void CreateGroup(char *group) { char *p = group; char *sub = group; CMStringA buf; while ((p = strchr(sub, '\\'))) { *p = 0; if (!buf.IsEmpty()) buf.AppendChar('\\'); buf.Append(sub); if (!availableGroups.Contains(buf)) AddNewGroup(buf); *p++ = '\\'; sub = p; } if (sub) { if (!buf.IsEmpty()) buf.AppendChar('\\'); buf.Append(sub); if (!availableGroups.Contains(buf)) AddNewGroup(buf); } }
static char* CreateRTFHeader(SrmmWindowData*) { HDC hdc = GetDC(NULL); logPixelSY = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(NULL, hdc); CMStringA buffer; buffer.Append("{\\rtf1\\ansi\\deff0{\\fonttbl"); LOGFONT lf; for (int i = 0; LoadMsgDlgFont(i, &lf, NULL); i++) buffer.AppendFormat(FONT_FORMAT, i, lf.lfCharSet, lf.lfFaceName); buffer.Append("}{\\colortbl "); COLORREF colour; for (int i = 0; LoadMsgDlgFont(i, NULL, &colour); i++) buffer.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); if (GetSysColorBrush(COLOR_HOTLIGHT) == NULL) colour = RGB(0, 0, 255); else colour = GetSysColor(COLOR_HOTLIGHT); buffer.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(colour), GetGValue(colour), GetBValue(colour)); buffer.Append("}"); return buffer.Detach(); }
// do load("A") A is DBVar name void checkStringForLoad(MCONTACT hContact, CMStringA &str) { if (!strstr(str, "load(\"")) return; char *A, *copyOfStr = NEWSTR_ALLOCA(str.c_str()); unsigned int i, j = 0, s = str.GetLength(); CMStringA tmp; for (i = 0; i < s; i++) { if (!strncmp(str.c_str()+i, "load(\"", mir_strlen("load(\""))) { i += (int)mir_strlen("load(\""); A = strtok(©OfStr[i], "\")"); j = A - ©OfStr[i] + (int)mir_strlen(A) + 1; if (A) { DBVARIANT dbv; if (!db_get_s(hContact, MODNAME, A, &dbv)) { tmp.Append(dbv.pszVal); db_free(&dbv); } } else tmp.Append(str.c_str()+i, j); i += j; } else tmp.AppendChar(copyOfStr[i]); } str = tmp; }
// do the compare("A","B","X","Y") void checkStringForcompare(CMStringA &str) { if (!strstr(str, "compare(\"")) return; char *A, *B, *X, *Y, *copyOfStr = NEWSTR_ALLOCA(str.c_str()); CMStringA tmp; unsigned int i, j = 0, s = str.GetLength(); for (i = 0; i < s; i++) { if (!strncmp(str.c_str()+i, "compare(\"", mir_strlen("compare(\""))) { i += (int)mir_strlen("compare(\""); A = strtok(©OfStr[i], "\",\""); B = strtok(NULL, "\",\""); X = strtok(NULL, "\",\""); Y = strtok(NULL, ",\")"); j = Y - ©OfStr[i] + (int)mir_strlen(Y) + 1; if (A && B && X && Y) { if (!mir_strcmp(A, B)) tmp.Append(X); else tmp.Append(Y); } else tmp.Append(str.c_str()+i, j); i += j; } else tmp.AppendChar(copyOfStr[i]); } str = tmp; }
// do lastchecked(file(X)) returns amount of chars to add to str pointer int lastChecked(CMStringA &szNewStr, const char *str) { char *szPattern = "lastchecked(file("; size_t cbPattern = mir_strlen(szPattern); if (!strncmp(str, szPattern, cbPattern)) { int file; char tszFileName[MAX_PATH], temp[MAX_PATH], szSetting[20]; sscanf(&str[cbPattern], "%d", &file); mir_snprintf(szSetting, "fn%d", file); char *szVar = db_get_sa(NULL, MODNAME, szSetting); if (szVar == NULL) return 0; if (!strncmp("http://", szVar, 7) || !strncmp("https://", szVar, 8)) mir_snprintf(tszFileName, _countof(tszFileName), "%s\\plugins\\fn%d.html", getMimDir(temp), file); else mir_strncpy(tszFileName, szVar, _countof(tszFileName)); mir_free(szVar); HANDLE hFile = CreateFileA(tszFileName, 0, FILE_SHARE_READ, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return 0; if (GetLastWriteTime(hFile, tszFileName)) { CloseHandle(hFile); szNewStr.Append(tszFileName); mir_snprintf(tszFileName, _countof(tszFileName), "%s%d))", szPattern, file); return (int)mir_strlen(tszFileName); } CloseHandle(hFile); } return 0; }
// do loadN("A","B") A is module, B is setting void checkStringForLoadN(CMStringA &str) { if (!strstr(str, "loadN(\"")) return; char *copyOfStr = NEWSTR_ALLOCA(str.c_str()), temp[32]; unsigned int i, j = 0, s = str.GetLength(); CMStringA tmp; for (i = 0; i < s; i++) { if (!strncmp(str.c_str()+i, "loadN(\"", mir_strlen("loadN(\""))) { i += (int)mir_strlen("loadN(\""); char *A = strtok(©OfStr[i], "\",\""); char *B = strtok(NULL, ",\")"); if (A && B) { j = B - ©OfStr[i] + (int)mir_strlen(B) + 1; DBVARIANT dbv; if (!db_get(NULL, A, B, &dbv)) { switch (dbv.type) { case DBVT_BYTE: tmp.Append(_itoa(dbv.bVal, temp, 10)); break; case DBVT_WORD: tmp.Append(_itoa(dbv.wVal, temp, 10)); break; case DBVT_DWORD: tmp.Append(_itoa(dbv.dVal, temp, 10)); break; case DBVT_ASCIIZ: tmp.Append(dbv.pszVal); break; } db_free(&dbv); } } else tmp.Append(str.c_str()+i, i); i += j; } else tmp.AppendChar(copyOfStr[i]); } str = tmp; }
// MsnSendContacts - sends contacts to a certain user int __cdecl CMsnProto::SendContacts(MCONTACT hContact, int, int nContacts, MCONTACT *hContactsList) { if (!msnLoggedIn) return 0; char tEmail[MSN_MAX_EMAIL_LEN]; if (MSN_IsMeByContact(hContact, tEmail)) return 0; int seq = 0; int netId = Lists_GetNetId(tEmail); CMStringA msg; msg.Append("<contacts alt=\"[Contacts enclosed. Please upgrade to latest Skype version to receive contacts.]\">"); for (int i = 0; i < nContacts; i++) { ptrA wlid(getStringA(hContactsList[i], "wlid")); if (wlid != NULL) msg.AppendFormat("<c t=\"s\" s=\"%s\"/>", wlid); } msg.Append("</contacts>"); seq = msnNsThread->sendMessage('1', tEmail, netId, msg, MSG_CONTACT); ForkThread(&CMsnProto::MsnFakeAck, new TFakeAckParams(hContact, seq, NULL, this, ACKTYPE_CONTACTS)); return seq; }
// do saveN("A","B","C","D") A is module, B is setting, c is value, D is type 0/b 1/w 2/d 3/s void checkStringForSaveN(CMStringA &str) { if (!strstr(str, "saveN(\"")) return; char *A, *B, *C, *D, *copyOfStr = NEWSTR_ALLOCA(str.c_str()); unsigned int i, j = 0, s = str.GetLength(); CMStringA tmp; for (i = 0; i < s; i++) { if (!strncmp(str.c_str()+i, "saveN(\"", mir_strlen("saveN(\""))) { i += (int)mir_strlen("saveN(\""); A = strtok(©OfStr[i], "\",\""); B = strtok(NULL, ",\""); C = strtok(NULL, ",\""); D = strtok(NULL, ",\")"); j = D - ©OfStr[i] + (int)mir_strlen(D) + 1; if (A && B && C && D) { switch (D[0]) { case '0': case 'b': db_set_b(NULL, A, B, (BYTE)atoi(C)); break; case '1': case 'w': db_set_w(NULL, A, B, (WORD)atoi(C)); break; case '2': case 'd': db_set_dw(NULL, A, B, (DWORD)atoi(C)); break; case '3': case 's': db_set_s(NULL, A, B, C); break; } } else tmp.Append(str.c_str()+i, j); i += j; } else tmp.AppendChar(copyOfStr[i]); } str = tmp; }
// do save("A","B") A is DBVar name, B is value void checkStringForSave(MCONTACT hContact, CMStringA &str) { if (!strstr(str, "save(\"")) return; char *A, *B, *copyOfStr = NEWSTR_ALLOCA(str.c_str()); unsigned int i, j = 0, s = str.GetLength(); CMStringA tmp; for (i = 0; i < s; i++) { if (!strncmp(str.c_str()+i, "save(\"", mir_strlen("save(\""))) { i += (int)mir_strlen("save(\""); A = strtok(©OfStr[i], "\",\""); B = strtok(NULL, ",\")"); j = B - ©OfStr[i] + (int)mir_strlen(B) + 1; if (A && B) db_set_s(hContact, MODNAME, A, B); else tmp.Append(str.c_str()+i, j); i += j; } else tmp.AppendChar(copyOfStr[i]); } str = tmp; }
HWND GGPROTO::SearchAdvanced(HWND hwndDlg) { // Check if connected if (!isonline()) return 0; gg_pubdir50_t req = gg_pubdir50_new(GG_PUBDIR50_SEARCH); if (!req) { #ifdef DEBUGMODE debugLogA("SearchAdvanced(): ForkThread 14 GGPROTO::searchthread"); #endif ForkThread(&GGPROTO::searchthread, NULL); return (HWND)1; } CMStringA szQuery; // Fetch search data TCHAR text[64]; GetDlgItemText(hwndDlg, IDC_FIRSTNAME, text, _countof(text)); if (mir_tstrlen(text)) { T2Utf firstName_utf8(text); gg_pubdir50_add(req, GG_PUBDIR50_FIRSTNAME, firstName_utf8); szQuery.Append(firstName_utf8); } /* 1 */ szQuery.AppendChar('.'); GetDlgItemText(hwndDlg, IDC_LASTNAME, text, _countof(text)); if (mir_tstrlen(text)) { T2Utf lastName_utf8(text); gg_pubdir50_add(req, GG_PUBDIR50_LASTNAME, lastName_utf8); szQuery.Append(lastName_utf8); } /* 2 */ szQuery.AppendChar('.'); GetDlgItemText(hwndDlg, IDC_NICKNAME, text, _countof(text)); if (mir_tstrlen(text)) { T2Utf nickName_utf8(text); gg_pubdir50_add(req, GG_PUBDIR50_NICKNAME, nickName_utf8); szQuery.Append(nickName_utf8); } /* 3 */ szQuery.AppendChar('.'); GetDlgItemText(hwndDlg, IDC_CITY, text, _countof(text)); if (mir_tstrlen(text)) { T2Utf city_utf8(text); gg_pubdir50_add(req, GG_PUBDIR50_CITY, city_utf8); szQuery.Append(city_utf8); } /* 4 */ szQuery.AppendChar('.'); GetDlgItemText(hwndDlg, IDC_AGEFROM, text, _countof(text)); if (mir_tstrlen(text)) { int yearTo = _tstoi(text); int yearFrom; time_t t = time(NULL); struct tm *lt = localtime(&t); int ay = lt->tm_year + 1900; char age[16]; GetDlgItemTextA(hwndDlg, IDC_AGETO, age, _countof(age)); yearFrom = atoi(age); // Count & fix ranges if (!yearTo) yearTo = ay; else yearTo = ay - yearTo; if (!yearFrom) yearFrom = 0; else yearFrom = ay - yearFrom; mir_sntprintf(text, _T("%d %d"), yearFrom, yearTo); T2Utf age_utf8(text); gg_pubdir50_add(req, GG_PUBDIR50_BIRTHYEAR, age_utf8); szQuery.Append(age_utf8); } /* 5 */ szQuery.AppendChar('.'); switch(SendDlgItemMessage(hwndDlg, IDC_GENDER, CB_GETCURSEL, 0, 0)) { case 1: gg_pubdir50_add(req, GG_PUBDIR50_GENDER, GG_PUBDIR50_GENDER_FEMALE); szQuery.Append(GG_PUBDIR50_GENDER_MALE); break; case 2: gg_pubdir50_add(req, GG_PUBDIR50_GENDER, GG_PUBDIR50_GENDER_MALE); szQuery.Append(GG_PUBDIR50_GENDER_FEMALE); break; } /* 6 */ szQuery.AppendChar('.'); if (IsDlgButtonChecked(hwndDlg, IDC_ONLYCONNECTED)) { gg_pubdir50_add(req, GG_PUBDIR50_ACTIVE, GG_PUBDIR50_ACTIVE_TRUE); szQuery.Append(GG_PUBDIR50_ACTIVE_TRUE); } /* 7 */ szQuery.AppendChar('.'); // No data entered if (szQuery.GetLength() <= 7 || (szQuery.GetLength() == 8 && IsDlgButtonChecked(hwndDlg, IDC_ONLYCONNECTED))) return 0; // Count crc & check if the data was equal if yes do same search with shift unsigned long crc = crc_get(szQuery.GetBuffer()); if (crc == last_crc && next_uin) gg_pubdir50_add(req, GG_PUBDIR50_START, ditoa(next_uin)); else last_crc = crc; gg_pubdir50_seq_set(req, GG_SEQ_SEARCH); if (isonline()) { gg_EnterCriticalSection(&sess_mutex, "SearchAdvanced", 52, "sess_mutex", 1); if (!gg_pubdir50(sess, req)) { gg_LeaveCriticalSection(&sess_mutex, "SearchAdvanced", 52, 1, "sess_mutex", 1); #ifdef DEBUGMODE debugLogA("SearchAdvanced(): ForkThread 15 GGPROTO::searchthread"); #endif ForkThread(&GGPROTO::searchthread, NULL); return (HWND)1; } gg_LeaveCriticalSection(&sess_mutex, "SearchAdvanced", 52, 2, "sess_mutex", 1); } debugLogA("SearchAdvanced(): Seq %d.", req->seq); gg_pubdir50_free(req); return (HWND)1; }
static int LoadLangDescr(LANGPACK_INFO &lpinfo, FILE *fp, char *line, int &startOfLine) { char szLanguage[64]; szLanguage[0] = 0; CMStringA szAuthors; lpinfo.codepage = CP_ACP; lpinfo.flags = 0; fgets(line, LANGPACK_BUF_SIZE, fp); size_t lineLen = strlen(line); if (lineLen >= 3 && line[0] == '\xef' && line[1] == '\xbb' && line[2] == '\xbf') memmove(line, line + 3, lineLen - 2); lrtrim(line); if (mir_strcmp(line, "Miranda Language Pack Version 1")) return 2; // headers while (!feof(fp)) { startOfLine = ftell(fp); if (fgets(line, LANGPACK_BUF_SIZE, fp) == NULL) break; lrtrim(line); if (IsEmpty(line) || line[0] == ';' || line[0] == 0) continue; if (line[0] == '[' || line[0] == '#') break; char *pszColon = strchr(line, ':'); if (pszColon == NULL) return 3; *pszColon++ = 0; if (!mir_strcmp(line, "Language")) { strncpy_s(szLanguage, pszColon, _TRUNCATE); lrtrim(szLanguage); } else if (!mir_strcmp(line, "Last-Modified-Using")) { lpinfo.szLastModifiedUsing = pszColon; lpinfo.szLastModifiedUsing.Trim(); } else if (!mir_strcmp(line, "Authors")) { if (!szAuthors.IsEmpty()) szAuthors.AppendChar(' '); szAuthors.Append(lrtrim(pszColon)); } else if (!mir_strcmp(line, "Author-email")) { lpinfo.szAuthorEmail = pszColon; lpinfo.szAuthorEmail.Trim(); } else if (!mir_strcmp(line, "Locale")) { char szBuf[20], *stopped; lrtrim(pszColon + 1); USHORT langID = (USHORT)strtol(pszColon, &stopped, 16); lpinfo.Locale = MAKELCID(langID, 0); GetLocaleInfoA(lpinfo.Locale, LOCALE_IDEFAULTANSICODEPAGE, szBuf, 10); szBuf[5] = 0; // codepages have max. 5 digits lpinfo.codepage = atoi(szBuf); } } lpinfo.szAuthors = szAuthors; MultiByteToWideChar(lpinfo.codepage, 0, szLanguage, -1, lpinfo.tszLanguage, _countof(lpinfo.tszLanguage)); if (!lpinfo.tszLanguage[0] && (lpinfo.Locale == 0) || !GetLocaleInfo(lpinfo.Locale, LOCALE_SENGLANGUAGE, lpinfo.tszLanguage, _countof(lpinfo.tszLanguage))) { TCHAR *p = _tcschr(lpinfo.tszFileName, '_'); _tcsncpy_s(lpinfo.tszLanguage, ((p != NULL) ? (p + 1) : lpinfo.tszFileName), _TRUNCATE); p = _tcsrchr(lpinfo.tszLanguage, _T('.')); if (p != NULL) *p = '\0'; } return 0; }
static void AppendToBufferWithRTF(CMStringA &buf, const TCHAR *line) { if (line == NULL) return; buf.Append("{\\uc1 "); for (; *line; line++) { if (*line == '\r' && line[1] == '\n') { buf.Append("\\par "); line++; } else if (*line == '\n') { buf.Append("\\par "); } else if (*line == '\t') { buf.Append("\\tab "); } else if (*line == '\\' || *line == '{' || *line == '}') { buf.AppendChar('\\'); buf.AppendChar(*line); } else if (*line == '[' && (g_dat.flags & SMF_SHOWFORMAT)) { int i, found = 0; for (i = 0; i < _countof(bbcodes); ++i) { if (line[1] == bbcodes[i][1]) { size_t lenb = mir_tstrlen(bbcodes[i]); if (!_tcsnicmp(line, bbcodes[i], lenb)) { buf.Append(bbcodefmt[i]); line += lenb - 1; found = 1; break; } } } if (!found) { if (!_tcsnicmp(line, _T("[url"), 4)) { const TCHAR* tag = _tcschr(line + 4, ']'); if (tag) { const TCHAR *tagu = (line[4] == '=') ? line + 5 : tag + 1; const TCHAR *tage = _tcsstr(tag, _T("[/url]")); if (!tage) tage = _tcsstr(tag, _T("[/URL]")); if (tage) { *(TCHAR*)tag = 0; *(TCHAR*)tage = 0; buf.Append("{\\field{\\*\\fldinst HYPERLINK \""); AppendPlainUnicode(buf, tagu); buf.Append("\"}{\\fldrslt "); AppendPlainUnicode(buf, tag+1); buf.Append("}}"); line = tage + 5; found = 1; } } } else if (!_tcsnicmp(line, _T("[color="), 7)) { const TCHAR* tag = _tcschr(line + 7, ']'); if (tag) { line = tag; found = 1; } } else if (!_tcsnicmp(line, _T("[/color]"), 8)) { line += 7; found = 1; } } if (!found) { if (*line < 128) buf.AppendChar((char)*line); else buf.AppendFormat("\\u%d ?", *line); } } else if (*line < 128) buf.AppendChar((char)*line); else buf.AppendFormat("\\u%d ?", *line); } buf.AppendChar('}'); }
INT_PTR CALLBACK DlgInviteToChat(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { InviteChatParam *param = (InviteChatParam*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); param = (InviteChatParam*)lParam; break; case WM_CLOSE: EndDialog(hwndDlg, 0); break; case WM_NCDESTROY: delete param; break; case WM_NOTIFY: NMCLISTCONTROL* nmc; { nmc = (NMCLISTCONTROL*)lParam; if (nmc->hdr.idFrom == IDC_CCLIST) { switch (nmc->hdr.code) { case CLN_NEWCONTACT: if (param && (nmc->flags & (CLNF_ISGROUP | CLNF_ISINFO)) == 0) ChatValidateContact((UINT_PTR)nmc->hItem, nmc->hdr.hwndFrom, param->ppro); break; case CLN_LISTREBUILT: if (param) ChatPrepare(NULL, nmc->hdr.hwndFrom, param->ppro); break; } } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ADDSCR: if (param->ppro->msnLoggedIn) { TCHAR email[MSN_MAX_EMAIL_LEN]; GetDlgItemText(hwndDlg, IDC_EDITSCR, email, _countof(email)); CLCINFOITEM cii = { 0 }; cii.cbSize = sizeof(cii); cii.flags = CLCIIF_CHECKBOX | CLCIIF_BELOWCONTACTS; cii.pszText = _tcslwr(email); HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_CCLIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii); SendDlgItemMessage(hwndDlg, IDC_CCLIST, CLM_SETCHECKMARK, (LPARAM)hItem, 1); } break; case IDCANCEL: EndDialog(hwndDlg, IDCANCEL); break; case IDOK: char tEmail[MSN_MAX_EMAIL_LEN]; tEmail[0] = 0; GCThreadData *info = NULL; if (param->id) info = param->ppro->MSN_GetThreadByChatId(param->id); /*else if (param->hContact) { if (!param->ppro->MSN_IsMeByContact(param->hContact, tEmail)) info = param->ppro->MSN_GetThreadByContact(tEmail); }*/ HWND hwndList = GetDlgItem(hwndDlg, IDC_CCLIST); STRLIST *cont = new STRLIST; ChatInviteSend(NULL, hwndList, *cont, param->ppro); if (info) { for (int i = 0; i < cont->getCount(); ++i) ChatInviteUser(param->ppro->msnNsThread, info, (*cont)[i]); delete cont; } else { /* Group chats only work for Skype users */ CMStringA buf; buf.AppendFormat("<thread><id></id><members><member><mri>%d:%s</mri><role>admin</role></member>", NETID_SKYPE, param->ppro->GetMyUsername(NETID_SKYPE)); for (int i = 0; i < cont->getCount(); ++i) { // TODO: Add support for assigning role in invite dialog maybe? buf.AppendFormat("<member><mri>%s</mri><role>user</role></member>", (*cont)[i]); } buf.Append("</members></thread>"); param->ppro->msnNsThread->sendPacketPayload("PUT", "MSGR\\THREAD", buf); } EndDialog(hwndDlg, IDOK); } break; } return FALSE; }
// add prefix to sent messages int OnDatabaseEventPreAdd(WPARAM hContact, LPARAM lParam) { if (!options.prefix_messages || !lParam) return 0; DBEVENTINFO *dbei = (DBEVENTINFO *)lParam; if ((dbei->eventType != EVENTTYPE_MESSAGE) || !(dbei->flags & DBEF_SENT) || (dbei->flags & DBEF_OTR_PREFIXED)) return 0; if (dbei->cbBlob == 0 || dbei->pBlob == 0) return 0; // just to be safe const char *proto = GetContactProto(hContact); if (!proto) return 0; if (db_get_b(hContact, proto, "ChatRoom", 0) == 1) return 0; if (mir_strcmp(proto, META_PROTO) == 0) { hContact = db_mc_getMostOnline(hContact); if (!hContact) return 0; proto = GetContactProto(hContact); if (!proto) return 0; } ConnContext *context = otrl_context_find_miranda(otr_user_state, hContact); bool encrypted = otr_context_get_trust(context) != TRUST_NOT_PRIVATE; if (!encrypted) return 0; DBEVENTINFO my_dbei = *dbei; // copy the other event char *msg = (char*)dbei->pBlob; int msgLen = (int)strlen(msg); int prefixlen = (int)strnlen(options.prefix, 64); if (strncmp(msg, options.prefix, prefixlen) == 0) return 0; // check for additional data presence int datalen = dbei->cbBlob - msgLen; if (datalen < 0) datalen = 0; CMStringA buf; buf.Append(options.prefix, prefixlen); buf.Append(msg); // append additional data if (datalen) { buf.AppendChar(0); buf.Append(msg + msgLen + 1, datalen); } my_dbei.pBlob = (BYTE*)buf.GetBuffer(); my_dbei.cbBlob = (int)buf.GetLength(); my_dbei.flags |= DBEF_OTR_PREFIXED; db_event_add(hContact, &my_dbei); // stop original event from being added return 1; }
TemplateMap* TemplateMap::loadTemplateFile(const char *id, const char *filename, bool onlyInfo) { char lastTemplate[1024], tmp2[1024]; unsigned int i = 0; if (filename == NULL || mir_strlen(filename) == 0) return NULL; FILE *fh = fopen(filename, "rt"); if (fh == NULL) return NULL; TemplateMap *tmap; if (!onlyInfo) tmap = TemplateMap::add(id, filename); else tmap = new TemplateMap(id); char store[4096]; bool wasTemplate = false; CMStringA templateText; while (fgets(store, sizeof(store), fh) != NULL) { if (sscanf(store, "%s", tmp2) == EOF) continue; //template start bool bFound = false; for (unsigned i = 0; i < _countof(templateNames); i++) { if (!strncmp(store, templateNames[i].tokenString, templateNames[i].tokenLen)) { bFound = true; break; } } if (bFound) { if (wasTemplate) tmap->addTemplate(lastTemplate, templateText); templateText.Empty(); wasTemplate = true; sscanf(store, "<!--%[^-]", lastTemplate); } else if (wasTemplate) templateText.Append(store); } if (wasTemplate) tmap->addTemplate(lastTemplate, templateText); templateText.Empty(); fclose(fh); static const char *groupTemplates[] = { "MessageInGroupStart", "MessageInGroupInner", "hMessageInGroupStart", "hMessageInGroupInner", "MessageOutGroupStart", "MessageOutGroupInner", "hMessageOutGroupStart", "hMessageOutGroupInner" }; tmap->grouping = true; for (i = 0; i < _countof(groupTemplates); i++) { if (tmap->getTemplate(groupTemplates[i]) == NULL) { tmap->grouping = false; break; } } static const char *rtlTemplates[] = { "MessageInRTL", "MessageOutRTL" }; //"HTMLStartRTL", tmap->rtl = true; for (i = 0; i < _countof(rtlTemplates); i++) { if (tmap->getTemplate(rtlTemplates[i]) == NULL) { tmap->rtl = false; break; } } return tmap; }
static void Log_AppendRTF(LOGSTREAMDATA *streamData, BOOL simpleMode, CMStringA &str, const TCHAR *fmt, ...) { int textCharsCount = 0; TCHAR *line = (TCHAR*)_alloca(8001 * sizeof(TCHAR)); va_list va; va_start(va, fmt); int lineLen = mir_vsntprintf(line, 8000, fmt, va); if (lineLen < 0) lineLen = 8000; line[lineLen] = 0; va_end(va); CMStringA res; for (; *line; line++, textCharsCount++) { if (*line == '\r' && line[1] == '\n') { res.Append("\\par "); line++; } else if (*line == '\n') { res.Append("\\line "); } else if (*line == '%' && !simpleMode) { char szTemp[200]; szTemp[0] = '\0'; switch (*++line) { case '\0': case '%': res.AppendChar('%'); break; case 'c': case 'f': if (g_Settings.bStripFormat || streamData->bStripFormat) line += 2; else if (line[1] != '\0' && line[2] != '\0') { TCHAR szTemp3[3], c = *line; int col; szTemp3[0] = line[1]; szTemp3[1] = line[2]; szTemp3[2] = '\0'; line += 2; col = _ttoi(szTemp3); col += (OPTIONS_FONTCOUNT + 1); res.AppendFormat((c == 'c') ? "\\cf%u " : "\\highlight%u ", col); } break; case 'C': case 'F': if (!g_Settings.bStripFormat && !streamData->bStripFormat) { int j = streamData->lin->bIsHighlighted ? 16 : EventToIndex(streamData->lin); if (*line == 'C') res.AppendFormat("\\cf%u ", j + 1); else res.Append("\\highlight0 "); } break; case 'b': case 'u': case 'i': if (!streamData->bStripFormat) res.AppendFormat((*line == 'u') ? "\\%cl " : "\\%c ", *line); break; case 'B': case 'U': case 'I': if (!streamData->bStripFormat) res.AppendFormat((*line == 'U') ? "\\%cl0 " : "\\%c0 ", tolower(*line)); break; case 'r': if (!streamData->bStripFormat) { int index = EventToIndex(streamData->lin); res.AppendFormat("%s ", pci->Log_SetStyle(index)); } break; } } else if (*line == '\t' && !streamData->bStripFormat) { res.Append("\\tab "); } else if ((*line == '\\' || *line == '{' || *line == '}') && !streamData->bStripFormat) { res.AppendChar('\\'); res.AppendChar(*line); } else if (*line > 0 && *line < 128) { res.AppendChar((char)*line); } else res.AppendFormat("\\u%u ?", (WORD)* line); } str += res; }
static char* Log_CreateRTF(LOGSTREAMDATA *streamData) { LOGINFO *lin = streamData->lin; MODULEINFO *mi = pci->MM_FindModule(streamData->si->pszModule); // ### RTF HEADER if (0 == mi->pszHeader) mi->pszHeader = Log_CreateRtfHeader(mi); char *header = mi->pszHeader; streamData->crCount = mi->nColorCount; CMStringA str; if (header) str.Append(header); // ### RTF BODY (one iteration per event that should be streamed in) while (lin) { // filter if ((streamData->si->iType != GCW_CHATROOM && streamData->si->iType != GCW_PRIVMESS) || !streamData->si->bFilterEnabled || (streamData->si->iLogFilterFlags & lin->iType) != 0) { if (lin->next != NULL) str.Append("\\par "); if (streamData->dat->dwFlags & MWF_DIVIDERWANTED || lin->dwFlags & MWF_DIVIDERWANTED) { static char szStyle_div[128] = "\0"; if (szStyle_div[0] == 0) mir_snprintf(szStyle_div, "\\f%u\\cf%u\\ul0\\b%d\\i%d\\fs%u", 17, 18, 0, 0, 5); lin->dwFlags |= MWF_DIVIDERWANTED; if (lin->prev || !streamData->bRedraw) str.AppendFormat("\\qc\\sl-1\\highlight%d %s ---------------------------------------------------------------------------------------\\par ", 18, szStyle_div); streamData->dat->dwFlags &= ~MWF_DIVIDERWANTED; } // create new line, and set font and color str.AppendFormat("\\ql\\sl0%s ", pci->Log_SetStyle(0)); str.AppendFormat("\\v~-+%d+-~\\v0 ", lin); // Insert icon if (g_Settings.bLogSymbols) // use symbols str.AppendFormat("%s %c", pci->Log_SetStyle(17), EventToSymbol(lin)); else if (g_Settings.dwIconFlags) { int iIndex = lin->bIsHighlighted ? ICON_HIGHLIGHT : EventToIcon(lin); str.Append("\\f0\\fs14"); str.AppendFormat(pci->pLogIconBmpBits[iIndex], (int)pci->logIconBmpSize[iIndex]); } if (g_Settings.bTimeStampEventColour) { // colored timestamps static char szStyle[256]; LOGFONT &F = pci->aFonts[0].lf; int iii; if (lin->ptszNick && lin->iType == GC_EVENT_MESSAGE) { iii = lin->bIsHighlighted ? 16 : (lin->bIsMe ? 2 : 1); mir_snprintf(szStyle, "\\f0\\cf%u\\ul0\\highlight0\\b%d\\i%d\\ul%d\\fs%u", iii + 1, F.lfWeight >= FW_BOLD ? 1 : 0, F.lfItalic, F.lfUnderline, 2 * abs(F.lfHeight) * 74 / pci->logPixelSY); str.Append(szStyle); } else { iii = lin->bIsHighlighted ? 16 : EventToIndex(lin); mir_snprintf(szStyle, "\\f0\\cf%u\\ul0\\highlight0\\b%d\\i%d\\ul%d\\fs%u", iii + 1, F.lfWeight >= FW_BOLD ? 1 : 0, F.lfItalic, F.lfUnderline, 2 * abs(F.lfHeight) * 74 / pci->logPixelSY); str.Append(szStyle); } } else str.Append(pci->Log_SetStyle(0)); str.AppendChar(' '); // insert a TAB if necessary to put the timestamp in the right position if (g_Settings.dwIconFlags) str.Append("\\tab "); //insert timestamp if (g_Settings.bShowTime) { TCHAR szTimeStamp[30], szOldTimeStamp[30]; _tcsncpy_s(szTimeStamp, pci->MakeTimeStamp(g_Settings.pszTimeStamp, lin->time), _TRUNCATE); _tcsncpy_s(szOldTimeStamp, pci->MakeTimeStamp(g_Settings.pszTimeStamp, streamData->si->LastTime), _TRUNCATE); if (!g_Settings.bShowTimeIfChanged || streamData->si->LastTime == 0 || mir_tstrcmp(szTimeStamp, szOldTimeStamp)) { streamData->si->LastTime = lin->time; Log_AppendRTF(streamData, TRUE, str, _T("%s"), szTimeStamp); } str.Append("\\tab "); } // Insert the nick if (lin->ptszNick && lin->iType == GC_EVENT_MESSAGE) { char pszIndicator[3] = "\0\0"; int crNickIndex = 0; if (g_Settings.bLogClassicIndicators || g_Settings.bColorizeNicksInLog) pszIndicator[0] = GetIndicator(streamData->si, lin->ptszNick, &crNickIndex); str.Append(pci->Log_SetStyle(lin->bIsMe ? 2 : 1)); str.AppendChar(' '); if (g_Settings.bLogClassicIndicators) str.Append(pszIndicator); CMString pszTemp(lin->bIsMe ? g_Settings.pszOutgoingNick : g_Settings.pszIncomingNick); pszTemp.Replace(_T("%n"), _T("%s")); if (!lin->bIsMe) { if (g_Settings.bClickableNicks) pszTemp.Replace(_T("%s"), _T("~~++#%s#++~~")); if (g_Settings.bColorizeNicksInLog && pszIndicator[0]) str.AppendFormat("\\cf%u ", OPTIONS_FONTCOUNT + streamData->crCount + crNickIndex); } Log_AppendRTF(streamData, TRUE, str, pszTemp, lin->ptszNick); str.AppendChar(' '); } // Insert the message str.Append(pci->Log_SetStyle(lin->bIsHighlighted ? 16 : EventToIndex(lin))); str.AppendChar(' '); streamData->lin = lin; AddEventToBuffer(str, streamData); } lin = lin->prev; } // ### RTF END if (streamData->bRedraw) str.Append("\\par}"); else str.Append("}"); return str.Detach(); }
int stringReplacer(const char *oldString, CMStringA &szNewString, MCONTACT hContact) { char var_file[8]; int tempInt; int startLine = 0, endLine = 0, startChar = 0, endChar = 0, wholeLine = -1, linesInFile; int positionInOldString = 0; char *fileContents[MAXLINES] = { NULL }, tempString[MAX_STRING_LENGTH]; // setup the variable names szNewString.Empty(); strncpy(var_file, "file(", sizeof(var_file)); while ((positionInOldString < (int)mir_strlen(oldString)) && (oldString[positionInOldString] != '\0')) { // load the file... must be first if (!strncmp(&oldString[positionInOldString], var_file, mir_strlen(var_file))) { positionInOldString += (int)mir_strlen(var_file); // check if its a number tempInt = getNumber(&oldString[positionInOldString]); if (tempInt == -1) { // not a number so check vars.. // there are none yet return ERROR_NO_FILE; } // read the file linesInFile = readFileIntoArray(tempInt, fileContents); if (linesInFile == 0) return ERROR_NO_FILE; positionInOldString += (int)mir_strlen(_itoa(tempInt, tempString, 10)) + 1; // +1 for the closing ) // wholeline() if (!strncmp(&oldString[positionInOldString], "wholeline(line(", mir_strlen("wholeline(line("))) { positionInOldString += (int)mir_strlen("wholeline(line("); tempInt = findLine(fileContents, oldString, linesInFile, startLine, &positionInOldString); if (tempInt == -1 || !fileContents[tempInt]) return ERROR_NO_LINE_AFTER_VAR_F; wholeLine = tempInt; positionInOldString += 3; // add 2 for the )) for wholeline(line()) } if (!strncmp(&oldString[positionInOldString], "start(", mir_strlen("start("))) { positionInOldString += (int)mir_strlen("start(line("); tempInt = findLine(fileContents, oldString, linesInFile, startLine, &positionInOldString); if (tempInt == -1 || !fileContents[tempInt]) return ERROR_NO_LINE_AFTER_VAR_F; else { positionInOldString += 2; startLine = tempInt; if (!endChar) endChar = (int)mir_strlen(fileContents[startLine]); tempInt = findChar(fileContents, oldString, linesInFile, startLine, &positionInOldString, startChar, 0); if (tempInt == -1) return ERROR_NO_LINE_AFTER_VAR_F; startChar = tempInt; } positionInOldString += 2; // add 2 for the )) for start(line()) } if (!strncmp(&oldString[positionInOldString], "end(", mir_strlen("end("))) { positionInOldString += (int)mir_strlen("end(line("); tempInt = findLine(fileContents, oldString, linesInFile, startLine, &positionInOldString); if (tempInt == -1 || !fileContents[tempInt]) return ERROR_NO_LINE_AFTER_VAR_F; positionInOldString += 2; endLine = tempInt; tempInt = findChar(fileContents, oldString, linesInFile, startLine, &positionInOldString, startChar, 1); if (tempInt == -1) return ERROR_NO_LINE_AFTER_VAR_F; endChar = tempInt; positionInOldString += 2; // add 2 for the )) for end(line()) } // check for both start() and end() otherwise, only copying 1 line if (!strstr(oldString, "start(")) startLine = endLine; if (!strstr(oldString, "end(")) endLine = startLine; // after all the options copy the line across and add 2 to positionInOldString for the file(print(....)) if (wholeLine >= 0) szNewString.Append(fileContents[wholeLine]); else { // only copying from 1 line if (startLine == endLine) szNewString.Append(&fileContents[startLine][startChar], endChar - startChar); else { // copy the whole first line from startChar szNewString.Append(&fileContents[startLine][startChar]); // copy the middle lines across for (int i = (startLine + 1); i < endLine; i++) szNewString.Append(fileContents[i]); // copy the last line untill endChar szNewString.Append(fileContents[endLine], endChar); } } } // filename() else if (!strncmp(&oldString[positionInOldString], "filename(", mir_strlen("filename("))) { positionInOldString += (int)mir_strlen("filename("); tempInt = getNumber(&oldString[positionInOldString]); if (tempInt == -1) { return ERROR_NO_FILE; } else { mir_snprintf(tempString, _countof(tempString), "fn%d", tempInt); if (db_get_static(NULL, MODNAME, tempString, tempString, _countof(tempString))) szNewString.Append(tempString); else return ERROR_NO_FILE; positionInOldString += (int)mir_strlen(_itoa(tempInt, tempString, 10)) + 1; } } // lastchecked(file(X)) else if (!strncmp(&oldString[positionInOldString], "lastchecked(file(", mir_strlen("lastchecked(file("))) { positionInOldString += lastChecked(szNewString, &oldString[positionInOldString]); } else { szNewString.Append(&oldString[positionInOldString], 1); positionInOldString++; } } // free the file strings for (tempInt = 0; (fileContents[tempInt] != NULL) && (tempInt < MAXLINES); tempInt++) free(fileContents[tempInt]); // check for load("A","B") checkStringForLoad(hContact, szNewString); // and loadN(...) checkStringForLoadN(szNewString); // check for compare("A","B","X","Y") checkStringForcompare(szNewString); // check for save("A","B") checkStringForSave(hContact, szNewString); // and saveN(...) checkStringForSaveN(szNewString); return 1; }
void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) { debugLogA("CVkProto::OnReceiveMessages %d", reply->resultCode); if (reply->resultCode != 200) return; JSONNode jnRoot; const JSONNode &jnResponse = CheckJsonResponse(pReq, reply, jnRoot); if (!jnResponse) return; if (!jnResponse["Msgs"]) return; CMStringA mids; int numMessages = jnResponse["Msgs"]["count"].as_int(); const JSONNode &jnMsgs = jnResponse["Msgs"]["items"]; const JSONNode &jnFUsers = jnResponse["fwd_users"]; debugLogA("CVkProto::OnReceiveMessages numMessages = %d", numMessages); for (auto it = jnMsgs.begin(); it != jnMsgs.end(); ++it) { const JSONNode &jnMsg = (*it); if (!jnMsg) { debugLogA("CVkProto::OnReceiveMessages pMsg == NULL"); break; } UINT mid = jnMsg["id"].as_int(); CMString tszBody(jnMsg["body"].as_mstring()); int datetime = jnMsg["date"].as_int(); int isOut = jnMsg["out"].as_int(); int isRead = jnMsg["read_state"].as_int(); int uid = jnMsg["user_id"].as_int(); const JSONNode &jnFwdMessages = jnMsg["fwd_messages"]; if (jnFwdMessages) { CMString tszFwdMessages = GetFwdMessages(jnFwdMessages, jnFUsers, m_vkOptions.BBCForAttachments()); if (!tszBody.IsEmpty()) tszFwdMessages = _T("\n") + tszFwdMessages; tszBody += tszFwdMessages; } CMString tszAttachmentDescr; const JSONNode &jnAttachments = jnMsg["attachments"]; if (jnAttachments) { tszAttachmentDescr = GetAttachmentDescr(jnAttachments, m_vkOptions.BBCForAttachments()); if (!tszBody.IsEmpty()) tszBody += _T("\n"); tszBody += tszAttachmentDescr; } MCONTACT hContact = NULL; int chat_id = jnMsg["chat_id"].as_int(); if (chat_id == 0) hContact = FindUser(uid, true); char szMid[40]; _itoa(mid, szMid, 10); if (m_vkOptions.iMarkMessageReadOn == MarkMsgReadOn::markOnReceive || chat_id != 0) { if (!mids.IsEmpty()) mids.AppendChar(','); mids.Append(szMid); } if (chat_id != 0) { debugLogA("CVkProto::OnReceiveMessages chat_id != 0"); CMString action_chat = jnMsg["action"].as_mstring(); int action_mid = _ttoi(jnMsg["action_mid"].as_mstring()); if ((action_chat == "chat_kick_user") && (action_mid == m_myUserId)) KickFromChat(chat_id, uid, jnMsg, jnFUsers); else { MCONTACT chatContact = FindChat(chat_id); if (chatContact && getBool(chatContact, "kicked", true)) db_unset(chatContact, m_szModuleName, "kicked"); AppendChatMessage(chat_id, jnMsg, jnFUsers, false); } continue; } PROTORECVEVENT recv = { 0 }; bool bUseServerReadFlag = m_vkOptions.bSyncReadMessageStatusFromServer ? true : !m_vkOptions.bMesAsUnread; if (isRead && bUseServerReadFlag) recv.flags |= PREF_CREATEREAD; if (isOut) recv.flags |= PREF_SENT; else if (m_vkOptions.bUserForceInvisibleOnActivity && time(NULL) - datetime < 60 * m_vkOptions.iInvisibleInterval) SetInvisible(hContact); T2Utf pszBody(tszBody); recv.timestamp = m_vkOptions.bUseLocalTime ? time(NULL) : datetime; recv.szMessage = pszBody; recv.lParam = isOut; recv.pCustomData = szMid; recv.cbCustomDataSize = (int)mir_strlen(szMid); Sleep(100); debugLogA("CVkProto::OnReceiveMessages mid = %d, datetime = %d, isOut = %d, isRead = %d, uid = %d", mid, datetime, isOut, isRead, uid); if (!CheckMid(m_sendIds, mid)) { debugLogA("CVkProto::OnReceiveMessages ProtoChainRecvMsg"); ProtoChainRecvMsg(hContact, &recv); if (mid > getDword(hContact, "lastmsgid", -1)) setDword(hContact, "lastmsgid", mid); if (!isOut) m_incIds.insert((HANDLE)mid); } else if (m_vkOptions.bLoadSentAttachments && !tszAttachmentDescr.IsEmpty() && isOut) { T2Utf pszAttach(tszAttachmentDescr); recv.timestamp = time(NULL); // only local time recv.szMessage = pszAttach; ProtoChainRecvMsg(hContact, &recv); } } if (!mids.IsEmpty()) MarkMessagesRead(mids); }
INT_PTR ImportContacts(WPARAM, LPARAM) { MCONTACT hContact; char name[256] = "", program[256] = "", programparam[256] = "", group[256] = "", line[2001] = ""; int icon = 40072, usetimer = 0, minutes = 1, timer = 0; char fn[MAX_PATH]; int i, j, contactDone = 0; if (!Openfile(fn, 1)) return 1; FILE *file = fopen(fn, "r"); if (!file) return 1; CMStringA tooltip; while (fgets(line, 2000, file)) { if (!mir_strcmp(line, "\r\n\0")) continue; if (!mir_strcmp(line, "[Non-IM Contact]\r\n")) contactDone = 0; else if (!strncmp(line, "Name=", mir_strlen("Name="))) { i = (int)mir_strlen("Name="); j = 0; while (line[i] != '\r' && line[i] != '\n' && line[i] != '\0') { name[j] = line[i++]; name[++j] = '\0'; } contactDone = 1; } else if (!strncmp(line, "ProgramString=", mir_strlen("ProgramString="))) { i = (int)mir_strlen("ProgramString="); j = 0; while (line[i] != '\r' && line[i] != '\n' && line[i] != '\0') { program[j] = line[i++]; program[++j] = '\0'; } } else if (!strncmp(line, "ProgramParamString=", mir_strlen("ProgramParamString="))) { i = (int)mir_strlen("ProgramParamString="); j = 0; while (line[i] != '\r' && line[i] != '\n' && line[i] != '\0') { programparam[j] = line[i++]; programparam[++j] = '\0'; } } else if (!strncmp(line, "Group=", mir_strlen("Group="))) { i = (int)mir_strlen("Group="); j = 0; while (line[i] != '\r' && line[i] != '\n' && line[i] != '\0') { group[j] = line[i++]; group[++j] = '\0'; } } else if (!strncmp(line, "ToolTip=", mir_strlen("ToolTip="))) { i = (int)mir_strlen("ToolTip="); tooltip = &line[i]; fgets(line, 2000, file); while (!strstr(line, "</tooltip>\r\n")) { tooltip.Append(line); fgets(line, 2000, file); } // the line that has the </tooltip> tooltip.Append(line); } else if (!strncmp(line, "Icon=", mir_strlen("Icon="))) { i = (int)mir_strlen("Icon="); sscanf(&line[i], "%d", &icon); } else if (!strncmp(line, "UseTimer=", mir_strlen("UseTimer="))) { i = (int)mir_strlen("UseTimer="); sscanf(&line[i], "%d", &usetimer); } else if (!strncmp(line, "Timer=", mir_strlen("Timer="))) { i = (int)mir_strlen("Timer="); sscanf(&line[i], "%d", &timer); } else if (!strncmp(line, "Minutes=", mir_strlen("Minutes="))) { i = (int)mir_strlen("Minutes="); sscanf(&line[i], "%d", &minutes); } else if (contactDone && !mir_strcmp(line, "[/Non-IM Contact]\r\n")) { if (!name) continue; size_t size = mir_strlen(name) + mir_strlen("Do you want to import this Non-IM Contact?\r\n\r\nName: \r\n") + 1; char *msg = (char*)malloc(size); mir_snprintf(msg, size, "Do you want to import this Non-IM Contact?\r\n\r\nName: %s\r\n", name); if (program[0] != '\0') { msg = (char*)realloc(msg, mir_strlen(msg) + mir_strlen(program) + mir_strlen("Program: \r\n") + 1); mir_strcat(msg, "Program: "); mir_strcat(msg, program); mir_strcat(msg, "\r\n"); } if (programparam[0] != '\0') { msg = (char*)realloc(msg, mir_strlen(msg) + mir_strlen(programparam) + mir_strlen("Program Parameters: \r\n") + 1); mir_strcat(msg, "Program Parameters: "); mir_strcat(msg, programparam); mir_strcat(msg, "\r\n"); } if (tooltip) { msg = (char*)realloc(msg, mir_strlen(msg) + mir_strlen(tooltip) + mir_strlen("ToolTip: \r\n") + 1); mir_strcat(msg, "ToolTip: "); mir_strcat(msg, tooltip); mir_strcat(msg, "\r\n"); } if (group[0] != '\0') { msg = (char*)realloc(msg, mir_strlen(msg) + mir_strlen(group) + mir_strlen("Group: \r\n") + 1); mir_strcat(msg, "Group: "); mir_strcat(msg, group); mir_strcat(msg, "\r\n"); } if (icon) { char tmp[64]; if (icon == ID_STATUS_ONLINE) mir_snprintf(tmp, "Icon: Online\r\n"); else if (icon == ID_STATUS_AWAY) mir_snprintf(tmp, "Icon: Away\r\n"); else if (icon == ID_STATUS_NA) mir_snprintf(tmp, "Icon: NA\r\n"); else if (icon == ID_STATUS_DND) mir_snprintf(tmp, "Icon: DND\r\n"); else if (icon == ID_STATUS_OCCUPIED) mir_snprintf(tmp, "Icon: Occupied\r\n"); else if (icon == ID_STATUS_FREECHAT) mir_snprintf(tmp, "Icon: Free For Chat\r\n"); else if (icon == ID_STATUS_INVISIBLE) mir_snprintf(tmp, "Icon: Invisible\r\n"); else if (icon == ID_STATUS_ONTHEPHONE) mir_snprintf(tmp, "Icon: On The Phone\r\n"); else if (icon == ID_STATUS_OUTTOLUNCH) mir_snprintf(tmp, "Icon: Out To Lunch\r\n"); else { free(msg); continue; } char *msgtemp = (char*)realloc(msg, mir_strlen(msg) + mir_strlen(tmp) + 1); if (msgtemp) { msg = msgtemp; mir_strcat(msg, tmp); } } if (usetimer && timer) { char tmp[64], tmp2[8]; if (minutes) mir_strcpy(tmp2, "Minutes"); else mir_strcpy(tmp2, "Seconds"); mir_snprintf(tmp, "UseTimer: Yes\r\nTimer: %d %s", timer, tmp2); char *msgtemp = (char*)realloc(msg, mir_strlen(msg) + mir_strlen(tmp) + 1); if (msgtemp) { msg = msgtemp; mir_strcat(msg, tmp); } } if (MessageBoxA(0, msg, modFullname, MB_YESNO) == IDYES) { if (!(hContact = (MCONTACT)CallService(MS_DB_CONTACT_ADD, 0, 0))) { msg("contact did get created", ""); continue; } Proto_AddToContact(hContact, MODNAME); CallService(MS_IGNORE_IGNORE, hContact, IGNOREEVENT_USERONLINE); db_set_s(hContact, MODNAME, "Nick", Translate("New Non-IM Contact")); db_set_s(hContact, MODNAME, "Name", name); db_set_s(hContact, MODNAME, "ProgramString", program); // copy the ProgramParamString db_set_s(hContact, MODNAME, "ProgramParamString", programparam); // copy the group db_set_s(hContact, "CList", "Group", group); // copy the ToolTip db_set_s(hContact, MODNAME, "ToolTip", tooltip); // timer db_set_b(hContact, MODNAME, "UseTimer", (BYTE)usetimer); db_set_b(hContact, MODNAME, "Minutes", (BYTE)minutes); db_set_w(hContact, MODNAME, "Timer", (WORD)timer); //icon db_set_w(hContact, MODNAME, "Icon", (WORD)icon); replaceAllStrings(hContact); } free(msg); contactDone = 0; name[0] = '\0'; program[0] = '\0'; programparam[0] = '\0'; group[0] = '\0'; line[0] = '\0'; tooltip.Empty(); icon = 40072; usetimer = 0; minutes = 1; timer = 0; } } fclose(file); return 1; }
void CMsnProto::MSN_CreateContList(void) { bool *used = (bool*)mir_calloc(m_arContacts.getCount()*sizeof(bool)); CMStringA cxml; cxml.AppendFormat("<ml l=\"%d\">", MyOptions.netId == NETID_MSN?1:0); { mir_cslock lck(m_csLists); for (int i = 0; i < m_arContacts.getCount(); i++) { if (used[i]) continue; const char* lastds = strchr(m_arContacts[i].email, '@'); bool newdom = true; for (int j = 0; j < m_arContacts.getCount(); j++) { if (used[j]) continue; const MsnContact& C = m_arContacts[j]; if (C.list == LIST_RL || C.list == LIST_PL || C.list == LIST_LL) { used[j] = true; continue; } const char *dom = strchr(C.email, '@'); if (dom == NULL && lastds == NULL) { if (newdom) { cxml.Append("<skp>"); newdom = false; } int list = C.list & ~(LIST_RL | LIST_LL); list = LIST_FL | LIST_AL; /* Seems to be always 3 in Skype... */ cxml.AppendFormat("<c n=\"%s\" t=\"%d\"><s l=\"%d\" n=\"PE\"/><s l=\"%d\" n=\"IM\"/><s l=\"%d\" n=\"SKP\"/><s l=\"%d\" n=\"PUB\"/></c>", C.email, C.netId, list, list, list, list); used[j] = true; } /* Seems to be unused in Skype and causing errors else if (dom != NULL && lastds != NULL && _stricmp(lastds, dom) == 0) { if (newdom) { cxml.AppendFormat("<d n=\"%s\">", lastds + 1); newdom = false; } *(char*)dom = 0; cxml.AppendFormat("<c n=\"%s\" t=\"%d\"><s n=\"IM\" l=\"%d\"/></c>", C.email, C.netId, C.list & ~(LIST_RL | LIST_LL)); *(char*)dom = '@'; used[j] = true; } */ } if (!newdom) cxml.Append(lastds ? "</d>" : "</skp>"); } } cxml.Append("</ml>"); msnNsThread->sendPacketPayload("PUT", "MSGR\\CONTACTS", "%s", cxml); if (msnP24Ver > 1) msnNsThread->sendPacketPayload("PUT", "MSGR\\SUBSCRIPTIONS", "<subscribe><presence><buddies><all /></buddies></presence><messaging><im /><conversations /></messaging><notifications><partners>%s<partner>ABCH</partner></partners></notifications></subscribe>", MyOptions.netId==NETID_MSN?"<partner>Hotmail</partner>":""); mir_free(used); }
INT_PTR CSkypeProto::GetEventText(WPARAM, LPARAM lParam) { DBEVENTGETTEXT *pEvent = (DBEVENTGETTEXT *)lParam; CMStringA szText; BOOL bUseBB = db_get_b(NULL, pEvent->dbei->szModule, "UseBBCodes", 1); switch (pEvent->dbei->eventType) { case SKYPE_DB_EVENT_TYPE_EDITED_MESSAGE: { JSONNode jMsg = JSONNode::parse((char*)pEvent->dbei->pBlob); if (jMsg) { JSONNode &jOriginalMsg = jMsg["original_message"]; szText.AppendFormat(bUseBB ? Translate("[b]Original message:[/b]\n%s\n") : Translate("Original message:\n%s\n"), mir_utf8decodeA(jOriginalMsg["text"].as_string().c_str())); JSONNode &jEdits = jMsg["edits"]; for (auto it = jEdits.begin(); it != jEdits.end(); ++it) { const JSONNode &jEdit = *it; time_t time = jEdit["time"].as_int(); char szTime[MAX_PATH]; strftime(szTime, sizeof(szTime), "%X %x", localtime(&time)); szText.AppendFormat(bUseBB ? Translate("[b]Edited at %s:[/b]\n%s\n") : Translate("Edited at %s:\n%s\n"), szTime, mir_utf8decodeA(jEdit["text"].as_string().c_str())); } } else { szText = INVALID_DATA; } break; } case SKYPE_DB_EVENT_TYPE_CALL_INFO: { HXML xml = xmlParseString(ptrT(mir_utf8decodeT((char*)pEvent->dbei->pBlob)), 0, _T("partlist")); if (xml != NULL) { ptrA type(mir_t2a(xmlGetAttrValue(xml, _T("type")))); bool bType = (!mir_strcmpi(type, "started")) ? 1 : 0; time_t callDuration = 0; for (int i = 0; i < xmlGetChildCount(xml); i++) { HXML xmlPart = xmlGetNthChild(xml, _T("part"), i); if (xmlPart != NULL) { HXML xmlDuration = xmlGetChildByPath(xmlPart, _T("duration"), 0); if (xmlDuration != NULL) { callDuration = _ttol(xmlGetText(xmlDuration)); xmlDestroyNode(xmlDuration); xmlDestroyNode(xmlPart); break; } xmlDestroyNode(xmlPart); } } if (bType) { szText = Translate("Call"); } else { if (callDuration == 0) { szText = Translate("Call missed"); } else { char szTime[100]; strftime(szTime, sizeof(szTime), "%X", gmtime(&callDuration)); szText.Format(Translate("Call ended (%s)"), szTime); } } xmlDestroyNode(xml); } else { szText = INVALID_DATA; } break; } case SKYPE_DB_EVENT_TYPE_FILETRANSFER_INFO: { HXML xml = xmlParseString(ptrT(mir_utf8decodeT((char*)pEvent->dbei->pBlob)), 0, _T("files")); if (xml != NULL) { for (int i = 0; i < xmlGetChildCount(xml); i++) { LONGLONG fileSize = 0; HXML xmlNode = xmlGetNthChild(xml, _T("file"), i); if (xmlNode != NULL) { fileSize = _ttol(xmlGetAttrValue(xmlNode, _T("size"))); char *fileName = _T2A(xmlGetText(xmlNode)); if (fileName != NULL) { szText.AppendFormat(Translate("File transfer:\n\tFile name: %s \n\tSize: %lld bytes \n"), fileName, fileSize); } xmlDestroyNode(xmlNode); } } xmlDestroyNode(xml); } else { szText = INVALID_DATA; } break; } case SKYPE_DB_EVENT_TYPE_MOJI: case SKYPE_DB_EVENT_TYPE_URIOBJ: { HXML xml = xmlParseString(ptrT(mir_utf8decodeT((char*)pEvent->dbei->pBlob)), 0, _T("URIObject")); if (xml != NULL) { szText.Append(_T2A(xmlGetText(xml))); HXML xmlA = xmlGetChildByPath(xml, _T("a"), 0); if (xmlA != NULL) { szText += _T2A(xmlGetAttrValue(xmlA, _T("href"))); xmlDestroyNode(xmlA); } xmlDestroyNode(xml); } else { szText = INVALID_DATA; } break; } case SKYPE_DB_EVENT_TYPE_INCOMING_CALL: { szText = Translate("Incoming call"); break; } case SKYPE_DB_EVENT_TYPE_UNKNOWN: { szText.Format(Translate("Unknown event, please send this text for developer: \"%s\""), mir_utf8decodeA((char*)pEvent->dbei->pBlob)); break; } default: { szText = ptrA(mir_utf8decodeA((char*)pEvent->dbei->pBlob)); } } switch(pEvent->datatype) { case DBVT_TCHAR: { return (INT_PTR)mir_a2t(szText); } case DBVT_ASCIIZ: { return (INT_PTR)szText.Detach(); } case DBVT_UTF8: { return (INT_PTR)mir_utf8encode(szText); } default: { return NULL; } } }
//mir_free() the return value static char* CreateRTFFromDbEvent(SrmmWindowData *dat, MCONTACT hContact, MEVENT hDbEvent, struct LogStreamData *streamData) { int showColon = 0; DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(hDbEvent); if (dbei.cbBlob == -1) return NULL; dbei.pBlob = (PBYTE)mir_alloc(dbei.cbBlob); db_event_get(hDbEvent, &dbei); if (!DbEventIsShown(&dbei)) { mir_free(dbei.pBlob); return NULL; } if (!(dbei.flags & DBEF_SENT) && (dbei.eventType == EVENTTYPE_MESSAGE || DbEventIsForMsgWindow(&dbei))) { db_event_markRead(hContact, hDbEvent); pcli->pfnRemoveEvent(hContact, hDbEvent); } else if (dbei.eventType == EVENTTYPE_JABBER_CHATSTATES || dbei.eventType == EVENTTYPE_JABBER_PRESENCE) { db_event_markRead(hContact, hDbEvent); } CMStringA buffer; if (!dat->bIsAutoRTL && !streamData->isEmpty) buffer.Append("\\par"); if (dbei.flags & DBEF_RTL) { buffer.Append("\\rtlpar"); dat->bIsAutoRTL = TRUE; } else buffer.Append("\\ltrpar"); streamData->isEmpty = 0; if (dat->bIsAutoRTL) { if (dbei.flags & DBEF_RTL) buffer.Append("\\ltrch\\rtlch"); else buffer.Append("\\rtlch\\ltrch"); } if (g_dat.flags & SMF_SHOWICONS) { int i = ((dbei.eventType == EVENTTYPE_MESSAGE) ? ((dbei.flags & DBEF_SENT) ? LOGICON_MSG_OUT : LOGICON_MSG_IN): LOGICON_MSG_NOTICE); buffer.Append("\\f0\\fs14"); buffer.Append(pLogIconBmpBits[i]); } if (g_dat.flags & SMF_SHOWTIME) { const TCHAR* szFormat; TCHAR str[64]; if (g_dat.flags & SMF_SHOWSECS) szFormat = g_dat.flags & SMF_SHOWDATE ? _T("d s") : _T("s"); else szFormat = g_dat.flags & SMF_SHOWDATE ? _T("d t") : _T("t"); TimeZone_PrintTimeStamp(NULL, dbei.timestamp, szFormat, str, _countof(str), 0); buffer.AppendFormat(" %s ", SetToStyle(dbei.flags & DBEF_SENT ? MSGFONTID_MYTIME : MSGFONTID_YOURTIME)); AppendToBufferWithRTF(buffer, str); showColon = 1; } if (!(g_dat.flags & SMF_HIDENAMES) && dbei.eventType != EVENTTYPE_JABBER_CHATSTATES && dbei.eventType != EVENTTYPE_JABBER_PRESENCE) { TCHAR *szName; CONTACTINFO ci = { 0 }; if (dbei.flags & DBEF_SENT) { ci.cbSize = sizeof(ci); ci.szProto = dbei.szModule; ci.dwFlag = CNF_DISPLAY | CNF_TCHAR; if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)&ci)) { // CNF_DISPLAY always returns a string type szName = ci.pszVal; } else // Shouldn't happen? szName = mir_tstrdup(TranslateT("Me")); } else szName = pcli->pfnGetContactDisplayName(hContact, 0); buffer.AppendFormat(" %s ", SetToStyle(dbei.flags & DBEF_SENT ? MSGFONTID_MYNAME : MSGFONTID_YOURNAME)); AppendToBufferWithRTF(buffer, szName); showColon = 1; if (ci.pszVal) mir_free(ci.pszVal); } if (showColon) buffer.AppendFormat("%s :", SetToStyle(dbei.flags & DBEF_SENT ? MSGFONTID_MYCOLON : MSGFONTID_YOURCOLON)); TCHAR *msg, *szName; switch (dbei.eventType) { case EVENTTYPE_JABBER_CHATSTATES: case EVENTTYPE_JABBER_PRESENCE: if (dbei.flags & DBEF_SENT) { CONTACTINFO ci = { sizeof(ci) }; ci.hContact = NULL; ci.szProto = dbei.szModule; ci.dwFlag = CNF_DISPLAY | CNF_TCHAR; // CNF_DISPLAY always returns a string type if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM)& ci)) szName = NEWTSTR_ALLOCA(ci.pszVal); else szName = _T(""); mir_free(ci.pszVal); } else szName = pcli->pfnGetContactDisplayName(hContact, 0); buffer.AppendFormat(" %s ", SetToStyle(MSGFONTID_NOTICE)); AppendToBufferWithRTF(buffer, szName); AppendToBufferWithRTF(buffer, _T(" ")); msg = DbGetEventTextT(&dbei, CP_ACP); if (msg) { AppendToBufferWithRTF(buffer, msg); mir_free(msg); } break; case EVENTTYPE_FILE: { char* filename = (char*)dbei.pBlob + sizeof(DWORD); char* descr = filename + mir_strlen(filename) + 1; ptrT ptszFileName(DbGetEventStringT(&dbei, filename)); buffer.AppendFormat(" %s ", SetToStyle(MSGFONTID_NOTICE)); AppendToBufferWithRTF(buffer, (dbei.flags & DBEF_SENT) ? TranslateT("File sent") : TranslateT("File received")); buffer.Append(": "); AppendToBufferWithRTF(buffer, ptszFileName); if (*descr != 0) { ptrT ptszDescr(DbGetEventStringT(&dbei, descr)); buffer.Append(" ("); AppendToBufferWithRTF(buffer, ptszDescr); buffer.Append(")"); } } break; case EVENTTYPE_MESSAGE: default: msg = DbGetEventTextT(&dbei, CP_ACP); buffer.AppendFormat(" %s ", SetToStyle((dbei.eventType == EVENTTYPE_MESSAGE) ? ((dbei.flags & DBEF_SENT) ? MSGFONTID_MYMSG : MSGFONTID_YOURMSG) : MSGFONTID_NOTICE)); AppendToBufferWithRTF(buffer, msg); mir_free(msg); } if (dat->bIsAutoRTL) buffer.Append("\\par"); mir_free(dbei.pBlob); return buffer.Detach(); }
HANDLE GGPROTO::SearchByName(const TCHAR *nick, const TCHAR *firstName, const TCHAR *lastName) { // Check if connected and if there's a search data if (!isonline()) return 0; if (!nick && !firstName && !lastName) return 0; gg_pubdir50_t req = gg_pubdir50_new(GG_PUBDIR50_SEARCH); if (req == NULL) { #ifdef DEBUGMODE debugLogA("SearchByName(): ForkThread 12 GGPROTO::searchthread"); #endif ForkThread(&GGPROTO::searchthread, NULL); return (HANDLE)1; } // Add nick,firstName,lastName and search it CMStringA szQuery; if (nick) { T2Utf nick_utf8(nick); gg_pubdir50_add(req, GG_PUBDIR50_NICKNAME, nick_utf8); szQuery.Append(nick_utf8); } szQuery.AppendChar('.'); if (firstName) { T2Utf firstName_utf8(firstName); gg_pubdir50_add(req, GG_PUBDIR50_FIRSTNAME, firstName_utf8); szQuery.Append(firstName_utf8); } szQuery.AppendChar('.'); if (lastName) { T2Utf lastName_utf8(lastName); gg_pubdir50_add(req, GG_PUBDIR50_LASTNAME, lastName_utf8); szQuery.Append(lastName_utf8); } szQuery.AppendChar('.'); // Count crc & check if the data was equal if yes do same search with shift unsigned long crc = crc_get(szQuery.GetBuffer()); if (crc == last_crc && next_uin) gg_pubdir50_add(req, GG_PUBDIR50_START, ditoa(next_uin)); else last_crc = crc; gg_pubdir50_seq_set(req, GG_SEQ_SEARCH); gg_EnterCriticalSection(&sess_mutex, "SearchByName", 51, "sess_mutex", 1); if (!gg_pubdir50(sess, req)) { gg_LeaveCriticalSection(&sess_mutex, "SearchByName", 51, 1, "sess_mutex", 1); #ifdef DEBUGMODE debugLogA("SearchByName(): ForkThread 13 GGPROTO::searchthread"); #endif ForkThread(&GGPROTO::searchthread, NULL); return (HANDLE)1; } gg_LeaveCriticalSection(&sess_mutex, "SearchByName", 51, 2, "sess_mutex", 1); debugLogA("SearchByName(): Seq %d.", req->seq); gg_pubdir50_free(req); return (HANDLE)1; }
void CSkypeProto::ProcessEndpointPresence(const JSONNode &node) { debugLogA("CSkypeProto::ProcessEndpointPresenceRes"); std::string selfLink = node["selfLink"].as_string(); CMStringA skypename(UrlToSkypename(selfLink.c_str())); MCONTACT hContact = FindContact(skypename); if (hContact == NULL) return; const JSONNode &publicInfo = node["publicInfo"]; const JSONNode &privateInfo = node["privateInfo"]; CMStringA MirVer; if (publicInfo) { std::string skypeNameVersion = publicInfo["skypeNameVersion"].as_string(); std::string version = publicInfo["version"].as_string(); std::string typ = publicInfo["typ"].as_string(); int iTyp = atoi(typ.c_str()); switch (iTyp) { case 0: case 1: MirVer.AppendFormat("Skype (Web) %s", ParseUrl(version.c_str(), "/")); break; case 10: MirVer.AppendFormat("Skype (XBOX) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 17: MirVer.AppendFormat("Skype (Android) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 16: MirVer.AppendFormat("Skype (iOS) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 12: MirVer.AppendFormat("Skype (WinRT) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 15: MirVer.AppendFormat("Skype (WP) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 13: MirVer.AppendFormat("Skype (OSX) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 11: MirVer.AppendFormat("Skype (Windows) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 14: MirVer.AppendFormat("Skype (Linux) %s", ParseUrl(skypeNameVersion.c_str(), "/")); break; case 125: MirVer.AppendFormat("Miranda NG Skype %s", version.c_str()); break; default: MirVer.Append("Skype (Unknown)"); } } if (privateInfo != NULL) { std::string epname = privateInfo["epname"].as_string(); if (!epname.empty()) { MirVer.AppendFormat(" [%s]", epname.c_str()); } } db_set_s(hContact, m_szModuleName, "MirVer", MirVer); }
INT_PTR CSkypeProto::GetCallEventText(WPARAM, LPARAM lParam) { DBEVENTGETTEXT *pEvent = (DBEVENTGETTEXT *)lParam; INT_PTR nRetVal = 0; ptrA pszText; switch (pEvent->dbei->eventType) { case SKYPE_DB_EVENT_TYPE_CALL_INFO: { CMStringA text; HXML xml = xmlParseString(ptrT(mir_utf8decodeT((char*)pEvent->dbei->pBlob)), 0, _T("partlist")); if (xml != NULL) { ptrA type(mir_t2a(xmlGetAttrValue(xml, _T("type")))); bool bType = (!mir_strcmpi(type, "started")) ? 1 : 0; for (int i = 0; i < xmlGetChildCount(xml); i++) { HXML xmlPart = xmlGetNthChild(xml, _T("part"), i); if (xmlPart != NULL) { HXML xmlName = xmlGetChildByPath(xmlPart, _T("name"), 0); if (xmlName != NULL) { text.AppendFormat(Translate("%s %s this call.\n"), _T2A(xmlGetText(xmlName)), bType ? Translate("enters") : Translate("leaves")); xmlDestroyNode(xmlName); } xmlDestroyNode(xmlPart); } } xmlDestroyNode(xml); } pszText = mir_strdup(text.GetBuffer()); break; } case SKYPE_DB_EVENT_TYPE_FILETRANSFER_INFO: { CMStringA text; HXML xml = xmlParseString(ptrT(mir_utf8decodeT((char*)pEvent->dbei->pBlob)), 0, _T("files")); if (xml != NULL) { for (int i = 0; i < xmlGetChildCount(xml); i++) { size_t fileSize = 0; HXML xmlNode = xmlGetNthChild(xml, _T("file"), i); if (xmlNode != NULL) { fileSize = _ttoi(ptrT((TCHAR*)xmlGetAttrValue(xmlNode, _T("size")))); ptrA fileName(mir_utf8encodeT(ptrT((TCHAR*)xmlGetText(xmlNode)))); if (fileName != NULL) { CMStringA msg(FORMAT, Translate("File transfer:\n\tFile name: %s\n\tSize: %d bytes"), fileName, fileSize); text.AppendFormat("%s\n", msg); } xmlDestroyNode(xmlNode); } } xmlDestroyNode(xml); } pszText = mir_strdup(text.GetBuffer()); break; } case SKYPE_DB_EVENT_TYPE_URIOBJ: { CMStringA text; HXML xml = xmlParseString(ptrT(mir_utf8decodeT((char*)pEvent->dbei->pBlob)), 0, _T("URIObject")); if (xml != NULL) { text.Append(_T2A(xmlGetText(xml))); xmlDestroyNode(xml); } pszText = mir_strdup(text.GetBuffer()); break; } case SKYPE_DB_EVENT_TYPE_INCOMING_CALL: { pszText = Translate("Incoming call."); break; } default: { pszText = mir_strdup((char*)pEvent->dbei->pBlob); } } if (pEvent->datatype == DBVT_TCHAR) { TCHAR *pwszText = _A2T(pszText); nRetVal = (INT_PTR)mir_tstrdup(pwszText); } else if (pEvent->datatype == DBVT_ASCIIZ) nRetVal = (INT_PTR)mir_strdup(pszText); return nRetVal; }