summaryrefslogtreecommitdiffstats
path: root/binding/bluetooth-pbap-binding.c
diff options
context:
space:
mode:
Diffstat (limited to 'binding/bluetooth-pbap-binding.c')
-rw-r--r--binding/bluetooth-pbap-binding.c82
1 files changed, 58 insertions, 24 deletions
diff --git a/binding/bluetooth-pbap-binding.c b/binding/bluetooth-pbap-binding.c
index a45e9ec..1493c16 100644
--- a/binding/bluetooth-pbap-binding.c
+++ b/binding/bluetooth-pbap-binding.c
@@ -16,6 +16,7 @@
*/
#define _GNU_SOURCE
+#include <errno.h>
#include <glib.h>
#include <json-c/json.h>
#include <math.h>
@@ -39,7 +40,6 @@ static OrgBluezObexClient1 *client;
static OrgBluezObexSession1 *session;
static OrgBluezObexPhonebookAccess1 *phonebook;
static GHashTable *xfer_queue;
-static GMutex cached_mutex;
static GMutex xfer_queue_mutex;
static GHashTable *xfer_complete;
static GMutex xfer_complete_mutex;
@@ -48,8 +48,6 @@ static GMutex connected_mutex;
static gboolean connected = FALSE;
static afb_event_t status_event;
-json_object *cached_results = NULL;
-
#define PBAP_UUID "0000112f-0000-1000-8000-00805f9b34fb"
#define INTERNAL "int"
@@ -63,6 +61,56 @@ json_object *cached_results = NULL;
#define OUTGOING "och"
#define MISSED "mch"
+
+static int update_or_insert(const char *key, const char *value)
+{
+ json_object *query = json_object_new_object();
+ int ret;
+
+ json_object_object_add(query, "key", json_object_new_string(key));
+ json_object_object_add(query, "value", json_object_new_string(value));
+ json_object_get(query);
+
+ ret = afb_service_call_sync("persistence", "update", query, NULL, NULL, NULL);
+ if (!ret) {
+ AFB_DEBUG("Updating persistence value '%s'", key);
+ json_object_put(query);
+ return 0;
+ }
+
+ ret = afb_service_call_sync("persistence", "write", query, NULL, NULL, NULL);
+ if (!ret) {
+ AFB_DEBUG("Create persistence value '%s'", key);
+ return 0;
+ }
+
+ return ret;
+}
+
+static int read_cached_value(const char *key, const char **data)
+{
+ json_object *response, *query;
+ int ret;
+
+ query = json_object_new_object();
+ json_object_object_add(query, "key", json_object_new_string(key));
+
+ ret = afb_service_call_sync("persistence", "read", query, &response, NULL, NULL);
+ if (!ret) {
+ json_object *val = NULL;
+
+ json_object_object_get_ex(response, "value", &val);
+ if (!val)
+ return -EINVAL;
+
+ *data = g_strdup(json_object_get_string(val));
+ }
+
+ json_object_get(response);
+
+ return ret;
+}
+
static void on_interface_proxy_properties_changed(
GDBusObjectManagerClient *manager,
GDBusObjectProxy *object_proxy,
@@ -307,6 +355,7 @@ static gboolean parse_max_entries_parameter(afb_req_t request, int *max_entries)
void contacts(afb_req_t request)
{
struct json_object *jresp;
+ const char *cached = NULL;
int max_entries = -1;
if (!connected) {
@@ -317,11 +366,8 @@ void contacts(afb_req_t request)
if (!parse_max_entries_parameter(request, &max_entries))
return;
- g_mutex_lock(&cached_mutex);
-
- if (max_entries == -1 && cached_results) {
- jresp = cached_results;
- json_object_get(jresp);
+ if (max_entries == -1 && !read_cached_value("default", &cached)) {
+ jresp = json_tokener_parse(cached);
} else {
org_bluez_obex_phonebook_access1_call_select_sync(
phonebook, INTERNAL, CONTACTS, NULL, NULL);
@@ -329,8 +375,6 @@ void contacts(afb_req_t request)
}
afb_req_success(request, jresp, "contacts");
-
- g_mutex_unlock(&cached_mutex);
}
void entry(afb_req_t request)
@@ -615,16 +659,12 @@ static gboolean is_pbap_dev_and_init(struct json_object *dev)
json_object_object_get_ex(dev, "device", &val1);
AFB_NOTICE("PBAP device connected: %s", json_object_get_string(val1));
- g_mutex_lock(&cached_mutex);
-
- if (cached_results)
- json_object_put(cached_results);
-
/* probably should be made async */
org_bluez_obex_phonebook_access1_call_select_sync(
phonebook, INTERNAL, CONTACTS, NULL, NULL);
- cached_results = get_vcards(-1);
- g_mutex_unlock(&cached_mutex);
+ update_or_insert("default",
+ json_object_to_json_string_ext(get_vcards(-1),
+ JSON_C_TO_STRING_PLAIN));
return TRUE;
}
@@ -752,12 +792,6 @@ static void process_connection_event(afb_api_t api, struct json_object *object)
afb_event_push(status_event, jresp);
- g_mutex_lock(&cached_mutex);
- if (cached_results)
- json_object_put(cached_results);
- cached_results = NULL;
- g_mutex_unlock(&cached_mutex);
-
AFB_NOTICE("PBAP device disconnected: %s", device);
}
@@ -765,7 +799,7 @@ static void onevent(afb_api_t api, const char *event, struct json_object *object
{
if (!g_ascii_strcasecmp(event, "Bluetooth-Manager/device_changes"))
process_connection_event(api, object);
- else
+ else
AFB_ERROR("Unsupported event: %s\n", event);
}