diff --git a/obexd/plugins/phonebook-ebook.c b/obexd/plugins/phonebook-ebook.c
index 0b2878a..2ee5473 100644
--- a/obexd/plugins/phonebook-ebook.c
+++ b/obexd/plugins/phonebook-ebook.c
char *id;
unsigned queued_calls;
void *user_data;
+ GSList *ebooks;
};
-static GSList *ebooks = NULL;
-
static char *attribute_mask[] = {
/* 0 */ "VERSION",
"FN",
};
+static void close_ebooks(GSList *ebooks)
+{
+ g_slist_free_full(ebooks, g_object_unref);
+}
+
static void free_query_context(struct query_context *data)
{
g_free(data->id);
if (data->query != NULL)
e_book_query_unref(data->query);
+ close_ebooks(data->ebooks);
+
g_free(data);
}
data->ready_cb(data->user_data);
}
-static int traverse_sources(GSList *sources, char *default_src) {
+static GSList *traverse_sources(GSList *ebooks, GSList *sources,
+ char *default_src) {
GError *gerr;
while (sources != NULL) {
sources = sources->next;
}
- return 0;
+ return ebooks;
}
int phonebook_init(void)
{
+ g_type_init();
+
+ return 0;
+}
+
+static GSList *open_ebooks(void)
+{
GError *gerr;
ESourceList *src_list;
GSList *list;
gchar *default_src = NULL;
- int status = 0;
-
- if (ebooks)
- return 0;
-
- g_type_init();
+ GSList *ebooks = NULL;
if (e_book_get_addressbooks(&src_list, &gerr) == FALSE) {
error("Can't list user's address books: %s", gerr->message);
g_error_free(gerr);
- status = -EIO;
- goto fail;
+ return NULL;
}
list = e_source_list_peek_groups(src_list);
GSList *sources = e_source_group_peek_sources(group);
- traverse_sources(sources, default_src);
+ ebooks = traverse_sources(ebooks, sources, default_src);
list = list->next;
}
- return status;
-
-fail:
- g_slist_free_full(ebooks, g_object_unref);
- g_object_unref(src_list);
-
- return status;
+ return ebooks;
}
void phonebook_exit(void)
{
- DBG("");
-
- if (ebooks == NULL)
- return;
-
- g_slist_free_full(ebooks, g_object_unref);
- ebooks = NULL;
}
char *phonebook_set_folder(const char *current_folder,
void phonebook_req_finalize(void *request)
{
struct query_context *data = request;
- GSList *ebook = ebooks;
+ GSList *ebook = data->ebooks;
DBG("");
data->params = params;
data->user_data = user_data;
data->buf = g_string_new("");
+ data->query = e_book_query_any_field_contains("");
+ data->ebooks = open_ebooks();
if (err)
- *err = 0;
+ *err = data->ebooks == NULL ? -EIO : 0;
return data;
}
if (!data)
return -ENOENT;
- data->query = e_book_query_any_field_contains("");
-
- ebook = ebooks;
+ ebook = data->ebooks;
while (ebook != NULL) {
if (e_book_is_opened(ebook->data) == TRUE) {
ret = e_book_get_contacts_async(ebook->data,
data->params = params;
data->user_data = user_data;
data->id = g_strdup(id);
+ data->ebooks = open_ebooks();
- ebook = ebooks;
+ ebook = data->ebooks;
while (ebook != NULL) {
if (e_book_is_opened(ebook->data) == TRUE) {
ret = e_book_get_contact_async(ebook->data, data->id,
EVCardAttribute *attrib;
char *uid, *tel, *cname;
-
if (g_strcmp0("/telecom/pb", name) != 0) {
if (err)
*err = -ENOENT;
data->ready_cb = ready_cb;
data->user_data = user_data;
data->query = query;
+ data->ebooks = open_ebooks();
/* Add 0.vcf */
if (e_book_get_self(&me, &eb, &gerr) == FALSE) {
g_object_unref(eb);
next:
- ebook = ebooks;
+ ebook = data->ebooks;
while (ebook != NULL) {
if (e_book_is_opened(ebook->data) == TRUE) {
ret = e_book_get_contacts_async(ebook->data, query,