diff options
author | Radoslaw Jablonski <ext-jablonski.radoslaw@nokia.com> | 2011-02-14 11:19:50 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2011-02-15 11:19:55 -0300 |
commit | ae6e7fe491c9d86682fbe379b967ab32cfbafb31 (patch) | |
tree | 3320a4651b8a8f79d1b49b2bf9ce2304b76439f5 /plugins/phonebook-tracker.c | |
parent | 4170f13ece1f0218ad70ec2bc6c2536367eed922 (diff) | |
download | obexd-ae6e7fe491c9d86682fbe379b967ab32cfbafb31.tar.gz |
Introduction of phonebook_pull_read
Previosly reading from backend was initialized in phonebook_pull.
Now phonebook_pull should be used only for preparing request data
and phonebook_pull_read for 'real' reading vcards data from back-end.
The back-end can return data in one response or it can return data in
many parts. After obtaining one part, PBAP core need to call
phonebook_pull_read with the same request again to get more results.
Using that, PBAP core has control of its the buffer size - it can
ask for new parts of data when buffer is empty or when its size
will be lower than some level.
Diffstat (limited to 'plugins/phonebook-tracker.c')
-rw-r--r-- | plugins/phonebook-tracker.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/plugins/phonebook-tracker.c b/plugins/phonebook-tracker.c index aea2365..e7f0807 100644 --- a/plugins/phonebook-tracker.c +++ b/plugins/phonebook-tracker.c @@ -918,6 +918,7 @@ struct phonebook_data { phonebook_entry_cb entry_cb; int newmissedcalls; GCancellable *query_canc; + char *req_name; }; struct phonebook_index { @@ -1819,6 +1820,7 @@ void phonebook_req_finalize(void *request) } g_slist_free(data->contacts); + g_free(data->req_name); g_free(data); } @@ -1897,41 +1899,52 @@ void *phonebook_pull(const char *name, const struct apparam_field *params, phonebook_cb cb, void *user_data, int *err) { struct phonebook_data *data; - const char *query; - reply_list_foreach_t pull_cb; - int col_amount, ret; DBG("name %s", name); - if (g_strcmp0(name, "telecom/mch.vcf") == 0) { + data = g_new0(struct phonebook_data, 1); + data->params = params; + data->user_data = user_data; + data->cb = cb; + data->req_name = g_strdup(name); + + if (err) + *err = 0; + + return data; +} + +int phonebook_pull_read(void *request) +{ + struct phonebook_data *data = request; + reply_list_foreach_t pull_cb; + const char *query; + int col_amount; + int ret; + + if(!data) + return -ENOENT; + + if (g_strcmp0(data->req_name, "telecom/mch.vcf") == 0) { query = NEW_MISSED_CALLS_LIST; col_amount = PULL_QUERY_COL_AMOUNT; pull_cb = pull_newmissedcalls; - } else if (params->maxlistcount == 0) { - query = name2count_query(name); + } else if (data->params->maxlistcount == 0) { + query = name2count_query(data->req_name); col_amount = COUNT_QUERY_COL_AMOUNT; pull_cb = pull_contacts_size; } else { - query = name2query(name); + query = name2query(data->req_name); col_amount = PULL_QUERY_COL_AMOUNT; pull_cb = pull_contacts; } - if (query == NULL) { - if (err) - *err = -ENOENT; - return NULL; - } + if (query == NULL) + return -ENOENT; - data = g_new0(struct phonebook_data, 1); - data->params = params; - data->user_data = user_data; - data->cb = cb; ret = query_tracker(query, col_amount, pull_cb, data); - if (err) - *err = ret; - return data; + return ret; } void *phonebook_get_entry(const char *folder, const char *id, |