void SendQueue::logError(const TWindowData *dat, int iSendJobIndex, const TCHAR *szErrMsg) const { DBEVENTINFO dbei = {0}; int iMsgLen; if(dat == 0) return; dbei.eventType = EVENTTYPE_ERRMSG; dbei.cbSize = sizeof(dbei); if (iSendJobIndex >= 0) { dbei.pBlob = (BYTE *)m_jobs[iSendJobIndex].sendBuffer; iMsgLen = lstrlenA(m_jobs[iSendJobIndex].sendBuffer) + 1; } else { iMsgLen = 0; dbei.pBlob = NULL; } if (m_jobs[iSendJobIndex].dwFlags & PREF_UTF) dbei.flags = DBEF_UTF; if (iSendJobIndex >= 0) { if (m_jobs[iSendJobIndex].dwFlags & PREF_UNICODE) { iMsgLen *= 3; } } dbei.cbBlob = iMsgLen; dbei.timestamp = time(NULL); dbei.szModule = (char *)szErrMsg; StreamInEvents(dat->hwnd, NULL, 1, 1, &dbei); }
void SendQueue::logError(const TWindowData *dat, int iSendJobIndex, const TCHAR *szErrMsg) const { if (dat == 0) return; size_t iMsgLen; DBEVENTINFO dbei = { sizeof(dbei) }; dbei.eventType = EVENTTYPE_ERRMSG; if (iSendJobIndex >= 0) { dbei.pBlob = (BYTE *)m_jobs[iSendJobIndex].szSendBuffer; iMsgLen = mir_strlen(m_jobs[iSendJobIndex].szSendBuffer) + 1; } else { iMsgLen = 0; dbei.pBlob = NULL; } dbei.flags = DBEF_UTF; dbei.cbBlob = (int)iMsgLen; dbei.timestamp = time(NULL); dbei.szModule = (char *)szErrMsg; StreamInEvents(dat->hwnd, NULL, 1, 1, &dbei); }
/** * This just adds the message to the database for later delivery and * adds the contact to the list of contacts that have queued messages * * @param iJobIndex int: index of the send job * dat: Message window data * fAddHeader: add the "message was sent delayed" header (default = true) * hContact : contact to which the job should be added (default = hOwner of the send job) * * @return the index on success, -1 on failure */ int SendQueue::doSendLater(int iJobIndex, TWindowData *dat, HANDLE hContact, bool fIsSendLater) { bool fAvail = sendLater->isAvail(); const TCHAR *szNote = 0; if(fIsSendLater && dat) { if(fAvail) szNote = CTranslator::get(CTranslator::GEN_SQ_QUEUED_MESSAGE); else szNote = CTranslator::get(CTranslator::GEN_SQ_QUEUING_NOT_AVAIL); char *utfText = M->utf8_encodeT(szNote); DBEVENTINFO dbei; dbei.cbSize = sizeof(dbei); dbei.eventType = EVENTTYPE_MESSAGE; dbei.flags = DBEF_SENT | DBEF_UTF; dbei.szModule = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) dat->hContact, 0); dbei.timestamp = time(NULL); dbei.cbBlob = lstrlenA(utfText) + 1; dbei.pBlob = (PBYTE) utfText; StreamInEvents(dat->hwnd, 0, 1, 1, &dbei); if (dat->hDbEventFirst == NULL) SendMessage(dat->hwnd, DM_REMAKELOG, 0, 0); dat->cache->saveHistory(0, 0); EnableSendButton(dat, FALSE); if (dat->pContainer->hwndActive == dat->hwnd) UpdateReadChars(dat); SendDlgItemMessage(dat->hwnd, IDC_SAVE, BM_SETIMAGE, IMAGE_ICON, (LPARAM) PluginConfig.g_buttonBarIcons[ICON_BUTTON_CANCEL]); SendDlgItemMessage(dat->hwnd, IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM)pszIDCSAVE_close, 0); dat->dwFlags &= ~MWF_SAVEBTN_SAV; mir_free(utfText); if(!fAvail) return(0); } if(iJobIndex >= 0 && iJobIndex < NR_SENDJOBS) { SendJob* job = &m_jobs[iJobIndex]; char szKeyName[20]; TCHAR tszTimestamp[30], tszHeader[150]; time_t now = time(0); if(fIsSendLater) { TCHAR *formatTime = _T("%Y.%m.%d - %H:%M"); _tcsftime(tszTimestamp, 30, formatTime, _localtime32((__time32_t *)&now)); tszTimestamp[29] = 0; mir_snprintf(szKeyName, 20, "S%d", now); mir_sntprintf(tszHeader, safe_sizeof(tszHeader), CTranslator::get(CTranslator::GEN_SQ_SENDLATER_HEADER), tszTimestamp); } else mir_sntprintf(tszHeader, safe_sizeof(tszHeader), _T("M%d|"), time(0)); if(job->dwFlags & PREF_UTF || !(job->dwFlags & PREF_UNICODE)) { char *utf_header = M->utf8_encodeT(tszHeader); UINT required = lstrlenA(utf_header) + lstrlenA(job->sendBuffer) + 10; char *tszMsg = reinterpret_cast<char *>(mir_alloc(required)); if(fIsSendLater) { mir_snprintf(tszMsg, required, "%s%s", job->sendBuffer, utf_header); DBWriteContactSettingString(hContact ? hContact : job->hOwner, "SendLater", szKeyName, tszMsg); } else { mir_snprintf(tszMsg, required, "%s%s", utf_header, job->sendBuffer); sendLater->addJob(tszMsg, (LPARAM)hContact); } mir_free(utf_header); mir_free(tszMsg); } else if(job->dwFlags & PREF_UNICODE) { int iLen = lstrlenA(job->sendBuffer); wchar_t *wszMsg = (wchar_t *)&job->sendBuffer[iLen + 1]; UINT required = sizeof(TCHAR) * (lstrlen(tszHeader) + lstrlenW(wszMsg) + 10); TCHAR *tszMsg = reinterpret_cast<TCHAR *>(mir_alloc(required)); if(fIsSendLater) mir_sntprintf(tszMsg, required, _T("%s%s"), wszMsg, tszHeader); else mir_sntprintf(tszMsg, required, _T("%s%s"), tszHeader, wszMsg); char *utf = M->utf8_encodeT(tszMsg); if(fIsSendLater) DBWriteContactSettingString(hContact ? hContact : job->hOwner, "SendLater", szKeyName, utf); else sendLater->addJob(utf, (LPARAM)hContact); mir_free(utf); mir_free(tszMsg); } if(fIsSendLater) { int iCount = M->GetDword(hContact ? hContact : job->hOwner, "SendLater", "count", 0); iCount++; M->WriteDword(hContact ? hContact : job->hOwner, "SendLater", "count", iCount); sendLater->addContact(hContact ? hContact : job->hOwner); } return(iJobIndex); } return(-1); }
INT_PTR CALLBACK DlgProcTemplateEditor(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { struct TWindowData *dat = 0; TemplateEditorInfo *teInfo = 0; TTemplateSet *tSet; int i; dat = (struct TWindowData *) GetWindowLongPtr(hwndDlg, GWLP_USERDATA); /* * since this dialog needs a struct MessageWindowData * but has no container, we can store * the extended info struct in pContainer *) */ if (dat) { teInfo = (TemplateEditorInfo *)dat->pContainer; tSet = teInfo->rtl ? dat->pContainer->rtl_templates : dat->pContainer->ltr_templates; } switch (msg) { case WM_INITDIALOG: { TemplateEditorNew *teNew = (TemplateEditorNew *)lParam; COLORREF url_visited = RGB(128, 0, 128); COLORREF url_unvisited = RGB(0, 0, 255); dat = (struct TWindowData *) malloc(sizeof(struct TWindowData)); TranslateDialogDefault(hwndDlg); ZeroMemory((void *) dat, sizeof(struct TWindowData)); dat->pContainer = (struct TContainerData *)malloc(sizeof(struct TContainerData)); ZeroMemory((void *)dat->pContainer, sizeof(struct TContainerData)); teInfo = (TemplateEditorInfo *)dat->pContainer; ZeroMemory((void *)teInfo, sizeof(TemplateEditorInfo)); teInfo->hContact = teNew->hContact; teInfo->rtl = teNew->rtl; teInfo->hwndParent = teNew->hwndParent; LoadOverrideTheme(dat->pContainer); /* * set hContact to the first found contact so that we can use the Preview window properly * also, set other parameters needed by the streaming function to display events */ SendDlgItemMessage(hwndDlg, IDC_PREVIEW, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_LINK); SendDlgItemMessage(hwndDlg, IDC_PREVIEW, EM_SETEDITSTYLE, SES_EXTENDBACKCOLOR, SES_EXTENDBACKCOLOR); SendDlgItemMessage(hwndDlg, IDC_PREVIEW, EM_EXLIMITTEXT, 0, 0x80000000); dat->hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); dat->szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); while(dat->szProto == 0 && dat->hContact != 0) { dat->hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)dat->hContact, 0); dat->szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0); } dat->dwFlags = dat->pContainer->theme.dwFlags; dat->cache = CContactCache::getContactCache(dat->hContact); dat->cache->updateState(); dat->cache->updateUIN(); dat->cache->updateStats(TSessionStats::INIT_TIMER); GetMYUIN(dat); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR) dat); ShowWindow(hwndDlg, SW_SHOW); SendDlgItemMessage(hwndDlg, IDC_EDITTEMPLATE, EM_LIMITTEXT, (WPARAM)TEMPLATE_LENGTH - 1, 0); SetWindowText(hwndDlg, CTranslator::getOpt(CTranslator::OPT_TEMP_TITLE)); Utils::enableDlgControl(hwndDlg, IDC_SAVETEMPLATE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_REVERT, FALSE); Utils::enableDlgControl(hwndDlg, IDC_FORGET, FALSE); for (i = 0; i <= TMPL_ERRMSG; i++) { SendDlgItemMessageA(hwndDlg, IDC_TEMPLATELIST, LB_ADDSTRING, 0, (LPARAM)Translate(TemplateNames[i])); SendDlgItemMessage(hwndDlg, IDC_TEMPLATELIST, LB_SETITEMDATA, i, (LPARAM)i); } Utils::enableDlgControl(teInfo->hwndParent, IDC_MODIFY, FALSE); Utils::enableDlgControl(teInfo->hwndParent, IDC_RTLMODIFY, FALSE); SendDlgItemMessage(hwndDlg, IDC_COLOR1, CPM_SETCOLOUR, 0, M->GetDword("cc1", SRMSGDEFSET_BKGCOLOUR)); SendDlgItemMessage(hwndDlg, IDC_COLOR2, CPM_SETCOLOUR, 0, M->GetDword("cc2", SRMSGDEFSET_BKGCOLOUR)); SendDlgItemMessage(hwndDlg, IDC_COLOR3, CPM_SETCOLOUR, 0, M->GetDword("cc3", SRMSGDEFSET_BKGCOLOUR)); SendDlgItemMessage(hwndDlg, IDC_COLOR4, CPM_SETCOLOUR, 0, M->GetDword("cc4", SRMSGDEFSET_BKGCOLOUR)); SendDlgItemMessage(hwndDlg, IDC_COLOR5, CPM_SETCOLOUR, 0, M->GetDword("cc5", SRMSGDEFSET_BKGCOLOUR)); SendMessage(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE), EM_SETREADONLY, TRUE, 0); return(TRUE); } case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: DestroyWindow(hwndDlg); break; case IDC_RESETALLTEMPLATES: if (MessageBox(0, CTranslator::getOpt(CTranslator::OPT_TEMP_RESET), CTranslator::getOpt(CTranslator::OPT_TEMP_TITLE), MB_YESNO | MB_ICONQUESTION) == IDYES) { M->WriteByte(teInfo->rtl ? RTLTEMPLATES_MODULE : TEMPLATES_MODULE, "setup", 0); LoadDefaultTemplates(); MessageBox(0, CTranslator::getOpt(CTranslator::OPT_TEMP_WASRESET), CTranslator::getOpt(CTranslator::OPT_TEMP_TITLE), MB_OK); DestroyWindow(hwndDlg); } break; case IDC_TEMPLATELIST: switch (HIWORD(wParam)) { case LBN_DBLCLK: { LRESULT iIndex = SendDlgItemMessage(hwndDlg, IDC_TEMPLATELIST, LB_GETCURSEL, 0, 0); if (iIndex != LB_ERR) { SetDlgItemText(hwndDlg, IDC_EDITTEMPLATE, tSet->szTemplates[iIndex]); teInfo->inEdit = iIndex; teInfo->changed = FALSE; teInfo->selchanging = FALSE; SetFocus(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE)); SendMessage(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE), EM_SETREADONLY, FALSE, 0); } break; } case LBN_SELCHANGE: { LRESULT iIndex = SendDlgItemMessage(hwndDlg, IDC_TEMPLATELIST, LB_GETCURSEL, 0, 0); teInfo->selchanging = TRUE; if (iIndex != LB_ERR) { SetDlgItemText(hwndDlg, IDC_EDITTEMPLATE, tSet->szTemplates[iIndex]); teInfo->inEdit = iIndex; teInfo->changed = FALSE; } SendMessage(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE), EM_SETREADONLY, TRUE, 0); break; } } break; case IDC_VARIABLESHELP: CallService(MS_UTILS_OPENURL, 0, (LPARAM)"http://wiki.miranda.or.at/TabSRMM/Templates"); break; case IDC_EDITTEMPLATE: if (HIWORD(wParam) == EN_CHANGE) { if (!teInfo->selchanging) { teInfo->changed = TRUE; teInfo->updateInfo[teInfo->inEdit] = TRUE; Utils::enableDlgControl(hwndDlg, IDC_SAVETEMPLATE, TRUE); Utils::enableDlgControl(hwndDlg, IDC_FORGET, TRUE); Utils::enableDlgControl(hwndDlg, IDC_TEMPLATELIST, FALSE); Utils::enableDlgControl(hwndDlg, IDC_REVERT, TRUE); } InvalidateRect(GetDlgItem(hwndDlg, IDC_TEMPLATELIST), NULL, FALSE); } break; case IDC_SAVETEMPLATE: { TCHAR newTemplate[TEMPLATE_LENGTH + 2]; GetWindowText(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE), newTemplate, TEMPLATE_LENGTH); CopyMemory(tSet->szTemplates[teInfo->inEdit], newTemplate, sizeof(TCHAR) * TEMPLATE_LENGTH); teInfo->changed = FALSE; teInfo->updateInfo[teInfo->inEdit] = FALSE; Utils::enableDlgControl(hwndDlg, IDC_SAVETEMPLATE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_FORGET, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TEMPLATELIST, TRUE); Utils::enableDlgControl(hwndDlg, IDC_REVERT, FALSE); InvalidateRect(GetDlgItem(hwndDlg, IDC_TEMPLATELIST), NULL, FALSE); M->WriteTString(teInfo->hContact, teInfo->rtl ? RTLTEMPLATES_MODULE : TEMPLATES_MODULE, TemplateNames[teInfo->inEdit], newTemplate); SendMessage(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE), EM_SETREADONLY, TRUE, 0); break; } case IDC_FORGET: { teInfo->changed = FALSE; teInfo->updateInfo[teInfo->inEdit] = FALSE; teInfo->selchanging = TRUE; SetDlgItemText(hwndDlg, IDC_EDITTEMPLATE, tSet->szTemplates[teInfo->inEdit]); SetFocus(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE)); InvalidateRect(GetDlgItem(hwndDlg, IDC_TEMPLATELIST), NULL, FALSE); Utils::enableDlgControl(hwndDlg, IDC_SAVETEMPLATE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_FORGET, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TEMPLATELIST, TRUE); Utils::enableDlgControl(hwndDlg, IDC_REVERT, FALSE); teInfo->selchanging = FALSE; SendMessage(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE), EM_SETREADONLY, TRUE, 0); break; } case IDC_REVERT: { teInfo->changed = FALSE; teInfo->updateInfo[teInfo->inEdit] = FALSE; teInfo->selchanging = TRUE; CopyMemory(tSet->szTemplates[teInfo->inEdit], LTR_Default.szTemplates[teInfo->inEdit], sizeof(TCHAR) * TEMPLATE_LENGTH); SetDlgItemText(hwndDlg, IDC_EDITTEMPLATE, tSet->szTemplates[teInfo->inEdit]); DBDeleteContactSetting(teInfo->hContact, teInfo->rtl ? RTLTEMPLATES_MODULE : TEMPLATES_MODULE, TemplateNames[teInfo->inEdit]); SetFocus(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE)); InvalidateRect(GetDlgItem(hwndDlg, IDC_TEMPLATELIST), NULL, FALSE); teInfo->selchanging = FALSE; Utils::enableDlgControl(hwndDlg, IDC_SAVETEMPLATE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_REVERT, FALSE); Utils::enableDlgControl(hwndDlg, IDC_FORGET, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TEMPLATELIST, TRUE); SendMessage(GetDlgItem(hwndDlg, IDC_EDITTEMPLATE), EM_SETREADONLY, TRUE, 0); break; } case IDC_UPDATEPREVIEW: SendMessage(hwndDlg, DM_UPDATETEMPLATEPREVIEW, 0, 0); break; } break; case WM_DRAWITEM: { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *) lParam; int iItem = dis->itemData; HBRUSH bkg, oldBkg; SetBkMode(dis->hDC, TRANSPARENT); FillRect(dis->hDC, &dis->rcItem, GetSysColorBrush(COLOR_WINDOW)); if (dis->itemState & ODS_SELECTED) { if (teInfo->updateInfo[iItem] == TRUE) { bkg = CreateSolidBrush(RGB(255, 0, 0)); oldBkg = (HBRUSH)SelectObject(dis->hDC, bkg); FillRect(dis->hDC, &dis->rcItem, bkg); SelectObject(dis->hDC, oldBkg); DeleteObject(bkg); } else FillRect(dis->hDC, &dis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT)); SetTextColor(dis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); } else { if (teInfo->updateInfo[iItem] == TRUE) SetTextColor(dis->hDC, RGB(255, 0, 0)); else SetTextColor(dis->hDC, GetSysColor(COLOR_WINDOWTEXT)); } char *pszName = Translate(TemplateNames[iItem]); TextOutA(dis->hDC, dis->rcItem.left, dis->rcItem.top, pszName, lstrlenA(pszName)); return(TRUE); } case DM_UPDATETEMPLATEPREVIEW: { DBEVENTINFO dbei = {0}; int iIndex = SendDlgItemMessage(hwndDlg, IDC_TEMPLATELIST, LB_GETCURSEL, 0, 0); TCHAR szTemp[TEMPLATE_LENGTH + 2]; if (teInfo->changed) { CopyMemory(szTemp, tSet->szTemplates[teInfo->inEdit], TEMPLATE_LENGTH * sizeof(TCHAR)); GetDlgItemText(hwndDlg, IDC_EDITTEMPLATE, tSet->szTemplates[teInfo->inEdit], TEMPLATE_LENGTH); } dbei.szModule = dat->szProto; dbei.timestamp = time(NULL); dbei.eventType = (iIndex == 6) ? EVENTTYPE_STATUSCHANGE : EVENTTYPE_MESSAGE; dbei.eventType = (iIndex == 7) ? EVENTTYPE_ERRMSG : dbei.eventType; if (dbei.eventType == EVENTTYPE_ERRMSG) dbei.szModule = "Sample error message"; dbei.cbSize = sizeof(dbei); dbei.pBlob = (iIndex == 6) ? (BYTE *)"is now offline (was online)" : (BYTE *)"The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog."; dbei.cbBlob = lstrlenA((char *)dbei.pBlob) + 1; dbei.flags = (iIndex == 1 || iIndex == 3 || iIndex == 5) ? DBEF_SENT : 0; dbei.flags |= (teInfo->rtl ? DBEF_RTL : 0); dat->lastEventTime = (iIndex == 4 || iIndex == 5) ? time(NULL) - 1 : 0; dat->iLastEventType = MAKELONG(dbei.flags, dbei.eventType); SetWindowText(GetDlgItem(hwndDlg, IDC_PREVIEW), _T("")); dat->dwFlags = MWF_LOG_ALL; dat->dwFlags = (teInfo->rtl ? dat->dwFlags | MWF_LOG_RTL : dat->dwFlags & ~MWF_LOG_RTL); dat->dwFlags = (iIndex == 0 || iIndex == 1) ? dat->dwFlags & ~MWF_LOG_GROUPMODE : dat->dwFlags | MWF_LOG_GROUPMODE; mir_sntprintf(dat->szMyNickname, safe_sizeof(dat->szMyNickname), _T("My Nickname")); StreamInEvents(hwndDlg, 0, 1, 1, &dbei); SendDlgItemMessage(hwndDlg, IDC_PREVIEW, EM_SETSEL, -1, -1); if (teInfo->changed) CopyMemory(tSet->szTemplates[teInfo->inEdit], szTemp, TEMPLATE_LENGTH * sizeof(TCHAR)); break; } case WM_DESTROY: Utils::enableDlgControl(teInfo->hwndParent, IDC_MODIFY, TRUE); Utils::enableDlgControl(teInfo->hwndParent, IDC_RTLMODIFY, TRUE); if (dat->pContainer) free(dat->pContainer); if (dat) free(dat); M->WriteDword(SRMSGMOD_T, "cc1", SendDlgItemMessage(hwndDlg, IDC_COLOR1, CPM_GETCOLOUR, 0, 0)); M->WriteDword(SRMSGMOD_T, "cc2", SendDlgItemMessage(hwndDlg, IDC_COLOR2, CPM_GETCOLOUR, 0, 0)); M->WriteDword(SRMSGMOD_T, "cc3", SendDlgItemMessage(hwndDlg, IDC_COLOR3, CPM_GETCOLOUR, 0, 0)); M->WriteDword(SRMSGMOD_T, "cc4", SendDlgItemMessage(hwndDlg, IDC_COLOR4, CPM_GETCOLOUR, 0, 0)); M->WriteDword(SRMSGMOD_T, "cc5", SendDlgItemMessage(hwndDlg, IDC_COLOR5, CPM_GETCOLOUR, 0, 0)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); break; } return(FALSE); }
int SendQueue::doSendLater(int iJobIndex, TWindowData *dat, MCONTACT hContact, bool fIsSendLater) { bool fAvail = sendLater->isAvail(); const TCHAR *szNote = 0; if (fIsSendLater && dat) { if (fAvail) szNote = TranslateT("Message successfully queued for later delivery.\nIt will be sent as soon as possible and a popup will inform you about the result."); else szNote = TranslateT("The send later feature is not available on this protocol."); T2Utf utfText(szNote); DBEVENTINFO dbei; dbei.cbSize = sizeof(dbei); dbei.eventType = EVENTTYPE_MESSAGE; dbei.flags = DBEF_SENT | DBEF_UTF; dbei.szModule = GetContactProto(dat->hContact); dbei.timestamp = time(NULL); dbei.cbBlob = (int)mir_strlen(utfText) + 1; dbei.pBlob = (PBYTE)(char*)utfText; StreamInEvents(dat->hwnd, 0, 1, 1, &dbei); if (dat->hDbEventFirst == NULL) SendMessage(dat->hwnd, DM_REMAKELOG, 0, 0); dat->cache->saveHistory(0, 0); EnableSendButton(dat, FALSE); if (dat->pContainer->hwndActive == dat->hwnd) UpdateReadChars(dat); SendDlgItemMessage(dat->hwnd, IDC_SAVE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)PluginConfig.g_buttonBarIcons[ICON_BUTTON_CANCEL]); SendDlgItemMessage(dat->hwnd, IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM)pszIDCSAVE_close, BATF_TCHAR); dat->dwFlags &= ~MWF_SAVEBTN_SAV; if (!fAvail) return 0; } if (iJobIndex >= 0 && iJobIndex < NR_SENDJOBS) { SendJob *job = &m_jobs[iJobIndex]; char szKeyName[20]; TCHAR tszHeader[150]; if (fIsSendLater) { time_t now = time(0); TCHAR tszTimestamp[30]; _tcsftime(tszTimestamp, _countof(tszTimestamp), _T("%Y.%m.%d - %H:%M"), _localtime32((__time32_t *)&now)); mir_snprintf(szKeyName, "S%d", now); mir_sntprintf(tszHeader, TranslateT("\n(Sent delayed. Original timestamp %s)"), tszTimestamp); } else mir_sntprintf(tszHeader, _T("M%d|"), time(0)); T2Utf utf_header(tszHeader); size_t required = mir_strlen(utf_header) + mir_strlen(job->szSendBuffer) + 10; char *tszMsg = reinterpret_cast<char *>(mir_alloc(required)); if (fIsSendLater) { mir_snprintf(tszMsg, required, "%s%s", job->szSendBuffer, utf_header); db_set_s(hContact ? hContact : job->hContact, "SendLater", szKeyName, tszMsg); } else { mir_snprintf(tszMsg, required, "%s%s", utf_header, job->szSendBuffer); sendLater->addJob(tszMsg, hContact); } mir_free(tszMsg); if (fIsSendLater) { int iCount = db_get_dw(hContact ? hContact : job->hContact, "SendLater", "count", 0); iCount++; db_set_dw(hContact ? hContact : job->hContact, "SendLater", "count", iCount); sendLater->addContact(hContact ? hContact : job->hContact); } return iJobIndex; } return -1; }