aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook')
-rw-r--r--addressbook/ChangeLog15
-rw-r--r--addressbook/backend/pas/pas-backend-ldap.c38
-rw-r--r--addressbook/gui/component/addressbook-config.c12
-rw-r--r--addressbook/gui/component/addressbook-config.glade78
-rw-r--r--addressbook/gui/component/addressbook-storage.c56
-rw-r--r--addressbook/gui/component/addressbook-storage.h1
6 files changed, 190 insertions, 10 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 507ee7ed35..770acc94e2 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,18 @@
+2002-01-21 Christopher James Lahey <clahey@ximian.com>
+
+ * backend/pas/pas-backend-ldap.c (ldap_search_handler): Set the
+ number of cards to return to the value specified in the ldap uri,
+ leaving the default at 100. Fixes Ximian bug #13953.
+
+ * gui/component/addressbook-config.c (addressbook_source_dialog),
+ gui/component/addressbook-config.glade: Added a limit entry here
+ to edit the limit field of the source.
+
+ * gui/component/addressbook-storage.c,
+ gui/component/addressbook-storage.h
+ (addressbook_storage_init_source_uri): Added a limit field to this
+ class and pass that value through in the uri that's generated.
+
2002-01-18 Christopher James Lahey <clahey@ximian.com>
* backend/ebook/e-card-compare.c: Made username match with no
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c
index 1432133fd3..ff5c29168b 100644
--- a/addressbook/backend/pas/pas-backend-ldap.c
+++ b/addressbook/backend/pas/pas-backend-ldap.c
@@ -44,6 +44,8 @@
#include "pas-book.h"
#include "pas-card-cursor.h"
+#include <stdlib.h>
+
#define LDAP_MAX_SEARCH_RESPONSES 100
@@ -69,6 +71,7 @@ struct _PASBackendLDAPPrivate {
gchar *ldap_rootdn;
int ldap_port;
int ldap_scope;
+ int ldap_limit;
GList *book_views;
LDAP *ldap;
@@ -2285,7 +2288,7 @@ ldap_search_handler (PASBackend *backend, LDAPOp *op)
NULL, /* XXX */
NULL, /* XXX */
NULL,
- LDAP_MAX_SEARCH_RESPONSES, &view->search_msgid);
+ bl->priv->ldap_limit, &view->search_msgid);
if (ldap_err != LDAP_SUCCESS) {
pas_book_view_notify_status_message (view->book_view, ldap_err2string(ldap_err));
@@ -2538,10 +2541,39 @@ pas_backend_ldap_load_uri (PASBackend *backend,
PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend);
LDAPURLDesc *lud;
int ldap_error;
+ char **attributes;
+ int i;
+ int limit = 100;
g_assert (bl->priv->connected == FALSE);
- ldap_error = ldap_url_parse ((char*)uri, &lud);
+ attributes = g_strsplit (uri, ";", 0);
+
+ if (attributes[0] == NULL)
+ return FALSE;
+
+ for (i = 1; attributes[i]; i++) {
+ char *equals;
+ char *value;
+ int key_length;
+ equals = strchr (attributes[i], '=');
+ if (equals) {
+ key_length = equals - attributes[i];
+ value = equals + 1;
+ } else {
+ key_length = strlen (attributes[i]);
+ value = NULL;
+ }
+
+ if (key_length == strlen("limit") && !strncmp (attributes[i], "limit", key_length)) {
+ if (value)
+ limit = atoi(value);
+ }
+ }
+
+ ldap_error = ldap_url_parse ((char*)attributes[0], &lud);
+ g_strfreev (attributes);
+
if (ldap_error == LDAP_SUCCESS) {
g_free(bl->priv->uri);
bl->priv->uri = g_strdup (uri);
@@ -2551,6 +2583,7 @@ pas_backend_ldap_load_uri (PASBackend *backend,
if (bl->priv->ldap_port == 0)
bl->priv->ldap_port = LDAP_PORT;
bl->priv->ldap_rootdn = g_strdup(lud->lud_dn);
+ bl->priv->ldap_limit = limit;
bl->priv->ldap_scope = lud->lud_scope;
ldap_free_urldesc(lud);
@@ -2746,6 +2779,7 @@ pas_backend_ldap_init (PASBackendLDAP *backend)
priv = g_new0 (PASBackendLDAPPrivate, 1);
priv->supported_fields = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL);
+ priv->ldap_limit = 100;
backend->priv = priv;
}
diff --git a/addressbook/gui/component/addressbook-config.c b/addressbook/gui/component/addressbook-config.c
index de65019a97..33feb391ab 100644
--- a/addressbook/gui/component/addressbook-config.c
+++ b/addressbook/gui/component/addressbook-config.c
@@ -13,6 +13,7 @@
#include <e-util/e-html-utils.h>
#include "addressbook-config.h"
#include "addressbook-storage.h"
+#include <stdlib.h>
typedef struct _AddressbookSourceDialog AddressbookSourceDialog;
typedef struct _AddressbookSourcePageItem AddressbookSourcePageItem;
@@ -33,6 +34,7 @@ struct _AddressbookSourceDialog {
GtkWidget *port;
GtkWidget *rootdn;
+ GtkWidget *limit;
GtkWidget *scope_optionmenu;
AddressbookLDAPScopeType ldap_scope;
GtkWidget *auth_checkbutton;
@@ -126,11 +128,15 @@ add_focus_handler (GtkWidget *widget, GtkWidget *notebook, int page_num)
static void
addressbook_source_dialog_set_source (AddressbookSourceDialog *dialog, AddressbookSource *source)
{
+ char *string;
e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->name), source ? source->name : "");
e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->host), source ? source->host : "");
e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->email), source ? source->email_addr : "");
e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->port), source ? source->port : "389");
e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->rootdn), source ? source->rootdn : "");
+ string = g_strdup_printf ("%d", source ? source->limit : 100);
+ e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->limit), string);
+ g_free (string);
gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->scope_optionmenu), source ? source->scope : ADDRESSBOOK_LDAP_SCOPE_ONELEVEL);
dialog->ldap_scope = source ? source->scope : ADDRESSBOOK_LDAP_SCOPE_ONELEVEL;
@@ -150,6 +156,7 @@ addressbook_source_dialog_get_source (AddressbookSourceDialog *dialog)
source->email_addr = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->email));
source->port = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->port));
source->rootdn = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->rootdn));
+ source->limit = atoi(e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->limit)));
source->scope = dialog->ldap_scope;
source->auth = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->auth_checkbutton))
? ADDRESSBOOK_LDAP_AUTH_SIMPLE : ADDRESSBOOK_LDAP_AUTH_NONE);
@@ -235,6 +242,11 @@ addressbook_source_dialog (GladeXML *gui, AddressbookSource *source, GtkWidget *
menu = gtk_option_menu_get_menu (GTK_OPTION_MENU(dialog->scope_optionmenu));
gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback)add_activate_cb, dialog);
+ dialog->limit = glade_xml_get_widget (gui, "limit-entry");
+ gtk_signal_connect (GTK_OBJECT (dialog->limit), "changed",
+ GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog);
+ add_focus_handler (dialog->limit, dialog->advanced_notebook, 3);
+
/* fill in source info if there is some */
addressbook_source_dialog_set_source (dialog, source);
diff --git a/addressbook/gui/component/addressbook-config.glade b/addressbook/gui/component/addressbook-config.glade
index 50241167c2..50b36e2462 100644
--- a/addressbook/gui/component/addressbook-config.glade
+++ b/addressbook/gui/component/addressbook-config.glade
@@ -432,7 +432,7 @@
<class>GtkTable</class>
<name>table2</name>
<border_width>3</border_width>
- <rows>3</rows>
+ <rows>4</rows>
<columns>2</columns>
<homogeneous>False</homogeneous>
<row_spacing>3</row_spacing>
@@ -604,6 +604,57 @@ Sub
<initial_choice>0</initial_choice>
</widget>
</widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label49</name>
+ <label>_Download Limit</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <default_focus_target>limit-entry</default_focus_target>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>limit-entry</name>
+ <can_focus>True</can_focus>
+ <editable>True</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text>100</text>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ </widget>
</widget>
<widget>
@@ -696,6 +747,31 @@ Sub
<xpad>0</xpad>
<ypad>0</ypad>
</widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label51</name>
+ <label>This is the maximum number of cards to download. Setting this number too large will slow down this addressbook.</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>True</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <child_name>Notebook:tab</child_name>
+ <name>label50</name>
+ <label>label50</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>True</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
</widget>
</widget>
diff --git a/addressbook/gui/component/addressbook-storage.c b/addressbook/gui/component/addressbook-storage.c
index 8f22ac359a..ed8a58ed11 100644
--- a/addressbook/gui/component/addressbook-storage.c
+++ b/addressbook/gui/component/addressbook-storage.c
@@ -31,6 +31,7 @@
<rootdn></rootdn>
<authmethod>simple</authmethod>
<emailaddr>toshok@blubag.com</emailaddr>
+ <limit>100</limit>
<rememberpass/>
</contactserver>
</addressbooks>
@@ -231,6 +232,30 @@ get_string_value (xmlNode *node,
return retval;
}
+
+static int
+get_integer_value (xmlNode *node,
+ const char *name,
+ int defval)
+{
+ xmlNode *p;
+ xmlChar *xml_string;
+ int retval;
+
+ p = e_xml_get_child_by_name (node, (xmlChar *) name);
+ if (p == NULL)
+ return defval;
+
+ p = e_xml_get_child_by_name (p, (xmlChar *) "text");
+ if (p == NULL) /* there's no text between the tags, return the default */
+ return defval;
+
+ xml_string = xmlNodeListGetString (node->doc, p, 1);
+ retval = atoi (xml_string);
+ xmlFree (xml_string);
+
+ return retval;
+}
#endif
static char *
@@ -299,9 +324,15 @@ addressbook_storage_init_source_uri (AddressbookSource *source)
if (source->uri)
g_free (source->uri);
- source->uri = g_strdup_printf ("ldap://%s:%s/%s??%s",
- source->host, source->port,
- source->rootdn, ldap_unparse_scope(source->scope));
+ if (source->limit != 100)
+ source->uri = g_strdup_printf ("ldap://%s:%s/%s?"/*trigraph prevention*/ "?%s;limit=%d",
+ source->host, source->port,
+ source->rootdn, ldap_unparse_scope(source->scope),
+ source->limit);
+ else
+ source->uri = g_strdup_printf ("ldap://%s:%s/%s?"/*trigraph prevention*/ "?%s",
+ source->host, source->port,
+ source->rootdn, ldap_unparse_scope(source->scope));
}
#ifdef HAVE_LDAP
@@ -330,7 +361,7 @@ load_source_data (const char *file_path)
if (rv < 0) {
g_error ("Failed to rename %s: %s\n",
- ADDRESSBOOK_SOURCES_XML,
+ file_path,
strerror(errno));
return FALSE;
} else
@@ -361,6 +392,7 @@ load_source_data (const char *file_path)
source->scope = ldap_parse_scope (get_string_value (child, "scope"));
source->auth = ldap_parse_auth (get_string_value (child, "authmethod"));
source->email_addr = get_string_value (child, "emailaddr");
+ source->limit = get_integer_value (child, "limit", 100);
}
else {
g_warning ("unknown node '%s' in %s", child->name, file_path);
@@ -414,6 +446,15 @@ ldap_source_foreach(AddressbookSource *source, xmlNode *root)
(xmlChar *) ldap_unparse_scope(source->scope));
xmlNewChild (source_root, NULL, (xmlChar *) "authmethod",
(xmlChar *) ldap_unparse_auth(source->auth));
+
+ if (source->limit != 100) {
+ char *string;
+ string = g_strdup_printf ("%d", source->limit);
+ xmlNewChild (source_root, NULL, (xmlChar *) "limit",
+ (xmlChar *) string);
+ g_free (string);
+ }
+
if (source->auth == ADDRESSBOOK_LDAP_AUTH_SIMPLE) {
xmlNewChild (source_root, NULL, (xmlChar *) "emailaddr",
(xmlChar *) source->email_addr);
@@ -445,7 +486,7 @@ save_source_data (const char *file_path)
xmlDocDumpMemory (doc, &buf, &buf_size);
if (buf == NULL) {
- g_error ("Failed to write %s: xmlBufferCreate() == NULL", ADDRESSBOOK_SOURCES_XML);
+ g_error ("Failed to write %s: xmlBufferCreate() == NULL", file_path);
return FALSE;
}
@@ -454,13 +495,13 @@ save_source_data (const char *file_path)
close (fd);
if (0 > rv) {
- g_error ("Failed to write new %s: %s\n", ADDRESSBOOK_SOURCES_XML, strerror(errno));
+ g_error ("Failed to write new %s: %s\n", file_path, strerror(errno));
unlink (new_path);
return FALSE;
}
else {
if (0 > rename (new_path, file_path)) {
- g_error ("Failed to rename %s: %s\n", ADDRESSBOOK_SOURCES_XML, strerror(errno));
+ g_error ("Failed to rename %s: %s\n", file_path, strerror(errno));
unlink (new_path);
return FALSE;
}
@@ -597,6 +638,7 @@ addressbook_source_copy (const AddressbookSource *source)
copy->auth = source->auth;
copy->email_addr = g_strdup (source->email_addr);
copy->remember_passwd = source->remember_passwd;
+ copy->limit = source->limit;
return copy;
}
diff --git a/addressbook/gui/component/addressbook-storage.h b/addressbook/gui/component/addressbook-storage.h
index 8416d4de83..b59ec467f7 100644
--- a/addressbook/gui/component/addressbook-storage.h
+++ b/addressbook/gui/component/addressbook-storage.h
@@ -57,6 +57,7 @@ typedef struct {
char *email_addr; /* used in AUTH_SIMPLE */
gboolean remember_passwd;
char *uri; /* filled in from the above */
+ int limit;
} AddressbookSource;
void addressbook_storage_setup (EvolutionShellComponent *shell_component,