diff options
author | Matt Ranostay <matt.ranostay@konsulko.com> | 2019-06-20 12:49:03 -0700 |
---|---|---|
committer | Jan-Simon Moeller <jsmoeller@linuxfoundation.org> | 2019-06-21 11:31:03 +0000 |
commit | a8d8db0b5fbc67569b04470444f42cb9c6296303 (patch) | |
tree | dd2b1d4289ae9956b311faf0624423ce23948dfe /binding | |
parent | 010af2a73f721b987f55028332023b00df7a70ce (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')
-rw-r--r-- | binding/bluetooth-pbap-binding.c | 61 |
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); |