{
mConnReqMap.erase(remoteAddress);
+ LoggerE("removeConnReq for address: %s", remoteAddress.c_str());
if(mRegisteredUUID.size() == 0 && mConnReqMap.size() == 0 && mConnectedSocket.size() == 0)
{
- if(bt_socket_unset_connection_state_changed_cb() != BT_ERROR_NONE)
+ int result=bt_socket_unset_connection_state_changed_cb();
+ if(result != BT_ERROR_NONE)
{
- LoggerW("Unsetting connection event callback failed");
+ LoggerW("Unsetting connection event callback failed with error: %d", result);
}
}
}
char* devicePath = NULL;
- for (int i = 0; i < mFoundDevices.size(); i++)
+ for (size_t i = 0; i < mFoundDevices.size(); ++i)
{
if (mFoundDevices[i]->getAddress() == address)
{
}
if (!devicePath)
+ {
devicePath = getDeviceFromAddress(address);
+ if(!devicePath)
+ {
+ LoggerE("Device currently unavailable");
+ NotFoundException *error = new NotFoundException("Device currently unavailable. Try again.");
+ BluetoothCallbackUtil::syncToAsyncErrorCallback(userData, error);
+ mCreateBondingAddress.clear();
+ mUserDataList[CREATE_BONDING].reset();
+ return;
+ }
+ }
if(mEnabled == true)
{
// if(setupAgent(AGENT_PATH)) {
- if (!devicePath)
- {
- LoggerE("devicePath was null, setting to empty string");
- devicePath = "";
- }
if (devicePath != NULL)
{
void BluetoothAdapter::returnKnownDevices(Common::MultiCallbackUserDataPtr userData)
{
- char *result;
bool done = false;
GError * error = nullptr;
}
g_variant_iter_free(iter);
+ if(knownDevices.size() > 0)
+ {
+ int num = knownDevices.size();
+ JSObjectRef devices[num];
+ for(int i = 0; i < num; ++i)
+ {
+ JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(userData->getContext(), knownDevices[i]);
+ devices[i] = deviceObj;
+ }
+
+ userData->invokeCallback("success", JSObjectMakeArray(userData->getContext(), num, devices, NULL));
+ }
+ else
+ userData->invokeCallback("success", JSObjectMakeArray(userData->getContext(), 0, NULL, NULL) );
+
}
void BluetoothAdapter::returnDevice(std::string &address, Common::MultiCallbackUserDataPtr userData)
gchar* BluetoothAdapter::getDefaultAdapter() const
{
- char *result;
+ char *result=nullptr;
bool done = false;
GError * error = nullptr;
result = objPath?strdup(objPath):NULL;
done = true;
- LoggerD("getDeviceFromAddress found : " << result);
}
g_free(addr);
while(g_variant_iter_next(iter, "{sa{sv}}",&interface, &iter2))
{
- if(!strcmp(interface, "org.bluez.Adapter1"))
+ if(!strcmp(interface, BLUEZ_ADAPTER_IFACE))
{
gchar * adapterPath = ctx->getDefaultAdapter();
free(ctx->mAdapterPath);
ctx);
}
}
-
else if(!strcmp(interface, "org.bluez.Device1"))
{
bt_adapter_device_discovery_info_s discoveryInfo;
discoveryInfo.service_uuid = NULL;
discoveryInfo.service_count = 0;
- const char *key;
+ char *key;
GVariant *value;
while(g_variant_iter_next(iter2, "{sv}", &key, &value))
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);
+ GVariantIter *iter3;
+ char *uuid = NULL;
+ g_variant_get(value, "as", &iter3);
+ discoveryInfo.service_count = g_variant_iter_n_children(iter3);
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))
+ while(g_variant_iter_next(iter3, "s", &uuid))
{
*uuids++ = uuid?strdup(uuid):NULL;
}
+ g_variant_iter_free(iter3);
}
+ g_variant_unref(value);
+ g_free(key);
}
if(!discoveryInfo.remote_address)
discoveryInfo.remote_name = strdup("");
}
- LoggerD("Found BT device: " << discoveryInfo.remote_address << " ... " << (discoveryInfo.remote_name?discoveryInfo.remote_name:""));
+ LoggerE("Found BT device: " << discoveryInfo.remote_address << " ... " << (discoveryInfo.remote_name?discoveryInfo.remote_name:""));
if(ctx->mUserDataList[DISCOVER_DEVICES] != NULL)
{
ctx->freeDiscoveryInfo(&discoveryInfo);
}
+ g_free(interface);
}
+ g_variant_iter_free(iter2);
}
+ g_free(objPath);
+ g_variant_iter_free(iter);
}
- else if(!strcmp(signal_name, "AdapterRemoved"))
+ else if(!strcmp(signal_name, "InterfacesRemoved"))
{
- const char *adapter = NULL;
- g_variant_get(parameters, "(o)", &adapter);
- if(adapter)
+ char *obj_path = nullptr;
+ GVariantIter *iter;
+ g_variant_get(parameters, "(oas)", &obj_path, &iter);
+
+ if(obj_path)
{
- LoggerD("Adapter removed: " << adapter);
+ char *iface = nullptr;
+
+ while(g_variant_iter_next(iter, "s", &iface))
+ {
+ if(!strcmp(iface, BLUEZ_DEVICE_IFACE))
+ {
+ LoggerE("Interface removed: " << iface);
+ }
+
+ g_free(iface);
+ }
+ g_variant_iter_free(iter);
}
+ g_free(obj_path);
}
}
- else if(!strcmp(interface_name, BLUEZ_ADAPTER_IFACE))
+ else if(!strcmp(signal_name, "PropertiesChanged"))
{
- if(!strcmp(signal_name, "PropertyChanged"))
+ char *objPath = NULL;
+ GVariantIter *iter, *iter2;
+
+ g_variant_get(parameters, "(sa{sv}as)", &objPath, &iter, &iter2);
+
+ if(objPath)
{
- 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"))
+ GVariant* var;
+ char *prop = NULL;
+
+ while(g_variant_iter_next(iter, "{sv}", &prop, &var))
{
- bool discovering = g_variant_get_boolean(var);
- if(discovering) // discovery started
+ if(!strcmp(prop, "Name"))
{
- MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
- if(callback)
- {
- callback->invokeCallback("onstarted");
- }
+ const char *_name = g_variant_get_string(var, NULL);
+ ctx->onNameChanged(_name);
+ }
+ else if(!strcmp(prop, "Powered"))
+ {
+ bool powered = g_variant_get_boolean(var);
+ ctx->onPoweredChanged(powered);
+ }
+ else if(!strcmp(prop, "Discoverable"))
+ {
+ bool visible = g_variant_get_boolean(var);
+ ctx->onVisibilityChanged(visible);
}
- else // discovery completed
+ else if(!strcmp(prop, "Discovering"))
{
- LoggerD("Discovery completed");
- if(ctx->mUserDataList[DISCOVER_DEVICES] != NULL)
+ bool discovering = g_variant_get_boolean(var);
+ if(discovering) // discovery started
{
- MultiCallbackUserDataPtr callback =
- static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
-
+ MultiCallbackUserDataPtr callback = static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
if(callback)
{
- if(ctx->mDisappearedDevices.size() > 0)
+ callback->invokeCallback("onstarted");
+ }
+ }
+ else // discovery completed
+ {
+ LoggerE("Discovery completed");
+ if(ctx->mUserDataList[DISCOVER_DEVICES] != NULL)
+ {
+ MultiCallbackUserDataPtr callback =
+ static_cast<MultiCallbackUserDataPtr>(ctx->mUserDataList[DISCOVER_DEVICES]);
+
+ if(callback)
{
- LoggerD("There are disappeared devices");
- for(auto iter = ctx->mDisappearedDevices.begin();
- iter != ctx->mDisappearedDevices.end(); iter++)
+ 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));
+ 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++)
+ if(ctx->mFoundDevices.size() > 0) // There are found devices
{
- JSObjectRef deviceObj = JSBluetoothDevice::createJSObject(callback->getContext(), ctx->mFoundDevices[i]);
- devices[i] = deviceObj;
- }
+ 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();
+ 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(), 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) );
+ 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);
+ 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);
+ }
}
}
}
+ g_variant_iter_free(iter);
+ g_variant_iter_free(iter2);
+ }
+ g_free(objPath);
+ }
+ else if(!strcmp(interface_name, BLUEZ_ADAPTER_IFACE))
+ {
+ if(!strcmp(signal_name, "PropertyChanged"))
+ {
+ LoggerE("PropertyChanged not working!!");
}
}
/*
if(err || !reply)
{
+ LoggerE("isDevicePaired return an error: %s, device: %s", err->message, device);
if(err)
g_error_free(err);
return false;
if(!mAdapterPath)
return false;
- std::string addressStr = std::string(address);
+ std::string addressStr(address);
char* device = getDeviceFromAddress(addressStr);
if(!device)
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);
bool BluetoothAdapter::removeDevice(const char *address)
{
-
if(!address)
return false;
if(!mAdapterPath)
return false;
- std::string addressStr = std::string(address);
+ std::string addressStr(address);
char* device = getDeviceFromAddress(addressStr);
if(!device)
}
}
- LoggerD("removed device : " << device);
+ for(auto iter=mFoundDevices.begin(); iter!=mFoundDevices.end();)
+ {
+ BluetoothDeviceSharedPtr foundDevice = *iter;
+
+ if(!strcmp(foundDevice->getAddress().c_str(), address))
+ {
+ iter=mFoundDevices.erase(iter);
+ mDisappearedDevices.push_back(address);
+ }
+ else
+ ++iter;
+ }
+
+ LoggerE(" removed device : " << device);
return success;
}