+static AddressVCard *addressbook_parse_vcard(XMLFile *file) {
+ AddressVCard *item = NULL;
+ VCardFile *vcf;
+ GList *attr;
+ gchar *name, *value;
+
+ vcf = vcard_create();
+ attr = xml_get_current_tag_attr( file );
+ while( attr ) {
+ name = ((XMLAttr *)attr->data)->name;
+ value = ((XMLAttr *)attr->data)->value;
+ if( strcmp( name, "name" ) == 0 ) {
+ vcard_set_name( vcf, value );
+ }
+ else if( strcmp( name, "file" ) == 0) {
+ vcard_set_file( vcf, value );
+ }
+ attr = g_list_next( attr );
+ }
+
+ // Move to next tag
+ if( xml_parse_next_tag( file ) >= 0 ) {
+ if( vcard_validate( vcf ) ) {
+ item = g_new( AddressVCard, 1 );
+ ADDRESS_OBJECT(item)->type = ADDR_VCARD;
+ item->name = g_strdup( vcf->name );
+ item->cardFile = vcf;
+ item->items = NULL;
+ return item;
+ }
+ }
+
+ // Must be an invalid tag or data.
+ g_warning( "addressbook_parse_vcard(): Parse error\n");
+ vcard_free( vcf );
+ vcf = NULL;
+ item = NULL;
+ return NULL;
+}
+
+static void addressbook_write_vcard( FILE *fp, AddressVCard *vcard, guint level ) {
+ VCardFile *cardFile = vcard->cardFile;
+ if( cardFile ) {
+ tab_indent_out(fp, 1);
+ fputs("<vcard ", fp);
+ fputs("name=\"", fp);
+ xml_file_put_escape_str(fp, cardFile->name);
+ fputs("\"", fp);
+ fputs(" file=\"", fp);
+ xml_file_put_escape_str(fp, cardFile->path);
+ fputs("\"", fp);
+ fputs(" />\n", fp);
+ }
+}
+
+#ifdef USE_JPILOT
+static AddressJPilot *addressbook_parse_jpilot(XMLFile *file) {
+ AddressJPilot *item = NULL;
+ JPilotFile *jpf;
+ GList *attr;
+ gchar *name, *value;
+
+ jpf = jpilot_create();
+ attr = xml_get_current_tag_attr( file );
+ while( attr ) {
+ name = ((XMLAttr *)attr->data)->name;
+ value = ((XMLAttr *)attr->data)->value;
+ if( strcmp( name, "name" ) == 0 ) {
+ jpilot_set_name( jpf, value );
+ }
+ else if( strcmp( name, "file" ) == 0 ) {
+ jpilot_set_file( jpf, value );
+ }
+ else if( strcmp( name, "custom-1" ) == 0 ) {
+ jpilot_add_custom_label( jpf, value );
+ }
+ else if( strcmp( name, "custom-2" ) == 0 ) {
+ jpilot_add_custom_label( jpf, value );
+ }
+ else if( strcmp( name, "custom-3" ) == 0 ) {
+ jpilot_add_custom_label( jpf, value );
+ }
+ else if( strcmp( name, "custom-4" ) == 0 ) {
+ jpilot_add_custom_label( jpf, value );
+ }
+ attr = g_list_next( attr );
+ }
+
+ // Move to next tag
+ if( xml_parse_next_tag( file ) >= 0 ) {
+ if( jpilot_validate( jpf ) ) {
+ item = g_new( AddressJPilot, 1 );
+ ADDRESS_OBJECT(item)->type = ADDR_JPILOT;
+ item->name = g_strdup( jpf->name );
+ item->pilotFile = jpf;
+ item->items = NULL;
+ return item;
+ }
+ }
+
+ // Must be an invalid tag or data.
+ g_warning( "addressbook_parse_jpilot(): Parse error\n");
+ jpilot_free( jpf );
+ jpf = NULL;
+ item = NULL;
+ return NULL;
+}
+
+static void addressbook_write_jpilot( FILE *fp, AddressJPilot *jpilot, guint level ) {
+ JPilotFile *pilotFile = jpilot->pilotFile;
+ if( pilotFile ) {
+ gint ind;
+ GList *node;
+ GList *customLbl = jpilot_get_custom_labels( pilotFile );
+ tab_indent_out(fp, 1);
+ fputs("<jpilot ", fp);
+ fputs("name=\"", fp);
+ xml_file_put_escape_str(fp, pilotFile->name);
+ fputs("\" file=\"", fp);
+ xml_file_put_escape_str(fp, pilotFile->path);
+
+ fputs( "\" ", fp );
+ node = customLbl;
+ ind = 1;
+ while( node ) {
+ fprintf( fp, "custom-%d=\"", ind );
+ xml_file_put_escape_str( fp, node->data );
+ fputs( "\" ", fp );
+ ind++;
+ node = g_list_next( node );
+ }
+ fputs("/>\n", fp);
+ }
+}
+#endif
+
+static void addressbook_new_vcard_cb( gpointer data, guint action, GtkWidget *widget ) {
+ AddressVCard *vcard;
+
+ if( addrbook.selected != addrbook.vcard ) return;
+ vcard = addressbook_edit_vcard( NULL );
+ if( vcard ) {
+ addressbook_add_object( addrbook.selected, ADDRESS_OBJECT(vcard) );
+ if( addrbook.selected == addrbook.opened ) {
+ addrbook.open_folder = TRUE;
+ gtk_ctree_select( GTK_CTREE(addrbook.ctree), addrbook.opened );
+ }
+ }
+}
+
+static void addressbook_vcard_show_message( VCardFile *vcf ) {
+ *addressbook_msgbuf = '\0';
+ if( vcf ) {
+ if( vcf->retVal == MGU_SUCCESS ) {
+ sprintf( addressbook_msgbuf, "%s", vcf->name );
+ }
+ else {
+ sprintf( addressbook_msgbuf, "%s: %s", vcf->name, mgu_error2string( vcf->retVal ) );
+ }
+ }
+ addressbook_status_show( addressbook_msgbuf );
+}
+
+#ifdef USE_JPILOT
+static void addressbook_new_jpilot_cb( gpointer data, guint action, GtkWidget *widget ) {
+ AddressJPilot *jpilot;
+
+ if( addrbook.selected != addrbook.jpilot ) return;
+ if( ! _have_pilot_library_ ) return;
+ jpilot = addressbook_edit_jpilot( NULL );
+ if( jpilot ) {
+ addressbook_add_object( addrbook.selected, ADDRESS_OBJECT(jpilot) );
+ if( addrbook.selected == addrbook.opened ) {
+ addrbook.open_folder = TRUE;
+ gtk_ctree_select( GTK_CTREE(addrbook.ctree), addrbook.opened );
+ }
+ }
+}
+
+static void addressbook_jpilot_show_message( JPilotFile *jpf ) {
+ *addressbook_msgbuf = '\0';
+ if( jpf ) {
+ if( jpf->retVal == MGU_SUCCESS ) {
+ sprintf( addressbook_msgbuf, "%s", jpf->name );
+ }
+ else {
+ sprintf( addressbook_msgbuf, "%s: %s", jpf->name, mgu_error2string( jpf->retVal ) );
+ }
+ }
+ addressbook_status_show( addressbook_msgbuf );
+}
+
+#endif
+
+#ifdef USE_LDAP
+static void addressbook_new_ldap_cb( gpointer data, guint action, GtkWidget *widget ) {
+ AddressLDAP *ldapi;
+
+ if( addrbook.selected != addrbook.ldap ) return;
+ if( ! _have_ldap_library_ ) return;
+ ldapi = addressbook_edit_ldap( NULL );
+ if( ldapi ) {
+ addressbook_add_object( addrbook.selected, ADDRESS_OBJECT(ldapi) );
+ if( addrbook.selected == addrbook.opened ) {
+ addrbook.open_folder = TRUE;
+ gtk_ctree_select( GTK_CTREE(addrbook.ctree), addrbook.opened );
+ }
+ }
+}
+
+static AddressLDAP *addressbook_parse_ldap(XMLFile *file) {
+ AddressLDAP *item = NULL;
+ SyldapServer *server;
+ GList *attr;
+ gchar *name, *value;
+ gint ivalue;
+
+ server = syldap_create();
+ attr = xml_get_current_tag_attr( file );
+ while( attr ) {
+ name = ((XMLAttr *)attr->data)->name;
+ value = ((XMLAttr *)attr->data)->value;
+ ivalue = atoi( value );
+ if( strcmp( name, "name" ) == 0 ) {
+ syldap_set_name( server, value );
+ }
+ else if( strcmp( name, "host" ) == 0 ) {
+ syldap_set_host( server, value );
+ }
+ else if( strcmp( name, "port" ) == 0 ) {
+ syldap_set_port( server, ivalue );
+ }
+ else if( strcmp( name, "base-dn" ) == 0 ) {
+ syldap_set_base_dn( server, value );
+ }
+ else if( strcmp( name, "bind-dn" ) == 0 ) {
+ syldap_set_bind_dn( server, value );
+ }
+ else if( strcmp( name, "bind-pass" ) == 0 ) {
+ syldap_set_bind_password( server, value );
+ }
+ else if( strcmp( name, "criteria" ) == 0 ) {
+ syldap_set_search_criteria( server, value );
+ }
+ else if( strcmp( name, "max-entry" ) == 0 ) {
+ syldap_set_max_entries( server, ivalue );
+ }
+ else if( strcmp( name, "timeout" ) == 0 ) {
+ syldap_set_timeout( server, ivalue );
+ }
+ attr = g_list_next( attr );
+ }
+
+ // Move to next tag
+ if( xml_parse_next_tag( file ) >= 0 ) {
+ item = g_new( AddressLDAP, 1 );
+ ADDRESS_OBJECT(item)->type = ADDR_LDAP;
+ item->name = g_strdup( server->name );
+ item->ldapServer = server;
+ item->items = NULL;
+ return item;
+ }
+
+ // Must be an invalid tag or data.
+ g_warning( "addressbook_parse_ldap(): Parse error\n");
+ syldap_free( server );
+ server = NULL;
+ item = NULL;
+ return NULL;
+}
+
+static void addressbook_write_ldap( FILE *fp, AddressLDAP *ldapi, guint level ) {
+ SyldapServer *server = ldapi->ldapServer;
+ if( server ) {
+ tab_indent_out(fp, 1);
+ fputs("<server ", fp);
+ fputs("name=\"", fp);
+ xml_file_put_escape_str(fp, server->name);
+ fputs("\" host=\"", fp);
+ xml_file_put_escape_str(fp, server->hostName);
+ fprintf( fp, "\" port=\"%d", server->port);
+ fputs("\" base-dn=\"", fp);
+ xml_file_put_escape_str(fp, server->baseDN);
+ fputs("\" bind-dn=\"", fp);
+ xml_file_put_escape_str(fp, server->bindDN);
+ fputs("\" bind-pass=\"", fp);
+ xml_file_put_escape_str(fp, server->bindPass);
+ fputs("\" criteria=\"", fp);
+ xml_file_put_escape_str(fp, server->searchCriteria);
+ fprintf( fp, "\" max-entry=\"%d", server->maxEntries);
+ fprintf( fp, "\" timeout=\"%d", server->timeOut);
+ fputs("\" />\n", fp);
+ }
+}
+
+static void addressbook_ldap_show_message( SyldapServer *svr ) {
+ *addressbook_msgbuf = '\0';
+ if( svr ) {
+ if( svr->busyFlag ) {
+ sprintf( addressbook_msgbuf, "%s: %s", svr->name, ADDRESSBOOK_LDAP_BUSYMSG );
+ }
+ else {
+ if( svr->retVal == MGU_SUCCESS ) {
+ sprintf( addressbook_msgbuf, "%s", svr->name );
+ }
+ else {
+ sprintf( addressbook_msgbuf, "%s: %s", svr->name, mgu_error2string( svr->retVal ) );
+ }
+ }
+ }
+ addressbook_status_show( addressbook_msgbuf );
+}
+
+static gint ldapsearch_callback( SyldapServer *sls ) {
+ GtkCTree *ctree = GTK_CTREE(addrbook.ctree);
+ AddressObject *obj;
+
+ if( sls == NULL ) return;
+ if( ! addrbook.selected ) return;
+ if( GTK_CTREE_ROW( addrbook.selected )->level == 1 ) return;
+
+ obj = gtk_ctree_node_get_row_data( ctree, addrbook.selected );
+ if( obj == NULL ) return;
+ if( obj->type == ADDR_LDAP ) {
+ AddressLDAP *ldapi = ADDRESS_LDAP(obj);
+ SyldapServer *server = ldapi->ldapServer;
+ if( server == sls ) {
+ if( ! _have_ldap_library_ ) return;
+ // Read from cache
+ gtk_widget_show_all(addrbook.window);
+ ADDRESS_LDAP(obj)->items = syldap_get_address_list( sls );
+ addressbook_set_clist( obj );
+ addressbook_ldap_show_message( sls );
+ gtk_widget_show_all(addrbook.window);
+ }
+ }
+}
+#endif
+
+/*
+ * Lookup button handler.
+ */
+static void addressbook_lup_clicked( GtkButton *button, gpointer data ) {
+ GtkCTree *ctree = GTK_CTREE(addrbook.ctree);
+ AddressObject *obj;
+ gchar *sLookup;
+#ifdef USE_LDAP
+ AddressLDAP *ldapi;
+ SyldapServer *server;
+#endif
+
+ sLookup = gtk_editable_get_chars( GTK_EDITABLE(addrbook.entry), 0, -1 );
+ g_strchomp( sLookup );
+
+ if( ! addrbook.selected ) return;
+ if( GTK_CTREE_ROW( addrbook.selected )->level == 1 ) return;
+
+ obj = gtk_ctree_node_get_row_data( ctree, addrbook.selected );
+ if( obj == NULL ) return;
+
+#ifdef USE_LDAP
+ if( obj->type == ADDR_LDAP ) {
+ ldapi = ADDRESS_LDAP(obj);
+ server = ldapi->ldapServer;
+ if( server ) {
+ if( ! _have_ldap_library_ ) return;
+ 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 );
+ }
+ }
+#endif
+
+}
+