#include <gio/gio.h>
#include <string>
#include "Utils.h"
#include "GattProperty.h"
GattProperty::GattProperty(const std::string &name, GVariant *pValue, GDBusInterfaceGetPropertyFunc getter, GDBusInterfaceSetPropertyFunc setter)
: name(name), pValue(pValue), getterFunc(getter), setterFunc(setter)
{
}
const std::string &GattProperty::getName() const
{
return name;
}
GattProperty &GattProperty::setName(const std::string &name)
{
this->name = name;
return *this;
}
const GVariant *GattProperty::getValue() const
{
return pValue;
}
GattProperty &GattProperty::setValue(GVariant *pValue)
{
this->pValue = pValue;
return *this;
}
GDBusInterfaceGetPropertyFunc GattProperty::getGetterFunc() const
{
return getterFunc;
}
GattProperty &GattProperty::setGetterFunc(GDBusInterfaceGetPropertyFunc func)
{
getterFunc = func;
return *this;
}
GDBusInterfaceSetPropertyFunc GattProperty::getSetterFunc() const
{
return setterFunc;
}
GattProperty &GattProperty::setSetterFunc(GDBusInterfaceSetPropertyFunc func)
{
setterFunc = func;
return *this;
}
std::string GattProperty::generateIntrospectionXML(int depth) const
{
std::string prefix;
prefix.insert(0, depth * 2, ' ');
std::string xml = std::string();
GVariant *pValue = const_cast<GVariant *>(getValue());
const gchar *pType = g_variant_get_type_string(pValue);
xml += prefix + "<property name='" + getName() + "' type='" + pType + "' access='read'>\n";
if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_BOOLEAN))
{
xml += prefix + " <annotation name='name' value='" + (g_variant_get_boolean(pValue) != 0 ? "true":"false") + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_INT16))
{
xml += prefix + " <annotation name='name' value='" + std::to_string(g_variant_get_int16(pValue)) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_UINT16))
{
xml += prefix + " <annotation name='name' value='" + std::to_string(g_variant_get_uint16(pValue)) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_INT32))
{
xml += prefix + " <annotation name='name' value='" + std::to_string(g_variant_get_int32(pValue)) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_UINT32))
{
xml += prefix + " <annotation name='name' value='" + std::to_string(g_variant_get_uint32(pValue)) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_INT64))
{
xml += prefix + " <annotation name='name' value='" + std::to_string(g_variant_get_int64(pValue)) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_UINT64))
{
xml += prefix + " <annotation name='name' value='" + std::to_string(g_variant_get_uint64(pValue)) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_DOUBLE))
{
xml += prefix + " <annotation value='" + std::to_string(g_variant_get_double(pValue)) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_STRING))
{
xml += prefix + " <annotation name='name' value='" + g_variant_get_string(pValue, nullptr) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_OBJECT_PATH))
{
xml += prefix + " <annotation name='name' value='" + g_variant_get_string(pValue, nullptr) + "' />\n";
}
else if (g_variant_is_of_type(pValue, G_VARIANT_TYPE_BYTESTRING))
{
xml += prefix + " <annotation name='name' value='" + g_variant_get_bytestring(pValue) + "' />\n";
}
xml += prefix + "</property>\n";
return xml;
}