static int MoveGroupBefore(WPARAM wParam,LPARAM lParam) { int i,shuffleFrom,shuffleTo,shuffleDir; char str[33]; TCHAR *szMoveName; DBVARIANT dbv; if (wParam == 0 || (LPARAM) wParam == lParam) return 0; itoa(wParam-1,str,10); if (DBGetContactSettingTString(NULL, "CListGroups", str, &dbv)) return 0; szMoveName = dbv.ptszVal; //shuffle list of groups up to fill gap if (lParam == 0) { shuffleFrom = wParam - 1; shuffleTo = -1; shuffleDir = -1; } else { if ((LPARAM) wParam < lParam) { shuffleFrom = wParam - 1; shuffleTo = lParam - 2; shuffleDir = -1; } else { shuffleFrom = wParam - 1; shuffleTo = lParam - 1; shuffleDir = 1; } } if(shuffleDir==-1) { for(i=shuffleFrom;i!=shuffleTo;i++) { itoa(i+1,str,10); if (DBGetContactSettingStringUtf(NULL, "CListGroups", str, &dbv)) { shuffleTo = i; break; } itoa(i,str,10); DBWriteContactSettingStringUtf(NULL, "CListGroups", str, dbv.pszVal); DBFreeVariant(&dbv); } } else { for(i=shuffleFrom;i!=shuffleTo;i--) { itoa(i-1,str,10); if (DBGetContactSettingStringUtf(NULL, "CListGroups", str, &dbv)) { mir_free(szMoveName); return 1; } //never happens itoa(i,str,10); DBWriteContactSettingStringUtf(NULL, "CListGroups", str, dbv.pszVal); DBFreeVariant(&dbv); } } itoa(shuffleTo,str,10); DBWriteContactSettingTString(NULL, "CListGroups", str, szMoveName); mir_free(szMoveName); return shuffleTo+1; }
/** Convert the contact chosen into a MetaContact. * * Create a new MetaContact, remove the selected contact from the \c CList * and attach it to the MetaContact. * * @param wParam : \c HANDLE to the contact that has been chosen. * @param lParam : Allways set to 0. */ INT_PTR Meta_Convert(WPARAM wParam,LPARAM lParam) { HANDLE hMetaContact; DBVARIANT dbv; char *group = 0;//, *proto; // Get some information about the selected contact. // proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO,wParam,0); if(!DBGetContactSettingStringUtf((HANDLE)wParam,"CList","Group",&dbv)) { group = _strdup(dbv.pszVal); DBFreeVariant(&dbv); } // Create a new metacontact hMetaContact = (HANDLE)CallService(MS_DB_CONTACT_ADD,0,0); // Add the info for the metacontact if(hMetaContact) { DBWriteContactSettingDword(hMetaContact,META_PROTO,META_ID,nextMetaID); DBWriteContactSettingDword(hMetaContact,META_PROTO,"NumContacts",0); DBWriteContactSettingDword(NULL,META_PROTO,"NextMetaID",++nextMetaID); // Add the MetaContact protocol to the new meta contact CallService( MS_PROTO_ADDTOCONTACT, ( WPARAM )hMetaContact, ( LPARAM )META_PROTO ); if(group) { if(ServiceExists(MS_DB_CONTACT_GETSETTING_STR)) DBWriteContactSettingStringUtf(hMetaContact,"CList","Group",group); else DBWriteContactSettingString(hMetaContact,"CList","Group",group); } // Assign the contact to the MetaContact just created (and make default). if(!Meta_Assign((HANDLE)wParam,hMetaContact,TRUE)) { MessageBox(0,Translate("There was a problem in assigning the contact to the MetaContact"),Translate("Error"),MB_ICONEXCLAMATION); CallService(MS_DB_CONTACT_DELETE, (WPARAM)hMetaContact, 0); return 0; } // hide the contact if clist groups disabled (shouldn't create one anyway since menus disabled) if(!Meta_IsEnabled()) DBWriteContactSettingByte(hMetaContact, "CList", "Hidden", 1); } // Update the graphics CallService(MS_CLUI_SORTLIST,0,0); free(group); return (int)hMetaContact; }
int CAimProto::OnDbSettingChanged(WPARAM wParam,LPARAM lParam) { DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; if (strcmp(cws->szModule, MOD_KEY_CL) == 0 && state == 1 && wParam) { HANDLE hContact = (HANDLE)wParam; if (strcmp(cws->szSetting, AIM_KEY_NL) == 0) { if (cws->value.type == DBVT_DELETED) { DBVARIANT dbv; if(!DBGetContactSettingStringUtf(hContact, MOD_KEY_CL, OTH_KEY_GP, &dbv) && dbv.pszVal[0]) { add_contact_to_group(hContact, dbv.pszVal); DBFreeVariant(&dbv); } else add_contact_to_group(hContact, AIM_DEFAULT_GROUP); } } else if (strcmp(cws->szSetting, "MyHandle") == 0) { char* name; switch (cws->value.type) { case DBVT_DELETED: set_local_nick(hContact, NULL, NULL); break; case DBVT_ASCIIZ: name = mir_utf8encode(cws->value.pszVal); set_local_nick(hContact, name, NULL); mir_free(name); break; case DBVT_UTF8: set_local_nick(hContact, cws->value.pszVal, NULL); break; case DBVT_WCHAR: name = mir_utf8encodeW(cws->value.pwszVal); set_local_nick(hContact, name, NULL); mir_free(name); break; } } } return 0; }
INT_PTR CAimProto::AddToServerList(WPARAM wParam, LPARAM /*lParam*/) { if (state != 1) return 0; HANDLE hContact = (HANDLE)wParam; DBVARIANT dbv; if (!DBGetContactSettingStringUtf(hContact, MOD_KEY_CL, OTH_KEY_GP, &dbv) && dbv.pszVal[0]) { add_contact_to_group(hContact, dbv.pszVal); DBFreeVariant(&dbv); } else add_contact_to_group(hContact, AIM_DEFAULT_GROUP); return 0; }
static int SetGroupExpandedState(WPARAM wParam,LPARAM lParam) { char idstr[33]; DBVARIANT dbv; itoa(wParam-1,idstr,10); if (DBGetContactSettingStringUtf(NULL, "CListGroups", idstr, &dbv)) return 1; if (lParam) dbv.pszVal[0] |= GROUPF_EXPANDED; else dbv.pszVal[0] = dbv.pszVal[0] & ~GROUPF_EXPANDED; DBWriteContactSettingStringUtf(NULL, "CListGroups", idstr, dbv.pszVal); DBFreeVariant(&dbv); return 0; }
static int SetGroupFlags(WPARAM wParam,LPARAM lParam) { char idstr[33]; DBVARIANT dbv; int flags,oldval,newval; itoa(wParam-1,idstr,10); if (DBGetContactSettingStringUtf(NULL, "CListGroups", idstr, &dbv)) return 1; flags=LOWORD(lParam)&HIWORD(lParam); oldval=dbv.pszVal[0]; newval=dbv.pszVal[0]=(dbv.pszVal[0]&~HIWORD(lParam))|flags; DBWriteContactSettingStringUtf(NULL, "CListGroups", idstr, dbv.pszVal); DBFreeVariant(&dbv); if ((oldval & GROUPF_HIDEOFFLINE) != (newval & GROUPF_HIDEOFFLINE)) LoadContactTree(); return 0; }
static int BuildGroupMenu(WPARAM wParam,LPARAM lParam) { char idstr[33]; DBVARIANT dbv; int groupId; HMENU hRootMenu,hThisMenu; int nextMenuId=100; TCHAR *pBackslash,*pNextField,szThisField[128],szThisMenuItem[128]; int menuId,compareResult,menuItemCount; MENUITEMINFO mii={0}; if (DBGetContactSettingStringUtf(NULL, "CListGroups", "0", &dbv)) return (int) (HMENU) NULL; DBFreeVariant(&dbv); hRootMenu=CreateMenu(); for(groupId=0;;groupId++) { itoa(groupId,idstr,10); if (DBGetContactSettingTString(NULL, "CListGroups", idstr, &dbv)) break; pNextField = (TCHAR*)dbv.ptszVal + 1; hThisMenu=hRootMenu; mii.cbSize=MENUITEMINFO_V4_SIZE; do { pBackslash = _tcschr(pNextField, '\\'); if(pBackslash==NULL) { lstrcpyn(szThisField, pNextField, SIZEOF(szThisField)); pNextField=NULL; } else { lstrcpyn(szThisField, pNextField, min( SIZEOF(szThisField), pBackslash - pNextField + 1)); pNextField=pBackslash+1; } compareResult=1; menuItemCount=GetMenuItemCount(hThisMenu); for(menuId=0;menuId<menuItemCount;menuId++) { mii.fMask=MIIM_TYPE|MIIM_SUBMENU|MIIM_DATA; mii.cch = SIZEOF(szThisMenuItem); mii.dwTypeData=szThisMenuItem; GetMenuItemInfo(hThisMenu,menuId,TRUE,&mii); compareResult = lstrcmp(szThisField, szThisMenuItem); if(compareResult==0) { if(pNextField==NULL) { mii.fMask=MIIM_DATA; mii.dwItemData=groupId+1; SetMenuItemInfo(hThisMenu,menuId,TRUE,&mii); } else { if(mii.hSubMenu==NULL) { mii.fMask=MIIM_SUBMENU; mii.hSubMenu=CreateMenu(); SetMenuItemInfo(hThisMenu,menuId,TRUE,&mii); mii.fMask=MIIM_DATA|MIIM_TYPE|MIIM_ID; //dwItemData doesn't change mii.fType=MFT_STRING; mii.dwTypeData=TranslateT("This group"); mii.wID=nextMenuId++; InsertMenuItem(mii.hSubMenu,0,TRUE,&mii); mii.fMask=MIIM_TYPE; mii.fType=MFT_SEPARATOR; InsertMenuItem(mii.hSubMenu,1,TRUE,&mii); } hThisMenu=mii.hSubMenu; } break; } if ((int) mii.dwItemData - 1 > groupId) break; } if(compareResult) { mii.fMask=MIIM_TYPE|MIIM_ID; mii.wID=nextMenuId++; mii.dwTypeData=szThisField; mii.fType=MFT_STRING; if(pNextField) { mii.fMask|=MIIM_SUBMENU; mii.hSubMenu=CreateMenu(); } else { mii.fMask|=MIIM_DATA; mii.dwItemData=groupId+1; } InsertMenuItem(hThisMenu,menuId,TRUE,&mii); if(pNextField) { hThisMenu=mii.hSubMenu; } } } while(pNextField); DBFreeVariant(&dbv); } return (int)hRootMenu; }
static int DeleteGroup(WPARAM wParam,LPARAM lParam) { int i; char str[33]; DBVARIANT dbv; HANDLE hContact; TCHAR name[256], szNewParent[256], *pszLastBackslash; //get the name itoa(wParam-1,str,10); if (DBGetContactSettingTString(NULL, "CListGroups", str, &dbv)) return 1; if (DBGetContactSettingByte(NULL, "CList", "ConfirmDelete", SETTING_CONFIRMDELETE_DEFAULT)) if (MessageBox((HWND)CallService(MS_CLUI_GETHWND, 0, 0), TranslateT("Are you sure you want to delete this group? This operation can not be undone."), TranslateT("Delete Group"), MB_YESNO|MB_ICONQUESTION)==IDNO) return 1; lstrcpyn(name, (TCHAR*)dbv.ptszVal + 1, SIZEOF(name)); DBFreeVariant(&dbv); SetCursor(LoadCursor(NULL,IDC_WAIT)); //must remove setting from all child contacts too //children are demoted to the next group up, not deleted. lstrcpy(szNewParent, name); pszLastBackslash = _tcsrchr(szNewParent, '\\'); if (pszLastBackslash) pszLastBackslash[0] = '\0'; else szNewParent[0] = '\0'; hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); do { if (DBGetContactSettingTString(hContact, "CList", "Group", &dbv)) continue; if (_tcscmp(dbv.ptszVal, name)) { DBFreeVariant(&dbv); continue; } DBFreeVariant(&dbv); if (szNewParent[0]) DBWriteContactSettingTString(hContact, "CList", "Group", szNewParent); else DBDeleteContactSetting(hContact, "CList", "Group"); } while((hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0))!=NULL); //shuffle list of groups up to fill gap for(i=wParam-1;;i++) { itoa(i+1,str,10); if (DBGetContactSettingStringUtf(NULL, "CListGroups", str, &dbv)) break; itoa(i,str,10); DBWriteContactSettingStringUtf(NULL, "CListGroups", str, dbv.pszVal); DBFreeVariant(&dbv); } itoa(i,str,10); DBDeleteContactSetting(NULL,"CListGroups",str); //rename subgroups { TCHAR szNewName[256]; int len; len = lstrlen(name); for(i=0;;i++) { itoa(i,str,10); if (DBGetContactSettingTString(NULL, "CListGroups", str, &dbv)) break; if (!_tcsncmp((TCHAR*)dbv.ptszVal + 1, name, len) && dbv.ptszVal[len + 1] == '\\' && _tcschr(dbv.ptszVal + len + 2, '\\') == NULL) { if (szNewParent[0]) mir_sntprintf(szNewName, SIZEOF(szNewName), _T("%s\\%s"), szNewParent, dbv.ptszVal + len + 2); else lstrcpyn(szNewName, dbv.ptszVal + len + 2, SIZEOF(szNewName)); RenameGroupT((WPARAM)(i + 1), (LPARAM)szNewName); } DBFreeVariant(&dbv); } } SetCursor(LoadCursor(NULL,IDC_ARROW)); LoadContactTree(); return 0; }
int CMsnProto::getStringUtf(const char* name, DBVARIANT* result) { return DBGetContactSettingStringUtf(NULL, m_szModuleName, name, result); }
int CJabberProto::JGetStringUtf( HANDLE hContact, char* valueName, DBVARIANT* dbv ) { return DBGetContactSettingStringUtf( hContact, m_szModuleName, valueName, dbv ); }