diff options
author | Sivaiah Nallagatla <snallagatla@novell.com> | 2004-04-05 07:07:59 +0000 |
---|---|---|
committer | Sivaiah Nallagatla <siva@src.gnome.org> | 2004-04-05 07:07:59 +0000 |
commit | be5a70031663cad23f866ceba59c0226b2f64ddb (patch) | |
tree | 02512a455abc9fca57dd641d2b5f50c93ce0141c | |
parent | bfce4d2af331227212d4980f357b3cbacbec1441 (diff) | |
download | evolution-data-server-be5a70031663cad23f866ceba59c0226b2f64ddb.tar.gz |
added code to build groupwise filter from the query passed to
2004-04-05 Sivaiah Nallagatla <snallagatla@novell.com>
* e-book-backend-groupwise.c : added code to build groupwise filter from
the query passed to get_contact_list and start_book_view functions
modified e_book_backend_groupwise_start_book_view and
e_book_backend_groupwise_get_contact_list to make use of filter
Also included gnome-i8n.h
-rw-r--r-- | addressbook/ChangeLog | 8 | ||||
-rw-r--r-- | addressbook/backends/groupwise/e-book-backend-groupwise.c | 392 |
2 files changed, 377 insertions, 23 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 2c4248b33..e9109920b 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,11 @@ +2004-04-05 Sivaiah Nallagatla <snallagatla@novell.com> + + * e-book-backend-groupwise.c : added code to build groupwise filter from + the query passed to get_contact_list and start_book_view functions + modified e_book_backend_groupwise_start_book_view and + e_book_backend_groupwise_get_contact_list to make use of filter + Also included gnome-i8n.h + 2004-04-02 Dan Winship <danw@ximian.com> * libedata-book/e-book-backend-sync.c diff --git a/addressbook/backends/groupwise/e-book-backend-groupwise.c b/addressbook/backends/groupwise/e-book-backend-groupwise.c index 6bd90873f..73bc671e1 100644 --- a/addressbook/backends/groupwise/e-book-backend-groupwise.c +++ b/addressbook/backends/groupwise/e-book-backend-groupwise.c @@ -13,14 +13,17 @@ #include <libebook/e-contact.h> - +#include <libgnome/gnome-i18n.h> +#include <libedataserver/e-sexp.h> #include <libedata-book/e-book-backend-sexp.h> #include <libedata-book/e-book-backend-summary.h> #include <libedata-book/e-data-book.h> #include <libedata-book/e-data-book-view.h> #include "e-book-backend-groupwise.h" -#include <e-gw-connection.h> +#include <e-gw-connection.h> #include <e-gw-item.h> +#include <e-gw-filter.h> +#include <libgnome/gnome-i18n.h> static EBookBackendClass *e_book_backend_groupwise_parent_class; @@ -985,7 +988,348 @@ e_book_backend_groupwise_get_contact (EBookBackend *backend, } +typedef struct { + EGwFilter *filter; + gboolean is_filter_valid; + gboolean is_personal_book; +} EBookBackendGroupwiseSExpData; + +static ESExpResult * +func_and(ESExp *f, int argc, ESExpResult **argv, void *data) +{ + ESExpResult *r; + EGwFilter *filter; + EBookBackendGroupwiseSExpData *sexp_data; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + filter = E_GW_FILTER (sexp_data->filter); + if (argc > 0) + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_AND, argc); + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + r->value.bool = FALSE; + + return r; +} + +static ESExpResult * +func_or(ESExp *f, int argc, ESExpResult **argv, void *data) +{ + ESExpResult *r; + EGwFilter *filter; + EBookBackendGroupwiseSExpData *sexp_data; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + filter = E_GW_FILTER (sexp_data->filter); + if (argc > 0) + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, argc); + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + r->value.bool = FALSE; + + return r; +} + +static ESExpResult * +func_not(ESExp *f, int argc, ESExpResult **argv, void *data) +{ + ESExpResult *r; + EGwFilter *filter; + EBookBackendGroupwiseSExpData *sexp_data; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + filter = E_GW_FILTER (sexp_data->filter); + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_NOT, 1); + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + r->value.bool = FALSE; + + return r; +} + +static ESExpResult * +func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) +{ + ESExpResult *r; + EGwFilter *filter; + EBookBackendGroupwiseSExpData *sexp_data; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + filter = E_GW_FILTER (sexp_data->filter); + + if (argc == 2 + && argv[0]->type == ESEXP_RES_STRING + && argv[1]->type == ESEXP_RES_STRING) { + char *propname = argv[0]->value.string; + char *str = argv[1]->value.string; + char *gw_field_name; + + gw_field_name = NULL; + if (g_str_equal (propname, "full_name")) + gw_field_name = "fullName"; + else if (g_str_equal (propname, "email")) + gw_field_name = "emailList/email"; + else if (g_str_equal (propname, "file_as") || g_str_equal (propname, "nickname")) + gw_field_name = "fullName/displayName"; + + + if (gw_field_name) { + if (g_str_equal (gw_field_name, "fullName")) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_CONTAINS, "fullName/firstName", str); + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_CONTAINS, "fullName/lastName", str); + if (sexp_data->is_personal_book) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_CONTAINS, "fullName/displayName", str); + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 3); + } + else + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 2); + } + else if (sexp_data->is_personal_book) + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_CONTAINS, gw_field_name, str); + else + sexp_data->is_filter_valid = FALSE; + } + else + sexp_data->is_filter_valid = FALSE; + } + + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + r->value.bool = FALSE; + return r; +} + +static ESExpResult * +func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) +{ + ESExpResult *r; + EGwFilter *filter; + EBookBackendGroupwiseSExpData *sexp_data; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + filter = E_GW_FILTER (sexp_data->filter); + + if (argc == 2 + && argv[0]->type == ESEXP_RES_STRING + && argv[1]->type == ESEXP_RES_STRING) { + char *propname = argv[0]->value.string; + char *str = argv[1]->value.string; + char *gw_field_name; + + gw_field_name = NULL; + if (g_str_equal (propname, "full_name")) + gw_field_name = "FullName"; + else if (g_str_equal (propname, "email")) + gw_field_name = "emailList/email"; + else if (g_str_equal (propname, "file_as") || g_str_equal (propname, "nickname")) + gw_field_name = "fullName/displayName"; + + if (gw_field_name) { + if (g_str_equal (gw_field_name, "fullName")) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EQUAL, "fullName/firstName", str); + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EQUAL, "fullName/lastName", str); + if (sexp_data->is_personal_book) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EQUAL, "fullName/displayName", str); + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 3); + } + else + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 2); + } + else if (sexp_data->is_personal_book) + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EQUAL, gw_field_name, str); + else + sexp_data->is_filter_valid = FALSE; + } + else + sexp_data->is_filter_valid = FALSE; + + } + + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + r->value.bool = FALSE; + + return r; +} + +static ESExpResult * +func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) +{ + + ESExpResult *r; + EGwFilter *filter; + EBookBackendGroupwiseSExpData *sexp_data; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + filter = E_GW_FILTER (sexp_data->filter); + + if (argc == 2 + && argv[0]->type == ESEXP_RES_STRING + && argv[1]->type == ESEXP_RES_STRING) { + char *propname = argv[0]->value.string; + char *str = argv[1]->value.string; + char *gw_field_name; + + gw_field_name = NULL; + if (g_str_equal (propname, "full_name")) + gw_field_name = "fullName"; + else if (g_str_equal (propname, "email")) + gw_field_name = "emailList/email"; + else if (g_str_equal (propname, "file_as") || g_str_equal (propname, "nickname")) + gw_field_name = "fullName/displayName"; + if (gw_field_name) { + + if (g_str_equal (gw_field_name, "fullName")) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_BEGINS, "fullName/firstName", str); + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_BEGINS, "fullName/lastName", str); + if (sexp_data->is_personal_book) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_BEGINS, "fullName/displayName", str); + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 3); + } + else + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 2); + } + else if (sexp_data->is_personal_book) + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_BEGINS, gw_field_name, str); + else + sexp_data->is_filter_valid = FALSE; + } + else + sexp_data->is_filter_valid = FALSE; + + + + } + + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + r->value.bool = FALSE; + + return r; +} + +static ESExpResult * +func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) +{ + EBookBackendGroupwiseSExpData *sexp_data; + ESExpResult *r; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + sexp_data->is_filter_valid = FALSE; + + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + + r->value.bool = FALSE; + + return r; +} + +static ESExpResult * +func_exists(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) +{ + ESExpResult *r; + EGwFilter *filter; + EBookBackendGroupwiseSExpData *sexp_data; + + sexp_data = (EBookBackendGroupwiseSExpData *) data; + filter = E_GW_FILTER (sexp_data->filter); + + if (argc == 1 + && argv[0]->type == ESEXP_RES_STRING) { + char *propname = argv[0]->value.string; + char *str = argv[1]->value.string; + char *gw_field_name; + + gw_field_name = NULL; + if (g_str_equal (propname, "full_name")) + gw_field_name = "fullName"; + else if (g_str_equal (propname, "email")) + gw_field_name = "emailList/email"; + else if (g_str_equal (propname, "file_as") || g_str_equal (propname, "nickname")) + gw_field_name = "fullName/displayName"; + + if (gw_field_name) { + + if (g_str_equal (gw_field_name, "fullName")) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EXISTS, "fullName/firstName", str); + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EXISTS, "fullName/lastName", str); + if (sexp_data->is_personal_book) { + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EXISTS, "fullName/displayName", str); + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 3); + } + else + e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_OR, 2); + } + else if (sexp_data->is_personal_book) + e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EXISTS, gw_field_name, str); + else + sexp_data->is_filter_valid = FALSE; + } + else + sexp_data->is_filter_valid = FALSE; + + } + + r = e_sexp_result_new(f, ESEXP_RES_BOOL); + r->value.bool = FALSE; + + return r; +} +/* 'builtin' functions */ +static struct { + char *name; + ESExpFunc *func; + int type; /* set to 1 if a function can perform shortcut evaluation, or + doesn't execute everything, 0 otherwise */ +} symbols[] = { + { "and", func_and, 0 }, + { "or", func_or, 0 }, + { "not", func_not, 0 }, + { "contains", func_contains, 0 }, + { "is", func_is, 0 }, + { "beginswith", func_beginswith, 0 }, + { "endswith", func_endswith, 0 }, + { "exists", func_exists, 0 }, +}; + + +static EGwFilter* +e_book_backend_groupwise_build_gw_filter (EBookBackendGroupwise *ebgw, const char *query ) +{ + ESExp *sexp; + ESExpResult *r; + EBookBackendGroupwiseSExpData *sexp_data; + EGwFilter *filter; + int i; + + + sexp = e_sexp_new(); + filter = e_gw_filter_new (); + + sexp_data = g_new0 (EBookBackendGroupwiseSExpData, 1); + sexp_data->filter = filter; + sexp_data->is_filter_valid = TRUE; + sexp_data->is_personal_book = e_book_backend_is_writable ( E_BOOK_BACKEND (ebgw)); + + for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) { + if (symbols[i].type == 1) { + e_sexp_add_ifunction(sexp, 0, symbols[i].name, + (ESExpIFunc *)symbols[i].func, sexp_data); + } else { + e_sexp_add_function(sexp, 0, symbols[i].name, + symbols[i].func, sexp_data); + } + } + + e_sexp_input_text(sexp, query, strlen(query)); + e_sexp_parse(sexp); + r = e_sexp_eval(sexp); + e_sexp_result_free(sexp, r); + e_sexp_unref (sexp); + if (sexp_data->is_filter_valid) + return filter; + else { + g_object_unref (filter); + return NULL; + } + g_free (sexp_data); + +} static void @@ -999,8 +1343,9 @@ e_book_backend_groupwise_get_contact_list (EBookBackend *backend, GList *gw_items; EContact *contact; EBookBackendGroupwise *egwb; - gboolean search_needed; + gboolean match_needed; EBookBackendSExp *card_sexp = NULL; + EGwFilter *filter; egwb = E_BOOK_BACKEND_GROUPWISE (backend); vcard_list = NULL; @@ -1011,21 +1356,18 @@ e_book_backend_groupwise_get_contact_list (EBookBackend *backend, e_data_book_respond_get_contact_list (book, GNOME_Evolution_Addressbook_OtherError, NULL); return; } - /* FIXME currently contacts received form Gw Server are checked for match against the query. - Instead of this Groupwise filter should be formed frm the query and given as input to get items calls - to make things more efficient */ - - search_needed = TRUE; - if ( g_str_equal(query, "(contains \"x-evolution-any-field\" \"\")")) - search_needed = FALSE; - printf ("query is %s\n", query); + + match_needed = TRUE; + filter = e_book_backend_groupwise_build_gw_filter (egwb, query); + if (filter) + match_needed = FALSE; card_sexp = e_book_backend_sexp_new (query); if (!card_sexp) { e_data_book_respond_get_contact_list (book, GNOME_Evolution_Addressbook_ContactNotFound, vcard_list); } - status = e_gw_connection_get_items (egwb->priv->cnc, egwb->priv->container_id, NULL, NULL, &gw_items); + status = e_gw_connection_get_items (egwb->priv->cnc, egwb->priv->container_id, NULL, filter, &gw_items); if (status != E_GW_CONNECTION_STATUS_OK) { e_data_book_respond_get_contact_list (book, GNOME_Evolution_Addressbook_OtherError, NULL); @@ -1034,7 +1376,9 @@ e_book_backend_groupwise_get_contact_list (EBookBackend *backend, for (; gw_items != NULL; gw_items = g_list_next(gw_items)) { contact = e_contact_new (); fill_contact_from_gw_item (contact, E_GW_ITEM (gw_items->data), egwb->priv->categories_by_id); - if ( (!search_needed) || e_book_backend_sexp_match_contact (card_sexp, contact)) + if ( match_needed && e_book_backend_sexp_match_contact (card_sexp, contact)) + vcard_list = g_list_append (vcard_list, e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30)); + else vcard_list = g_list_append (vcard_list, e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30)); g_object_unref (contact); g_object_unref (gw_items->data); @@ -1042,7 +1386,8 @@ e_book_backend_groupwise_get_contact_list (EBookBackend *backend, e_data_book_respond_get_contact_list (book, GNOME_Evolution_Addressbook_Success, vcard_list); - + if (filter) + g_object_unref (filter); } @@ -1055,7 +1400,9 @@ e_book_backend_groupwise_start_book_view (EBookBackend *backend, GList *gw_items; EContact *contact; EBookBackendGroupwise *gwb; - + const char *query; + EGwFilter *filter; + gwb = E_BOOK_BACKEND_GROUPWISE (backend); gw_items = NULL; @@ -1063,9 +1410,11 @@ e_book_backend_groupwise_start_book_view (EBookBackend *backend, e_data_book_view_notify_complete (book_view, GNOME_Evolution_Addressbook_OtherError); return; } - e_data_book_view_notify_status_message (book_view, "Searching..."); - status = e_gw_connection_get_items (gwb->priv->cnc, gwb->priv->container_id, NULL, NULL, &gw_items); - + e_data_book_view_notify_status_message (book_view, _("Searching...")); + query = e_data_book_view_get_card_query (book_view); + filter = e_book_backend_groupwise_build_gw_filter (gwb, query); + status = e_gw_connection_get_items (gwb->priv->cnc, gwb->priv->container_id, NULL, filter, &gw_items); + if (status != E_GW_CONNECTION_STATUS_OK) { e_data_book_view_notify_complete (book_view, GNOME_Evolution_Addressbook_OtherError); return; @@ -1073,7 +1422,6 @@ e_book_backend_groupwise_start_book_view (EBookBackend *backend, for (; gw_items != NULL; gw_items = g_list_next(gw_items)) { contact = e_contact_new (); fill_contact_from_gw_item (contact, E_GW_ITEM (gw_items->data), gwb->priv->categories_by_id); - printf ("contact = %s\n", e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30)); e_data_book_view_notify_update (book_view, contact); g_object_unref(contact); g_object_unref (gw_items->data); @@ -1081,7 +1429,8 @@ e_book_backend_groupwise_start_book_view (EBookBackend *backend, } e_data_book_view_notify_complete (book_view, GNOME_Evolution_Addressbook_Success); - + if (filter) + g_object_unref (filter); } static void @@ -1124,13 +1473,11 @@ e_book_backend_groupwise_authenticate_user (EBookBackend *backend, e_data_book_respond_authenticate_user (book, GNOME_Evolution_Addressbook_OtherError); return; } - printf ("authenitcating user\n"); id = NULL; is_writable = FALSE; status = e_gw_connection_get_address_book_id (priv->cnc, priv->book_name, &id, &is_writable); if (status == E_GW_CONNECTION_STATUS_OK) { if ( (id == NULL) && !priv->only_if_exists ) { - printf ("creating address book %s\n", priv->book_name); status = e_gw_connection_create_book (priv->cnc, priv->book_name, &id); if (status != E_GW_CONNECTION_STATUS_OK ) { e_data_book_respond_authenticate_user (book, GNOME_Evolution_Addressbook_OtherError); @@ -1201,7 +1548,6 @@ e_book_backend_groupwise_load_source (EBookBackend *backend, if(book_name == NULL) return GNOME_Evolution_Addressbook_OtherError; priv->book_name = g_strdup (book_name); - printf ("is already existing %d\n", priv->only_if_exists); e_book_backend_set_is_loaded (E_BOOK_BACKEND (backend), TRUE); e_book_backend_set_is_writable (E_BOOK_BACKEND(backend), FALSE); return GNOME_Evolution_Addressbook_Success; |