am c937b5ce: Merge change 23463 into eclair

Merge commit 'c937b5ce4ff2f39fd9c60f718f98550a932b62f0' into eclair-plus-aosp

* commit 'c937b5ce4ff2f39fd9c60f718f98550a932b62f0':
  Wait for HCI to come up if getting the adapter path fails.
This commit is contained in:
Jaikumar Ganesh
2009-09-01 19:20:44 -07:00
committed by Android Git Automerger

View File

@@ -227,37 +227,58 @@ static jboolean setUpEventLoop(native_data_t *nat) {
const char * get_adapter_path(DBusConnection *conn) { const char * get_adapter_path(DBusConnection *conn) {
DBusMessage *msg, *reply; DBusMessage *msg, *reply = NULL;
DBusError err; DBusError err;
const char *device_path = NULL; const char *device_path = NULL;
msg = dbus_message_new_method_call("org.bluez", "/", int attempt = 0;
"org.bluez.Manager", "DefaultAdapter");
if (!msg) {
LOGE("%s: Can't allocate new method call for GetProperties!",
__FUNCTION__);
return NULL;
}
dbus_message_append_args(msg, DBUS_TYPE_INVALID);
dbus_error_init(&err); for (attempt = 0; attempt < 1000 && reply == NULL; attempt ++) {
reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); msg = dbus_message_new_method_call("org.bluez", "/",
dbus_message_unref(msg); "org.bluez.Manager", "DefaultAdapter");
if (!msg) {
if (!reply) { LOGE("%s: Can't allocate new method call for get_adapter_path!",
if (dbus_error_is_set(&err)) { __FUNCTION__);
LOG_AND_FREE_DBUS_ERROR(&err); return NULL;
}
dbus_message_append_args(msg, DBUS_TYPE_INVALID);
dbus_error_init(&err);
reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
if (!reply) {
if (dbus_error_is_set(&err)) {
if (dbus_error_has_name(&err,
"org.freedesktop.DBus.Error.ServiceUnknown")) {
// bluetoothd is still down, retry
LOG_AND_FREE_DBUS_ERROR(&err);
usleep(10000); // 10 ms
continue;
} else {
// Some other error we weren't expecting
LOG_AND_FREE_DBUS_ERROR(&err);
}
}
goto failed;
} }
return NULL;
} }
if (attempt == 1000) {
LOGE("Time out while trying to get Adapter path, is bluetoothd up ?");
goto failed;
}
if (!dbus_message_get_args(reply, &err, DBUS_TYPE_OBJECT_PATH, if (!dbus_message_get_args(reply, &err, DBUS_TYPE_OBJECT_PATH,
&device_path, DBUS_TYPE_INVALID) &device_path, DBUS_TYPE_INVALID)
|| !device_path){ || !device_path){
if (dbus_error_is_set(&err)) { if (dbus_error_is_set(&err)) {
LOG_AND_FREE_DBUS_ERROR(&err); LOG_AND_FREE_DBUS_ERROR(&err);
} }
return NULL; goto failed;
} }
dbus_message_unref(msg);
return device_path; return device_path;
failed:
dbus_message_unref(msg);
return NULL;
} }
static int register_agent(native_data_t *nat, static int register_agent(native_data_t *nat,
@@ -274,6 +295,9 @@ static int register_agent(native_data_t *nat,
} }
nat->adapter = get_adapter_path(nat->conn); nat->adapter = get_adapter_path(nat->conn);
if (nat->adapter == NULL) {
return -1;
}
msg = dbus_message_new_method_call("org.bluez", nat->adapter, msg = dbus_message_new_method_call("org.bluez", nat->adapter,
"org.bluez.Adapter", "RegisterAgent"); "org.bluez.Adapter", "RegisterAgent");
if (!msg) { if (!msg) {