- LoggerD("signal received: '" << interface_name << "' -> '" << signal_name << "' -> '" << object_path << "'");
-
- BluetoothAdapter *ctx = static_cast<BluetoothAdapter*>(user_data);
- if(!ctx) {
- LoggerD("Failed to cast to BluetoothAdapter");
- return;
- }
-
-
- if(!strcmp(interface_name, BLUEZ_MANAGER_IFACE)) {
- if(!strcmp(signal_name, "AdapterAdded")) {
- const char *adapter = NULL;
- g_variant_get(parameters, "(o)", &adapter);
- if(adapter) {
- LoggerD("Adapter added: " << adapter);
- gchar * adapterPath = ctx->getDefaultAdapter();
- free(ctx->mAdapterPath);
- ctx->mAdapterPath = adapterPath;
- if(adapterPath) {
- Utils::setSignalListener(G_BUS_TYPE_SYSTEM, BLUEZ_SERVICE, BLUEZ_ADAPTER_IFACE,
- adapterPath, "PropertyChanged", BluetoothAdapter::handleSignal,
- ctx);
- }
- }
- }
- else if(!strcmp(signal_name, "AdapterRemoved")) {
- const char *adapter = NULL;
- g_variant_get(parameters, "(o)", &adapter);
- if(adapter) {
- LoggerD("Adapter removed: " << adapter);
- }
- }
- }
- else if(!strcmp(interface_name, BLUEZ_ADAPTER_IFACE)) {
- if(!strcmp(signal_name, "PropertyChanged")) {
- const char *name;
- GVariant *var;
- g_variant_get(parameters, "(sv)", &name, &var);
- LoggerD("\tname=" << name);
- if(!strcmp(name, "Name")) {
- const char *_name = g_variant_get_string(var, NULL);
- ctx->onNameChanged(_name);
- }
- else if(!strcmp(name, "Powered")) {
- bool powered = g_variant_get_boolean(var);
- ctx->onPoweredChanged(powered);
- }
- else if(!strcmp(name, "Discoverable")) {
- bool visible = g_variant_get_boolean(var);
- ctx->onVisibilityChanged(visible);
- }
- else if(!strcmp(name, "Discovering")) {
- bool discovering = g_variant_get_boolean(var);
- if(discovering) { // discovery started
- MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
- if(callback) {
- callback->invokeCallback("onstarted");
- }
- }
- else { // discovery completed
- LoggerD("Discovery completed");
- if(ctx->mUserDataList[DISCOVER_DEVICES] != NULL) {
- MultiCallbackUserDataPtr callback =
- static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
-
- if(callback) {
- if(ctx->mDisappearedDevices.size() > 0) {
- LoggerD("There are disappeared devices");
- for(auto iter = ctx->mDisappearedDevices.begin();
- iter != ctx->mDisappearedDevices.end(); iter++) {
-
- callback->invokeCallback("ondevicedisappeared",
- JSUtil::toJSValueRef(callback->getContext(), *iter));
- }
- }
-
- if(ctx->mFoundDevices.size() > 0) { // There are found devices
- LoggerD("There are found devices");
- int num = ctx->mFoundDevices.size();
- JSObjectRef devices[num];
- for(int i = 0; i < num; i++) {
- JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(callback->getContext(), ctx->mFoundDevices[i]);
- devices[i] = deviceObj;
- }
-
- ctx->mUserDataList[DISCOVER_DEVICES].reset();
-
- callback->invokeCallback(
- "onfinished",
- JSObjectMakeArray(callback->getContext(), num, devices, NULL) );
- }
- else { // There is no found device
- LoggerD("There is no found device");
- ctx->mUserDataList[DISCOVER_DEVICES].reset();
-
- callback->invokeCallback(
- "onfinished",
- JSObjectMakeArray(callback->getContext(), 0, NULL, NULL) );
- }
- }
-
- Utils::removeSignalListener(G_BUS_TYPE_SYSTEM, BLUEZ_SERVICE, BLUEZ_ADAPTER_IFACE, object_path, "DeviceFound");
-
- GError *err = NULL;
- g_dbus_connection_call_sync( g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL),
- BLUEZ_SERVICE,
- ctx->mAdapterPath,
- BLUEZ_ADAPTER_IFACE,
- "StopDiscovery",
- NULL,
- NULL,
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &err);
- if(err)
- g_error_free(err);
- }
- }
- }
- }
- else if(!strcmp(signal_name, "DeviceFound")) { // found remote BT device
- bt_adapter_device_discovery_info_s discoveryInfo;
- discoveryInfo.remote_name = NULL;
- discoveryInfo.remote_address = NULL;
- discoveryInfo.service_uuid = NULL;
- discoveryInfo.service_count = 0;
-
- const char *address;
- GVariantIter *iter;
- g_variant_get(parameters, "(sa{sv})", &address, &iter);
- discoveryInfo.remote_address = address?strdup(address):NULL;
- const char *key;
- GVariant *value;
- while(g_variant_iter_next(iter, "{sv}", &key, &value)) {
- //LoggerD("KEY: " << key);
- if(!strcmp(key, "Name")) {
- const char *name = g_variant_get_string(value, NULL);
- discoveryInfo.remote_name = name?strdup(name):NULL;
- }
- else if(!strcmp(key, "Paired")) {
- discoveryInfo.is_bonded = g_variant_get_boolean(value);
- }
- else if(!strcmp(key, "Class")) {
- guint32 _class = g_variant_get_uint32(value);
- uint8_t minor = _class & 0xff;
- uint8_t major = (_class >> 8) & 0xff;
- discoveryInfo.bt_class.minor_device_class = (bt_minor_device_class_e) minor;
- discoveryInfo.bt_class.major_device_class = (bt_major_device_class_e) major;
- //discoveryInfo.bt_class.major_service_class_mask =
- }
- else if(!strcmp(key, "UUIDs")) {
- GVariantIter *iter;
- const char *uuid = NULL;
- g_variant_get(value, "as", &iter);
- discoveryInfo.service_count = g_variant_iter_n_children(iter);
- discoveryInfo.service_uuid = (char**)malloc(discoveryInfo.service_count*sizeof(char*));
- char **uuids = discoveryInfo.service_uuid; // make a copy of ptr, since we will modify the pointer
- while(g_variant_iter_next(iter, "s", &uuid)) {
- *uuids++ = uuid?strdup(uuid):NULL;
- }
- }
- }
-
- if(!discoveryInfo.remote_address) {
- LoggerD("discovery info ... remote_address is null");
- ctx->freeDiscoveryInfo(&discoveryInfo);
- return;
- }
-
- if(!discoveryInfo.remote_name) {
- LoggerD("discovery info ... remote_name is null for " << discoveryInfo.remote_address);
- discoveryInfo.remote_name = strdup("");
- }
-
- LoggerD("Found BT device: " << discoveryInfo.remote_address << " ... " << (discoveryInfo.remote_name?discoveryInfo.remote_name:""));
-
- if(ctx->mUserDataList[DISCOVER_DEVICES] != NULL) { // requested event
- MultiCallbackUserDataPtr callback =
- static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
-
- if(callback) {
- if(!ctx->isDeviceInList(ctx->mFoundDevices, discoveryInfo.remote_address)) {
- // create BluetoothDevice
- BluetoothDeviceSharedPtr device(new BluetoothDevice(&discoveryInfo));
- JSContextRef context = callback->getContext();
- JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(context, device);
- ctx->mFoundDevices.push_back(device);
-
- // remove MAC address of found device from mDisappearedDevices
- for(auto iter = ctx->mDisappearedDevices.begin(); iter != ctx->mDisappearedDevices.end(); iter++) {
- if(!strcmp(discoveryInfo.remote_address, (*iter).c_str())) {
- ctx->mDisappearedDevices.erase(iter);
- break;
- }
- }
-
- callback->invokeCallback("ondevicefound", deviceObj);
- }
- }
- }
-
- ctx->freeDiscoveryInfo(&discoveryInfo);
- }
- }
- /*
- else if(!strcmp(interface_name, CONNMAN_TECHNOLOGY_IFACE)) {
- if(!strcmp(signal_name, "PropertyChanged")) {
- const char *name;
- GVariant *value;
- g_variant_get(parameters, "(sv)", &name, &value);
- if(!strcmp(name, "Powered")) {
- bool powered = g_variant_get_boolean(value);
- ctx->onPoweredChanged(powered);
- }
- }
- }
- */
+ LoggerE("signal received: '" << interface_name << "' -> '" << signal_name << "' -> '" << object_path << "'");
+
+ BluetoothAdapter *ctx = static_cast<BluetoothAdapter*>(user_data);
+ if(!ctx)
+ {
+ LoggerD("Failed to cast to BluetoothAdapter");
+ return;
+ }
+
+
+ if(!strcmp(interface_name, "org.freedesktop.DBus.ObjectManager"))
+ {
+ if(!strcmp(signal_name, "InterfacesAdded"))
+ {
+
+ char *objPath = NULL;
+ GVariantIter* iter;
+
+ g_variant_get(parameters, "(oa{sa{sv}})", &objPath, &iter);
+
+ if(objPath)
+ {
+
+ GVariantIter* iter2;
+ char *interface = NULL;
+
+ while(g_variant_iter_next(iter, "{sa{sv}}",&interface, &iter2))
+ {
+
+ if(!strcmp(interface, "org.bluez.Adapter1"))
+ {
+ gchar * adapterPath = ctx->getDefaultAdapter();
+ free(ctx->mAdapterPath);
+ ctx->mAdapterPath = adapterPath;
+
+ if(adapterPath)
+ {
+ Utils::setSignalListener(G_BUS_TYPE_SYSTEM, BLUEZ_SERVICE, "org.freedesktop.DBus.Properties",
+ adapterPath, "PropertiesChanged", BluetoothAdapter::handleSignal,
+ ctx);
+ }
+ }
+
+ else if(!strcmp(interface, "org.bluez.Device1"))
+ {
+ bt_adapter_device_discovery_info_s discoveryInfo;
+ discoveryInfo.remote_name = NULL;
+ discoveryInfo.remote_address = NULL;
+ discoveryInfo.service_uuid = NULL;
+ discoveryInfo.service_count = 0;
+
+ const char *key;
+ GVariant *value;
+
+ while(g_variant_iter_next(iter2, "{sv}", &key, &value))
+ {
+ if(!strcmp(key, "Address"))
+ {
+ const char *address = g_variant_get_string(value, NULL);
+ discoveryInfo.remote_address = address?strdup(address):NULL;
+ }
+
+ else if(!strcmp(key, "Name"))
+ {
+ const char *name = g_variant_get_string(value, NULL);
+ discoveryInfo.remote_name = name?strdup(name):NULL;
+ }
+
+ else if(!strcmp(key, "Paired"))
+ {
+ discoveryInfo.is_bonded = g_variant_get_boolean(value);
+ }
+
+ else if(!strcmp(key, "Class"))
+ {
+ guint32 _class = g_variant_get_uint32(value);
+ uint8_t minor = _class & 0xff;
+ uint8_t major = (_class >> 8) & 0xff;
+ discoveryInfo.bt_class.minor_device_class = (bt_minor_device_class_e) minor;
+ discoveryInfo.bt_class.major_device_class = (bt_major_device_class_e) major;
+ //discoveryInfo.bt_class.major_service_class_mask =
+ }
+
+ else if(!strcmp(key, "UUIDs"))
+ {
+ GVariantIter *iter;
+ const char *uuid = NULL;
+ g_variant_get(value, "as", &iter);
+ discoveryInfo.service_count = g_variant_iter_n_children(iter);
+ discoveryInfo.service_uuid = (char**)malloc(discoveryInfo.service_count*sizeof(char*));
+ char **uuids = discoveryInfo.service_uuid; // make a copy of ptr, since we will modify the pointer
+ while(g_variant_iter_next(iter, "s", &uuid))
+ {
+ *uuids++ = uuid?strdup(uuid):NULL;
+ }
+ }
+ }
+
+ if(!discoveryInfo.remote_address)
+ {
+ ctx->freeDiscoveryInfo(&discoveryInfo);
+ return;
+ }
+
+ if(!discoveryInfo.remote_name)
+ {
+ LoggerD("discovery info ... remote_name is null for " << discoveryInfo.remote_address);
+ discoveryInfo.remote_name = strdup("");
+ }
+
+ LoggerD("Found BT device: " << discoveryInfo.remote_address << " ... " << (discoveryInfo.remote_name?discoveryInfo.remote_name:""));
+
+ if(ctx->mUserDataList[DISCOVER_DEVICES] != NULL)
+ {
+ // requested event
+ MultiCallbackUserDataPtr callback =
+ static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
+
+ if(callback)
+ {
+ if(!ctx->isDeviceInList(ctx->mFoundDevices, discoveryInfo.remote_address))
+ {
+ // create BluetoothDevice
+ BluetoothDeviceSharedPtr device(new BluetoothDevice(&discoveryInfo, objPath));
+ JSContextRef context = callback->getContext();
+ JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(context, device);
+ ctx->mFoundDevices.push_back(device);
+
+ // remove MAC address of found device from mDisappearedDevices
+ for(auto iter = ctx->mDisappearedDevices.begin(); iter != ctx->mDisappearedDevices.end(); iter++)
+ {
+ if(!strcmp(discoveryInfo.remote_address, (*iter).c_str()))
+ {
+ ctx->mDisappearedDevices.erase(iter);
+ break;
+ }
+ }
+
+ callback->invokeCallback("ondevicefound", deviceObj);
+ }
+ }
+ }
+
+ ctx->freeDiscoveryInfo(&discoveryInfo);
+ }
+ }
+ }
+ }
+ else if(!strcmp(signal_name, "AdapterRemoved"))
+ {
+ const char *adapter = NULL;
+ g_variant_get(parameters, "(o)", &adapter);
+ if(adapter)
+ {
+ LoggerD("Adapter removed: " << adapter);
+ }
+ }
+ }
+ else if(!strcmp(interface_name, BLUEZ_ADAPTER_IFACE))
+ {
+ if(!strcmp(signal_name, "PropertyChanged"))
+ {
+ const char *name;
+ GVariant *var;
+ g_variant_get(parameters, "(sv)", &name, &var);
+ LoggerD("\tname=" << name);
+ if(!strcmp(name, "Name"))
+ {
+ const char *_name = g_variant_get_string(var, NULL);
+ ctx->onNameChanged(_name);
+ }
+ else if(!strcmp(name, "Powered"))
+ {
+ bool powered = g_variant_get_boolean(var);
+ ctx->onPoweredChanged(powered);
+ }
+ else if(!strcmp(name, "Discoverable"))
+ {
+ bool visible = g_variant_get_boolean(var);
+ ctx->onVisibilityChanged(visible);
+ }
+ else if(!strcmp(name, "Discovering"))
+ {
+ bool discovering = g_variant_get_boolean(var);
+ if(discovering) // discovery started
+ {
+ MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
+ if(callback)
+ {
+ callback->invokeCallback("onstarted");
+ }
+ }
+ else // discovery completed
+ {
+ LoggerD("Discovery completed");
+ if(ctx->mUserDataList[DISCOVER_DEVICES] != NULL)
+ {
+ MultiCallbackUserDataPtr callback =
+ static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
+
+ if(callback)
+ {
+ if(ctx->mDisappearedDevices.size() > 0)
+ {
+ LoggerD("There are disappeared devices");
+ for(auto iter = ctx->mDisappearedDevices.begin();
+ iter != ctx->mDisappearedDevices.end(); iter++)
+ {
+
+ callback->invokeCallback("ondevicedisappeared",
+ JSUtil::toJSValueRef(callback->getContext(), *iter));
+ }
+ }
+
+ if(ctx->mFoundDevices.size() > 0) // There are found devices
+ {
+ LoggerD("There are found devices");
+ int num = ctx->mFoundDevices.size();
+ JSObjectRef devices[num];
+ for(int i = 0; i < num; i++)
+ {
+ JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(callback->getContext(), ctx->mFoundDevices[i]);
+ devices[i] = deviceObj;
+ }
+
+ ctx->mUserDataList[DISCOVER_DEVICES].reset();
+
+ callback->invokeCallback(
+ "onfinished",
+ JSObjectMakeArray(callback->getContext(), num, devices, NULL) );
+ }
+ else // There is no found device
+ {
+ LoggerD("There is no found device");
+ ctx->mUserDataList[DISCOVER_DEVICES].reset();
+
+ callback->invokeCallback(
+ "onfinished",
+ JSObjectMakeArray(callback->getContext(), 0, NULL, NULL) );
+ }
+ }
+
+ Utils::removeSignalListener(G_BUS_TYPE_SYSTEM, BLUEZ_SERVICE, BLUEZ_ADAPTER_IFACE, object_path, "DeviceFound");
+
+ GError *err = NULL;
+ g_dbus_connection_call_sync( g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL),
+ BLUEZ_SERVICE,
+ ctx->mAdapterPath,
+ BLUEZ_ADAPTER_IFACE,
+ "StopDiscovery",
+ NULL,
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &err);
+ if(err)
+ g_error_free(err);
+ }
+ }
+ }
+ }
+ }
+ /*
+ else if(!strcmp(interface_name, CONNMAN_TECHNOLOGY_IFACE)) {
+ if(!strcmp(signal_name, "PropertyChanged")) {
+ const char *name;
+ GVariant *value;
+ g_variant_get(parameters, "(sv)", &name, &value);
+ if(!strcmp(name, "Powered")) {
+ bool powered = g_variant_get_boolean(value);
+ ctx->onPoweredChanged(powered);
+ }
+ }
+ }
+ */