void CNetwork::UpdateQunContacts(HWND hwndDlg, unsigned int qunid) { if (Qun* qun=m_qunList.getQun(qunid)) { std::list<FriendItem> list=qun->getMembers(); HANDLE hContact=FindContact(qunid); unsigned int creator=READC_D2("Creator"); DBVARIANT dbv; TCHAR* pszNick; TCHAR szTemp[MAX_PATH]; char szID[16]; HWND hControl=GetDlgItem(hwndDlg,IDC_QUNINFO_MEMBERLIST); SendMessage(hControl,LB_RESETCONTENT,(WPARAM)NULL,(LPARAM)NULL); for (std::list<FriendItem>::iterator iter=list.begin(); iter!=list.end(); ++iter) { ultoa(iter->getQQ(),szID,10); if (READC_S2(szID,&dbv)) { // Nick not found swprintf(szTemp,L" [%s] %u",iter->isOnline()?TranslateT("Online"):TranslateT("Offline"),iter->getQQ()); } else { // Nick found pszNick=mir_a2u_cp(dbv.pszVal,936); swprintf(szTemp,L" [%s] %s(%u)",iter->isOnline()?TranslateT("Online"):TranslateT("Offline"),pszNick,iter->getQQ()); mir_free(pszNick); DBFreeVariant(&dbv); } if (creator==iter->getQQ()) *szTemp=_T('*'); else if (qun->isAdmin(iter->getQQ())) *szTemp=_T('+'); SendMessage(hControl,LB_ADDSTRING,(WPARAM)NULL,(LPARAM)szTemp); } } }
void PasteIt(MCONTACT hContact, int mode) { PasteToWeb* pasteToWeb = pasteToWebs[Options::instance->defWeb]; if(mode == FROM_CLIPBOARD) { pasteToWeb->FromClipboard(); } else if(mode == FROM_FILE) { std::wstring file = GetFile(); if(file.length() > 0) { pasteToWeb->FromFile(file); } else return; } else return; if(pasteToWeb->szFileLink[0] == 0 && pasteToWeb->error != NULL) { MessageBox(NULL, pasteToWeb->error, TranslateT("Error"), MB_OK | MB_ICONERROR); } else if(hContact != NULL && pasteToWeb->szFileLink[0] != 0) { char *szProto = GetContactProto(hContact); if (szProto && (INT_PTR)szProto != CALLSERVICE_NOTFOUND) { BOOL isChat = db_get_b(hContact, szProto, "ChatRoom", 0); if(Options::instance->autoSend) { if(!isChat) { DBEVENTINFO dbei = {0}; dbei.cbSize = sizeof(dbei); dbei.eventType = EVENTTYPE_MESSAGE; dbei.flags = DBEF_SENT; dbei.szModule = szProto; dbei.timestamp = (DWORD)time(NULL); dbei.cbBlob = (DWORD)strlen(pasteToWeb->szFileLink) + 1; dbei.pBlob = (PBYTE)pasteToWeb->szFileLink; db_event_add(hContact, &dbei); CallContactService(hContact, PSS_MESSAGE, 0, (LPARAM)pasteToWeb->szFileLink); } else { // PSS_MESSAGE is not compatible with chat rooms // there are no simple method to send text to all users // in chat room. // Next step is to get all protocol sessions and find // one with correct hContact GC_INFO gci = {0}; GCDEST gcd = { szProto, NULL, GC_EVENT_SENDMESSAGE }; GCEVENT gce = { sizeof(gce), &gcd }; int cnt = (int)CallService(MS_GC_GETSESSIONCOUNT, 0, (LPARAM)szProto); for (int i = 0; i < cnt ; i++ ) { gci.iItem = i; gci.pszModule = szProto; gci.Flags = GCF_BYINDEX | GCF_HCONTACT | GCF_ID; CallService(MS_GC_GETINFO, 0, (LPARAM)&gci); if (gci.hContact == hContact) { // In this place session was finded, gci.pszID contains // session ID, but it is in unicode or ascii format, // depends on protocol wersion gcd.ptszID = gci.pszID; gce.bIsMe = TRUE; gce.dwFlags = GCEF_ADDTOLOG; gce.ptszText = mir_a2u_cp(pasteToWeb->szFileLink, CP_ACP); gce.time = time(NULL); CallService(MS_GC_EVENT, 0, (LPARAM)(GCEVENT *) &gce); mir_free((void*)gce.ptszText); break; } } } // Send message to focus window CallServiceSync(MS_MSG_SENDMESSAGE, hContact, 0); } else { if(isChat) { // MS_MSG_SENDMESSAGE in incompatible with chat rooms, // because it sends text to IDC_MESSAGE window, // but in chat rooms is only IDC_CHAT_MESSAGE window. // contactWindows map contains all opened hContact // with assaigned to them chat windows. // This map is prepared in ME_MSG_WINDOWEVENT event. std::map<MCONTACT, HWND>::iterator it = contactWindows->find(hContact); if(it != contactWindows->end()) { // it->second is imput window, so now I can send to them // new text. Afterr all is sended MS_MSG_SENDMESSAGE // to focus window. SendMessage(it->second, EM_SETSEL, -1, SendMessage(it->second, WM_GETTEXTLENGTH, 0, 0)); SendMessageA(it->second, EM_REPLACESEL, FALSE, (LPARAM)pasteToWeb->szFileLink); CallServiceSync(MS_MSG_SENDMESSAGE, hContact, NULL); } else { // If window do not exist, maybe it is not chat CallServiceSync(MS_MSG_SENDMESSAGE, hContact, (LPARAM)pasteToWeb->szFileLink); } } else { CallServiceSync(MS_MSG_SENDMESSAGE, hContact, (LPARAM)pasteToWeb->szFileLink); } } } } }
wchar_t* mir_a2u( const char* src ) { return mir_a2u_cp( src, LangPackGetDefaultCodePage()); }
static int CompareStatusMsg(STATUSMSGINFO *smi, DBCONTACTWRITESETTING *cws_new, char *szSetting) { DBVARIANT dbv_old; int ret = -1; switch (cws_new->value.type) { case DBVT_ASCIIZ: smi->newstatusmsg = (CheckStr(cws_new->value.pszVal, 0, 1) ? nullptr : mir_a2u_cp(cws_new->value.pszVal, CP_ACP)); break; case DBVT_UTF8: smi->newstatusmsg = (CheckStr(cws_new->value.pszVal, 0, 1) ? nullptr : mir_a2u_cp(cws_new->value.pszVal, CP_UTF8)); break; case DBVT_WCHAR: smi->newstatusmsg = (CheckStrW(cws_new->value.pwszVal, 0, 1) ? nullptr : mir_wstrdup(cws_new->value.pwszVal)); break; case DBVT_DELETED: default: smi->newstatusmsg = nullptr; break; } if (!db_get_s(smi->hContact, "UserOnline", szSetting, &dbv_old, 0)) { switch (dbv_old.type) { case DBVT_ASCIIZ: smi->oldstatusmsg = (CheckStr(dbv_old.pszVal, 0, 1) ? nullptr : mir_a2u_cp(dbv_old.pszVal, CP_ACP)); break; case DBVT_UTF8: smi->oldstatusmsg = (CheckStr(dbv_old.pszVal, 0, 1) ? nullptr : mir_a2u_cp(dbv_old.pszVal, CP_UTF8)); break; case DBVT_WCHAR: smi->oldstatusmsg = (CheckStrW(dbv_old.pwszVal, 0, 1) ? nullptr : mir_wstrdup(dbv_old.pwszVal)); break; default: smi->oldstatusmsg = nullptr; break; } if (cws_new->value.type == DBVT_DELETED) { if (dbv_old.type == DBVT_WCHAR) ret = CheckStrW(dbv_old.pwszVal, COMPARE_DEL, COMPARE_SAME); else if (dbv_old.type == DBVT_UTF8 || dbv_old.type == DBVT_ASCIIZ) ret = CheckStr(dbv_old.pszVal, COMPARE_DEL, COMPARE_SAME); else ret = COMPARE_DEL; } else if (dbv_old.type != cws_new->value.type) ret = (mir_wstrcmp(smi->newstatusmsg, smi->oldstatusmsg) ? CheckStrW(smi->newstatusmsg, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME); else if (dbv_old.type == DBVT_ASCIIZ) ret = (mir_strcmp(cws_new->value.pszVal, dbv_old.pszVal) ? CheckStr(cws_new->value.pszVal, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME); else if (dbv_old.type == DBVT_UTF8) ret = (mir_strcmp(cws_new->value.pszVal, dbv_old.pszVal) ? CheckStr(cws_new->value.pszVal, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME); else if (dbv_old.type == DBVT_WCHAR) ret = (mir_wstrcmp(cws_new->value.pwszVal, dbv_old.pwszVal) ? CheckStrW(cws_new->value.pwszVal, COMPARE_DIFF, COMPARE_DEL) : COMPARE_SAME); db_free(&dbv_old); } else { if (cws_new->value.type == DBVT_DELETED) ret = COMPARE_SAME; else if (cws_new->value.type == DBVT_WCHAR) ret = CheckStrW(cws_new->value.pwszVal, COMPARE_DIFF, COMPARE_SAME); else if (cws_new->value.type == DBVT_UTF8 || cws_new->value.type == DBVT_ASCIIZ) ret = CheckStr(cws_new->value.pszVal, COMPARE_DIFF, COMPARE_SAME); else ret = COMPARE_DIFF; smi->oldstatusmsg = nullptr; } return ret; }
static BOOL CALLBACK QunDetailsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); SetWindowLong(hwndDlg,GWL_USERDATA,lParam); return TRUE; } case WM_TIMER: if (LocalDetails_t* ldt=networkmap[(HANDLE)GetWindowLong(hwndDlg,GWL_USERDATA)]) { LPSTR m_szModuleName=ldt->network->m_szModuleName; HANDLE hContact=ldt->hContact; unsigned int qunid=READC_D2(UNIQUEIDSETTING); /* ldt->network->UpdateQunContacts(hwndDlg,qunid); */ KillTimer(hwndDlg,1); ldt->network->append(new QunGetOnlineMemberPacket(qunid)); } return TRUE; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_INFOCHANGED: if (LocalDetails_t* ldt=networkmap[(HANDLE)((LPPSHNOTIFY)lParam)->lParam]) { LPTSTR pszTemp; LPSTR m_szModuleName=ldt->network->m_szModuleName; char szTemp[MAX_PATH]; TCHAR wszTemp[MAX_PATH]; HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam; HANDLE hContact2=hContact; DBVARIANT dbv; unsigned int nTemp; unsigned int qunid=0; qunid=READC_D2(UNIQUEIDSETTING); nTemp=READC_D2("Creator"); ultoa(nTemp,szTemp,10); if (!READC_S2(szTemp,&dbv)) { // Qun creator info available pszTemp=mir_a2u_cp(dbv.pszVal,936); swprintf(wszTemp,L"%s (%u)", pszTemp, nTemp); mir_free(pszTemp); DBFreeVariant(&dbv); } else _ultow(nTemp,wszTemp,10); SetDlgItemText(hwndDlg,IDC_QUNINFO_CREATOR,wszTemp); _ultow(READC_D2("ExternalID"),wszTemp,10); SetDlgItemText(hwndDlg,IDC_QUNINFO_QID,wszTemp); if (!READC_TS2("Nick",&dbv)) { // Qun name available SetDlgItemText(hwndDlg,IDC_QUNINFO_NAME,wcschr(dbv.ptszVal,L')')+2); DBFreeVariant(&dbv); } if (!DBGetContactSettingTString(hContact,"CList","StatusMsg",&dbv)) { // Notice available SetDlgItemText(hwndDlg,IDC_QUNINFO_NOTICE,dbv.ptszVal); DBFreeVariant(&dbv); } if (!READC_TS2("Description",&dbv)) { // Description available SetDlgItemText(hwndDlg,IDC_QUNINFO_DESC,dbv.ptszVal); DBFreeVariant(&dbv); } switch (READC_B2("GetInfoOnline")) { case 1: // Just retrieved info, send member online update call PostMessage(hwndDlg,WM_TIMER,1,0); { unsigned int myqq=ldt->network->GetMyQQ(); Qun* qun=ldt->network->m_qunList.getQun(READC_D2(UNIQUEIDSETTING)); if (qun==NULL || !(qun->isAdmin(myqq)||qun->getDetails().getCreator()==myqq)) { EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_DELMEMBER),FALSE); } else EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_DELMEMBER),TRUE); if (qun->getDetails().getCreator()==myqq) { EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_SETADMIN),TRUE); EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_UNSETADMIN),TRUE); EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_TRANSFER),TRUE); } } break; case 2: // Retrieved online info ldt->network->UpdateQunContacts(hwndDlg,qunid); WRITEC_B("GetInfoOnline",0); ldt->timer=SetTimer(hwndDlg,1,60000,NULL); break; } } break; } break; } break; case WM_DESTROY: if (LocalDetails_t* ldt=networkmap[hwndDlg]) { if (ldt->timer) KillTimer(hwndDlg,1); delete ldt; networkmap.erase(hwndDlg); } break; case WM_COMMAND: { if (LocalDetails_t* ldt=networkmap[(HANDLE)GetWindowLong(hwndDlg,GWL_USERDATA)]) { char szTemp[MAX_PATH]={0}; if (SendDlgItemMessageA(hwndDlg,IDC_QUNINFO_MEMBERLIST,LB_GETTEXT,SendDlgItemMessage(hwndDlg,IDC_QUNINFO_MEMBERLIST,LB_GETCURSEL,0,0),(LPARAM)&szTemp)!=LB_ERR && *szTemp!=0) { LPSTR pszChk=strrchr(szTemp,'('); unsigned int qqid=strtoul(strrchr(szTemp,pszChk?'(':' ')+1,NULL,10); LPSTR m_szModuleName=ldt->network->m_szModuleName; HANDLE hContact=ldt->hContact; unsigned int qunid=READC_D2(UNIQUEIDSETTING); switch (LOWORD(wParam)) { case IDC_QUNINFO_ADDTOME: { if (HANDLE hContact=ldt->network->FindContact(qqid)) { MessageBox(hwndDlg,TranslateT("The member is already in your contact list."),NULL,MB_ICONERROR); } else { ldt->network->AddContactWithSend(qqid); } } break; case IDC_QUNINFO_DELMEMBER: { TCHAR szMsg[MAX_PATH]; _stprintf(szMsg,TranslateT("Are you sure you want to kick user %u out of this Qun %d?"),qqid,READC_D2("ExternalID")); if (MessageBox(NULL,szMsg,APPNAME,MB_ICONWARNING|MB_YESNO)==IDYES) { std::list<unsigned int> list; QunModifyMemberPacket *out=new QunModifyMemberPacket(READC_D2(UNIQUEIDSETTING),false); list.insert(list.end(),qqid); out->setMembers(list); ldt->network->append(out); } } break; case IDC_QUNINFO_SETADMIN: case IDC_QUNINFO_UNSETADMIN: { QunAdminOpPacket* out=new QunAdminOpPacket(qunid,qqid,LOWORD(wParam)==IDC_QUNINFO_SETADMIN); ldt->network->append(out); } break; case IDC_QUNINFO_TRANSFER: { TCHAR szMsg[MAX_PATH]; _stprintf(szMsg,TranslateT("Are you sure you want to transfer Qun %u to user %u?"),READC_D2("ExternalID"),qqid); if (MessageBox(NULL,szMsg,APPNAME,MB_ICONWARNING|MB_YESNO)==IDYES) { std::list<unsigned int> list; QunTransferPacket *out=new QunTransferPacket(qunid,qqid); ldt->network->append(out); } } break; } } } } break; #if 0 case WM_COMMAND: /*switch(LOWORD(wParam)) { case IDC_CHANGEDETAILS: { CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://www.icq.com/whitepages/user_details.php"); } break; case IDCANCEL: SendMessage(GetParent(hwndDlg),msg,wParam,lParam); break; }*/ break; #endif } return FALSE; }
int CMraProto::MraDbSettingChanged(WPARAM hContact, LPARAM lParam) { if (!m_bLoggedIn || !lParam || !hContact) return 0; DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING*)lParam; // это наш контакт, он не временный (есть в списке на сервере) и его обновление разрешено if (IsContactMra(hContact) && !db_get_b(hContact, "CList", "NotOnList", 0) && getDword(hContact, "HooksLocked", FALSE) == FALSE) { if (!strcmp(cws->szModule, "CList")) { // MyHandle setting if (!strcmp(cws->szSetting, "MyHandle")) { // always store custom nick CMStringW wszNick; if (cws->value.type == DBVT_DELETED) { wszNick = GetContactNameW(hContact); db_set_ws(hContact, "CList", "MyHandle", wszNick); } else if (cws->value.pszVal) { switch (cws->value.type) { case DBVT_WCHAR: wszNick = cws->value.pwszVal; break; case DBVT_UTF8: wszNick = ptrW(mir_utf8decodeW(cws->value.pszVal)); break; case DBVT_ASCIIZ: wszNick = ptrW(mir_a2u_cp(cws->value.pszVal, MRA_CODE_PAGE)); break; } if (wszNick.GetLength()) MraModifyContact(hContact, 0, 0, 0, 0, &wszNick); } } // Group setting else if (!strcmp(cws->szSetting, "Group")) { CMStringW wszGroup; // manage group on server switch (cws->value.type) { case DBVT_WCHAR: wszGroup = cws->value.pwszVal; break; case DBVT_UTF8: wszGroup = ptrW(mir_utf8decodeW(cws->value.pszVal)); break; case DBVT_ASCIIZ: wszGroup = ptrW(mir_a2u_cp(cws->value.pszVal, MRA_CODE_PAGE)); break; } if (wszGroup.GetLength()) { DWORD dwGroupID = getDword(hContact, "GroupID", -1); if (dwGroupID != -1) MraMoveContactToGroup(hContact, dwGroupID, wszGroup); } } // NotOnList setting. Has a temporary contact just been added permanently? else if (!strcmp(cws->szSetting, "NotOnList")) { if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) { CMStringW wszAuthMessage; if (!mraGetStringW(NULL, "AuthMessage", wszAuthMessage)) wszAuthMessage = TranslateT(MRA_DEFAULT_AUTH_MESSAGE); db_unset(hContact, "CList", "Hidden"); CMStringA szEmail, szPhones; CMStringW wszNick; DWORD dwGroupID, dwContactFlag; GetContactBasicInfoW(hContact, NULL, &dwGroupID, &dwContactFlag, NULL, NULL, &szEmail, &wszNick, &szPhones); MraAddContact(hContact, dwContactFlag, dwGroupID, szEmail, wszNick, &szPhones, &wszAuthMessage); } } // Hidden setting else if (!strcmp(cws->szSetting, "Hidden")) { DWORD dwContactFlag = GetContactFlags(hContact); if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_BYTE && cws->value.bVal == 0)) dwContactFlag &= ~CONTACT_FLAG_SHADOW; else dwContactFlag |= CONTACT_FLAG_SHADOW; MraModifyContact(hContact, 0, &dwContactFlag); } } // Ignore section else if (!strcmp(cws->szModule, "Ignore")) { if (!strcmp(cws->szSetting, "Mask1")) { DWORD dwContactFlag = GetContactFlags(hContact); if (cws->value.type == DBVT_DELETED || (cws->value.type == DBVT_DWORD && cws->value.dVal&IGNOREEVENT_MESSAGE) == 0) dwContactFlag &= ~CONTACT_FLAG_IGNORE; else dwContactFlag |= CONTACT_FLAG_IGNORE; MraModifyContact(hContact, 0, &dwContactFlag); } } // User info section else if (!strcmp(cws->szModule, "UserInfo")) { if (!strcmp(cws->szSetting, "MyPhone0") || !strcmp(cws->szSetting, "MyPhone1") || !strcmp(cws->szSetting, "MyPhone2")) MraModifyContact(hContact); } } return 0; }