LDAP/UI code separation. Fix mem leak.
[claws.git] / src / addressbook.c
index 3beba73287bc0db6fbd069021f8a5e619b8b499d..970174284db2ddc8a5a47fdbbe9e7ef5235ff968 100644 (file)
@@ -54,7 +54,7 @@
 #include "menu.h"
 #include "stock_pixmap.h"
 #include "xml.h"
-#include "prefs.h"
+#include "prefs_gtk.h"
 #include "procmime.h"
 #include "utils.h"
 #include "gtkutils.h"
@@ -292,11 +292,6 @@ static void addressbook_move_nodes_up              (GtkCTree       *ctree,
                                                GtkCTreeNode    *node);
 static GtkCTreeNode *addressbook_find_group_node (GtkCTreeNode *parent,
                                                   ItemGroup    *group);
-static GtkCTreeNode *addressbook_find_folder_node( GtkCTreeNode        *parent,
-                                                  ItemFolder   *folder );
-
-static void addressbook_delete_object          (AddressObject  *obj);
-
 static void key_pressed                                (GtkWidget      *widget,
                                                 GdkEventKey    *event,
                                                 gpointer        data);
@@ -431,11 +426,12 @@ void addressbook_open(Compose *target)
                addressbook_load_tree();
                gtk_ctree_select(GTK_CTREE(addrbook.ctree),
                                 GTK_CTREE_NODE(GTK_CLIST(addrbook.ctree)->row_list));
-       } else
+       }
+       else {
                gtk_widget_hide(addrbook.window);
+       }
 
        gtk_widget_show_all(addrbook.window);
-
        addressbook_set_target_compose(target);
 }
 
@@ -458,7 +454,6 @@ void addressbook_destroy() {
 void addressbook_set_target_compose(Compose *target)
 {
        addrbook.target_compose = target;
-
        addressbook_button_set_sensitive();
 }
 
@@ -808,10 +803,12 @@ static void addressbook_ds_status_message( AddressDataSource *ds, gchar *msg ) {
                gchar *name;
 
                name = addrindex_ds_get_name( ds );
-               sprintf( addressbook_msgbuf, "%s: %s", name, msg );
+               g_snprintf( addressbook_msgbuf, sizeof(addressbook_msgbuf),
+                           "%s: %s", name, msg );
        }
        else {
-               sprintf( addressbook_msgbuf, "%s", msg );
+               g_snprintf( addressbook_msgbuf, sizeof(addressbook_msgbuf),
+                           "%s", msg );
        }
        addressbook_status_show( addressbook_msgbuf );
 }
@@ -824,11 +821,13 @@ static void addressbook_ds_show_message( AddressDataSource *ds ) {
                name = addrindex_ds_get_name( ds );
                retVal = addrindex_ds_get_status_code( ds );
                if( retVal == MGU_SUCCESS ) {
-                       sprintf( addressbook_msgbuf, "%s", name );
+                       g_snprintf( addressbook_msgbuf,
+                                   sizeof(addressbook_msgbuf), "%s", name );
                }
                else {
-                       sprintf( addressbook_msgbuf, "%s: %s", name,
-                               mgu_error2string( retVal ) );
+                       g_snprintf( addressbook_msgbuf, 
+                                   sizeof(addressbook_msgbuf), "%s: %s", name,
+                                   mgu_error2string( retVal ) );
                }
        }
        addressbook_status_show( addressbook_msgbuf );
@@ -1053,6 +1052,14 @@ static void addressbook_to_clicked(GtkButton *button, gpointer data)
        compose = addrbook.target_compose;
        if( ! compose ) return;
 
+       /* Nothing selected, but maybe there is something in text entry */
+       addr = gtk_entry_get_text( GTK_ENTRY( addrbook.entry) );
+       if ( addr ) {
+               compose_entry_append(
+                       compose, addr, (ComposeEntryType)data );
+       }
+
+       /* Select from address list */
        list = addrselect_get_list( _addressSelect_ );
        node = list;
        while( node ) {
@@ -2019,7 +2026,7 @@ static void addressbook_treenode_edit_cb(gpointer data, guint action,
        if( name && parentNode ) {
                /* Update node in tree view */
                addressbook_change_node_name( node, name );
-               gtk_ctree_sort_node(ctree, parentNode);
+               gtk_sctree_sort_node(ctree, parentNode);
                gtk_ctree_expand( ctree, node );
                gtk_ctree_select( ctree, node );
        }
@@ -2207,33 +2214,6 @@ static GtkCTreeNode *addressbook_find_group_node( GtkCTreeNode *parent, ItemGrou
        return NULL;
 }
 
-/*
-* Search for specified child folder node in address index tree.
-* Enter: parent Parent node.
-*        folder Folder to find.
-*/
-static GtkCTreeNode *addressbook_find_folder_node( GtkCTreeNode *parent, ItemFolder *folder ) {
-       GtkCTreeNode *node = NULL;
-       GtkCTreeRow *currRow;
-
-       currRow = GTK_CTREE_ROW( parent );
-       if( currRow ) {
-               node = currRow->children;
-               while( node ) {
-                       AddressObject *obj;
-
-                       obj = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.ctree), node );
-                       if( obj->type == ADDR_ITEM_FOLDER ) {
-                               ItemFolder *f = ADAPTER_FOLDER(obj)->itemFolder;
-                               if( f == folder ) return node;
-                       }
-                       currRow = GTK_CTREE_ROW(node);
-                       node = currRow->sibling;
-               }
-       }
-       return NULL;
-}
-
 static AddressBookFile *addressbook_get_book_file() {
        AddressBookFile *abf = NULL;
        AddressDataSource *ds = NULL;
@@ -2266,7 +2246,7 @@ static void addressbook_move_nodes_up( GtkCTree *ctree, GtkCTreeNode *node ) {
                while( (child = currRow->children) ) {
                        gtk_ctree_move( ctree, child, parent, node );
                }
-               gtk_ctree_sort_node( ctree, parent );
+               gtk_sctree_sort_node( ctree, parent );
        }
 }
 
@@ -2336,7 +2316,7 @@ static void addressbook_edit_address_cb( gpointer data, guint action, GtkWidget
        /* Update tree node with node name */
        if( node == NULL ) return;
        addressbook_change_node_name( node, name );
-       gtk_ctree_sort_node( ctree, parentNode );
+       gtk_sctree_sort_node( ctree, parentNode );
        gtk_ctree_select( ctree, addrbook.opened );
 }
 
@@ -2495,7 +2475,7 @@ static void addressbook_folder_load_person( GtkCTree *clist, ItemFolder *itemFol
                                        FALSE, person->isOpened );
                        gtk_ctree_node_set_row_data(clist, nodePerson, person );
                }
-               gtk_ctree_sort_node(GTK_CTREE(clist), NULL);
+               gtk_sctree_sort_node(GTK_CTREE(clist), NULL);
        }
        /* Free up the list */
        mgu_clear_list( items );
@@ -2523,59 +2503,13 @@ static void addressbook_folder_load_group( GtkCTree *clist, ItemFolder *itemFold
                                      atci->iconXpmOpen, atci->maskXpmOpen,
                                      FALSE, FALSE);
                gtk_ctree_node_set_row_data(clist, nodeGroup, group );
-               gtk_ctree_sort_node(clist, NULL);
+               gtk_sctree_sort_node(clist, NULL);
        }
        /* Free up the list */
        mgu_clear_list( items );
        g_list_free( items );
 }
 
-/*
- * Load data sources into list.
- */
-static void addressbook_node_load_datasource( GtkCTree *clist, AddressObject *obj ) {
-       AdapterInterface *adapter;
-       AddressInterface *iface;
-       AddressTypeControlItem *atci = NULL;
-       GtkCTreeNode *newNode, *node;
-       GtkCTreeRow *row;
-       GtkCell *cell = NULL;
-       gchar *text[N_COLS];
-
-       adapter = ADAPTER_INTERFACE(obj);
-       if( adapter == NULL ) return;
-       iface = adapter->interface;
-       atci = adapter->atci;
-       if( atci == NULL ) return;
-
-       /* Create nodes in list copying values for data sources in tree */
-       row = GTK_CTREE_ROW( adapter->treeNode );
-       if( row ) {
-               node = row->children;
-               while( node ) {
-                       gpointer data;
-
-                       data = gtk_ctree_node_get_row_data( clist, node );
-                       row = GTK_CTREE_ROW( node );
-                       cell = ( ( GtkCListRow * )row )->cell;
-                       text[COL_NAME] = cell->u.text;
-                       text[COL_ADDRESS] = NULL;
-                       text[COL_REMARKS] = NULL;
-                       newNode = gtk_ctree_insert_node( clist, NULL, NULL,
-                                     text, FOLDER_SPACING,
-                                     atci->iconXpm, atci->maskXpm,
-                                     atci->iconXpmOpen, atci->maskXpmOpen,
-                                     FALSE, FALSE);
-                       /*
-                       gtk_ctree_node_set_row_data( clist, newNode, data );
-                       gtk_ctree_node_set_row_data_full( clist, newNode, NULL, NULL );
-                       */
-                       node = row->sibling;
-               }
-       }
-       gtk_ctree_sort_node( clist, NULL );
-}
-
 /*
 * Search ctree widget callback function.
 * Enter: pA Pointer to node.
@@ -2996,7 +2930,7 @@ static GtkCTreeNode *addressbook_add_object(GtkCTreeNode *node,
                }
        }
 
-       gtk_ctree_sort_node(ctree, node);
+       gtk_sctree_sort_node(ctree, node);
 
        return added;
 }
@@ -3032,7 +2966,7 @@ static GtkCTreeNode *addressbook_node_add_group( GtkCTreeNode *node, AddressData
                        atci->treeLeaf, atci->treeExpand );
        gtk_ctree_node_set_row_data_full( ctree, newNode, adapter,
                addressbook_free_treenode );
-       gtk_ctree_sort_node( ctree, node );
+       gtk_sctree_sort_node( ctree, node );
        return newNode;
 }
 
@@ -3093,31 +3027,10 @@ static GtkCTreeNode *addressbook_node_add_folder(
                addressbook_node_add_group( newNode, ds, item );
                listItems = g_list_next( listItems );
        }
-       gtk_ctree_sort_node( ctree, node );
+       gtk_sctree_sort_node( ctree, node );
        return newNode;
 }
 
-static void addressbook_delete_object(AddressObject *obj) {
-       AdapterDSource *ads = NULL;
-       AddressDataSource *ds = NULL;
-       if (!obj) return;
-
-       /* Remove data source. */
-       /* printf( "Delete obj type : %d\n", obj->type ); */
-
-       ads = ADAPTER_DSOURCE(obj);
-       if( ads == NULL ) return;
-       ds = ads->dataSource;
-       if( ds == NULL ) return;
-
-       /* Remove data source */
-       if( addrindex_index_remove_datasource( _addressIndex_, ds ) ) {
-               addrindex_free_datasource( ds );
-       }
-       /* Free up Adapter object */
-       g_free( ads );
-}
-
 void addressbook_export_to_file( void ) {
        if( _addressIndex_ ) {
                /* Save all new address book data */
@@ -3273,21 +3186,28 @@ static void addressbook_ldap_show_message( SyldapServer *svr ) {
        if( svr ) {
                name = syldap_get_name( svr );
                if( svr->busyFlag ) {
-                       sprintf( addressbook_msgbuf, "%s: %s", name, ADDRESSBOOK_LDAP_BUSYMSG );
+                       g_snprintf( addressbook_msgbuf,
+                                   sizeof(addressbook_msgbuf), "%s: %s", name,
+                                   ADDRESSBOOK_LDAP_BUSYMSG );
                }
                else {
                        if( svr->retVal == MGU_SUCCESS ) {
-                               sprintf( addressbook_msgbuf, "%s", name );
+                               g_snprintf( addressbook_msgbuf,
+                                           sizeof(addressbook_msgbuf), "%s",
+                                           name );
                        }
                        else {
-                               sprintf( addressbook_msgbuf, "%s: %s", name, mgu_error2string( svr->retVal ) );
+                               g_snprintf( addressbook_msgbuf,
+                                           sizeof(addressbook_msgbuf),
+                                           "%s: %s", name,
+                                           mgu_error2string( svr->retVal ) );
                        }
                }
        }
        addressbook_status_show( addressbook_msgbuf );
 }
 
-static void ldapsearch_callback( SyldapServer *sls ) {
+static void addressbook_ldap_show_results( SyldapServer *sls ) {
        GtkCTree *ctree = GTK_CTREE(addrbook.ctree);
        AddressObject *obj;
        AdapterDSource *ads = NULL;
@@ -3321,6 +3241,52 @@ static void ldapsearch_callback( SyldapServer *sls ) {
                }
        }
 }
+
+/*
+ * LDAP idle function. This function is called during UI idle time while
+ * an LDAP search is in progress.
+ * Enter: data Reference to LDAP server object.
+ */
+static void addressbook_ldap_idle( gpointer data ) {
+       SyldapServer *server;
+
+       server = ( SyldapServer * ) data;       
+       if( ! server->busyFlag ) {
+               /* Server has completed search - remove from idle list */
+               gtk_idle_remove( server->idleId );
+
+               /* Process callback and free up the thread */
+               addressbook_ldap_show_results( server );
+               g_free( server->thread );
+               server->thread = NULL;
+       }
+}
+
+/*
+ * Perform lookup for LDAP search.
+ * Enter: ads     Adapter for data source.
+ *        sLookup Lookup string.
+ */
+static void addressbook_ldap_lookup( AdapterDSource *ads, gchar *sLookup ) {
+       AddressDataSource *ds = NULL;
+       AddressInterface *iface = NULL;
+       SyldapServer *server;
+
+       ds = ads->dataSource;
+       if( ds == NULL ) return;
+       iface = ds->interface;
+       if( ! iface->haveLibrary ) return;
+       server = ds->rawDataSource;
+       if( server ) {
+               syldap_cancel_read( server );
+               if( *sLookup == '\0' || strlen( sLookup ) < 1 ) return;
+               syldap_set_search_value( server, sLookup );
+               server->idleId = gtk_idle_add(
+                       ( GtkFunction ) addressbook_ldap_idle, server );
+               syldap_read_data_th( server );
+               addressbook_ldap_show_message( server );
+       }
+}
 #endif
 
 /*
@@ -3329,45 +3295,28 @@ static void ldapsearch_callback( SyldapServer *sls ) {
 static void addressbook_lup_clicked( GtkButton *button, gpointer data ) {
        GtkCTree *ctree = GTK_CTREE(addrbook.ctree);
        AddressObject *obj;
-#ifdef USE_LDAP
        AdapterDSource *ads = NULL;
-       AddressDataSource *ds = NULL;
-       AddressInterface *iface = NULL;
-#endif
        gchar *sLookup;
 
-       sLookup = gtk_editable_get_chars( GTK_EDITABLE(addrbook.entry), 0, -1 );
-       g_strchomp( sLookup );
-
        if( ! addrbook.treeSelected ) return;
        if( GTK_CTREE_ROW( addrbook.treeSelected )->level == 1 ) return;
 
        obj = gtk_ctree_node_get_row_data( ctree, addrbook.treeSelected );
        if( obj == NULL ) return;
 
-#ifdef USE_LDAP
+       sLookup = gtk_editable_get_chars( GTK_EDITABLE(addrbook.entry), 0, -1 );
+       g_strchomp( sLookup );
+
        if( obj->type == ADDR_DATASOURCE ) {
                ads = ADAPTER_DSOURCE(obj);
+#ifdef USE_LDAP
                if( ads->subType == ADDR_LDAP ) {
-                       SyldapServer *server;
-
-                       ds = ads->dataSource;
-                       if( ds == NULL ) return;
-                       iface = ds->interface;
-                       if( ! iface->haveLibrary ) return;
-                       server = ds->rawDataSource;
-                       if( server ) {
-                               syldap_cancel_read( server );
-                               if( *sLookup == '\0' || strlen( sLookup ) < 1 ) return;
-                               syldap_set_search_value( server, sLookup );
-                               syldap_set_callback( server, ldapsearch_callback );
-                               syldap_read_data_th( server );
-                               addressbook_ldap_show_message( server );
-                       }
+                       addressbook_ldap_lookup( ads, sLookup );
                }
+#endif /* USE_LDAP */
        }
-#endif
 
+       g_free( sLookup );
 }
 
 /* **********************************************************************
@@ -3383,13 +3332,13 @@ static void addressbook_lup_clicked( GtkButton *button, gpointer data ) {
 ItemObjectType addressbook_type2item( AddressObjectType abType ) {
        ItemObjectType ioType;
 
-       ioType = ITEMTYPE_NONE;
        switch( abType ) {
                case ADDR_ITEM_PERSON: ioType = ITEMTYPE_PERSON;     break;
                case ADDR_ITEM_EMAIL:  ioType = ITEMTYPE_EMAIL;      break;
                case ADDR_ITEM_FOLDER: ioType = ITEMTYPE_FOLDER;     break;
                case ADDR_ITEM_GROUP:  ioType = ITEMTYPE_GROUP;      break;
                case ADDR_DATASOURCE:  ioType = ITEMTYPE_DATASOURCE; break;
+               default:               ioType = ITEMTYPE_NONE;       break;
        }
        return ioType;
 }