char *NickFromHContact(HANDLE hContact) { static char nick[512] = ""; if (hContact) { char szProto[256]; int loaded = 0; if (GetValue(hContact,"Protocol","p",szProto,SIZEOF(szProto))) loaded = IsProtocolLoaded(szProto); if (!szProto[0] || !loaded) { char name[256]; if (szProto[0]) { if (GetValue(hContact,szProto,"Nick",name,SIZEOF(name))) mir_snprintf(nick, SIZEOF(nick),"%s (%s)", name, szProto); else mir_snprintf(nick, SIZEOF(nick),"(UNKNOWN) (%s)", szProto); } else mir_snprintf(nick, SIZEOF(nick),"(UNKNOWN)"); } else { char *uid; char szUID[256]; uid = (char*)CallProtoService(szProto,PS_GETCAPS,PFLAG_UNIQUEIDSETTING,0); if ((int)uid!=CALLSERVICE_NOTFOUND && uid) { GetValue(hContact, szProto, uid, szUID, SIZEOF(szUID)); mir_snprintf(nick, SIZEOF(nick), "%s *(%s)*<%s>*{%s}*", (char*)GetContactName(hContact,szProto,0), szProto, uid, szUID); } else mir_snprintf(nick, SIZEOF(nick), "%s (%s)", (char*)GetContactName(hContact,szProto,0), szProto); } } return nick; }
static MCONTACT convertContact(MCONTACT hContact) { // Check what protocol this contact belongs to char szProto[100]; if (myGetS(hContact, "Protocol", "p", szProto)) return INVALID_CONTACT_ID; // Protocol installed? if (!IsProtocolLoaded(szProto)) return INVALID_CONTACT_ID; // Is contact in database? char* pszUniqueSetting = (char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0); // Skip protocols with no unique id setting (some non IM protocols return NULL) MCONTACT hDst = INVALID_CONTACT_ID; if (pszUniqueSetting && (INT_PTR)pszUniqueSetting != CALLSERVICE_NOTFOUND) { DBVARIANT dbv; if (!myGet(hContact, szProto, pszUniqueSetting, &dbv)) { switch (dbv.type) { case DBVT_DWORD: hDst = HContactFromNumericID(szProto, pszUniqueSetting, dbv.dVal); break; case DBVT_ASCIIZ: hDst = HContactFromID(szProto, pszUniqueSetting, _A2T(dbv.pszVal)); break; case DBVT_WCHAR: hDst = HContactFromID(szProto, pszUniqueSetting, dbv.ptszVal); break; } srcDb->FreeVariant(&dbv); } } return hDst; }
INT_PTR CALLBACK copyModDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { ModuleAndContact *mac = (ModuleAndContact *)GetWindowLongPtr(hwnd,GWLP_USERDATA); if (msg == WM_INITDIALOG) { int index, loaded; char szProto[256]; for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { if (GetValue(hContact,"Protocol","p",szProto,SIZEOF(szProto))) loaded = IsProtocolLoaded(szProto); else loaded = 0; // filter if ((loaded && Mode == MODE_UNLOADED) || (!loaded && Mode == MODE_LOADED)) continue; // contacts name DBVARIANT dbv ={0}; WCHAR nick[256]; WCHAR protoW[256]; // unicode proto if (szProto[0]) a2u(szProto, protoW, SIZEOF(protoW)); else protoW[0] = 0; if (!szProto[0] || !loaded) { if (protoW) { if (Order) mir_snwprintf(nick, SIZEOF(nick), L"(%s) %s %s", protoW, GetContactName(hContact, szProto, 1), L"(UNLOADED)"); else mir_snwprintf(nick, SIZEOF(nick), L"%s (%s) %s", GetContactName(hContact, szProto, 1), protoW, L"(UNLOADED)"); } else wcscpy(nick, nick_unknownW); } else { if (Order) mir_snwprintf(nick, SIZEOF(nick), L"(%s) %s", protoW, GetContactName(hContact, szProto, 1)); else mir_snwprintf(nick, SIZEOF(nick), L"%s (%s)", GetContactName(hContact, szProto, 1), protoW); } index = SendMessageW(GetDlgItem(hwnd, IDC_CONTACTS), CB_ADDSTRING, 0, (LPARAM)nick); SendMessageW(GetDlgItem(hwnd, IDC_CONTACTS), CB_SETITEMDATA, index, hContact); } index = (int)SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_INSERTSTRING, 0, (LPARAM)(char*)Translate("Settings")); SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_SETITEMDATA, index, 0); SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_SETCURSEL, index, 0); SetWindowLongPtr(hwnd,GWLP_USERDATA,lParam); TranslateDialogDefault(hwnd); } else if (msg == WM_COMMAND) { switch(LOWORD(wParam)) { case CHK_COPY2ALL: EnableWindow(GetDlgItem(hwnd, IDC_CONTACTS),!IsDlgButtonChecked(hwnd,CHK_COPY2ALL)); break; case IDOK: if (!IsDlgButtonChecked(hwnd,CHK_COPY2ALL)) { MCONTACT hContact = (MCONTACT)SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_GETITEMDATA, SendMessage(GetDlgItem(hwnd, IDC_CONTACTS), CB_GETCURSEL, 0, 0), 0); copyModule(mac->module, mac->hContact, hContact); } else { SetCursor(LoadCursor(NULL,IDC_WAIT)); for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) copyModule(mac->module, mac->hContact, hContact); SetCursor(LoadCursor(NULL,IDC_ARROW)); } mir_free(mac); refreshTree(1); DestroyWindow(hwnd); break; case IDCANCEL: mir_free(mac); DestroyWindow(hwnd); break; } } return 0; }
void moduleListWM_NOTIFY(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)// hwnd here is to the main window, NOT the treview { switch (((NMHDR *)lParam)->code) { case TVN_ITEMEXPANDINGA: case TVN_ITEMEXPANDINGW: if (populating && ((LPNMTREEVIEW)lParam)->action == TVE_EXPAND) { ModuleTreeInfoStruct *mtis = (ModuleTreeInfoStruct *)((LPNMTREEVIEW)lParam)->itemNew.lParam; if (mtis && (mtis->type == (CONTACT | EMPTY))) { TVINSERTSTRUCT tvi; HTREEITEM item = {0}; ModuleTreeInfoStruct *_lParam; HWND hwnd2Tree = GetDlgItem(hwnd2mainWindow, IDC_MODULES); ModSetLinkLinkItem *module; ModuleSettingLL modlist; MCONTACT hContact = mtis->hContact; mtis->type = CONTACT; if (!EnumModules(&modlist)) { msg(Translate("Error loading module list"), modFullname); break; } module = modlist.first; while (module && hwnd2mainWindow) { if (module->name[0] && !IsModuleEmpty(hContact, module->name)) { tvi.hParent = ((LPNMTREEVIEW)lParam)->itemNew.hItem; tvi.hInsertAfter = TVI_SORT; tvi.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.item.pszText = module->name; _lParam = (ModuleTreeInfoStruct *)mir_calloc(sizeof(ModuleTreeInfoStruct)); _lParam->hContact = hContact; tvi.item.iImage = 5; tvi.item.iSelectedImage = 6; _lParam->type = KNOWN_MODULE; tvi.item.lParam = (LPARAM)_lParam; TreeView_InsertItem(hwnd2Tree, &tvi); } module = (ModSetLinkLinkItem *)module->next; } FreeModuleSettingLL(&modlist); } } break; case TVN_SELCHANGEDA: case TVN_SELCHANGEDW: { ModuleTreeInfoStruct *mtis; LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TVITEM tvi = {0}; char text[264]; MCONTACT hContact; HWND hwnd2Settings = GetDlgItem(hwnd, IDC_SETTINGS); tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT; tvi.hItem = pnmtv->itemNew.hItem; tvi.pszText = text; tvi.cchTextMax = 264; TreeView_GetItem(pnmtv->hdr.hwndFrom, &tvi); if (tvi.lParam) { mtis = (ModuleTreeInfoStruct *)tvi.lParam; hContact = mtis->hContact; if (mtis->type == STUB) break; if (populating) Select = 0; if (mtis->type == MODULE) { SettingListInfo *info = (SettingListInfo *)GetWindowLongPtr(hwnd2Settings, GWLP_USERDATA); BOOL refresh = 1; if (info) { if (info->hContact == hContact && !mir_strcmp(info->module, text)) refresh = 0; } if (refresh) PopulateSettings(hwnd2Settings, hContact, text); } else if (((mtis->type & CONTACT) == CONTACT && hContact) || (mtis->type == CONTACT_ROOT_ITEM && !hContact)) { char data[32], szProto[256]; int index, loaded, multi = 0; LVITEM lvi = {0}; lvi.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM; lvi.iImage = 6; ClearListview(hwnd2Settings); SetWindowLongPtr(hwnd2Settings, GWLP_USERDATA, 0); if (himl2) ListView_SetImageList(hwnd2Settings, himl2, LVSIL_SMALL); if (mtis->type == CONTACT_ROOT_ITEM && !hContact) { multi = 1; hContact = db_find_first(); } while (hContact && hwnd2mainWindow) { if (multi) { // filter if (GetValue(hContact, "Protocol", "p", szProto, SIZEOF(szProto))) loaded = IsProtocolLoaded(szProto); else loaded = 0; if ((loaded && Mode == MODE_UNLOADED) || (!loaded && Mode == MODE_LOADED)) { hContact = db_find_next(hContact); continue; } } lvi.iItem = 0; lvi.pszText = (char *)GetContactName(hContact, NULL, FALSE); index = ListView_InsertItem(hwnd2Settings, &lvi); mir_snprintf(data, SIZEOF(data), "0x%08X (%ld)", hContact, hContact); ListView_SetItemText(hwnd2Settings, index, 1, data); ListView_SetItemText(hwnd2Settings, index, 2, Translate("HANDLE")); ListView_SetItemText(hwnd2Settings, index, 3, "0x0004 (4)"); if (!multi) break; hContact = db_find_next(hContact); } } else ClearListview(hwnd2Settings); } else // clear any settings that may be there... ClearListview(hwnd2Settings); } break; //TVN_SELCHANGED: case NM_RCLICK: if (((NMHDR *)lParam)->code == NM_RCLICK) moduleListRightClick(hwnd, wParam, lParam); break; case TVN_BEGINLABELEDITA: // subclass it.. case TVN_BEGINLABELEDITW: { LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lParam; ModuleTreeInfoStruct *mtis = (ModuleTreeInfoStruct *)ptvdi->item.lParam; HWND hwnd2Edit = TreeView_GetEditControl(GetDlgItem(hwnd, IDC_MODULES)); if (!mtis->type || (mtis->type == CONTACT)) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, TRUE); break; } mir_subclassWindow(hwnd2Edit, ModuleTreeLabelEditSubClassProc); SetWindowLongPtr(hwnd, DWLP_MSGRESULT, FALSE); } break; case TVN_ENDLABELEDITA: case TVN_ENDLABELEDITW: LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lParam; TVITEM tvi = {0}; char text[264]; char *newtext; ModuleTreeInfoStruct *mtis; tvi.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_PARAM; tvi.hItem = ptvdi->item.hItem; tvi.pszText = text; tvi.cchTextMax = 264; TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom, &tvi); mtis = (ModuleTreeInfoStruct *)ptvdi->item.lParam; newtext = u2a((WCHAR *)ptvdi->item.pszText); if (!newtext // edit control failed || !mtis->type // its a root item || mtis->type == CONTACT // its a contact || *newtext == 0) // empty string SetWindowLongPtr(hwnd, DWLP_MSGRESULT, FALSE); else { if (mir_strcmp(tvi.pszText, newtext)) { renameModule(tvi.pszText, newtext, mtis->hContact); findAndRemoveDuplicates(((LPNMHDR)lParam)->hwndFrom, mtis->hContact, newtext); if (TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom, &tvi)) { tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.iImage = 1; tvi.iSelectedImage = 2; TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom, &tvi); PopulateSettings(GetDlgItem(hwnd, IDC_SETTINGS), mtis->hContact, newtext); } } SetWindowLongPtr(hwnd, DWLP_MSGRESULT, TRUE); } mir_free(newtext); break; } }
void exportDB(HANDLE hContact, char* module) // hContact == -1 export entire db. module == NULL export entire contact. { // hContact == -1, module == "" - all contacts FILE* file = NULL; char fileName[MAX_PATH]; int nullcontactDone = 0; ModuleSettingLL modlist; struct ModSetLinkLinkItem *mod; // enum all the modules if (!EnumModules(&modlist)) { msg(Translate("Error Loading Module List"),modFullname); return;} if (Openfile(fileName, ((int)hContact==-1)?NULL:module)) { if (!(file = fopen(fileName, "wt"))) { msg(Translate("Couldn't open file for writing"), modFullname); return; } SetCursor(LoadCursor(NULL,IDC_WAIT)); // exporting entire db if (hContact == INVALID_HANDLE_VALUE) { hContact = NULL; if (module == NULL) { fprintf(file, "SETTINGS:\n"); mod = modlist.first; while(mod) { if (IsModuleEmpty(hContact, mod->name)) { mod = (struct ModSetLinkLinkItem *)mod->next; continue; } exportModule(hContact, mod->name, file); mod = (struct ModSetLinkLinkItem *)mod->next; if (mod) fprintf(file, "\n"); } } else { if (module == "") module = NULL; // reset module for all contacts export } hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); while (hContact) { if (!hContact) continue; // filter if (Mode != MODE_ALL) { char szProto[256]; int loaded = 0; if (GetValue(hContact,"Protocol","p",szProto,SIZEOF(szProto))) loaded = IsProtocolLoaded(szProto); if ((loaded && Mode == MODE_UNLOADED) || (!loaded && Mode == MODE_LOADED)) { hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); continue; } } fprintf(file, "CONTACT: %s\n", NickFromHContact(hContact)); if (module == NULL) // export all modules { mod = modlist.first; while(mod) { if (IsModuleEmpty(hContact, mod->name)) { mod = (struct ModSetLinkLinkItem *)mod->next; continue; } exportModule(hContact, mod->name, file); mod = (struct ModSetLinkLinkItem *)mod->next; if (mod) fprintf(file, "\n"); } } else // export module { exportModule(hContact, module, file); } hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)(HANDLE)hContact, 0); } } // exporting a contact else { if (!module) // exporting every module { if (hContact) fprintf(file, "CONTACT: %s\n", NickFromHContact(hContact)); else fprintf(file, "SETTINGS:\n"); mod = modlist.first; while(mod) { if (IsModuleEmpty(hContact, mod->name)) { mod = (struct ModSetLinkLinkItem *)mod->next; continue; } exportModule(hContact, mod->name, file); mod = (struct ModSetLinkLinkItem *)mod->next; if (mod) fprintf(file, "\n"); } } else { if (hContact) fprintf(file, "FROM CONTACT: %s\n", NickFromHContact(hContact)); else fprintf(file, "SETTINGS:\n"); exportModule(hContact, module, file); } } fclose(file); SetCursor(LoadCursor(NULL,IDC_ARROW)); } FreeModuleSettingLL(&modlist); }
static MCONTACT ImportContact(MCONTACT hSrc) { MCONTACT hDst; TCHAR id[ 40 ], *pszUniqueID; char szProto[100]; // Check what protocol this contact belongs to if (myGetS(hSrc, "Protocol", "p", szProto)) { AddMessage(LPGENT("Skipping contact with no protocol")); return NULL; } if (!IsProtocolLoaded(szProto)) { AddMessage(LPGENT("Skipping contact, %S not installed."), szProto); return NULL; } // Skip protocols with no unique id setting (some non IM protocols return NULL) char* pszUniqueSetting = (char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0); if (!pszUniqueSetting || (INT_PTR)pszUniqueSetting == CALLSERVICE_NOTFOUND) { AddMessage(LPGENT("Skipping non-IM contact (%S)"), szProto); return NULL; } DBVARIANT dbv; if (myGet(hSrc, szProto, pszUniqueSetting, &dbv)) { AddMessage(LPGENT("Skipping %S contact, ID not found"), szProto); return NULL; } // Does the contact already exist? switch (dbv.type) { case DBVT_DWORD: pszUniqueID = _ltot(dbv.dVal, id, 10); hDst = HContactFromNumericID(szProto, pszUniqueSetting, dbv.dVal); break; case DBVT_ASCIIZ: pszUniqueID = NEWTSTR_ALLOCA(_A2T(dbv.pszVal)); hDst = HContactFromID(szProto, pszUniqueSetting, pszUniqueID); break; case DBVT_WCHAR: pszUniqueID = NEWTSTR_ALLOCA(dbv.ptszVal); hDst = HContactFromID(szProto, pszUniqueSetting, pszUniqueID); break; } if (hDst != INVALID_CONTACT_ID) { AddMessage(LPGENT("Skipping duplicate %S contact %s"), szProto, pszUniqueID); srcDb->FreeVariant(&dbv); return NULL; } TCHAR *tszGroup = myGetWs(hSrc, "CList", "Group"), *tszNick = myGetWs(hSrc, "CList", "MyHandle"); if (tszNick == NULL) tszNick = myGetWs(hSrc, szProto, "Nick"); hDst = AddContact(hdlgProgress, szProto, pszUniqueSetting, &dbv, pszUniqueID, tszNick, tszGroup); mir_free(tszGroup), mir_free(tszNick); if (hDst != INVALID_CONTACT_ID) { // Hidden? if (!myGet(hSrc, "CList", "Hidden", &dbv)) { mySet(hDst, "CList", "Hidden", &dbv); srcDb->FreeVariant(&dbv); } // Ignore settings if (!myGet(hSrc, "Ignore", "Mask1", &dbv)) { mySet(hDst, "Ignore", "Mask1", &dbv); srcDb->FreeVariant(&dbv); } // Apparent mode if (!myGet(hSrc, szProto, "ApparentMode", &dbv)) { mySet(hDst, szProto, "ApparentMode", &dbv); srcDb->FreeVariant(&dbv); } // Nick if (!myGet(hSrc, szProto, "Nick", &dbv)) { mySet(hDst, szProto, "Nick", &dbv); srcDb->FreeVariant(&dbv); } // Myhandle if (!myGet(hSrc, szProto, "MyHandle", &dbv)) { mySet(hDst, szProto, "MyHandle", &dbv); srcDb->FreeVariant(&dbv); } // First name if (!myGet(hSrc, szProto, "FirstName", &dbv)) { mySet(hDst, szProto, "FirstName", &dbv); srcDb->FreeVariant(&dbv); } // Last name if (!myGet(hSrc, szProto, "LastName", &dbv)) { mySet(hDst, szProto, "LastName", &dbv); srcDb->FreeVariant(&dbv); } // About if (!myGet(hSrc, szProto, "About", &dbv)) { mySet(hDst, szProto, "About", &dbv); srcDb->FreeVariant(&dbv); } } else AddMessage(LPGENT("Unknown error while adding %S contact %s"), szProto, pszUniqueID); return hDst; }