void VDUIListViewW32::SetItemText(int item, int subitem, const wchar_t *text) { DWORD dwMask = LVIF_TEXT; if (VDIsWindowsNT()) { LVITEMW lviw={0}; lviw.mask = dwMask; lviw.iItem = item; lviw.iSubItem = subitem; lviw.pszText = (LPWSTR)text; SendMessageW(mhwnd, LVM_SETITEMTEXTW, (WPARAM)item, (LPARAM)&lviw); } else { LVITEMA lvia={0}; VDStringA textA(VDTextWToA(text)); lvia.mask = dwMask; lvia.iItem = item; lvia.iSubItem = subitem; lvia.pszText = (LPSTR)textA.c_str(); SendMessageA(mhwnd, LVM_SETITEMTEXTA, (WPARAM)item, (LPARAM)&lvia); } }
void VDSetMenuItemTextByCommandW32(HMENU hmenu, UINT cmd, const wchar_t *text) { if (VDIsWindowsNT()) { MENUITEMINFOW mmiW; mmiW.cbSize = MENUITEMINFO_SIZE_VERSION_400W; mmiW.fMask = MIIM_TYPE; mmiW.fType = MFT_STRING; mmiW.dwTypeData = (LPWSTR)text; SetMenuItemInfoW(hmenu, cmd, FALSE, &mmiW); } else { MENUITEMINFOA mmiA; VDStringA textA(VDTextWToA(text)); mmiA.cbSize = MENUITEMINFO_SIZE_VERSION_400A; mmiA.fMask = MIIM_TYPE; mmiA.fType = MFT_STRING; mmiA.dwTypeData = (LPSTR)textA.c_str(); SetMenuItemInfoA(hmenu, cmd, FALSE, &mmiA); } }
int VDUIListViewW32::AddItem(const wchar_t *text, uintptr data) { DWORD dwMask = LVIF_PARAM | LVIF_TEXT; if (mbCheckable) dwMask |= LVIF_STATE; int item; if (VDIsWindowsNT()) { LVITEMW lviw={0}; lviw.mask = dwMask; lviw.iItem = 0x1FFFFFFF; lviw.iSubItem = 0; lviw.state = 0x1000; lviw.stateMask = (UINT)-1; lviw.pszText = (LPWSTR)text; lviw.lParam = (LPARAM)data; item = (int)SendMessageW(mhwnd, LVM_INSERTITEMW, 0, (LPARAM)&lviw); } else { LVITEMA lvia={0}; VDStringA textA(VDTextWToA(text)); lvia.mask = dwMask; lvia.iItem = 0x1FFFFFFF; lvia.iSubItem = 0; lvia.state = 0x1000; lvia.stateMask = (UINT)-1; lvia.pszText = (LPSTR)textA.c_str(); lvia.lParam = (LPARAM)data; item = (int)SendMessageA(mhwnd, LVM_INSERTITEMA, 0, (LPARAM)&lvia); } return item; }
void ReceiveContactMessage(LPCTSTR msg_from, LPCTSTR msg_to, LPCTSTR msg_text, int msg_len) { if ( ! pluginInstalled ) return; CString from( msg_from ); CString to( msg_to ); CString text( msg_text, msg_len ); from.MakeUpper(); to.MakeUpper(); // Свое собственное сообщение? if ( IsItMe( from ) ) { LOG ( "Ignoring my message." ); return; } // Нормализация разбиения сообщения на строки Normalize( text ); // Дубликат? if (db_get_b (NULL, modname, "Filter-dups", TRUE)) { // Вычисление прошедшего времени с последнего сообщения static FILETIME last_time = { 0, 0 }; FILETIME current_time; GetSystemTimeAsFileTime (¤t_time); ULONGLONG elapsed = ((ULONGLONG) current_time.dwLowDateTime | (ULONGLONG) current_time.dwHighDateTime << 32) - ((ULONGLONG) last_time.dwLowDateTime | (ULONGLONG) last_time.dwHighDateTime << 32); // Вычисление MD5-хэшей отправителя MD5Context ctx; md5init (&ctx); md5update (&ctx, (const unsigned char*)(LPCTSTR)from, from.GetLength() * sizeof (TCHAR)); unsigned char digest_from_current [16] = {0}; static unsigned char digest_from_last [16] = {0}; md5final (digest_from_current, &ctx); // Вычисление MD5-хэшей сообщения md5init (&ctx); md5update (&ctx, (const unsigned char*)(LPCTSTR)text, text.GetLength() * sizeof (TCHAR)); unsigned char digest_text_current [16] = {0}; static unsigned char digest_text_last [16] = {0}; md5final (digest_text_current, &ctx); // Если прошло менее 2 секунд между сообщениями if (elapsed < 20000000) { // И отправители совпадают if (memcmp (digest_from_current, digest_from_last, 16) == 0) { // И сообщение совпадает if (memcmp (digest_text_current, digest_text_last, 16) == 0) { // то пропускаем такое сообщение LOG ("Duplicate message detected"); return; } } } last_time = current_time; CopyMemory (digest_from_last, digest_from_current, 16); CopyMemory (digest_text_last, digest_text_current, 16); } #ifdef CHAT_ENABLED if ( ! IsItMe( to ) && pluginChatEnabled ) // Групповой адрес? { // Формирование группового сообщения if ( ChatNewSession( to ) ) { // Добавить группу ATLVERIFY( ChatAddGroup( to, _T("Normal") ) ); // Добавить себя ATLVERIFY( ChatJoinMe( to, _T("Normal") ) ); // Добавить "От Кого" ATLVERIFY( ChatJoinUser( to, from, _T("Normal") ) ); // Завершение создания чата ATLVERIFY( ChatInitDone( to ) ); // Перевод чат-контакта в онлайн ATLVERIFY( ChatOnline( to ) ); // Сообщение ATLVERIFY( ChatMessage( to, from, text ) ); } } else #endif // CHAT_ENABLED { // Формирование приватного сообщения HANDLE hContact = AddToListByName( from, 0, NULL, false, false ); if ( hContact ) { PROTORECVEVENT pre = { 0 }; pre.timestamp = time (); CT2A textA( text ); pre.szMessage = (LPSTR)(LPCSTR)textA; CCSDATA ccs = { 0 }; ccs.szProtoService = PSR_MESSAGE; ccs.hContact = hContact; db_unset (ccs.hContact, "CList", "Hidden"); ccs.lParam = (LPARAM) ⪯ CallServiceSync (MS_PROTO_CHAINRECV, 0, (LPARAM) &ccs); // Переводим контакт в онлайн SetContactStatus( hContact, contact_scanner::ScanContact( hContact ), true ); // Авто-ответчик if ( db_get_b( NULL, modname, "Auto-answer", FALSE ) ) Autoanswer( hContact ); } } }