/** * Process a single label entry field, parsing multiple e-mail address entries. * * \param pilotFile JPilot control data. * \param labelEntry Label entry data. * \param person Person. */ static void jpilot_parse_label( JPilotFile *pilotFile, gchar *labelEntry, ItemPerson *person ) { gchar buffer[ EMAIL_BUFSIZE ]; ItemEMail *email; GList *list, *node; if( labelEntry ) { *buffer = '\0'; strcpy( buffer, labelEntry ); node = list = jpilot_parse_email( buffer ); while( node ) { gchar convertBuff[JPILOT_LEN_LABEL]; email = addritem_create_item_email(); addritem_email_set_address( email, node->data ); if (convert_charcode) { conv_sjistoeuc(convertBuff, JPILOT_LEN_LABEL, buffer); addritem_email_set_remarks(email, convertBuff); } else { addritem_email_set_remarks(email, buffer); } addrcache_id_email( pilotFile->addressCache, email ); addrcache_person_add_email( pilotFile->addressCache, person, email ); node = g_list_next( node ); } mgu_free_dlist( list ); list = NULL; } }
/** * Add person and address data to cache. * \param cache Cache. * \param folder Folder where to add person, or NULL for root folder. * \param name Common name. * \param address EMail address. * \param remarks Remarks. * \return Person added. Do not *NOT* to use the * <code>addrbook_free_xxx()</code> functions...; this will destroy * the address book data. */ ItemPerson *addrcache_add_contact( AddressCache *cache, ItemFolder *folder, const gchar *name, const gchar *address, const gchar *remarks ) { ItemPerson *person = NULL; ItemEMail *email = NULL; ItemFolder *f = folder; cm_return_val_if_fail( cache != NULL, NULL ); if( ! f ) f = cache->rootFolder; /* Create person object */ person = addritem_create_item_person(); addritem_person_set_common_name( person, name ); addrcache_id_person( cache, person ); addrcache_folder_add_person( cache, f, person ); /* Create email object */ email = addritem_create_item_email(); addritem_email_set_address( email, address ); addritem_email_set_remarks( email, remarks ); addrcache_id_email( cache, email ); addritem_person_add_email( person, email ); cache->dirtyFlag = TRUE; return person; }
/* * Build an address list entry and append to list of address items. */ static void vcard_build_items( VCardFile *cardFile, GSList *listName, GSList *listAddr, GSList *listRem, GSList *listID ) { GSList *nodeName = listName; GSList *nodeID = listID; gchar *str; while( nodeName ) { GSList *nodeAddress = listAddr; GSList *nodeRemarks = listRem; ItemPerson *person = addritem_create_item_person(); addritem_person_set_common_name( person, nodeName->data ); while( nodeAddress ) { str = nodeAddress->data; if( *str != '\0' ) { ItemEMail *email = addritem_create_item_email(); addritem_email_set_address( email, str ); str = nodeRemarks->data; if( nodeRemarks ) { if( str ) { if( g_strcasecmp( str, "internet" ) != 0 ) { if( *str != '\0' ) addritem_email_set_remarks( email, str ); } } } addrcache_id_email( cardFile->addressCache, email ); addrcache_person_add_email( cardFile->addressCache, person, email ); } nodeAddress = g_slist_next( nodeAddress ); nodeRemarks = g_slist_next( nodeRemarks ); } if( person->listEMail ) { addrcache_id_person( cardFile->addressCache, person ); addrcache_add_person( cardFile->addressCache, person ); if( nodeID ) { str = nodeID->data; addritem_person_set_external_id( person, str ); } } else { addritem_free_item_person( person ); } nodeName = g_slist_next( nodeName ); nodeID = g_slist_next( nodeID ); } }
/* * Unpack address, building new data inside cache. */ static void jpilot_load_address( JPilotFile *pilotFile, buf_rec *buf, ItemFolder *folderInd[] ) { struct Address addr; gchar **addrEnt; gint num, k; gint cat_id = 0; guint unique_id; guchar attrib; gchar fullName[ FULLNAME_BUFSIZE ]; gchar bufEMail[ EMAIL_BUFSIZE ]; ItemPerson *person; ItemEMail *email; gint *indPhoneLbl; gchar *labelEntry; GList *node; gchar* extID; struct AddressAppInfo *ai; gchar **firstName = NULL; gchar **lastName = NULL; #if (PILOT_LINK_MAJOR > 11) pi_buffer_t *RecordBuffer; #endif /* PILOT_LINK_0_12 */ /* Retrieve address */ #if (PILOT_LINK_MAJOR < 12) num = unpack_Address( & addr, buf->buf, buf->size ); if( num > 0 ) { #else /* PILOT_LINK_0_12 */ RecordBuffer = pi_buffer_new(buf->size); memcpy(RecordBuffer->data, buf->buf, buf->size); RecordBuffer->used = buf->size; num = unpack_Address( & addr, RecordBuffer, address_v1 ); pi_buffer_free(RecordBuffer); if (num != -1) { #endif gchar *nameConv; addrEnt = addr.entry; attrib = buf->attrib; unique_id = buf->unique_id; cat_id = attrib & 0x0F; *fullName = *bufEMail = '\0'; if( addrEnt[ IND_LABEL_FIRSTNAME ] ) { firstName = g_strsplit( addrEnt[ IND_LABEL_FIRSTNAME ], "\01", 2 ); } if( addrEnt[ IND_LABEL_LASTNAME ] ) { lastName = g_strsplit( addrEnt[ IND_LABEL_LASTNAME ], "\01", 2 ); } if( name_order == FAMILY_LAST ) { g_snprintf( fullName, FULLNAME_BUFSIZE, "%s %s", firstName ? firstName[0] : "", lastName ? lastName[0] : "" ); } else { g_snprintf( fullName, FULLNAME_BUFSIZE, "%s %s", lastName ? lastName[0] : "", firstName ? firstName[0] : "" ); } if( firstName ) { g_strfreev( firstName ); } if( lastName ) { g_strfreev( lastName ); } g_strstrip( fullName ); nameConv = jpilot_convert_encoding( fullName ); strncpy2( fullName, nameConv, FULLNAME_BUFSIZE ); g_free( nameConv ); person = addritem_create_item_person(); addritem_person_set_common_name( person, fullName ); addritem_person_set_first_name( person, addrEnt[ IND_LABEL_FIRSTNAME ] ); addritem_person_set_last_name( person, addrEnt[ IND_LABEL_LASTNAME ] ); addrcache_id_person( pilotFile->addressCache, person ); extID = g_strdup_printf( "%d", unique_id ); addritem_person_set_external_id( person, extID ); g_free( extID ); extID = NULL; /* Pointer to address metadata. */ ai = & pilotFile->addrInfo; /* Add entry for each email address listed under phone labels. */ indPhoneLbl = addr.phoneLabel; for( k = 0; k < JPILOT_NUM_ADDR_PHONE; k++ ) { gint ind; ind = indPhoneLbl[k]; /* * fprintf( stdout, "%d : %d : %20s : %s\n", k, ind, * ai->phoneLabels[ind], addrEnt[3+k] ); */ if( indPhoneLbl[k] == IND_PHONE_EMAIL ) { labelEntry = addrEnt[ OFFSET_PHONE_LABEL + k ]; if( labelEntry ) { strcpy( bufEMail, labelEntry ); g_strchug( bufEMail ); g_strchomp( bufEMail ); email = addritem_create_item_email(); addritem_email_set_address( email, bufEMail ); addrcache_id_email( pilotFile->addressCache, email ); addrcache_person_add_email ( pilotFile->addressCache, person, email ); } } } /* Add entry for each custom label */ node = pilotFile->labelInd; while( node ) { gint ind; ind = GPOINTER_TO_INT( node->data ); if( ind > -1 ) { /* * fprintf( stdout, "%d : %20s : %s\n", ind, ai->labels[ind], * addrEnt[ind] ); */ labelEntry = addrEnt[ind]; if( labelEntry ) { gchar *convertBuff; strcpy( bufEMail, labelEntry ); g_strchug( bufEMail ); g_strchomp( bufEMail ); email = addritem_create_item_email(); addritem_email_set_address( email, bufEMail ); convertBuff = jpilot_convert_encoding( ai->labels[ind] ); addritem_email_set_remarks( email, convertBuff ); g_free( convertBuff ); addrcache_id_email( pilotFile->addressCache, email ); addrcache_person_add_email ( pilotFile->addressCache, person, email ); } } node = g_list_next( node ); } if( person->listEMail ) { if( cat_id > -1 && cat_id < JPILOT_NUM_CATEG ) { /* Add to specified category */ addrcache_folder_add_person ( pilotFile->addressCache, folderInd[cat_id], person ); } else { /* Add to root folder */ addrcache_add_person( pilotFile->addressCache, person ); } } else { addritem_free_item_person( person ); person = NULL; } } } /* * Free up address list. */ static void jpilot_free_addrlist( GList *records ) { GList *node; buf_rec *br; node = records; while( node ) { br = node->data; free( br ); node->data = NULL; node = g_list_next( node ); } /* Free up list */ g_list_free( records ); }