summaryrefslogtreecommitdiffstats
path: root/binding/bluetooth-pbap-binding.c
diff options
context:
space:
mode:
authorMatt Ranostay <matt.ranostay@konsulko.com>2019-06-20 12:49:03 -0700
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2019-06-21 11:31:03 +0000
commita8d8db0b5fbc67569b04470444f42cb9c6296303 (patch)
treedd2b1d4289ae9956b311faf0624423ce23948dfe /binding/bluetooth-pbap-binding.c
parent010af2a73f721b987f55028332023b00df7a70ce (diff)
binding: bluetooth-pbap: add import verb to improve transfer of contacts
Previously contacts are requested on every connection of a device by OBEX transfers, and due to issues with transfer rates it should be only done when requested. import verb requests new phonebook transfer, and returns data as the contacts verb currently does. Also this patchset switchs from the canonical MAC address to using the identifier from the Bluetooth stack for better connection tracking. Bug-AGL: SPEC-2541 Change-Id: I27ad0626248e8dba0cacd65f34843b8eec2ca754 Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Diffstat (limited to 'binding/bluetooth-pbap-binding.c')
-rw-r--r--binding/bluetooth-pbap-binding.c61
1 files changed, 45 insertions, 16 deletions
diff --git a/binding/bluetooth-pbap-binding.c b/binding/bluetooth-pbap-binding.c
index 8dfba3d..cf39851 100644
--- a/binding/bluetooth-pbap-binding.c
+++ b/binding/bluetooth-pbap-binding.c
@@ -356,25 +356,54 @@ void contacts(afb_req_t request)
{
struct json_object *jresp;
const char *cached = NULL;
+
+ if (!connected) {
+ afb_req_fail(request, "not connected", NULL);
+ return;
+ }
+
+ if (!read_cached_value(connected_address, &cached)) {
+ jresp = json_tokener_parse(cached);
+ } else {
+ afb_req_fail(request, "no imported contacts", NULL);
+ }
+
+ afb_req_success(request, jresp, "contacts");
+}
+
+void import(afb_req_t request)
+{
+ struct json_object *jresp;
int max_entries = -1;
+ gchar *address;
+ g_mutex_lock(&connected_mutex);
if (!connected) {
afb_req_fail(request, "not connected", NULL);
+ g_mutex_unlock(&connected_mutex);
return;
}
+ address = g_strdup(connected_address);
+ g_mutex_unlock(&connected_mutex);
+
if (!parse_max_entries_parameter(request, &max_entries))
return;
- if (max_entries == -1 && !read_cached_value(connected_address, &cached)) {
- jresp = json_tokener_parse(cached);
- } else {
- org_bluez_obex_phonebook_access1_call_select_sync(
- phonebook, INTERNAL, CONTACTS, NULL, NULL);
- jresp = get_vcards(max_entries);
+ if (!org_bluez_obex_phonebook_access1_call_select_sync(
+ phonebook, INTERNAL, CONTACTS, NULL, NULL)) {
+ afb_req_fail(request, "cannot import contacts", NULL);
+ goto out_free;
}
+ jresp = get_vcards(max_entries);
+ update_or_insert(address,
+ json_object_to_json_string_ext(jresp, JSON_C_TO_STRING_PLAIN));
+
afb_req_success(request, jresp, "contacts");
+
+out_free:
+ g_free(address);
}
void entry(afb_req_t request)
@@ -651,24 +680,22 @@ static gboolean is_pbap_dev_and_init(struct json_object *dev)
g_mutex_lock(&connected_mutex);
if (connected_address)
g_free(connected_address);
- connected_address = g_strdup(address);
connected = TRUE;
json_object_object_add(jresp, "connected",
json_object_new_boolean(connected));
+
+ json_object_object_get_ex(dev, "device", &val1);
+ connected_address = g_strdup(json_object_get_string(val1));
+
+ json_object_object_add(jresp, "device",
+ json_object_new_string(connected_address));
+
g_mutex_unlock(&connected_mutex);
afb_event_push(status_event, jresp);
- json_object_object_get_ex(dev, "device", &val1);
- AFB_NOTICE("PBAP device connected: %s", json_object_get_string(val1));
-
- /* probably should be made async */
- org_bluez_obex_phonebook_access1_call_select_sync(
- phonebook, INTERNAL, CONTACTS, NULL, NULL);
- update_or_insert(address,
- json_object_to_json_string_ext(get_vcards(-1),
- JSON_C_TO_STRING_PLAIN));
+ AFB_NOTICE("PBAP device connected: %s", connected_address);
return TRUE;
}
@@ -714,6 +741,7 @@ static void init_bt(afb_api_t api)
static const afb_verb_t binding_verbs[] = {
{ .verb = "contacts", .callback = contacts, .info = "List contacts" },
+ { .verb = "import", .callback = import, .info = "Import contacts" },
{ .verb = "entry", .callback = entry, .info = "List call entry" },
{ .verb = "history", .callback = history, .info = "List call history" },
{ .verb = "search", .callback = search, .info = "Search for entry" },
@@ -792,6 +820,7 @@ static void process_connection_event(afb_api_t api, struct json_object *object)
g_mutex_lock(&connected_mutex);
connected = FALSE;
json_object_object_add(jresp, "connected", json_object_new_boolean(connected));
+ json_object_object_add(jresp, "device", json_object_new_string(device));
g_mutex_unlock(&connected_mutex);
afb_event_push(status_event, jresp);