static void log_prefix(bool log_updated_time) { #ifdef HAVE_GETTIMEOFDAY char timestamp[100]; struct timeval tv; struct tm *tm; static char prefix[200]; if (log_updated_time) { gettimeofday(&tv, NULL); #ifdef __MINGW64_VERSION_MAJOR tm = _localtime32(&tv.tv_sec); #else tm = localtime(&tv.tv_sec); #endif strftime(timestamp, sizeof(timestamp), "%Y-%m-%dT%H:%M:%S", tm); snprintf(prefix, sizeof(prefix), "[%s.%06d %-5d] ", timestamp, (int)tv.tv_usec, (int)getpid()); } fputs(prefix, logfile); #else fprintf(logfile, "[%-5d] ", (int)getpid()); #endif }
static errno_t __cdecl _int_localtime32_s (struct tm *ptm, const __time32_t *pt) { struct tm *ltm; if (ptm) memset (ptm, 0xff, sizeof (*ptm)); if (!ptm || !pt) { errno = EINVAL; return EINVAL; } if ((ltm = _localtime32 (pt)) == NULL) return errno; *ptm = *ltm; return 0; }
/** * 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); }
void CDlgCapCam::Start(void) { int i; printf("capcam start\r\n"); UpdateData(); m_trigger_snatch_time = 0; m_trigger_index = 0; //抓拍参数 m_snatch_count =0 ; m_snatch_intertime = 0; m_snatch_pretime = 0; if (!m_flg_process) { //使用的设备序号 m_index_device = m_combo_list_device.GetCurSel(); //每次start,都生成一个新的事件记录文件 //设置相关的其他文件路径 __time32_t cur_time; struct tm * now_time; _time32(&cur_time); now_time = _localtime32(&cur_time); i=config_path.ReverseFind(_T('\\')); event_file_path = config_path.Left(i) + _T("\\event\\"); event_file_path.AppendFormat(_T("_CAM%04d%02d%02d-%02d%02d%02d.csv"), now_time->tm_year+1900, now_time->tm_mon+1, now_time->tm_mday, now_time->tm_hour, now_time->tm_min, now_time->tm_sec); ((CSTEvaluationDlg*)pWndParent)->event_file_path = event_file_path; //记录开始时间 m_start_time = cur_time; //抓拍参数 m_snatch_count =0 ; m_snatch_intertime = 0; m_snatch_pretime = 0; ResetEvent(m_proc_flgexit); m_proc_handle = CreateThread( NULL, // default security attributes 0, // use default stack size thread_proc, // thread function this, // argument to thread function 0, // use default creation flags NULL); // returns the thread identifier if (m_proc_handle) { m_flg_process = TRUE; } else { printf("create proc thread failed!\r\n"); } Invalidate(); } else { ; } }
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; }
// fills the list of jobs with current contents of the job queue // filters by m_hFilter (contact handle) // void CSendLater::qMgrFillList(bool fClear) { TCHAR *formatTime = _T("%Y.%m.%d - %H:%M"); if (fClear) { ::SendMessage(m_hwndList, LVM_DELETEALLITEMS, 0, 0); ::SendMessage(m_hwndFilter, CB_RESETCONTENT, 0, 0); } m_sel = 0; ::SendMessage(m_hwndFilter, CB_INSERTSTRING, -1, LPARAM(TranslateT("<All contacts>"))); ::SendMessage(m_hwndFilter, CB_SETITEMDATA, 0, 0); LVITEM lvItem = { 0 }; lvItem.cchTextMax = 255; BYTE bCode = '-'; unsigned uIndex = 0; for (int i = 0; i < m_sendLaterJobList.getCount(); i++) { CSendLaterJob *p = m_sendLaterJobList[i]; CContactCache *c = CContactCache::getContactCache(p->hContact); if (c) { const TCHAR *tszNick = c->getNick(); if (m_hFilter && m_hFilter != p->hContact) { qMgrAddFilter(c->getContact(), tszNick); continue; } lvItem.mask = LVIF_TEXT|LVIF_PARAM; TCHAR tszBuf[255]; mir_sntprintf(tszBuf, 255, _T("%s [%s]"), tszNick, c->getRealAccount()); lvItem.pszText = tszBuf; lvItem.iItem = uIndex++; lvItem.iSubItem = 0; lvItem.lParam = LPARAM(p); ::SendMessage(m_hwndList, LVM_INSERTITEM, 0, LPARAM(&lvItem)); qMgrAddFilter(c->getContact(), tszNick); lvItem.mask = LVIF_TEXT; TCHAR tszTimestamp[30]; _tcsftime(tszTimestamp, 30, formatTime, _localtime32((__time32_t *)&p->created)); tszTimestamp[29] = 0; lvItem.pszText = tszTimestamp; lvItem.iSubItem = 1; ::SendMessage(m_hwndList, LVM_SETITEM, 0, LPARAM(&lvItem)); TCHAR *msg = mir_utf8decodeT(p->sendBuffer); TCHAR *preview = Utils::GetPreviewWithEllipsis(msg, 255); lvItem.pszText = preview; lvItem.iSubItem = 2; ::SendMessage(m_hwndList, LVM_SETITEM, 0, LPARAM(&lvItem)); mir_free(preview); mir_free(msg); const TCHAR *tszStatusText = 0; if (p->fFailed) { tszStatusText = p->bCode == CSendLaterJob::JOB_REMOVABLE ? TranslateT("Removed") : TranslateT("Failed"); } else if (p->fSuccess) tszStatusText = TranslateT("Sent OK"); else { switch(p->bCode) { case CSendLaterJob::JOB_DEFERRED: tszStatusText = TranslateT("Deferred"); break; case CSendLaterJob::JOB_AGE: tszStatusText = TranslateT("Failed"); break; case CSendLaterJob::JOB_HOLD: tszStatusText = TranslateT("Suspended"); break; default: tszStatusText = TranslateT("Pending"); break; } } if (p->bCode) bCode = p->bCode; TCHAR tszStatus[20]; mir_sntprintf(tszStatus, 20, _T("X/%s[%c] (%d)"), tszStatusText, bCode, p->iSendCount); tszStatus[0] = p->szId[0]; lvItem.pszText = tszStatus; lvItem.iSubItem = 3; ::SendMessage(m_hwndList, LVM_SETITEM, 0, LPARAM(&lvItem)); if (p->lastSent == 0) mir_sntprintf(tszTimestamp, 30, _T("%s"), _T("Never")); else { _tcsftime(tszTimestamp, 30, formatTime, _localtime32((__time32_t *)&p->lastSent)); tszTimestamp[29] = 0; } lvItem.pszText = tszTimestamp; lvItem.iSubItem = 4; ::SendMessage(m_hwndList, LVM_SETITEM, 0, LPARAM(&lvItem)); } } if (m_hFilter == 0) ::SendMessage(m_hwndFilter, CB_SETCURSEL, 0, 0); else ::SendMessage(m_hwndFilter, CB_SETCURSEL, m_sel, 0); }
BOOL LogToFile(SESSION_INFO *si, GCEVENT *gce) { TCHAR szBuffer[4096]; TCHAR szLine[4096]; TCHAR p = '\0'; szBuffer[0] = '\0'; GetChatLogsFilename(si, gce->time); BOOL bFileJustCreated = !PathFileExists(si->pszLogFileName); TCHAR tszFolder[MAX_PATH]; _tcsncpy_s(tszFolder, si->pszLogFileName, _TRUNCATE); PathRemoveFileSpec(tszFolder); if (!PathIsDirectory(tszFolder)) CreateDirectoryTreeT(tszFolder); TCHAR szTime[100]; mir_tstrncpy(szTime, chatApi.MakeTimeStamp(g_Settings->pszTimeStampLog, gce->time), 99); FILE *hFile = _tfopen(si->pszLogFileName, _T("ab+")); if (hFile == NULL) return FALSE; TCHAR szTemp[512], szTemp2[512]; TCHAR* pszNick = NULL; if (bFileJustCreated) fputws((const wchar_t*)"\377\376", hFile); //UTF-16 LE BOM == FF FE if (gce->ptszNick) { if (g_Settings->bLogLimitNames && mir_tstrlen(gce->ptszNick) > 20) { mir_tstrncpy(szTemp2, gce->ptszNick, 20); mir_tstrncpy(szTemp2 + 20, _T("..."), 4); } else mir_tstrncpy(szTemp2, gce->ptszNick, 511); if (gce->ptszUserInfo) mir_sntprintf(szTemp, _T("%s (%s)"), szTemp2, gce->ptszUserInfo); else _tcsncpy_s(szTemp, szTemp2, _TRUNCATE); pszNick = szTemp; } switch (gce->pDest->iType) { case GC_EVENT_MESSAGE: case GC_EVENT_MESSAGE | GC_EVENT_HIGHLIGHT: p = '*'; mir_sntprintf(szBuffer, _T("%s: %s"), gce->ptszNick, chatApi.RemoveFormatting(gce->ptszText)); break; case GC_EVENT_ACTION: case GC_EVENT_ACTION | GC_EVENT_HIGHLIGHT: p = '*'; mir_sntprintf(szBuffer, _T("%s %s"), gce->ptszNick, chatApi.RemoveFormatting(gce->ptszText)); break; case GC_EVENT_JOIN: p = '>'; mir_sntprintf(szBuffer, TranslateT("%s has joined"), pszNick); break; case GC_EVENT_PART: p = '<'; if (!gce->ptszText) mir_sntprintf(szBuffer, TranslateT("%s has left"), pszNick); else mir_sntprintf(szBuffer, TranslateT("%s has left (%s)"), pszNick, chatApi.RemoveFormatting(gce->ptszText)); break; case GC_EVENT_QUIT: p = '<'; if (!gce->ptszText) mir_sntprintf(szBuffer, TranslateT("%s has disconnected"), pszNick); else mir_sntprintf(szBuffer, TranslateT("%s has disconnected (%s)"), pszNick, chatApi.RemoveFormatting(gce->ptszText)); break; case GC_EVENT_NICK: p = '^'; mir_sntprintf(szBuffer, TranslateT("%s is now known as %s"), gce->ptszNick, gce->ptszText); break; case GC_EVENT_KICK: p = '~'; if (!gce->ptszText) mir_sntprintf(szBuffer, TranslateT("%s kicked %s"), gce->ptszStatus, gce->ptszNick); else mir_sntprintf(szBuffer, TranslateT("%s kicked %s (%s)"), gce->ptszStatus, gce->ptszNick, chatApi.RemoveFormatting(gce->ptszText)); break; case GC_EVENT_NOTICE: p = 'o'; mir_sntprintf(szBuffer, TranslateT("Notice from %s: %s"), gce->ptszNick, chatApi.RemoveFormatting(gce->ptszText)); break; case GC_EVENT_TOPIC: p = '#'; if (!gce->ptszNick) mir_sntprintf(szBuffer, TranslateT("The topic is '%s'"), chatApi.RemoveFormatting(gce->ptszText)); else mir_sntprintf(szBuffer, TranslateT("The topic is '%s' (set by %s)"), chatApi.RemoveFormatting(gce->ptszText), gce->ptszNick); break; case GC_EVENT_INFORMATION: p = '!'; _tcsncpy_s(szBuffer, chatApi.RemoveFormatting(gce->ptszText), _TRUNCATE); break; case GC_EVENT_ADDSTATUS: p = '+'; mir_sntprintf(szBuffer, TranslateT("%s enables '%s' status for %s"), gce->ptszText, gce->ptszStatus, gce->ptszNick); break; case GC_EVENT_REMOVESTATUS: p = '-'; mir_sntprintf(szBuffer, TranslateT("%s disables '%s' status for %s"), gce->ptszText, gce->ptszStatus, gce->ptszNick); break; } // formatting strings don't need to be translatable - changing them via language pack would // only screw up the log format. if (p) mir_sntprintf(szLine, _T("%s %c %s\r\n"), szTime, p, szBuffer); else mir_sntprintf(szLine, _T("%s %s\r\n"), szTime, szBuffer); if (szLine[0]) { _fputts(szLine, hFile); if (g_Settings->LoggingLimit > 0) { fseek(hFile, 0, SEEK_END); long dwSize = ftell(hFile); rewind(hFile); long trimlimit = g_Settings->LoggingLimit * 1024; if (dwSize > trimlimit) { time_t now = time(0); TCHAR tszTimestamp[20]; _tcsftime(tszTimestamp, 20, _T("%Y%m%d-%H%M%S"), _localtime32((__time32_t *)&now)); tszTimestamp[19] = 0; // max size reached, rotate the log // move old logs to /archived sub folder just inside the log root folder. // add a time stamp to the file name. TCHAR tszDrive[_MAX_DRIVE], tszDir[_MAX_DIR], tszName[_MAX_FNAME], tszExt[_MAX_EXT]; _tsplitpath(si->pszLogFileName, tszDrive, tszDir, tszName, tszExt); TCHAR tszNewPath[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT + 20]; mir_sntprintf(tszNewPath, _T("%s%sarchived\\"), tszDrive, tszDir); CreateDirectoryTreeT(tszNewPath); TCHAR tszNewName[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT + 20]; mir_sntprintf(tszNewName, _T("%s%s-%s%s"), tszNewPath, tszName, tszTimestamp, tszExt); fclose(hFile); hFile = 0; if (!PathFileExists(tszNewName)) CopyFile(si->pszLogFileName, tszNewName, TRUE); DeleteFile(si->pszLogFileName); } } } if (hFile) fclose(hFile); return TRUE; }