void SendQueue::UpdateSaveAndSendButton(TWindowData *dat) { if(dat) { int len; HWND hwndDlg = dat->hwnd; GETTEXTLENGTHEX gtxl = {0}; gtxl.codepage = CP_UTF8; gtxl.flags = GTL_DEFAULT | GTL_PRECISE | GTL_NUMBYTES; len = SendDlgItemMessage(hwndDlg, IDC_MESSAGE, EM_GETTEXTLENGTHEX, (WPARAM) & gtxl, 0); if (len && GetSendButtonState(hwndDlg) == PBS_DISABLED) EnableSendButton(dat, TRUE); else if (len == 0 && GetSendButtonState(hwndDlg) != PBS_DISABLED) EnableSendButton(dat, FALSE); if (len) { // looks complex but avoids flickering on the button while typing. if (!(dat->dwFlags & MWF_SAVEBTN_SAV)) { SendDlgItemMessage(hwndDlg, IDC_SAVE, BM_SETIMAGE, IMAGE_ICON, (LPARAM) PluginConfig.g_buttonBarIcons[ICON_BUTTON_SAVE]); SendDlgItemMessage(hwndDlg, IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM) pszIDCSAVE_save, 0); dat->dwFlags |= MWF_SAVEBTN_SAV; } } else { SendDlgItemMessage(hwndDlg, IDC_SAVE, BM_SETIMAGE, IMAGE_ICON, (LPARAM) PluginConfig.g_buttonBarIcons[ICON_BUTTON_CANCEL]); SendDlgItemMessage(hwndDlg, IDC_SAVE, BUTTONADDTOOLTIP, (WPARAM) pszIDCSAVE_close, 0); dat->dwFlags &= ~MWF_SAVEBTN_SAV; } dat->textLen = len; } }
/** * 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 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; }