int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct) == - 1) { return - 1; } //Center the main window so message boxes are in the center CRect rcScreen; GetMonitorRect(0, &rcScreen); CPoint cpCenter = rcScreen.CenterPoint(); //MoveWindow(cpCenter.x, cpCenter.x, - 2, - 2); //Then set the main window to transparent so it's never shown //if it is shown then only the task tray icon //m_Transparency.SetTransparent(m_hWnd, 0, true); SetWindowText(_T("")); Log(_T("Setting polling timer to track focus")); SetTimer(ACTIVE_WINDOW_TIMER, g_Opt.FocusWndTimerTimeout(), 0); SetTimer(READ_RANDOM_DB_FILE, g_Opt.ReadRandomFileInterval() * 1000, 0); SetWindowText(_T("Ditto")); HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_TrayIcon.Create(NULL, WM_ICON_NOTIFY, _T("Ditto"), hIcon, IDR_MENU, FALSE, _T(""), _T(""), NULL, 20); m_TrayIcon.SetSingleClickSelect(TRUE); m_TrayIcon.MinimiseToTray(this); m_TrayIcon.SetMenuDefaultItem(ID_FIRST_SHOWQUICKPASTE, FALSE); //Only if in release #ifndef _DEBUG { //If not showing the icon show it for 40 seconds so they can get to the option //in case they can't remember the hot keys or something like that if(!(CGetSetOptions::GetShowIconInSysTray())) { SetTimer(HIDE_ICON_TIMER, 40000, 0); } } #endif //SetTimer(CLOSE_WINDOW_TIMER, ONE_HOUR*24, 0); SetTimer(REMOVE_OLD_REMOTE_COPIES, ONE_DAY, 0); SetTimer(REMOVE_OLD_ENTRIES_TIMER, ONE_MINUTE*15, 0); //found on some computers GetTickCount gettickcount returns a smaller value than other, can't explain //check here to see if we need to make an adjustment IdleSeconds(); m_ulCopyGap = CGetSetOptions::GetCopyGap(); theApp.AfterMainCreate(); m_thread.Start(this); return 0; }
void CSteamProto::PollingThread(void*) { debugLog(_T("CSteamProto::PollingThread: entering")); ptrA token(getStringA("TokenSecret")); ptrA umqId(getStringA("UMQID")); UINT32 messageId = getDword("MessageID", 0); //PollApi::PollResult pollResult; int errors = 0; bool breaked = false; while (!isTerminated && !breaked && errors < POLLING_ERRORS_LIMIT) { PollRequest *request = new PollRequest(token, umqId, messageId, IdleSeconds()); //request->nlc = m_pollingConnection; HttpResponse *response = request->Send(m_hNetlibUser); delete request; if (response == NULL || response->resultCode != HTTP_CODE_OK) { if (response != NULL) delete response; errors++; continue; } else errors = 0; JSONROOT root(response->pData); JSONNode *node = json_get(root, "error"); ptrT error(json_as_string(node)); if (!lstrcmpi(error, _T("OK"))) { node = json_get(root, "messagelast"); messageId = json_as_int(node); node = json_get(root, "messages"); JSONNode *nroot = json_as_array(node); if (nroot != NULL) { ParsePollData(nroot); json_delete(nroot); } m_pollingConnection = response->nlc; } else if (!lstrcmpi(error, _T("Timeout"))) { continue; } /*else if (!lstrcmpi(error, _T("Not Logged On"))) // 'else' below will handle this error, we don't need this particular check right now { if (!IsOnline()) { // need to relogin debugLog(_T("CSteamProto::PollingThread: not logged on")); SetStatus(ID_STATUS_OFFLINE); } breaked = true; }*/ else { // something wrong debugLog(_T("CSteamProto::PollingThread: %s (%d)"), error, response->resultCode); // token has expired if (response->resultCode == HTTP_CODE_UNAUTHORIZED) delSetting("TokenSecret"); // too low timeout? node = json_get(root, "sectimeout"); int timeout = json_as_int(node); if (timeout < STEAM_API_TIMEOUT) debugLog(_T("CSteamProto::PollingThread: Timeout is too low (%d)"), timeout); breaked = true; } delete response; } setDword("MessageID", messageId); m_hPollingThread = NULL; debugLog(_T("CSteamProto::PollingThread: leaving")); if (!isTerminated) { debugLog(_T("CSteamProto::PollingThread: unexpected termination; switching protocol to offline")); SetStatus(ID_STATUS_OFFLINE); } }
BOOL RemoveOldEntries(bool checkIdleTime) { Log(StrF(_T("Beginning of RemoveOldEntries MaxEntries: %d - Keep days: %d"), CGetSetOptions::GetMaxEntries(), CGetSetOptions::GetExpiredEntries())); try { CppSQLite3DB db; CString csDbPath = CGetSetOptions::GetDBPath(); db.open(csDbPath); if(CGetSetOptions::GetCheckForMaxEntries()) { long lMax = CGetSetOptions::GetMaxEntries(); if(lMax >= 0) { CClipIDs IDs; int clipId; CppSQLite3Query q = db.execQueryEx(_T("SELECT lID, lShortCut, lParentID, lDontAutoDelete, stickyClipOrder, stickyClipGroupOrder FROM Main WHERE bIsGroup = 0 ORDER BY clipOrder DESC LIMIT -1 OFFSET %d"), lMax); while(q.eof() == false) { int shortcut = q.getIntField(_T("lShortCut")); int dontDelete = q.getIntField(_T("lDontAutoDelete")); int parentId = q.getIntField(_T("lParentID")); double stickyClipOrder = q.getFloatField(_T("stickyClipOrder")); double stickyClipGroupOrder = q.getFloatField(_T("stickyClipGroupOrder")); //Only delete entries that have no shortcut and don't have the flag set and aren't in groups and if(shortcut == 0 && dontDelete == 0 && parentId <= 0 && stickyClipOrder == 0.0 && stickyClipGroupOrder == 0.0) { clipId = q.getIntField(_T("lID")); IDs.Add(clipId); Log(StrF(_T("From MaxEntries - Deleting Id: %d"), clipId)); } q.nextRow(); } if(IDs.GetCount() > 0) { IDs.DeleteIDs(false, db); } } } if(CGetSetOptions::GetCheckForExpiredEntries()) { long lExpire = CGetSetOptions::GetExpiredEntries(); if(lExpire) { CTime now = CTime::GetCurrentTime(); now -= CTimeSpan(lExpire, 0, 0, 0); CClipIDs IDs; CppSQLite3Query q = db.execQueryEx(_T("SELECT lID FROM Main ") _T("WHERE lastPasteDate < %d AND ") _T("bIsGroup = 0 AND lShortCut = 0 AND lParentID <= 0 AND lDontAutoDelete = 0 AND stickyClipOrder = 0 AND stickyClipGroupOrder = 0"), (int)now.GetTime()); while(q.eof() == false) { IDs.Add(q.getIntField(_T("lID"))); Log(StrF(_T("From Clips Expire - Deleting Id: %d"), q.getIntField(_T("lID")))); q.nextRow(); } if(IDs.GetCount() > 0) { IDs.DeleteIDs(false, db); } } } int toDeleteCount = db.execScalar(_T("SELECT COUNT(clipID) FROM MainDeletes")); Log(StrF(_T("Before Deleting emptied out data, count: %d, Idle Seconds: %f"), toDeleteCount, IdleSeconds())); //Only delete 1 at a time, was finding that it was taking a long time to delete clips, locking the db and causing other queries //to lock up CppSQLite3Query q = db.execQueryEx(_T("SELECT * FROM MainDeletes LIMIT %d"), CGetSetOptions::GetMainDeletesDeleteCount()); int deleteCount = 0; while(q.eof() == false) { double idleSeconds = IdleSeconds(); if(checkIdleTime == false || idleSeconds > CGetSetOptions::GetIdleSecondsBeforeDelete()) { //delete any data items sitting out there that the main table data was deleted //this was done to speed up deleted from the main table deleteCount = db.execDMLEx(_T("DELETE FROM MainDeletes WHERE clipID=%d"), q.getIntField(_T("clipID"))); } else { Log(StrF(_T("Computer has not been idle long enough to delete clips, Min Idle: %d, current Idle: %d"), CGetSetOptions::GetIdleSecondsBeforeDelete(), idleSeconds)); break; } q.nextRow(); } toDeleteCount = db.execScalar(_T("SELECT COUNT(clipID) FROM MainDeletes")); Log(StrF(_T("After Deleting emptied out data rows, Count: %d, toDelete: %d"), deleteCount, toDeleteCount)); } CATCH_SQLITE_EXCEPTION Log(_T("End of RemoveOldEntries")); return TRUE; }