void TemplateHTMLBuilder::appendEvent(IEView *view, IEVIEWEVENT *event) { DBVARIANT dbv; CONTACTINFO ci; char szBase[1024]; char szNoAvatar[1024]; char szCID[32]; char *szName = NULL; char *szNameIn = NULL; char *szNameOut = NULL; char *szAvatar = NULL; char *szAvatarIn = NULL; char *szAvatarOut = NULL; char *szText = NULL; char *szProto = NULL; const char *tmpltName[2]; bool isGrouping = false; int cp = CP_ACP; if (event->cbSize == sizeof(IEVIEWEVENT)) { cp = event->codepage; } szProto = Utils::dupString((char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) event->hContact, 0)); szBase[0]='\0'; TemplateMap *tmpm = (event->dwFlags & IEEF_RTL) ? TemplateMap::getTemplateMap("default_rtl") : TemplateMap::getTemplateMap("default"); if (tmpm!=NULL) { strcpy(szBase, tmpm->getFilename()); char* pathrun = szBase + strlen(szBase); while ((*pathrun != '\\' && *pathrun != '/') && (pathrun > szBase)) pathrun--; pathrun++; *pathrun = '\0'; isGrouping = tmpm->isGrouping(); } sprintf(szNoAvatar, "%snoavatar.jpg", szBase); if (Options::getTemplatesFlags() & Options::LOG_SHOW_NICKNAMES) { ZeroMemory(&ci, sizeof(ci)); ci.cbSize = sizeof(ci); ci.hContact = NULL; ci.szProto = szProto; ci.dwFlag = CNF_DISPLAY; if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { szNameOut = encodeUTF8(ci.pszVal, NULL, false); } szNameIn = encodeUTF8((char *) CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM) event->hContact, 0), NULL, false); } else { szNameOut = Utils::dupString(" "); szNameIn = Utils::dupString(" "); } if (!DBGetContactSetting(event->hContact, "ContactPhoto", "File",&dbv)) { if (strlen(dbv.pszVal) > 0) { szAvatarIn = Utils::dupString(dbv.pszVal); Utils::convertPath(szAvatarIn); } DBFreeVariant(&dbv); } if (szAvatarIn == NULL) { szAvatarIn = Utils::dupString(szNoAvatar); } if (!DBGetContactSetting(NULL, "ContactPhoto", "File",&dbv)) { if (strlen(dbv.pszVal) > 0) { szAvatarOut = Utils::dupString(dbv.pszVal); Utils::convertPath(szAvatarOut); } DBFreeVariant(&dbv); } if (szAvatarOut == NULL) { szAvatarOut = Utils::dupString(szNoAvatar); } HANDLE hDbEvent = event->hDbEventFirst; event->hDbEventFirst = NULL; for (int eventIdx = 0; hDbEvent!=NULL && (eventIdx < event->count || event->count==-1); eventIdx++) { int outputSize; char *output; DBEVENTINFO dbei = { 0 }; dbei.cbSize = sizeof(dbei); dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM) hDbEvent, 0); if (dbei.cbBlob == 0xFFFFFFFF) { return; } dbei.pBlob = (PBYTE) malloc(dbei.cbBlob); CallService(MS_DB_EVENT_GET, (WPARAM) hDbEvent, (LPARAM) & dbei); if (!(dbei.flags & DBEF_SENT) && (dbei.eventType == EVENTTYPE_MESSAGE )) { CallService(MS_DB_EVENT_MARKREAD, (WPARAM) event->hContact, (LPARAM) hDbEvent); CallService(MS_CLIST_REMOVEEVENT, (WPARAM) event->hContact, (LPARAM) hDbEvent); } else if (dbei.eventType == EVENTTYPE_STATUSCHANGE) { CallService(MS_DB_EVENT_MARKREAD, (WPARAM) event->hContact, (LPARAM) hDbEvent); } HANDLE hCurDbEvent = hDbEvent; hDbEvent = (HANDLE) CallService(MS_DB_EVENT_FINDNEXT, (WPARAM) hDbEvent, 0); if (!isDbEventShown(0, &dbei)) { free(dbei.pBlob); continue; } output = NULL; if (dbei.eventType == EVENTTYPE_MESSAGE || dbei.eventType == EVENTTYPE_STATUSCHANGE || dbei.eventType == EVENTTYPE_FILE || dbei.eventType == EVENTTYPE_URL) { int isSent = (dbei.flags & DBEF_SENT); int isHistory = (dbei.timestamp < (DWORD)getStartedTime() && (dbei.flags & DBEF_READ || dbei.flags & DBEF_SENT)); int isGroupBreak = TRUE; if ((Options::getTemplatesFlags() & Options::LOG_GROUP_MESSAGES) && dbei.flags == LOWORD(getLastEventType()) && dbei.eventType == EVENTTYPE_MESSAGE && HIWORD(getLastEventType()) == EVENTTYPE_MESSAGE && ((dbei.timestamp - getLastEventTime()) < 86400)) { isGroupBreak = FALSE; } if (isSent) { szName = szNameOut; szAvatar = szAvatarOut; sprintf(szCID, "%d", 0); } else { szName = szNameIn; szAvatar = szAvatarIn; sprintf(szCID, "%d", (int)event->hContact); } tmpltName[0] = groupTemplate; tmpltName[1] = NULL; groupTemplate = NULL; if (dbei.eventType == EVENTTYPE_MESSAGE) { DWORD aLen = strlen((char *)dbei.pBlob)+1; if (dbei.cbBlob > aLen && !(event->dwFlags & IEEF_NO_UNICODE)) { DWORD wlen = Utils::safe_wcslen((wchar_t *)&dbei.pBlob[aLen], (dbei.cbBlob - aLen) / 2); if (wlen > 0 && wlen < aLen) { szText = encodeUTF8((wchar_t *)&dbei.pBlob[aLen], szProto, true); } else { szText = encodeUTF8((char *)dbei.pBlob, cp, szProto, true); } } else { szText = encodeUTF8((char *)dbei.pBlob, cp, szProto, true); } if (isGrouping && (Options::getTemplatesFlags() & Options::LOG_GROUP_MESSAGES)) { if (isGroupBreak) { tmpltName[1] = isHistory ? isSent ? "hMessageOutGroupStart" : "hMessageInGroupStart" : isSent ? "MessageOutGroupStart" : "MessageInGroupStart"; } else { tmpltName[0] = isHistory ? isSent ? "hMessageOutGroupInner" : "hMessageInGroupInner" : isSent ? "MessageOutGroupInner" : "MessageInGroupInner"; } groupTemplate = isHistory ? isSent ? "hMessageOutGroupEnd" : "hMessageInGroupEnd" : isSent ? "MessageOutGroupEnd" : "MessageInGroupEnd"; } else { tmpltName[1] = isHistory ? isSent ? "hMessageOut" : "hMessageIn" : isSent ? "MessageOut" : "MessageIn"; } } else if (dbei.eventType == EVENTTYPE_FILE) { szText = encodeUTF8((char *)dbei.pBlob + sizeof(DWORD), NULL, false); tmpltName[1] = isHistory ? "hFile" : "File"; } else if (dbei.eventType == EVENTTYPE_URL) { szText = encodeUTF8((char *)dbei.pBlob, NULL, false); tmpltName[1] = isHistory ? "hURL" : "URL"; } else if (dbei.eventType == EVENTTYPE_STATUSCHANGE) { szText = encodeUTF8((char *)dbei.pBlob, NULL, false); tmpltName[1] = isHistory ? "hStatus" : "Status"; } /* template-specific formatting */ for (int i=0;i<2;i++) { Template *tmplt; if (tmpltName[i] == NULL) continue; tmplt = (event->dwFlags & IEEF_RTL) ? TemplateMap::getTemplate("default_rtl", tmpltName[i]) : TemplateMap::getTemplate("default", tmpltName[i]); if (tmplt == NULL) continue; for (Token *token = tmplt->getTokens();token!=NULL;token=token->getNext()) { const char *tokenVal; tokenVal = NULL; switch (token->getType()) { case Token::PLAIN: tokenVal = token->getText(); break; case Token::NAME: tokenVal = szName; break; case Token::TIME: if (Options::getTemplatesFlags() & Options::LOG_SHOW_TIME) { tokenVal = timestampToString(dbei.timestamp, 1); } else { tokenVal = " "; } break; case Token::DATE: if (Options::getTemplatesFlags() & Options::LOG_SHOW_DATE) { tokenVal = timestampToString(dbei.timestamp, 0); } else { tokenVal = " "; } break; case Token::TEXT: tokenVal = szText; break; case Token::AVATAR: tokenVal = szAvatar; break; case Token::CID: tokenVal = szCID; break; case Token::BASE: tokenVal = szBase; break; case Token::NAMEIN: tokenVal = szNameIn; break; case Token::NAMEOUT: tokenVal = szNameOut; break; case Token::AVATARIN: tokenVal = szAvatarIn; break; case Token::AVATAROUT: tokenVal = szAvatarOut; break; case Token::PROTO: tokenVal = szProto; break; } if (tokenVal != NULL) { Utils::appendText(&output, &outputSize, "%s", tokenVal); } } } event->hDbEventFirst = hCurDbEvent; setLastEventType(MAKELONG(dbei.flags, dbei.eventType)); setLastEventTime(dbei.timestamp); if (szText!=NULL) delete szText; } if (output != NULL) { view->write(output); free(output); } free(dbei.pBlob); } if (szProto!=NULL) delete szProto; if (szAvatarIn!=NULL) delete szAvatarIn; if (szAvatarOut!=NULL) delete szAvatarOut; if (szNameIn!=NULL) delete szNameIn; if (szNameOut!=NULL) delete szNameOut; view->scrollToBottom(); }
void HTMLBuilder::appendEventOld(IEView *view, IEVIEWEVENT *event) { IEVIEWEVENT newEvent; IEVIEWEVENTDATA* eventData; IEVIEWEVENTDATA* prevEventData = NULL; char *szProto = NULL; HANDLE hDbEvent = event->hDbEventFirst; event->hDbEventFirst = NULL; newEvent.cbSize = sizeof (IEVIEWEVENT); newEvent.iType = IEE_LOG_MEM_EVENTS; newEvent.codepage = CP_ACP; if (event->cbSize >= IEVIEWEVENT_SIZE_V2) { newEvent.codepage = event->codepage; } if (event->cbSize >= IEVIEWEVENT_SIZE_V3 && event->pszProto != NULL) { szProto = Utils::dupString(event->pszProto); } else { szProto = getProto(event->hContact); } newEvent.pszProto = szProto; newEvent.count = 0; newEvent.dwFlags = event->dwFlags; newEvent.hContact = event->hContact; newEvent.hwnd = event->hwnd; newEvent.eventData = NULL; for (int eventIdx = 0; hDbEvent!=NULL && (eventIdx < event->count || event->count==-1); eventIdx++) { DBEVENTINFO dbei = { 0 }; dbei.cbSize = sizeof(dbei); dbei.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM) hDbEvent, 0); if (dbei.cbBlob == 0xFFFFFFFF) { hDbEvent = (HANDLE) CallService(MS_DB_EVENT_FINDNEXT, (WPARAM) hDbEvent, 0); continue; } dbei.pBlob = (PBYTE) malloc(dbei.cbBlob); CallService(MS_DB_EVENT_GET, (WPARAM) hDbEvent, (LPARAM) & dbei); if (!(dbei.flags & DBEF_SENT) && (dbei.eventType == EVENTTYPE_MESSAGE || dbei.eventType == EVENTTYPE_URL)) { CallService(MS_DB_EVENT_MARKREAD, (WPARAM) event->hContact, (LPARAM) hDbEvent); CallService(MS_CLIST_REMOVEEVENT, (WPARAM) event->hContact, (LPARAM) hDbEvent); } else if (dbei.eventType == EVENTTYPE_STATUSCHANGE) { CallService(MS_DB_EVENT_MARKREAD, (WPARAM) event->hContact, (LPARAM) hDbEvent); } if (!isDbEventShown(&dbei)) { free(dbei.pBlob); hDbEvent = (HANDLE) CallService(MS_DB_EVENT_FINDNEXT, (WPARAM) hDbEvent, 0); continue; } eventData = new IEVIEWEVENTDATA; eventData->cbSize = sizeof(IEVIEWEVENTDATA); eventData->dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK | IEEDF_UNICODE_TEXT2 | (dbei.flags & DBEF_READ ? IEEDF_READ : 0) | (dbei.flags & DBEF_SENT ? IEEDF_SENT : 0) | (dbei.flags & DBEF_RTL ? IEEDF_RTL : 0); if (event->dwFlags & IEEF_RTL) { eventData->dwFlags |= IEEDF_RTL; } eventData->time = dbei.timestamp; eventData->pszNickW = NULL; eventData->pszTextW = NULL; eventData->pszText2W = NULL; if (dbei.flags & DBEF_SENT) { eventData->pszNickW = getContactName(NULL, szProto); eventData->bIsMe = TRUE; } else { eventData->pszNickW = getContactName(event->hContact, szProto); eventData->bIsMe = FALSE; } if (dbei.eventType == EVENTTYPE_MESSAGE || dbei.eventType == EVENTTYPE_URL || dbei.eventType == EVENTTYPE_STATUSCHANGE || dbei.eventType == EVENTTYPE_JABBER_CHATSTATES) { DBEVENTGETTEXT temp = { &dbei, DBVT_WCHAR + ((event->dwFlags & IEEF_NO_UNICODE) ? DBVTF_DENYUNICODE : 0), newEvent.codepage }; WCHAR* pwszEventText = (WCHAR*)CallService(MS_DB_EVENT_GETTEXT,0,(LPARAM)&temp); eventData->pszTextW = Utils::dupString( pwszEventText ); mir_free( pwszEventText ); if (dbei.eventType == EVENTTYPE_MESSAGE) { eventData->iType = IEED_EVENT_MESSAGE; } else if (dbei.eventType == EVENTTYPE_URL) { eventData->iType = IEED_EVENT_URL; } else { eventData->iType = IEED_EVENT_STATUSCHANGE; } } else if (dbei.eventType == EVENTTYPE_FILE) { //blob is: sequenceid(DWORD),filename(ASCIIZ),description(ASCIIZ) char* filename = ((char *)dbei.pBlob) + sizeof(DWORD); char* descr = filename + lstrlenA(filename) + 1; TCHAR *tStr = DbGetEventStringT(&dbei, filename); eventData->ptszText = Utils::dupString(tStr); mir_free(tStr); if (*descr != '\0') { tStr = DbGetEventStringT(&dbei, descr); eventData->ptszText2 = Utils::dupString(tStr); mir_free(tStr); } eventData->iType = IEED_EVENT_FILE; } else if (dbei.eventType == EVENTTYPE_AUTHREQUEST) { //blob is: uin(DWORD), hContact(DWORD), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ) eventData->ptszText = Utils::dupString(TranslateT(" requested authorisation")); TCHAR *tStr = DbGetEventStringT(&dbei, (char *)dbei.pBlob + 8); eventData->ptszNick = Utils::dupString(tStr); mir_free(tStr); eventData->iType = IEED_EVENT_SYSTEM; } else if (dbei.eventType == EVENTTYPE_ADDED) { //blob is: uin(DWORD), hContact(DWORD), nick(ASCIIZ), first(ASCIIZ), last(ASCIIZ), email(ASCIIZ) eventData->ptszText = Utils::dupString(TranslateT(" was added.")); TCHAR *tStr = DbGetEventStringT(&dbei, (char *)dbei.pBlob + 8); eventData->ptszNick = Utils::dupString(tStr); mir_free(tStr); eventData->iType = IEED_EVENT_SYSTEM; } free(dbei.pBlob); eventData->next = NULL; if (prevEventData != NULL) { prevEventData->next = eventData; } else { newEvent.eventData = eventData; } prevEventData = eventData; newEvent.count++; event->hDbEventFirst = hDbEvent; hDbEvent = (HANDLE) CallService(MS_DB_EVENT_FINDNEXT, (WPARAM) hDbEvent, 0); } appendEventNew(view, &newEvent); for ( IEVIEWEVENTDATA* eventData2 = newEvent.eventData; eventData2 != NULL; eventData2 = eventData) { eventData = eventData2->next; if (eventData2->pszTextW != NULL) { delete (wchar_t*)eventData2->pszTextW; } if (eventData2->pszText2W != NULL) { delete (wchar_t*)eventData2->pszText2W; } if (eventData2->pszNickW != NULL) { delete (wchar_t*)eventData2->pszNickW; } delete eventData2; } if (szProto != NULL) { delete szProto; } }