aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend/pas
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend/pas')
-rw-r--r--addressbook/backend/pas/pas-backend-file.c156
-rw-r--r--addressbook/backend/pas/pas-backend-ldap.c115
2 files changed, 148 insertions, 123 deletions
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
index a64a94c402..36310e0f43 100644
--- a/addressbook/backend/pas/pas-backend-file.c
+++ b/addressbook/backend/pas/pas-backend-file.c
@@ -20,7 +20,7 @@
#include "pas-backend-file.h"
#include "pas-book.h"
#include "pas-card-cursor.h"
-#include <ebook/e-card.h>
+#include <ebook/e-card-simple.h>
#include <e-util/e-sexp.h>
#include <e-util/e-util.h>
@@ -56,7 +56,7 @@ struct _PASBackendFileBookView {
};
struct _PASBackendFileSearchContext {
- ECard *ecard;
+ ECardSimple *card;
};
static long
@@ -157,65 +157,39 @@ pas_backend_file_create_unique_id (char *vcard)
}
static gboolean
-compare_email (ECard *ecard, const char *str,
+compare_email (ECardSimple *card, const char *str,
char *(*compare)(const char*, const char*))
{
- EList *prop_list;
- EIterator *iter;
- gboolean truth = FALSE;
-
- gtk_object_get(GTK_OBJECT(ecard),
- "email", &prop_list, NULL);
+ int i;
- iter = e_list_get_iterator(prop_list);
+ for (i = E_CARD_SIMPLE_EMAIL_ID_EMAIL; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) {
+ const char *email = e_card_simple_get_email (card, i);
- while (e_iterator_is_valid(iter)) {
-
- if (compare((char*)e_iterator_get(iter), str)) {
- truth = TRUE;
- break;
- }
- else {
- e_iterator_next(iter);
- }
+ if (compare(email, str))
+ return TRUE;
}
- gtk_object_unref (GTK_OBJECT(iter));
-
- return truth;
+ return FALSE;
}
static gboolean
-compare_phone (ECard *ecard, const char *str,
+compare_phone (ECardSimple *card, const char *str,
char *(*compare)(const char*, const char*))
{
- EList *prop_list;
- EIterator *iter;
- gboolean truth = FALSE;
+ int i;
- gtk_object_get(GTK_OBJECT(ecard),
- "phone", &prop_list, NULL);
-
- iter = e_list_get_iterator(prop_list);
+ for (i = E_CARD_SIMPLE_PHONE_ID_ASSISTANT; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) {
+ const ECardPhone *phone = e_card_simple_get_phone (card, i);
- while (e_iterator_is_valid(iter)) {
- ECardPhone *phone = (ECardPhone*)e_iterator_get(iter);
- if (compare(phone->number, str)) {
- truth = TRUE;
- break;
- }
- else {
- e_iterator_next(iter);
- }
+ if (compare(phone->number, str))
+ return TRUE;
}
- gtk_object_unref (GTK_OBJECT(iter));
-
- return truth;
+ return FALSE;
}
static gboolean
-compare_address (ECard *ecard, const char *str,
+compare_address (ECardSimple *card, const char *str,
char *(*compare)(const char*, const char*))
{
g_warning("address searching not implemented\n");
@@ -223,34 +197,38 @@ compare_address (ECard *ecard, const char *str,
}
static struct prop_info {
+ ECardSimpleField field_id;
const char *query_prop;
const char *ecard_prop;
#define PROP_TYPE_NORMAL 0x01
#define PROP_TYPE_LIST 0x02
#define PROP_TYPE_LISTITEM 0x03
int prop_type;
- gboolean (*list_compare)(ECard *ecard, const char *str,
+ gboolean (*list_compare)(ECardSimple *ecard, const char *str,
char *(*compare)(const char*, const char*));
} prop_info_table[] = {
+#define NORMAL_PROP(f,q,e) {f, q, e, PROP_TYPE_NORMAL, NULL}
+#define LIST_PROP(q,e,c) {0, q, e, PROP_TYPE_LIST, c}
+
/* query prop, ecard prop, type, list compare function */
- { "file_as", "file_as", PROP_TYPE_NORMAL, NULL },
- { "full_name", "full_name", PROP_TYPE_NORMAL, NULL },
- { "url", "url", PROP_TYPE_NORMAL, NULL },
- { "mailer", "mailer", PROP_TYPE_NORMAL, NULL },
- { "org", "org", PROP_TYPE_NORMAL, NULL },
- { "org_unit", "org_unit", PROP_TYPE_NORMAL, NULL },
- { "office", "office", PROP_TYPE_NORMAL, NULL },
- { "title", "title", PROP_TYPE_NORMAL, NULL },
- { "role", "role", PROP_TYPE_NORMAL, NULL },
- { "manager", "manager", PROP_TYPE_NORMAL, NULL },
- { "assistant", "assistant", PROP_TYPE_NORMAL, NULL },
- { "nickname", "nickname", PROP_TYPE_NORMAL, NULL },
- { "spouse", "spouse", PROP_TYPE_NORMAL, NULL },
- { "email", "email", PROP_TYPE_LIST, compare_email },
- { "phone", "phone", PROP_TYPE_LIST, compare_phone },
- { "address", "address", PROP_TYPE_LIST, compare_address },
- { "note", "note", PROP_TYPE_NORMAL, NULL },
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_FILE_AS, "file_as", "file_as" ),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "full_name" ),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_URL, "url", "url" ),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_MAILER, "mailer", "mailer"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ORG, "org", "org"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ORG_UNIT, "org_unit", "org_unit"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_OFFICE, "office", "office"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_TITLE, "title", "title"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ROLE, "role", "role"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_MANAGER, "manager", "manager"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ASSISTANT, "assistant", "assistant"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_NICKNAME, "nickname", "nickname"),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_SPOUSE, "spouse", "spouse" ),
+ NORMAL_PROP ( E_CARD_SIMPLE_FIELD_NOTE, "note", "note"),
+ LIST_PROP ( "email", "email", compare_email ),
+ LIST_PROP ( "phone", "phone", compare_phone ),
+ LIST_PROP ( "address", "address", compare_address ),
};
static int num_prop_infos = sizeof(prop_info_table) / sizeof(prop_info_table[0]);
@@ -268,35 +246,41 @@ entry_compare(PASBackendFileSearchContext *ctx, struct _ESExp *f,
char *propname;
struct prop_info *info = NULL;
int i;
+ gboolean any_field;
propname = argv[0]->value.string;
+ any_field = !strcmp(propname, "x-evolution-any-field");
for (i = 0; i < num_prop_infos; i ++) {
- if (!strcmp (prop_info_table[i].query_prop, propname)) {
+ if (any_field
+ || strcmp (prop_info_table[i].query_prop, propname)) {
info = &prop_info_table[i];
- break;
- }
- }
-
- if (info) {
- if (info->prop_type == PROP_TYPE_NORMAL) {
- char *prop = NULL;
- /* searches where the query's property
- maps directly to an ecard property */
-
- gtk_object_get(GTK_OBJECT(ctx->ecard),
- info->ecard_prop, &prop, NULL);
-
- if (prop && compare(prop, argv[1]->value.string)) {
- truth = TRUE;
- }
- if ((!prop) && compare("", argv[1]->value.string)) {
- truth = TRUE;
+
+ if (info->prop_type == PROP_TYPE_NORMAL) {
+ char *prop = NULL;
+ /* searches where the query's property
+ maps directly to an ecard property */
+
+ prop = e_card_simple_get (ctx->card, info->field_id);
+
+ if (prop && compare(prop, argv[1]->value.string)) {
+ truth = TRUE;
+ }
+ if ((!prop) && compare("", argv[1]->value.string)) {
+ truth = TRUE;
+ }
}
- }
- else if (info->prop_type == PROP_TYPE_LIST) {
+ else if (info->prop_type == PROP_TYPE_LIST) {
/* the special searches that match any of the list elements */
- truth = info->list_compare (ctx->ecard, argv[1]->value.string, compare);
+ truth = info->list_compare (ctx->card, argv[1]->value.string, compare);
+ }
+
+ /* if we're looking at all fields and find a match,
+ or if we're just looking at this one field,
+ break. */
+ if ((any_field && truth)
+ || !any_field)
+ break;
}
}
@@ -389,17 +373,17 @@ vcard_matches_search (PASBackendFileBookView *view, char *vcard_string)
ESExpResult *r;
gboolean retval;
- view->search_context->ecard = e_card_new (vcard_string);
+ view->search_context->card = e_card_simple_new (e_card_new (vcard_string));
/* if it's not a valid vcard why is it in our db? :) */
- if (!view->search_context->ecard)
+ if (!view->search_context->card)
return FALSE;
r = e_sexp_eval(view->search_sexp);
retval = (r && r->type == ESEXP_RES_BOOL && r->value.bool);
- gtk_object_unref(GTK_OBJECT(view->search_context->ecard));
+ gtk_object_unref(GTK_OBJECT(view->search_context->card));
e_sexp_result_free(r);
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c
index 5257177328..3968648972 100644
--- a/addressbook/backend/pas/pas-backend-ldap.c
+++ b/addressbook/backend/pas/pas-backend-ldap.c
@@ -314,6 +314,36 @@ pas_backend_ldap_process_get_cursor (PASBackend *backend,
cursor);
}
+static void
+construct_email_list(ECardSimple *card, const char *prop, char **values)
+{
+ int i;
+
+ for (i = 0; values[i] && i < 3; i ++) {
+ e_card_simple_set_email (card, i, values[i]);
+ }
+}
+
+struct prop_info {
+ ECardSimpleField field_id;
+ char *query_prop;
+ char *ldap_attr;
+#define PROP_TYPE_NORMAL 0x01
+#define PROP_TYPE_LIST 0x02
+#define PROP_TYPE_LISTITEM 0x03
+ int prop_type;
+ void (*construct_list_func)(ECardSimple *card, const char *prop, char **values);
+} prop_info_table[] = {
+ /* field_id, query prop, ldap attr, type, list construct function */
+ { E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "cn", PROP_TYPE_NORMAL, NULL },
+ { E_CARD_SIMPLE_FIELD_TITLE, "title", "title", PROP_TYPE_NORMAL, NULL },
+ { E_CARD_SIMPLE_FIELD_ORG, "org", "o", PROP_TYPE_NORMAL, NULL },
+ { E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, "phone", "telephonenumber", PROP_TYPE_NORMAL, NULL },
+ { 0 /* unused */, "email", "mail", PROP_TYPE_LIST, construct_email_list },
+};
+
+static int num_prop_infos = sizeof(prop_info_table) / sizeof(prop_info_table[0]);
+
static ESExpResult *
func_and(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
@@ -415,18 +445,59 @@ func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data
&& argv[1]->type == ESEXP_RES_STRING) {
char *propname = argv[0]->value.string;
char *str = argv[1]->value.string;
- char *ldap_attr = query_prop_to_ldap(propname);
gboolean one_star = FALSE;
if (strlen(str) == 0)
one_star = TRUE;
- if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=*%s%s)",
- ldap_attr,
- str,
- one_star ? "" : "*"));
+ if (!strcmp (propname, "x-evolution-any-field")) {
+ int i;
+ int query_length;
+ char *big_query;
+ char *header, *footer;
+ char *match_str;
+
+ header = g_malloc0((num_prop_infos - 1) * 2 + 1);
+ footer = g_malloc0(num_prop_infos + 1);
+ for (i = 0; i < num_prop_infos - 1; i ++) {
+ strcat (header, "(|");
+ strcat (footer, ")");
+ }
+
+ match_str = g_strdup_printf("=*%s%s)",
+ str, one_star ? "" : "*");
+
+ query_length = strlen (header);
+
+ for (i = 0; i < num_prop_infos; i ++) {
+ query_length += 1 + strlen(prop_info_table[i].ldap_attr) + strlen (match_str);
+ }
+
+ big_query = g_malloc0(query_length + 1);
+ strcat (big_query, header);
+ for (i = 0; i < num_prop_infos; i ++) {
+ strcat (big_query, "(");
+ strcat (big_query, prop_info_table[i].ldap_attr);
+ strcat (big_query, match_str);
+ }
+ strcat (big_query, footer);
+
+ *list = g_list_prepend(*list, big_query);
+
+ g_free (match_str);
+ g_free (header);
+ g_free (footer);
+ }
+ else {
+ char *ldap_attr = query_prop_to_ldap(propname);
+
+ if (ldap_attr)
+ *list = g_list_prepend(*list,
+ g_strdup_printf("(%s=*%s%s)",
+ ldap_attr,
+ str,
+ one_star ? "" : "*"));
+ }
}
r = e_sexp_result_new(ESEXP_RES_BOOL);
@@ -578,36 +649,6 @@ pas_backend_ldap_build_query (gchar *query)
return retval;
}
-static void
-construct_email_list(ECardSimple *card, const char *prop, char **values)
-{
- int i;
-
- for (i = 0; values[i] && i < 3; i ++) {
- e_card_simple_set_email (card, i, values[i]);
- }
-}
-
-struct prop_info {
- ECardSimpleField field_id;
- char *query_prop;
- char *ldap_attr;
-#define PROP_TYPE_NORMAL 0x01
-#define PROP_TYPE_LIST 0x02
-#define PROP_TYPE_LISTITEM 0x03
- int prop_type;
- void (*construct_list_func)(ECardSimple *card, const char *prop, char **values);
-} prop_info_table[] = {
- /* field_id, query prop, ldap attr, type, list construct function */
- { E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "cn", PROP_TYPE_NORMAL, NULL },
- { E_CARD_SIMPLE_FIELD_TITLE, "title", "title", PROP_TYPE_NORMAL, NULL },
- { E_CARD_SIMPLE_FIELD_ORG, "org", "o", PROP_TYPE_NORMAL, NULL },
- { E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, "phone", "telephonenumber", PROP_TYPE_NORMAL, NULL },
- { 0 /* unused */, "email", "mail", PROP_TYPE_LIST, construct_email_list },
-};
-
-static int num_prop_infos = sizeof(prop_info_table) / sizeof(prop_info_table[0]);
-
static gchar *
query_prop_to_ldap(gchar *query_prop)
{