diff --git a/obexd/plugins/phonebook-tracker.c b/obexd/plugins/phonebook-tracker.c
index 8044395..6b9bb2f 100644
--- a/obexd/plugins/phonebook-tracker.c
+++ b/obexd/plugins/phonebook-tracker.c
"} GROUP BY ?call ORDER BY DESC(nmo:receivedDate(?call)) " \
"LIMIT 40"
-typedef void (*reply_list_foreach_t) (const char **reply, int num_fields,
+typedef int (*reply_list_foreach_t) (const char **reply, int num_fields,
void *user_data);
typedef void (*add_field_t) (struct phonebook_contact *contact,
GError *error = NULL;
gboolean success;
const char **node;
+ int err;
success = tracker_sparql_cursor_next_finish(
TRACKER_SPARQL_CURSOR(source),
}
node = string_array_from_cursor(cursor, pending->num_fields);
- pending->callback(node, pending->num_fields, pending->user_data);
+ err = pending->callback(node, pending->num_fields, pending->user_data);
g_free(node);
-
- /* getting next row from query results */
- cancellable = g_cancellable_new();
- update_cancellable(pending->user_data, cancellable);
- tracker_sparql_cursor_next_async(cursor, cancellable,
+ /* Fetch next result only if processing current chunk ended with
+ * success. Sometimes during processing data, we are able to determine
+ * if there is no need to get more data from tracker - by example
+ * stored amount of data parts is big enough for sending and we might
+ * want to suspend processing or just some error occurred. */
+ if (!err) {
+ cancellable = g_cancellable_new();
+ update_cancellable(pending->user_data, cancellable);
+ tracker_sparql_cursor_next_async(cursor, cancellable,
async_query_cursor_next_cb,
pending);
- return;
+ return;
+ }
failed:
g_object_unref(cursor);
return vcards;
}
-static void pull_contacts_size(const char **reply, int num_fields,
+static int pull_contacts_size(const char **reply, int num_fields,
void *user_data)
{
struct phonebook_data *data = user_data;
if (num_fields < 0) {
data->cb(NULL, 0, num_fields, 0, data->user_data);
- return;
+ return -EINTR;
}
if (reply != NULL) {
data->index = atoi(reply[0]);
- return;
+ return 0;
}
data->cb(NULL, 0, data->index, data->newmissedcalls, data->user_data);
+ return 0;
/*
* phonebook_data is freed in phonebook_req_finalize. Useful in
* cases when call is terminated.
add_affiliation(&contact->role, reply[COL_ORG_ROLE]);
}
-static void pull_contacts(const char **reply, int num_fields, void *user_data)
+static int pull_contacts(const char **reply, int num_fields, void *user_data)
{
struct phonebook_data *data = user_data;
const struct apparam_field *params = data->params;
if (i == num_fields - 4 && !g_str_equal(reply[CONTACTS_ID_COL],
TRACKER_DEFAULT_CONTACT_ME))
- return;
+ return 0;
if (g_strcmp0(temp_id, reply[CONTACTS_ID_COL])) {
data->index++;
if ((data->index <= params->liststartoffset ||
data->index > last_index) &&
params->maxlistcount > 0)
- return;
+ return 0;
add_entry:
contact = g_new0(struct phonebook_contact, 1);
data->contacts = g_slist_append(data->contacts, contact_data);
}
- return;
+ return 0;
done:
vcards = gen_vcards(data->contacts, params);
g_free(temp_id);
temp_id = NULL;
+ return -EINTR;
/*
* phonebook_data is freed in phonebook_req_finalize. Useful in
* cases when call is terminated.
*/
}
-static void add_to_cache(const char **reply, int num_fields, void *user_data)
+static int add_to_cache(const char **reply, int num_fields, void *user_data)
{
struct phonebook_data *data = user_data;
char *formatted;
if (i == num_fields &&
!g_str_equal(reply[0], TRACKER_DEFAULT_CONTACT_ME))
- return;
+ return 0;
if (i == 6)
formatted = g_strdup(reply[6]);
g_free(formatted);
- return;
+ return 0;
done:
if (num_fields <= 0)
data->ready_cb(data->user_data);
+ return -EINTR;
/*
* phonebook_data is freed in phonebook_req_finalize. Useful in
* cases when call is terminated.
g_string_free(data, TRUE);
}
-static void pull_newmissedcalls(const char **reply, int num_fields,
+static int pull_newmissedcalls(const char **reply, int num_fields,
void *user_data)
{
struct phonebook_data *data = user_data;
number);
}
}
- return;
+ return 0;
done:
DBG("newmissedcalls %d", data->newmissedcalls);
if (num_fields < 0) {
data->cb(NULL, 0, num_fields, 0, data->user_data);
- return;
+ return -EINTR;
}
if (data->params->maxlistcount == 0) {
}
err = query_tracker(query, col_amount, pull_cb, data);
- if (err < 0)
+ if (err < 0) {
data->cb(NULL, 0, err, 0, data->user_data);
+
+ return -EINTR;
+ }
+
+ return 0;
}
void *phonebook_pull(const char *name, const struct apparam_field *params,