#include "common.h" #include "timezone_list.h" #include ITEMLIST listbox_items; void load_listbox_items() { HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); LISTITEM pa; DBVARIANT dbv; char *proto; listbox_items.clear(); while ( hContact != NULL ) { proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ); if ( proto && !lstrcmp( PROTO, proto)) { pa.hContact = hContact; if(!DBGetContactSetting(pa.hContact, PROTO, "TZName", &dbv)) { for(TimeList::iterator j = timezone_list.begin(); j != timezone_list.end(); j++) { if(!strcmp(j->tcName, dbv.pszVal)) { pa.timezone_list_index = j->list_index; break; } } DBFreeVariant(&dbv); } else pa.timezone_list_index = DBGetContactSettingDword(pa.hContact, PROTO, "TimezoneListIndex", -1); if(!DBGetContactSetting(pa.hContact, PROTO, "Nick", &dbv)) { strncpy(pa.pszText, dbv.pszVal, MAX_NAME_LENGTH); DBFreeVariant(&dbv); } listbox_items.push_back(pa); } hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); } } void save_listbox_items() { bool is_contact; for(ITEMLIST::iterator i = listbox_items.begin(); i != listbox_items.end(); i++) { is_contact = (int)CallService(MS_DB_CONTACT_IS, (WPARAM)i->hContact, 0) == 1; if(!is_contact) { i->hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )i->hContact, ( LPARAM )PROTO ); CallService(MS_IGNORE_IGNORE, (WPARAM)i->hContact, (WPARAM)IGNOREEVENT_USERONLINE); } DBWriteContactSettingString(i->hContact, PROTO, "Nick", i->pszText); DBWriteContactSettingDword(i->hContact, PROTO, "TimezoneListIndex", i->timezone_list_index); DBWriteContactSettingWord(i->hContact, PROTO, "Status", ID_STATUS_ONLINE); DBWriteContactSettingString(i->hContact, PROTO, "TZName", timezone_list[i->timezone_list_index].tcName); } DBWriteContactSettingWord(0, PROTO, "DataVersion", 1); // remove contacts in DB that have been removed from the list HANDLE hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); char *proto; bool found; while ( hContact != NULL ) { proto = ( char* )CallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM )hContact,0 ); if ( proto && !lstrcmp( PROTO, proto)) { found = false; for(ITEMLIST::iterator i = listbox_items.begin(); i != listbox_items.end(); i++) { if(i->hContact == hContact) { found = true; } } if(!found) { // remove prot first, so that our contact deleted event handler (if present) isn't activated HANDLE oldHContact = hContact; hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); CallService(MS_PROTO_REMOVEFROMCONTACT, (WPARAM)oldHContact, (LPARAM)PROTO); CallService(MS_DB_CONTACT_DELETE, (WPARAM)oldHContact, 0); } else hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); } else hContact = ( HANDLE )CallService( MS_DB_CONTACT_FINDNEXT,( WPARAM )hContact, 0 ); } }