/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2001-2004 Match Grun
+ * Copyright (C) 2001-2007 Match Grun and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
*/
/*
#include "defs.h"
#include <glib.h>
+#include <glib/gi18n.h>
-#include "intl.h"
#include "mgutils.h"
#include "addritem.h"
#include "addrcache.h"
#include "addrbook.h"
+#include "addressbook.h"
#include "addrindex.h"
#include "xml.h"
#include "addrquery.h"
#include "addr_compl.h"
+#include "utils.h"
+#include "alertpanel.h"
#ifndef DEV_STANDALONE
#include "prefs_gtk.h"
#include "ldapserver.h"
#include "ldapctrl.h"
#include "ldapquery.h"
+#include "ldapupdate.h"
+#include "ldaputil.h"
#endif
#define TAG_ADDRESS_INDEX "addressbook"
#define ATTAG_LDAP_DYN_SEARCH "dyn-search"
#define ATTAG_LDAP_MATCH_OPT "match-opt"
#define ATTAG_LDAP_ENABLE_TLS "enable-tls"
+#define ATTAG_LDAP_ENABLE_SSL "enable-ssl"
#define ELTAG_LDAP_ATTR_SRCH "attribute"
#define ATTAG_LDAP_ATTR_NAME "name"
/* New attributes */
#define ATTAG_LDAP_DEFAULT "default"
-#if 0
-N_("Common address")
-N_("Personal address")
-#endif
-
-#define DISP_NEW_COMMON _("Common address")
-#define DISP_NEW_PERSONAL _("Personal address")
+#define DISP_NEW_COMMON _("Common addresses")
+#define DISP_NEW_PERSONAL _("Personal addresses")
/* Old address book */
#define TAG_IF_OLD_COMMON "common_address"
gchar *value;
};
+static AddressDataSource *addrindex_create_datasource ( AddressIfType ifType );
+
+static GList *addrindex_ds_get_all_persons ( AddressDataSource *ds );
+static GList *addrindex_ds_get_all_groups ( AddressDataSource *ds );
+static AddressDataSource *addrindex_get_datasource ( AddressIndex *addrIndex,
+ const gchar *cacheID );
+static AddressInterface *addrindex_get_interface ( AddressIndex *addrIndex,
+ AddressIfType ifType );
+static gint addrindex_write_to ( AddressIndex *addrIndex,
+ const gchar *newFile );
+
/*
* Define DOM fragment.
*/
iface->getListFolder = ( void * ) addrbook_get_list_folder;
iface->getListPerson = ( void * ) addrbook_get_list_person;
iface->getAllPersons = ( void * ) addrbook_get_all_persons;
+ iface->getAllGroups = ( void * ) addrbook_get_all_groups;
iface->getName = ( void * ) addrbook_get_name;
iface->setAccessFlag = ( void * ) addrbook_set_accessed;
iface->searchOrder = 0;
iface = addrindex_create_interface(
ADDR_IF_LDAP, "LDAP", TAG_IF_LDAP, TAG_DS_LDAP );
#ifdef USE_LDAP
+ iface->readOnly = FALSE;
/* iface->haveLibrary = ldapsvr_test_ldap_lib(); */
iface->haveLibrary = ldaputil_test_ldap_lib();
iface->useInterface = iface->haveLibrary;
- /* iface->getModifyFlag = ( void * ) ldapsvr_get_modified; */
+ iface->getModifyFlag = ( void * ) ldapsvr_get_modified;
iface->getAccessFlag = ( void * ) ldapsvr_get_accessed;
- /* iface->getReadFlag = ( void * ) ldapsvr_get_read_flag; */
+ iface->getReadFlag = ( void * ) ldapsvr_get_read_flag;
iface->getStatusCode = ( void * ) ldapsvr_get_status;
- /* iface->getReadData = ( void * ) ldapsvr_read_data; */
+ iface->getReadData = ( void * ) ldapsvr_read_data;
iface->getRootFolder = ( void * ) ldapsvr_get_root_folder;
iface->getListFolder = ( void * ) ldapsvr_get_list_folder;
iface->getListPerson = ( void * ) ldapsvr_get_list_person;
* \param cacheID ID.
* \return Data source, or NULL if not found.
*/
-AddressDataSource *addrindex_get_datasource(
+static AddressDataSource *addrindex_get_datasource(
AddressIndex *addrIndex, const gchar *cacheID )
{
g_return_val_if_fail( addrIndex != NULL, NULL );
* Free hash table of address cache items.
*/
static void addrindex_free_cache_hash( GHashTable *table ) {
- g_hash_table_freeze( table );
g_hash_table_foreach_remove( table, addrindex_free_cache_cb, NULL );
- g_hash_table_thaw( table );
g_hash_table_destroy( table );
}
return _addressIndex_;
}
-/**
- * Return reference to address index.
- * \return Address index object.
- */
-AddressIndex *addrindex_get_object( void ) {
- return _addressIndex_;
-}
-
/**
* Property - Specify file path to address index file.
* \param addrIndex Address index.
addrIndex->fileName = mgu_replace_string( addrIndex->fileName, value );
}
-/**
- * Property - Specify file path to be used.
- * \param addrIndex Address index.
- * \param value Path to JPilot file.
- */
-void addrindex_set_dirty( AddressIndex *addrIndex, const gboolean value ) {
- g_return_if_fail( addrIndex != NULL );
- addrIndex->dirtyFlag = value;
-}
-
-/**
- * Property - get loaded flag. Note that this flag is set after reading data
- * from the address books.
- * \param addrIndex Address index.
- * \return <i>TRUE</i> if address index data was loaded.
- */
-gboolean addrindex_get_loaded( AddressIndex *addrIndex ) {
- g_return_val_if_fail( addrIndex != NULL, FALSE );
- return addrIndex->loadedFlag;
-}
-
/**
* Return list of address interfaces.
* \param addrIndex Address index.
* \param ifType Interface type.
* \return Address interface, or NULL if not found.
*/
-AddressInterface *addrindex_get_interface(
+static AddressInterface *addrindex_get_interface(
AddressIndex *addrIndex, AddressIfType ifType )
{
AddressInterface *retVal = NULL;
* \param lvl Indentation level.
* \param name Element name.
*/
-static void addrindex_write_elem_s( FILE *fp, const gint lvl, const gchar *name ) {
+static int addrindex_write_elem_s( FILE *fp, const gint lvl, const gchar *name ) {
gint i;
- for( i = 0; i < lvl; i++ ) fputs( " ", fp );
- fputs( "<", fp );
- fputs( name, fp );
+ for( i = 0; i < lvl; i++ )
+ if (fputs( " ", fp ) == EOF)
+ return -1;
+ if (fputs( "<", fp ) == EOF)
+ return -1;
+ if (fputs( name, fp ) == EOF)
+ return -1;
+ return 0;
}
/**
* \param lvl Indentation level.
* \param name Element name.
*/
-static void addrindex_write_elem_e( FILE *fp, const gint lvl, const gchar *name ) {
+static int addrindex_write_elem_e( FILE *fp, const gint lvl, const gchar *name ) {
gint i;
- for( i = 0; i < lvl; i++ ) fputs( " ", fp );
- fputs( "</", fp );
- fputs( name, fp );
- fputs( ">\n", fp );
+ for( i = 0; i < lvl; i++ )
+ if (fputs( " ", fp ) == EOF)
+ return -1;
+ if (fputs( "</", fp ) == EOF)
+ return -1;
+ if (fputs( name, fp ) == EOF)
+ return -1;
+ if (fputs( ">\n", fp ) == EOF)
+ return -1;
+ return 0;
}
/**
* \param name Attribute name.
* \param value Attribute value.
*/
-static void addrindex_write_attr( FILE *fp, const gchar *name, const gchar *value ) {
- fputs( " ", fp );
- fputs( name, fp );
- fputs( "=\"", fp );
- xml_file_put_escape_str( fp, value );
- fputs( "\"", fp );
+static int addrindex_write_attr( FILE *fp, const gchar *name, const gchar *value ) {
+ if (fputs( " ", fp ) == EOF)
+ return -1;
+ if (fputs( name, fp ) == EOF)
+ return -1;
+ if (fputs( "=\"", fp ) == EOF)
+ return -1;
+ if (xml_file_put_escape_str( fp, value ) < 0)
+ return -1;
+ if (fputs( "\"", fp ) == EOF)
+ return -1;
+ return 0;
}
/**
guint prevLevel;
gint rc;
- /* printf( "addrindex_read_fragment\n" ); */
+ /* g_print( "addrindex_read_fragment\n" ); */
prevLevel = file->level;
* \param fragment DOM fragment for configuration element.
* \param lvl Indent level.
*/
-static void addrindex_write_fragment(
+static int addrindex_write_fragment(
FILE *fp, const AddressIfFragment *fragment, const gint lvl )
{
GList *node;
if( fragment ) {
- addrindex_write_elem_s( fp, lvl, fragment->name );
+ if (addrindex_write_elem_s( fp, lvl, fragment->name ) < 0)
+ return -1;
node = fragment->attributes;
while( node ) {
AddressIfAttrib *nv = node->data;
- addrindex_write_attr( fp, nv->name, nv->value );
+ if (addrindex_write_attr( fp, nv->name, nv->value ) < 0)
+ return -1;
node = g_list_next( node );
}
if( fragment->children ) {
- fputs(" >\n", fp);
+ if (fputs(" >\n", fp) == EOF)
+ return -1;
/* Output children */
node = fragment->children;
while( node ) {
AddressIfFragment *child = node->data;
- addrindex_write_fragment( fp, child, 1+lvl );
+ if (addrindex_write_fragment( fp, child, 1+lvl ) < 0)
+ return -1;
node = g_list_next( node );
}
/* Output closing tag */
- addrindex_write_elem_e( fp, lvl, fragment->name );
+ if (addrindex_write_elem_e( fp, lvl, fragment->name ) < 0)
+ return -1;
}
else {
- fputs(" />\n", fp);
+ if (fputs(" />\n", fp) == EOF)
+ return -1;
}
}
+
+ return 0;
}
-#if 0
-static void addrindex_print_fragment_r(
- const AddressIfFragment *fragment, FILE *stream, gint lvl )
-{
- GList *node;
- gint i;
-
- for( i = 0; i < lvl; i++ )
- fprintf( stream, " " );
- fprintf( stream, "Element:%s:\n", fragment->name );
- node = fragment->attributes;
- while( node ) {
- AddressIfAttrib *nv = node->data;
- for( i = 0; i < lvl; i++ )
- fprintf( stream, " " );
- fprintf( stream, " %s : %s\n", nv->name, nv->value );
- node = g_list_next( node );
- }
- node = fragment->children;
- while( node ) {
- AddressIfFragment *child = node->data;
- addrindex_print_fragment_r( child, stream, 1+lvl );
- node = g_list_next( node );
- }
-}
-
-static void addrindex_print_fragment( const AddressIfFragment *fragment, FILE *stream ) {
- addrindex_print_fragment_r( fragment, stream, 0 );
-}
-#endif
-
/**
* Read/parse address index file, creating a data source for a regular
* intrinsic XML addressbook.
return ds;
}
-static void addrindex_write_book( FILE *fp, AddressDataSource *ds, gint lvl ) {
+static int addrindex_write_book( FILE *fp, AddressDataSource *ds, gint lvl ) {
AddressBookFile *abf = ds->rawDataSource;
if( abf ) {
- addrindex_write_elem_s( fp, lvl, TAG_DS_ADDRESS_BOOK );
- addrindex_write_attr( fp, ATTAG_BOOK_NAME, addrbook_get_name( abf ) );
- addrindex_write_attr( fp, ATTAG_BOOK_FILE, abf->fileName );
- fputs( " />\n", fp );
+ if (addrindex_write_elem_s( fp, lvl, TAG_DS_ADDRESS_BOOK ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_BOOK_NAME, addrbook_get_name( abf ) ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_BOOK_FILE, abf->fileName ) < 0)
+ return -1;
+ if (fputs( " />\n", fp ) == EOF)
+ return -1;
}
+ return 0;
}
static AddressDataSource *addrindex_parse_vcard( XMLFile *file ) {
return ds;
}
-static void addrindex_write_vcard( FILE *fp, AddressDataSource *ds, gint lvl ) {
+static int addrindex_write_vcard( FILE *fp, AddressDataSource *ds, gint lvl ) {
VCardFile *vcf = ds->rawDataSource;
if( vcf ) {
- addrindex_write_elem_s( fp, lvl, TAG_DS_VCARD );
- addrindex_write_attr( fp, ATTAG_VCARD_NAME, vcard_get_name( vcf ) );
- addrindex_write_attr( fp, ATTAG_VCARD_FILE, vcf->path );
- fputs( " />\n", fp );
+ if (addrindex_write_elem_s( fp, lvl, TAG_DS_VCARD ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_VCARD_NAME, vcard_get_name( vcf ) ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_VCARD_FILE, vcf->path ) < 0)
+ return -1;
+ if (fputs( " />\n", fp ) == EOF)
+ return -1;
}
+ return 0;
}
#ifdef USE_JPILOT
return ds;
}
-static void addrindex_write_jpilot( FILE *fp,AddressDataSource *ds, gint lvl ) {
+static int addrindex_write_jpilot( FILE *fp,AddressDataSource *ds, gint lvl ) {
JPilotFile *jpf = ds->rawDataSource;
if( jpf ) {
gint ind;
GList *node;
GList *customLbl = jpilot_get_custom_labels( jpf );
- addrindex_write_elem_s( fp, lvl, TAG_DS_JPILOT );
- addrindex_write_attr( fp, ATTAG_JPILOT_NAME, jpilot_get_name( jpf ) );
- addrindex_write_attr( fp, ATTAG_JPILOT_FILE, jpf->path );
+ if (addrindex_write_elem_s( fp, lvl, TAG_DS_JPILOT ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_JPILOT_NAME, jpilot_get_name( jpf ) ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_JPILOT_FILE, jpf->path ) < 0)
+ return -1;
node = customLbl;
ind = 1;
while( node ) {
gchar name[256];
g_snprintf( name, sizeof(name), "%s%d",
ATTAG_JPILOT_CUSTOM, ind );
- addrindex_write_attr( fp, name, node->data );
+ if (addrindex_write_attr( fp, name, node->data ) < 0)
+ return -1;
ind++;
node = g_list_next( node );
}
- fputs( " />\n", fp );
+ if (fputs( " />\n", fp ) == EOF)
+ return -1;
}
+ return 0;
}
#else
return ds;
}
-static void addrindex_write_jpilot( FILE *fp, AddressDataSource *ds, gint lvl ) {
+static int addrindex_write_jpilot( FILE *fp, AddressDataSource *ds, gint lvl ) {
AddressIfFragment *fragment = ds->rawDataSource;
if( fragment ) {
- addrindex_write_fragment( fp, fragment, lvl );
+ if (addrindex_write_fragment( fp, fragment, lvl ) < 0)
+ return -1;
}
+ return 0;
}
#endif
}
+void ldapsvr_set_control( LdapServer *server, LdapControl *ctl );
/**
* Parse LDAP control data from XML file.
* \param file Index file.
gchar *serverName = NULL;
gchar *criteria = NULL;
gboolean bDynSearch;
- gboolean bTLS;
+ gboolean bTLS, bSSL;
gint iMatch;
- /* printf( "addrindex_parse_ldap\n" ); */
+ /* g_print( "addrindex_parse_ldap\n" ); */
/* Set up some defaults */
bDynSearch = FALSE;
bTLS = FALSE;
+ bSSL = FALSE;
iMatch = LDAPCTL_MATCH_BEGINWITH;
ds = addrindex_create_datasource( ADDR_IF_LDAP );
gint ivalue = atoi( value );
if( strcmp( name, ATTAG_LDAP_NAME ) == 0 ) {
- if( serverName ) g_free( serverName );
+ g_free( serverName );
serverName = g_strdup( value );
}
else if( strcmp( name, ATTAG_LDAP_HOST ) == 0 ) {
ldapctl_set_bind_password( ctl, value );
}
else if( strcmp( name, ATTAG_LDAP_CRITERIA ) == 0 ) {
- if( criteria ) g_free( criteria );
+ g_free( criteria );
criteria = g_strdup( value );
+ g_print("criteria %s\n", criteria);
}
else if( strcmp( name, ATTAG_LDAP_MAX_ENTRY ) == 0 ) {
ldapctl_set_max_entries( ctl, ivalue );
bTLS = TRUE;
}
}
+ else if( strcmp( name, ATTAG_LDAP_ENABLE_SSL ) == 0 ) {
+ bSSL = FALSE;
+ if( strcmp( value, ATVAL_BOOLEAN_YES ) == 0 ) {
+ bSSL = TRUE;
+ }
+ }
attr = g_list_next( attr );
}
ldapsvr_set_name( server, serverName );
ldapsvr_set_search_flag( server, bDynSearch );
ldapctl_set_matching_option( ctl, iMatch );
+#ifdef USE_LDAP_TLS
ldapctl_set_tls( ctl, bTLS );
+ ldapctl_set_ssl( ctl, bSSL );
+#endif
g_free( serverName );
ldapsvr_set_control( server, ctl );
ds->rawDataSource = server;
return ds;
}
-static void addrindex_write_ldap( FILE *fp, AddressDataSource *ds, gint lvl ) {
+static int addrindex_write_ldap( FILE *fp, AddressDataSource *ds, gint lvl ) {
LdapServer *server = ds->rawDataSource;
LdapControl *ctl = NULL;
GList *node;
if( server ) {
ctl = server->control;
}
- if( ctl == NULL ) return;
+ if( ctl == NULL ) return 0;
/* Output start element with attributes */
- addrindex_write_elem_s( fp, lvl, TAG_DS_LDAP );
- addrindex_write_attr( fp, ATTAG_LDAP_NAME, ldapsvr_get_name( server ) );
- addrindex_write_attr( fp, ATTAG_LDAP_HOST, ctl->hostName );
+ if (addrindex_write_elem_s( fp, lvl, TAG_DS_LDAP ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_LDAP_NAME, ldapsvr_get_name( server ) ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_LDAP_HOST, ctl->hostName ) < 0)
+ return -1;
sprintf( value, "%d", ctl->port );
- addrindex_write_attr( fp, ATTAG_LDAP_PORT, value );
+ if (addrindex_write_attr( fp, ATTAG_LDAP_PORT, value ) < 0)
+ return -1;
- addrindex_write_attr( fp, ATTAG_LDAP_BASE_DN, ctl->baseDN );
- addrindex_write_attr( fp, ATTAG_LDAP_BIND_DN, ctl->bindDN );
- addrindex_write_attr( fp, ATTAG_LDAP_BIND_PASS, ctl->bindPass );
+ if (addrindex_write_attr( fp, ATTAG_LDAP_BASE_DN, ctl->baseDN ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_LDAP_BIND_DN, ctl->bindDN ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_LDAP_BIND_PASS, ctl->bindPass ) < 0)
+ return -1;
sprintf( value, "%d", ctl->maxEntries );
- addrindex_write_attr( fp, ATTAG_LDAP_MAX_ENTRY, value );
+ if (addrindex_write_attr( fp, ATTAG_LDAP_MAX_ENTRY, value ) < 0)
+ return -1;
sprintf( value, "%d", ctl->timeOut );
- addrindex_write_attr( fp, ATTAG_LDAP_TIMEOUT, value );
+ if (addrindex_write_attr( fp, ATTAG_LDAP_TIMEOUT, value ) < 0)
+ return -1;
sprintf( value, "%d", ctl->maxQueryAge );
- addrindex_write_attr( fp, ATTAG_LDAP_MAX_AGE, value );
+ if (addrindex_write_attr( fp, ATTAG_LDAP_MAX_AGE, value ) < 0)
+ return -1;
- addrindex_write_attr( fp, ATTAG_LDAP_DYN_SEARCH,
+ if (addrindex_write_attr( fp, ATTAG_LDAP_DYN_SEARCH,
server->searchFlag ?
- ATVAL_BOOLEAN_YES : ATVAL_BOOLEAN_NO );
+ ATVAL_BOOLEAN_YES : ATVAL_BOOLEAN_NO ) < 0)
+ return -1;
- addrindex_write_attr( fp, ATTAG_LDAP_MATCH_OPT,
+ if (addrindex_write_attr( fp, ATTAG_LDAP_MATCH_OPT,
( ctl->matchingOption == LDAPCTL_MATCH_CONTAINS ) ?
- ATVAL_LDAP_MATCH_CONTAINS : ATVAL_LDAP_MATCH_BEGIN );
+ ATVAL_LDAP_MATCH_CONTAINS : ATVAL_LDAP_MATCH_BEGIN ) < 0)
+ return -1;
- addrindex_write_attr( fp, ATTAG_LDAP_ENABLE_TLS,
+ if (addrindex_write_attr( fp, ATTAG_LDAP_ENABLE_TLS,
ctl->enableTLS ?
- ATVAL_BOOLEAN_YES : ATVAL_BOOLEAN_NO );
+ ATVAL_BOOLEAN_YES : ATVAL_BOOLEAN_NO ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_LDAP_ENABLE_SSL,
+ ctl->enableSSL ?
+ ATVAL_BOOLEAN_YES : ATVAL_BOOLEAN_NO ) < 0)
+ return -1;
- fputs(" >\n", fp);
+ if (fputs(" >\n", fp) == EOF)
+ return -1;
/* Output attributes */
node = ldapctl_get_criteria_list( ctl );
while( node ) {
- addrindex_write_elem_s( fp, 1+lvl, ELTAG_LDAP_ATTR_SRCH );
- addrindex_write_attr( fp, ATTAG_LDAP_ATTR_NAME, node->data );
- fputs(" />\n", fp);
+ if (addrindex_write_elem_s( fp, 1+lvl, ELTAG_LDAP_ATTR_SRCH ) < 0)
+ return -1;
+ if (addrindex_write_attr( fp, ATTAG_LDAP_ATTR_NAME, node->data ) < 0)
+ return -1;
+ if (fputs(" />\n", fp) == EOF)
+ return -1;
node = g_list_next( node );
}
/* End of element */
- addrindex_write_elem_e( fp, lvl, TAG_DS_LDAP );
+ if (addrindex_write_elem_e( fp, lvl, TAG_DS_LDAP ) < 0)
+ return -1;
+
+ return 0;
}
#else
return ds;
}
-static void addrindex_write_ldap( FILE *fp, AddressDataSource *ds, gint lvl ) {
+static int addrindex_write_ldap( FILE *fp, AddressDataSource *ds, gint lvl ) {
AddressIfFragment *fragment = ds->rawDataSource;
if( fragment ) {
- addrindex_write_fragment( fp, fragment, lvl );
+ if (addrindex_write_fragment( fp, fragment, lvl ) < 0)
+ return -1;
}
+ return 0;
}
#endif
if( file == NULL ) {
/*
- fprintf( stdout, " file '%s' does not exist.\n", addrIndex->fileName );
+ g_print( " file '%s' does not exist.\n", addrIndex->fileName );
*/
return addrIndex->retVal;
}
return addrIndex->retVal;
}
-static void addrindex_write_index( AddressIndex *addrIndex, FILE *fp ) {
+static int addrindex_write_index( AddressIndex *addrIndex, FILE *fp ) {
GList *nodeIF, *nodeDS;
gint lvlList = 1;
gint lvlItem = 1 + lvlList;
AddressInterface *iface = nodeIF->data;
if( ! iface->legacyFlag ) {
nodeDS = iface->listSource;
- addrindex_write_elem_s( fp, lvlList, iface->listTag );
- fputs( ">\n", fp );
+ if (addrindex_write_elem_s( fp, lvlList, iface->listTag ) < 0)
+ return -1;
+ if (fputs( ">\n", fp ) == EOF)
+ return -1;
while( nodeDS ) {
AddressDataSource *ds = nodeDS->data;
if( ds ) {
if( iface->type == ADDR_IF_BOOK ) {
- addrindex_write_book( fp, ds, lvlItem );
+ if (addrindex_write_book( fp, ds, lvlItem ) < 0)
+ return -1;
}
if( iface->type == ADDR_IF_VCARD ) {
- addrindex_write_vcard( fp, ds, lvlItem );
+ if (addrindex_write_vcard( fp, ds, lvlItem ) < 0)
+ return -1;
}
if( iface->type == ADDR_IF_JPILOT ) {
- addrindex_write_jpilot( fp, ds, lvlItem );
+ if (addrindex_write_jpilot( fp, ds, lvlItem ) < 0)
+ return -1;
}
if( iface->type == ADDR_IF_LDAP ) {
- addrindex_write_ldap( fp, ds, lvlItem );
+ if (addrindex_write_ldap( fp, ds, lvlItem ) < 0)
+ return -1;
}
}
nodeDS = g_list_next( nodeDS );
}
- addrindex_write_elem_e( fp, lvlList, iface->listTag );
+ if (addrindex_write_elem_e( fp, lvlList, iface->listTag ) < 0)
+ return -1;
}
nodeIF = g_list_next( nodeIF );
}
+ return 0;
}
/*
* return: Status code, from addrIndex->retVal.
* Note: File will be created in directory specified by addrIndex.
*/
-gint addrindex_write_to( AddressIndex *addrIndex, const gchar *newFile ) {
+static gint addrindex_write_to( AddressIndex *addrIndex, const gchar *newFile ) {
FILE *fp;
gchar *fileSpec;
#ifndef DEV_STANDALONE
fileSpec = g_strconcat( addrIndex->filePath, G_DIR_SEPARATOR_S, newFile, NULL );
addrIndex->retVal = MGU_OPEN_FILE;
#ifdef DEV_STANDALONE
- fp = fopen( fileSpec, "wb" );
+ fp = g_fopen( fileSpec, "wb" );
g_free( fileSpec );
if( fp ) {
fputs( "<?xml version=\"1.0\" ?>\n", fp );
g_free( fileSpec );
if( pfile ) {
fp = pfile->fp;
- fprintf( fp, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n",
- conv_get_current_charset_str() );
+ if (fprintf( fp, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n", CS_INTERNAL ) < 0)
+ goto fail;
#endif
- addrindex_write_elem_s( fp, 0, TAG_ADDRESS_INDEX );
- fputs( ">\n", fp );
+ if (addrindex_write_elem_s( fp, 0, TAG_ADDRESS_INDEX ) < 0)
+ goto fail;
+ if (fputs( ">\n", fp ) == EOF)
+ goto fail;
- addrindex_write_index( addrIndex, fp );
- addrindex_write_elem_e( fp, 0, TAG_ADDRESS_INDEX );
+ if (addrindex_write_index( addrIndex, fp ) < 0)
+ goto fail;
+ if (addrindex_write_elem_e( fp, 0, TAG_ADDRESS_INDEX ) < 0)
+ goto fail;
addrIndex->retVal = MGU_SUCCESS;
#ifdef DEV_STANDALONE
fileSpec = NULL;
return addrIndex->retVal;
+fail:
+ g_warning("error writing AB index\n");
+ addrIndex->retVal = MGU_ERROR_WRITE;
+ if (pfile)
+ prefs_file_close_revert( pfile );
+ return addrIndex->retVal;
}
/*
* return: Status code, from addrIndex->retVal.
*/
gint addrindex_save_data( AddressIndex *addrIndex ) {
+#ifdef USE_LDAP
+ GList *nodeIf;
+ GList *nodeDS;
+#endif
+
g_return_val_if_fail( addrIndex != NULL, -1 );
+#ifdef USE_LDAP
+ nodeIf = addrIndex->interfaceList;
+ /* save LDAP interfaces */
+ while ( nodeIf ) {
+ AddressInterface *iface = nodeIf->data;
+ if( iface->type == ADDR_IF_LDAP ) {
+ nodeDS = iface->listSource;
+ while( nodeDS ) {
+ AddressDataSource *ds = nodeDS->data;
+ LdapServer *abf = ds->rawDataSource;
+ if( ldapsvr_get_read_flag( abf ) ) {
+ if( ldapsvr_get_modified( abf ) ) {
+ ldapsvr_update_book( abf, NULL );
+ if( abf->retVal != LDAPRC_SUCCESS ) {
+ alertpanel( _("Address(es) update"),
+ _("Update failed. Changes not written to Directory."),
+ GTK_STOCK_CLOSE, NULL, NULL );
+ }
+ else {
+ abf->retVal = MGU_SUCCESS;
+ ldapsvr_set_modified( abf, FALSE );
+ }
+ }
+ }
+ nodeDS = g_list_next( nodeDS );
+ }
+ break;
+ }
+ nodeIf = g_list_next( nodeIf );
+ }
+#endif
addrIndex->retVal = MGU_NO_FILE;
if( addrIndex->fileName == NULL || *addrIndex->fileName == '\0' ) return addrIndex->retVal;
if( addrIndex->filePath == NULL || *addrIndex->filePath == '\0' ) return addrIndex->retVal;
if( xml_compare_tag( file, ELTAG_IF_OLD_REMARKS ) ) {
nn->remarks = g_strdup( element );
}
+ g_free(element);
xml_parse_next_tag(file);
}
}
node->list = g_list_append( node->list, newNode );
}
else {
- /* printf( "invalid: !!! \n" ); */
+ /* g_print( "invalid: !!! \n" ); */
attr = xml_get_current_tag_attr( file );
}
}
if (file->level < prev_level) return;
xtag = xml_get_current_tag( file );
- /* printf( "tag : %s\n", xtag->tag ); */
+ /* g_print( "tag : %s\n", xtag->tag ); */
element = xml_get_element( file );
attr = xml_get_current_tag_attr( file );
/* show_attribs( attr ); */
- /* printf( "\ttag value : %s :\n", element ); */
+ /* g_print( "\ttag value : %s :\n", element ); */
addrindex_consume_tree( file );
}
}
if (file->level < prev_level) return;
xtag = xml_get_current_tag( file );
- /* printf( "tag : %d : %s\n", prev_level, xtag->tag ); */
+ /* g_print( "tag : %d : %s\n", prev_level, xtag->tag ); */
if( strcmp( xtag->tag, TAG_IF_OLD_COMMON ) == 0 ) {
if( addrindex_process_book( addrIndex, file, DISP_OLD_COMMON ) ) {
addrIndex->needsConversion = FALSE;
element = xml_get_element( file );
attr = xml_get_current_tag_attr( file );
/* show_attribs( attr ); */
- /* printf( "\ttag value : %s :\n", element ); */
+ /* g_print( "\ttag value : %s :\n", element ); */
addrindex_consume_tree( file );
}
}
g_free( fileSpec );
if( file == NULL ) {
- /* fprintf( stdout, " file '%s' does not exist.\n", addrIndex->fileName ); */
+ /* g_print( " file '%s' does not exist.\n", addrIndex->fileName ); */
return addrIndex->retVal;
}
if( iface->getReadData ) {
/*
gchar *name = ( iface->getName ) ( ds->rawDataSource );
- printf( "addrindex_ds_read_data...reading:::%s:::\n", name );
+ g_print( "addrindex_ds_read_data...reading:::%s:::\n", name );
*/
retVal = ( iface->getReadData ) ( ds->rawDataSource );
}
return retVal;
}
-/*
- * Return list of folders for specified data source.
- */
-GList *addrindex_ds_get_list_folder( AddressDataSource *ds ) {
- GList *retVal = FALSE;
- AddressInterface *iface;
-
- if( ds == NULL ) return retVal;
- iface = ds->interface;
- if( iface == NULL ) return retVal;
- if( iface->getListFolder ) {
- retVal = ( iface->getListFolder ) ( ds->rawDataSource );
- }
- return retVal;
-}
-
-/*
- * Return list of persons in root folder for specified data source.
- */
-GList *addrindex_ds_get_list_person( AddressDataSource *ds ) {
- GList *retVal = FALSE;
- AddressInterface *iface;
-
- if( ds == NULL ) return retVal;
- iface = ds->interface;
- if( iface == NULL ) return retVal;
- if( iface->getListPerson ) {
- retVal = ( iface->getListPerson ) ( ds->rawDataSource );
- }
- return retVal;
-}
-
/*
* Return name for specified data source.
*/
/*
* Return list of all persons for specified data source.
*/
-GList *addrindex_ds_get_all_persons( AddressDataSource *ds ) {
+static GList *addrindex_ds_get_all_persons( AddressDataSource *ds ) {
GList *retVal = NULL;
AddressInterface *iface;
/*
* Return list of all groups for specified data source.
*/
-GList *addrindex_ds_get_all_groups( AddressDataSource *ds ) {
+static GList *addrindex_ds_get_all_groups( AddressDataSource *ds ) {
GList *retVal = NULL;
AddressInterface *iface;
queryID = req->queryID;
qryreq_set_search_type( req, ADDRSEARCH_DYNAMIC );
- /* printf( "***> query ID ::%d::\n", queryID ); */
+ /* g_print( "***> query ID ::%d::\n", queryID ); */
return queryID;
}
LdapServer *server, QueryRequest *req );
LdapQuery *ldapsvr_new_explicit_search(
LdapServer *server, QueryRequest *req, ItemFolder *folder );
+void ldapsvr_execute_query( LdapServer *server, LdapQuery *qry );
#endif
GList *nodeDS;
gint type;
- /* printf( "addrindex_start_dynamic::%d::\n", req->queryID ); */
+ /* g_print( "addrindex_start_dynamic::%d::\n", req->queryID ); */
nodeIf = _addressIndex_->searchOrder;
while( nodeIf ) {
iface = nodeIf->data;
AddrQueryObject *aqo;
GList *node;
- /* printf( "addrindex_stop_search/queryID=%d\n", queryID ); */
+ /* g_print( "addrindex_stop_search/queryID=%d\n", queryID ); */
/* If query ID does not match, search has not been setup */
req = qrymgr_find_request( queryID );
if( req == NULL ) {
QueryRequest *req;
gint queryID;
gchar *name;
+ gchar *mySearch;
/* Name the query */
name = g_strdup_printf( "Search '%s'", searchTerm );
/* Set up query request */
- req = qrymgr_add_request( searchTerm, callBackEnd, callBackEntry );
+ if (!strcmp(searchTerm, "*"))
+ mySearch = g_strdup("*@");
+ else
+ mySearch = g_strdup(searchTerm);
+
+ req = qrymgr_add_request( mySearch, callBackEnd, callBackEntry );
+
+ g_free(mySearch);
+
qryreq_set_search_type( req, ADDRSEARCH_EXPLICIT );
queryID = req->queryID;
AddrSearchType searchType;
retVal = FALSE;
- /* printf( "addrindex_start_search/queryID=%d\n", queryID ); */
+ /* g_print( "addrindex_start_search/queryID=%d\n", queryID ); */
req = qrymgr_find_request( queryID );
if( req == NULL ) {
return retVal;
AddressCache *cache;
gint queryID = 0;
- /* printf( "addrindex_remove_results/start\n" ); */
+ /* g_print( "addrindex_remove_results/start\n" ); */
/* Test for folder */
if( folder->folderType != ADDRFOLDER_QUERY_RESULTS ) return;
- /* printf( "folder name ::%s::\n", ADDRITEM_NAME(folder) ); */
+ /* g_print( "folder name ::%s::\n", ADDRITEM_NAME(folder) ); */
adbase = ( AddrBookBase * ) ds->rawDataSource;
if( adbase == NULL ) return;
cache = adbase->addressCache;
qry = ( LdapQuery * ) folder->folderData;
queryID = ADDRQUERY_ID(qry);
- /* printf( "calling ldapquery_remove_results...queryID=%d\n", queryID ); */
+ /* g_print( "calling ldapquery_remove_results...queryID=%d\n", queryID ); */
delFlag = ldapquery_remove_results( qry );
- /* printf( "calling ldapquery_remove_results...done\n" ); */
+ if (delFlag) {
+ ldapqry_free( qry );
+ }
+ /* g_print( "calling ldapquery_remove_results...done\n" ); */
/*
if( delFlag ) {
- printf( "delFlag IS-TRUE\n" );
+ g_print( "delFlag IS-TRUE\n" );
}
else {
- printf( "delFlag IS-FALSE\n" );
- addressbook_clear_idler( queryID );
+ g_print( "delFlag IS-FALSE\n" );
}
*/
#endif
}
- /* printf( "addrindex_remove_results/end\n" ); */
+ /* g_print( "addrindex_remove_results/end\n" ); */
/* Delete query request */
if( queryID > 0 ) {
* ***********************************************************************
*/
+static void addrindex_load_completion_load_persons(
+ gint (*callBackFunc) ( const gchar *, const gchar *,
+ const gchar *, const gchar *, GList * ),
+ AddressDataSource *ds)
+{
+ GList *listP, *nodeP;
+ GList *nodeM;
+ gchar *sName;
+
+ /* Read address book */
+ if( addrindex_ds_get_modify_flag( ds ) ) {
+ addrindex_ds_read_data( ds );
+ }
+
+ if( ! addrindex_ds_get_read_flag( ds ) ) {
+ addrindex_ds_read_data( ds );
+ }
+
+ /* Get all groups */
+ listP = addrindex_ds_get_all_groups( ds );
+ nodeP = listP;
+ while( nodeP ) {
+ ItemGroup *group = nodeP->data;
+ GList *emails = NULL;
+ for (nodeM = group->listEMail; nodeM; nodeM = g_list_next(nodeM)) {
+ ItemEMail *email = nodeM->data;
+ if (email->address)
+ emails = g_list_append(emails, email);
+ }
+ callBackFunc( ((AddrItemObject *)group)->name, NULL,
+ NULL, NULL, emails );
+ nodeP = g_list_next( nodeP );
+ }
+
+ /* Free up the list */
+ g_list_free( listP );
+ /* Get all persons */
+ listP = addrindex_ds_get_all_persons( ds );
+ nodeP = listP;
+ while( nodeP ) {
+ ItemPerson *person = nodeP->data;
+ nodeM = person->listEMail;
+
+ /* Figure out name to use */
+ sName = ADDRITEM_NAME(person);
+ if( sName == NULL || *sName == '\0' ) {
+ sName = person->nickName;
+ }
+
+ /* Process each E-Mail address */
+ while( nodeM ) {
+ ItemEMail *email = nodeM->data;
+
+ callBackFunc( sName, email->address, person->nickName,
+ ADDRITEM_NAME(email), NULL );
+
+ nodeM = g_list_next( nodeM );
+ }
+ nodeP = g_list_next( nodeP );
+ }
+
+ /* Free up the list */
+ g_list_free( listP );
+}
+
/**
* This function is used by the address completion function to load
* addresses for all non-external address book interfaces.
*
* \param callBackFunc Function to be called when an address is
* to be loaded.
+ * \param folderpath Addressbook's Book/folder path to restrict to (if NULL or ""
+ * or "Any", assume the whole addressbook
* \return <i>TRUE</i> if data loaded, <i>FALSE</i> if address index not loaded.
*/
+
gboolean addrindex_load_completion(
gint (*callBackFunc) ( const gchar *, const gchar *,
- const gchar *, const gchar * ) )
+ const gchar *, const gchar *, GList * ),
+ gchar *folderpath )
+{
+ GList *nodeIf, *nodeDS;
+
+ if( folderpath != NULL ) {
+ AddressDataSource *book;
+ ItemFolder* folder;
+
+ /* split the folder path we've received, we'll try to match this path, subpath by
+ subpath against the book/folder structure in order and restrict loading of
+ addresses to that subpart (if matches). book/folder path must exist and
+ folderpath must not be empty or NULL */
+
+ if( ! addressbook_peek_folder_exists( folderpath, &book, &folder ) ) {
+ g_warning("addrindex_load_completion: folder path '%s' doesn't exist\n", folderpath);
+ return FALSE;
+ }
+
+ if( folder != NULL ) {
+
+ GList *items;
+ GList *nodeM;
+ gchar *sName;
+ ItemPerson *person;
+
+ debug_print("addrindex_load_completion: folder %p '%s'\n", folder, folder->obj.name);
+
+ /* Load email addresses */
+ items = addritem_folder_get_person_list( folder );
+ for( ; items != NULL; items = g_list_next( items ) ) {
+ person = items->data;
+ nodeM = person->listEMail;
+
+ /* Figure out name to use */
+ sName = ADDRITEM_NAME(person);
+ if( sName == NULL || *sName == '\0' ) {
+ sName = person->nickName;
+ }
+
+ /* Process each E-Mail address */
+ while( nodeM ) {
+ ItemEMail *email = nodeM->data;
+
+ callBackFunc( sName, email->address, person->nickName,
+ ADDRITEM_NAME(email), NULL );
+
+ nodeM = g_list_next( nodeM );
+ }
+ }
+ /* Free up the list */
+ mgu_clear_list( items );
+ g_list_free( items );
+
+ return TRUE;
+
+ } else {
+
+ if( book != NULL ) {
+
+ AddressBookFile *abf = book->rawDataSource;
+
+ debug_print("addrindex_load_completion: book %p '%s'\n", book, abf?abf->fileName:"(null)");
+
+ addrindex_load_completion_load_persons( callBackFunc, book );
+
+ return TRUE;
+
+ } else {
+ g_warning("addrindex_load_completion: book/folder path is valid but got no pointer\n");
+ }
+ }
+ return FALSE;
+
+ } else {
+
+ nodeIf = addrindex_get_interface_list( _addressIndex_ );
+ while( nodeIf ) {
+ AddressInterface *iface = nodeIf->data;
+
+ nodeIf = g_list_next( nodeIf );
+
+ if( ! iface->useInterface || iface->externalQuery )
+ continue;
+
+ nodeDS = iface->listSource;
+ while( nodeDS ) {
+ addrindex_load_completion_load_persons( callBackFunc, nodeDS->data );
+ nodeDS = g_list_next( nodeDS );
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * This function can be used to collect information about
+ * addressbook entries that contain a specific attribute.
+ *
+ * \param attr Name of attribute to look for
+ * \param callBackFunc Function to be called when a matching attribute was found
+ * \return <i>TRUE</i>
+ */
+gboolean addrindex_load_person_attribute(
+ const gchar *attr,
+ gint (*callBackFunc) ( ItemPerson *, const gchar * ) )
{
AddressDataSource *ds;
GList *nodeIf, *nodeDS;
GList *listP, *nodeP;
- GList *nodeM;
- gchar *sName;
+ GList *nodeA;
nodeIf = addrindex_get_interface_list( _addressIndex_ );
while( nodeIf ) {
+ gchar *cur_bname;
AddressInterface *iface = nodeIf->data;
nodeIf = g_list_next( nodeIf );
- if( ! iface->useInterface ) {
- continue;
- }
- if( iface->externalQuery ) {
+
+ if( ! iface->useInterface || iface->externalQuery )
continue;
- }
+
nodeDS = iface->listSource;
while( nodeDS ) {
ds = nodeDS->data;
addrindex_ds_read_data( ds );
}
+ /* Check addressbook name */
+ cur_bname = addrindex_ds_get_name( ds );
+
/* Get all persons */
listP = addrindex_ds_get_all_persons( ds );
nodeP = listP;
while( nodeP ) {
ItemPerson *person = nodeP->data;
- nodeM = person->listEMail;
- /* Figure out name to use */
- sName = ADDRITEM_NAME(person);
- if( sName == NULL || *sName == '\0' ) {
- sName = person->nickName;
+ /* Return all ItemPerson's if attr is NULL */
+ if( attr == NULL ) {
+ callBackFunc(person, cur_bname);
}
- /* Process each E-Mail address */
- while( nodeM ) {
- ItemEMail *email = nodeM->data;
-
- callBackFunc( sName, email->address, person->nickName,
- ADDRITEM_NAME(email) );
-
- nodeM = g_list_next( nodeM );
+ /* Return ItemPerson's with specific attribute */
+ else {
+ nodeA = person->listAttrib;
+ /* Process each User Attribute */
+ while( nodeA ) {
+ UserAttribute *attrib = nodeA->data;
+ if( attrib->name &&
+ !strcmp( attrib->name,attr ) ) {
+ callBackFunc(person, cur_bname);
+ }
+ nodeA = g_list_next( nodeA );
+ }
}
nodeP = g_list_next( nodeP );
}
nodeDS = g_list_next( nodeDS );
}
}
+ return TRUE;
+}
+
+/**
+ * This function can be used to collect information about
+ * addressbook entries
+ *
+ * \param callBackFunc Function to be called for each ItemPerson
+ * \return <i>TRUE</i>
+ */
+gboolean addrindex_load_person_ds( gint (*callBackFunc)
+ ( ItemPerson *, AddressDataSource * ) )
+{
+ AddressDataSource *ds;
+ GList *nodeIf, *nodeDS;
+ GList *listP, *nodeP;
+
+ nodeIf = addrindex_get_interface_list( _addressIndex_ );
+ while( nodeIf ) {
+ AddressInterface *iface = nodeIf->data;
+
+ nodeIf = g_list_next( nodeIf );
+
+ if( ! iface->useInterface || iface->externalQuery )
+ continue;
+ nodeDS = iface->listSource;
+ while( nodeDS ) {
+ ds = nodeDS->data;
+
+ /* Read address book */
+ if( addrindex_ds_get_modify_flag( ds ) ) {
+ addrindex_ds_read_data( ds );
+ }
+
+ if( ! addrindex_ds_get_read_flag( ds ) ) {
+ addrindex_ds_read_data( ds );
+ }
+
+ /* Get all persons */
+ listP = addrindex_ds_get_all_persons( ds );
+ nodeP = listP;
+ while( nodeP ) {
+ ItemPerson *person = nodeP->data;
+
+ callBackFunc(person, ds);
+ nodeP = g_list_next( nodeP );
+ }
+ /* Free up the list */
+ g_list_free( listP );
+
+ nodeDS = g_list_next( nodeDS );
+ }
+ }
return TRUE;
}
+
/*
* End of Source.
*/
-
-