2008-09-20 [colin] 3.5.0cvs118
[claws.git] / src / ldapquery.c
index dd1d4720344ea4934bbcd6ffc64fd3dedb960877..60c10fec24da314aed448cedd7f4626274b1ec37 100644 (file)
@@ -32,6 +32,7 @@
 #include <string.h>
 #include <lber.h>
 
+#include "defs.h"
 #include "ldaputil.h"
 #include "ldapquery.h"
 #include "ldapctrl.h"
@@ -115,8 +116,9 @@ void ldapqry_set_control( LdapQuery *qry, LdapControl *ctl ) {
  */
 void ldapqry_set_name( LdapQuery* qry, const gchar *value ) {
        g_return_if_fail( qry != NULL );
-       g_return_if_fail( ADDRQUERY_NAME(qry) != NULL );
        ADDRQUERY_NAME(qry) = mgu_replace_string( ADDRQUERY_NAME(qry), value );
+       if (ADDRQUERY_NAME(qry) == NULL)
+               return;
        g_strstrip( ADDRQUERY_NAME(qry) );
        debug_print("set name: %s\n", ADDRQUERY_NAME(qry));
 }
@@ -128,8 +130,9 @@ void ldapqry_set_name( LdapQuery* qry, const gchar *value ) {
  */
 void ldapqry_set_search_value( LdapQuery *qry, const gchar *value ) {
        g_return_if_fail( qry != NULL );
-       g_return_if_fail( ADDRQUERY_SEARCHVALUE(qry) != NULL );
        ADDRQUERY_SEARCHVALUE(qry) = mgu_replace_string( ADDRQUERY_SEARCHVALUE(qry), value );
+       if (ADDRQUERY_SEARCHVALUE(qry) == NULL)
+               return;
        g_strstrip( ADDRQUERY_SEARCHVALUE(qry) );
        debug_print("search value: %s\n", ADDRQUERY_SEARCHVALUE(qry));
 }
@@ -157,7 +160,6 @@ void ldapqry_set_query_type( LdapQuery* qry, const gint value ) {
  */
 void ldapqry_set_search_type( LdapQuery *qry, const AddrSearchType value ) {
        g_return_if_fail( qry != NULL );
-       g_return_if_fail( ADDRQUERY_SEARCHTYPE(qry) != NULL );
        ADDRQUERY_SEARCHTYPE(qry) = value;
 }
 
@@ -168,7 +170,6 @@ void ldapqry_set_search_type( LdapQuery *qry, const AddrSearchType value ) {
  */
 void ldapqry_set_query_id( LdapQuery* qry, const gint value ) {
        g_return_if_fail( qry != NULL );
-       g_return_if_fail( ADDRQUERY_ID(qry) != NULL );
        ADDRQUERY_ID(qry) = value;
 }
 
@@ -414,9 +415,19 @@ static GSList *ldapqry_add_single_value( LDAP *ld, LDAPMessage *entry, char *att
 
        if( ( vals = ldap_get_values_len( ld, entry, attr ) ) != NULL ) {
                if( vals[0] != NULL ) {
-                       debug_print("sv\t%s: %s\n", attr?attr:"null",
-                                       vals[0]->bv_val?vals[0]->bv_val:"null");
-                       list = g_slist_append( list, g_strndup( vals[0]->bv_val, vals[0]->bv_len ));
+                       if (strcmp(attr, "jpegPhoto")) {
+                               debug_print("sv\t%s: %s\n", attr?attr:"null",
+                                               vals[0]->bv_val?vals[0]->bv_val:"null");
+                               list = g_slist_append( list, g_strndup( vals[0]->bv_val, vals[0]->bv_len ));
+                       } else {
+                               char *file = get_tmp_file();
+                               FILE *fp = g_fopen(file, "wb");
+                               if (fp) {
+                                       fwrite(vals[0]->bv_val, 1, vals[0]->bv_len, fp);
+                                       fclose(fp);
+                               }
+                               list = g_slist_append( list, file);
+                       }
                }
        }
        ldap_value_free_len( vals );
@@ -455,6 +466,7 @@ static GList *ldapqry_build_items_fl(
        ItemPerson *person;
        ItemEMail *email;
        ItemFolder *folder;
+       gchar *picfile = NULL;
        GList *listReturn = NULL;
 
        folder = ADDRQUERY_FOLDER(qry);
@@ -511,7 +523,24 @@ static GList *ldapqry_build_items_fl(
        
        for (cur = attributes; cur; cur = cur->next) {
                UserAttribute *attrib = addritem_copy_attribute((UserAttribute *)cur->data);
-               addritem_person_add_attribute( person, attrib );
+               if (attrib->name && strcmp(attrib->name, "jpegPhoto")) {
+                       addritem_person_add_attribute( person, attrib );
+               } else {
+                       if (qry && qry->server && qry->server->control) {
+                               gchar *dir = g_strconcat( get_rc_dir(), G_DIR_SEPARATOR_S, 
+                                                       ADDRBOOK_DIR, G_DIR_SEPARATOR_S, NULL );
+                               gchar *filename = g_strdup_printf("%s-%s-%s",
+                                       qry->server->control->hostName?qry->server->control->hostName:"nohost", 
+                                       qry->server->control->baseDN?qry->server->control->baseDN:"nobase", 
+                                       dn);
+                               picfile = g_strdup_printf("%s%s.png", dir, filename);
+                               addritem_person_set_picture( person, filename );
+                               rename_force(attrib->value, picfile);
+                               g_free(filename);
+                               g_free(picfile);
+                               g_free(dir);
+                       }
+               }
        }
        
        addrcache_folder_add_person( cache, ADDRQUERY_FOLDER(qry), person );
@@ -678,6 +707,8 @@ static gint ldapqry_connect( LdapQuery *qry ) {
        qry->elapsedTime = -1;
        ADDRQUERY_RETVAL(qry) = LDAPRC_INIT;
 
+       ldapsrv_set_options (ctl->timeOut, NULL);
+
        uri = g_strdup_printf("ldap%s://%s:%d",
                                ctl->enableSSL?"s":"",
                                ctl->hostName, ctl->port);
@@ -1013,10 +1044,9 @@ static void ldapqry_destroyer( void * ptr ) {
 
        qry = ( LdapQuery * ) ptr;
        g_return_if_fail( qry != NULL );
-       g_return_if_fail( ADDRQUERY_NAME(qry) != NULL );
 
        debug_print("ldapqry_destroyer::%d::%s\n", (int) pthread_self(),
-                       ADDRQUERY_NAME(qry));
+                       ADDRQUERY_NAME(qry)?ADDRQUERY_NAME(qry):"null");
 
        /* Perform any destruction here */
        if( qry->control != NULL ) {
@@ -1034,7 +1064,8 @@ static void ldapqry_destroyer( void * ptr ) {
 void ldapqry_cancel( LdapQuery *qry ) {
        g_return_if_fail( qry != NULL );
 
-       debug_print("cancelling::%d::%s\n", (int) pthread_self(), ADDRQUERY_NAME(qry));
+       debug_print("cancelling::%d::%s\n", (int) pthread_self(),
+                       ADDRQUERY_NAME(qry)?ADDRQUERY_NAME(qry):"null");
        if( ldapqry_get_busy_flag( qry ) ) {
                if( qry->thread ) {
                        debug_print("calling pthread_cancel\n");