summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hcid/dbus-database.c10
-rw-r--r--hcid/main.c52
-rw-r--r--hcid/manager.c53
-rw-r--r--hcid/manager.h2
-rw-r--r--sdpd/sdpd.h3
-rw-r--r--sdpd/service.c9
6 files changed, 64 insertions, 65 deletions
diff --git a/hcid/dbus-database.c b/hcid/dbus-database.c
index 384df032..29e5b132 100644
--- a/hcid/dbus-database.c
+++ b/hcid/dbus-database.c
@@ -86,8 +86,6 @@ static void exit_callback(const char *name, void *user_data)
else
unregister_sdp_record(user_record->handle);
- update_class_of_device();
-
if (user_record->sender)
g_free(user_record->sender);
@@ -148,8 +146,6 @@ static DBusHandlerResult add_service_record(DBusConnection *conn,
}
}
- update_class_of_device();
-
sender = dbus_message_get_sender(msg);
user_record->sender = g_strdup(sender);
@@ -211,8 +207,6 @@ static DBusHandlerResult add_service_record_from_xml(DBusConnection *conn,
sdp_record_free(sdp_record);
}
- update_class_of_device();
-
sender = dbus_message_get_sender(msg);
user_record->sender = g_strdup(sender);
@@ -262,8 +256,6 @@ static DBusHandlerResult update_record(DBusConnection *conn, DBusMessage *msg,
}
}
- update_class_of_device();
-
return send_message_and_unref(conn,
dbus_message_new_method_return(msg));
}
@@ -366,8 +358,6 @@ static DBusHandlerResult remove_service_record(DBusConnection *conn,
else
unregister_sdp_record(handle);
- update_class_of_device();
-
if (user_record->sender)
g_free(user_record->sender);
diff --git a/hcid/main.c b/hcid/main.c
index 6539642d..90461274 100644
--- a/hcid/main.c
+++ b/hcid/main.c
@@ -243,6 +243,57 @@ no_address:
return device_opts->discovto;
}
+void update_service_classes(const bdaddr_t *bdaddr, uint8_t value)
+{
+ struct hci_dev_list_req *dl;
+ struct hci_dev_req *dr;
+ int i, sk;
+
+ sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+ if (sk < 0)
+ return;
+
+ dl = g_malloc0(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl));
+
+ dl->dev_num = HCI_MAX_DEV;
+ dr = dl->dev_req;
+
+ if (ioctl(sk, HCIGETDEVLIST, dl) < 0) {
+ close(sk);
+ g_free(dl);
+ return;
+ }
+
+ dr = dl->dev_req;
+
+ for (i = 0; i < dl->dev_num; i++, dr++) {
+ struct hci_dev_info di;
+ uint8_t cls[3];
+ int dd;
+
+ if (hci_devinfo(dr->dev_id, &di) < 0)
+ continue;
+
+ if (hci_test_bit(HCI_RAW, &di.flags))
+ continue;
+
+ if (get_device_class(di.dev_id, cls) < 0)
+ continue;
+
+ dd = hci_open_dev(di.dev_id);
+ if (dd < 0)
+ continue;
+
+ set_service_classes(dd, cls, value);
+
+ hci_close_dev(dd);
+ }
+
+ g_free(dl);
+
+ close(sk);
+}
+
/*
* Device name expansion
* %d - device id
@@ -884,6 +935,7 @@ int main(int argc, char *argv[])
if (sdp) {
set_sdp_server_enable();
start_sdp_server(mtu, hcid.deviceid, SDP_SERVER_COMPAT);
+ set_service_classes_callback(update_service_classes);
}
notify_init();
diff --git a/hcid/manager.c b/hcid/manager.c
index a5588c4b..8e0652cc 100644
--- a/hcid/manager.c
+++ b/hcid/manager.c
@@ -329,56 +329,3 @@ void set_default_adapter(int new_default)
{
default_adapter_id = new_default;
}
-
-void update_class_of_device(void)
-{
- struct hci_dev_list_req *dl;
- struct hci_dev_req *dr;
- int i, sk;
-
- sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
- if (sk < 0)
- return;
-
- dl = g_malloc0(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl));
-
- dl->dev_num = HCI_MAX_DEV;
- dr = dl->dev_req;
-
- if (ioctl(sk, HCIGETDEVLIST, dl) < 0) {
- close(sk);
- g_free(dl);
- return;
- }
-
- dr = dl->dev_req;
-
- for (i = 0; i < dl->dev_num; i++, dr++) {
- struct hci_dev_info di;
- uint8_t value, cls[3];
- int dd;
-
- if (hci_devinfo(dr->dev_id, &di) < 0)
- continue;
-
- if (hci_test_bit(HCI_RAW, &di.flags))
- continue;
-
- if (get_device_class(di.dev_id, cls) < 0)
- continue;
-
- dd = hci_open_dev(di.dev_id);
- if (dd < 0)
- continue;
-
- value = get_service_classes(&di.bdaddr);
-
- set_service_classes(dd, cls, value);
-
- hci_close_dev(dd);
- }
-
- g_free(dl);
-
- close(sk);
-}
diff --git a/hcid/manager.h b/hcid/manager.h
index 41127bab..eef0dd36 100644
--- a/hcid/manager.h
+++ b/hcid/manager.h
@@ -28,5 +28,3 @@ dbus_bool_t manager_init(DBusConnection *conn, const char *path);
int get_default_adapter(void);
void set_default_adapter(int new_default);
-
-void update_class_of_device(void);
diff --git a/sdpd/sdpd.h b/sdpd/sdpd.h
index 6fc60e85..ad7a2d4f 100644
--- a/sdpd/sdpd.h
+++ b/sdpd/sdpd.h
@@ -87,4 +87,7 @@ void stop_sdp_server(void);
int add_record_to_server(sdp_record_t *rec);
int remove_record_from_server(uint32_t handle);
+typedef void (*service_classes_callback_t) (const bdaddr_t *bdaddr, uint8_t value);
+
uint8_t get_service_classes(const bdaddr_t *bdaddr);
+void set_service_classes_callback(service_classes_callback_t callback);
diff --git a/sdpd/service.c b/sdpd/service.c
index 851c1459..7f8296f4 100644
--- a/sdpd/service.c
+++ b/sdpd/service.c
@@ -45,6 +45,7 @@
static sdp_record_t *server = NULL;
static uint8_t service_classes = 0x00;
+static service_classes_callback_t service_classes_callback = NULL;
/*
* List of version numbers supported by the SDP server.
@@ -123,6 +124,9 @@ static void update_svclass_list(void)
debug("Service classes 0x%02x", val);
service_classes = val;
+
+ if (service_classes_callback)
+ service_classes_callback(BDADDR_ANY, val);
}
uint8_t get_service_classes(const bdaddr_t *bdaddr)
@@ -130,6 +134,11 @@ uint8_t get_service_classes(const bdaddr_t *bdaddr)
return service_classes;
}
+void set_service_classes_callback(service_classes_callback_t callback)
+{
+ service_classes_callback = callback;
+}
+
void register_public_browse_group(void)
{
sdp_list_t *browselist;