diff options
| author | George Hazan <ghazan@miranda.im> | 2018-06-19 12:43:27 +0300 |
|---|---|---|
| committer | George Hazan <ghazan@miranda.im> | 2018-06-19 12:43:27 +0300 |
| commit | 0fb39531240a0a23e92c0456fe72e26027740696 (patch) | |
| tree | 8b85028b680b6951f8afa369297adfc93baef79a /plugins/StatusManager/src/KeepStatus | |
| parent | aef4307d04fb8d8bbc05921d45d97a63e627fb4d (diff) | |
StatusManager:
- project structure linearized;
- AAA flag "Use same settings wasn't saved across Miranda starts;
- perversion with declaring static arrays in commonstatus.h removed
Diffstat (limited to 'plugins/StatusManager/src/KeepStatus')
| -rw-r--r-- | plugins/StatusManager/src/KeepStatus/keepstatus.cpp | 1102 | ||||
| -rw-r--r-- | plugins/StatusManager/src/KeepStatus/keepstatus.h | 112 | ||||
| -rw-r--r-- | plugins/StatusManager/src/KeepStatus/ks_options.cpp | 487 |
3 files changed, 0 insertions, 1701 deletions
diff --git a/plugins/StatusManager/src/KeepStatus/keepstatus.cpp b/plugins/StatusManager/src/KeepStatus/keepstatus.cpp deleted file mode 100644 index 5b130f024a..0000000000 --- a/plugins/StatusManager/src/KeepStatus/keepstatus.cpp +++ /dev/null @@ -1,1102 +0,0 @@ -/* - KeepStatus Plugin for Miranda-IM (www.miranda-im.org) - Copyright 2003-2006 P. Boon - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "..\stdafx.h" - -int KSLangPack; - -static HANDLE hConnectionEvent = nullptr; -static HANDLE hServices[4], hEvents[2]; - -static mir_cs GenTimerCS, GenStatusCS, CheckContinueslyCS; - -static HANDLE hProtoAckHook = nullptr; -static HANDLE hStatusChangeHook = nullptr; -static HANDLE hCSStatusChangeHook = nullptr; -static HANDLE hCSStatusChangeExHook = nullptr; - -static HWND hMessageWindow = nullptr; - -static UINT_PTR checkConnectionTimerId = 0; -static UINT_PTR afterCheckTimerId = 0; -static UINT_PTR processAckTimerId = 0; -static UINT_PTR checkContinTimerId = 0; -static UINT_PTR checkConnectingTimerId = 0; -static int retryCount = 0; -static BOOL bLastPingResult = TRUE; -// variables (options) -static int maxRetries = 0; -static int initDelay = 0; -static int currentDelay = 0; -static int maxDelay = 0; -static int ackDelay = 500; -static int increaseExponential = 0; -static int showConnectionPopups = 0; -// prototypes -static int StartTimer(int timer, int timeout, BOOL restart); -static int StopTimer(int timer); -static int ProcessProtoAck(WPARAM wParam, LPARAM lParam); -static VOID CALLBACK CheckConnectingTimer(HWND hwnd, UINT message, UINT_PTR idEvent, DWORD dwTime); -static VOID CALLBACK CheckAckStatusTimer(HWND hwnd, UINT message, UINT_PTR idEvent, DWORD dwTime); -static int StatusChange(WPARAM wParam, LPARAM lParam); -static int CSStatusChange(WPARAM wParam, LPARAM lParam); -static int CSStatusChangeEx(WPARAM wParam, LPARAM lParam); -static VOID CALLBACK CheckConnectionTimer(HWND hwnd, UINT message, UINT_PTR idEvent, DWORD dwTime); -static int StopChecking(); -static VOID CALLBACK AfterCheckTimer(HWND hwnd, UINT message, UINT_PTR idEvent, DWORD dwTime); -static VOID CALLBACK CheckContinueslyTimer(HWND hwnd, UINT message, UINT_PTR idEvent, DWORD dwTime); -INT_PTR IsProtocolEnabledService(WPARAM wParam, LPARAM lParam); - -static int ProcessPopup(int reason, LPARAM lParam); -LRESULT CALLBACK KSPopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); -static DWORD CALLBACK MessageWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - -// options.c -extern int KeepStatusOptionsInit(WPARAM wparam, LPARAM); - -///////////////////////////////////////////////////////////////////////////////////////// - -void KSUnloadOptions() -{ - UnhookEvent(hProtoAckHook); - UnhookEvent(hStatusChangeHook); - UnhookEvent(hCSStatusChangeHook); - UnhookEvent(hCSStatusChangeExHook); - hProtoAckHook = hStatusChangeHook = hCSStatusChangeHook = hCSStatusChangeExHook = nullptr; - - if (IsWindow(hMessageWindow)) - DestroyWindow(hMessageWindow); - - if (StartTimer(IDT_CHECKCONTIN, -1, FALSE)) - WSACleanup(); - - StopTimer(IDT_CHECKCONN | IDT_PROCESSACK | IDT_AFTERCHECK | IDT_CHECKCONTIN | IDT_CHECKCONNECTING); -} - -int KSLoadOptions() -{ - KSUnloadOptions(); - - if (db_get_b(0, KSMODULENAME, SETTING_CHECKCONNECTION, FALSE)) { - if (db_get_b(0, KSMODULENAME, SETTING_CONTCHECK, FALSE)) { - if (db_get_b(0, KSMODULENAME, SETTING_BYPING, FALSE)) { - WSADATA wsaData; - WSAStartup(MAKEWORD(2, 2), &wsaData); - } - StartTimer(IDT_CHECKCONTIN, 0, FALSE); - } - increaseExponential = db_get_b(0, KSMODULENAME, SETTING_INCREASEEXPONENTIAL, FALSE); - currentDelay = initDelay = 1000 * db_get_dw(0, KSMODULENAME, SETTING_INITDELAY, DEFAULT_INITDELAY); - maxDelay = 1000 * db_get_dw(0, KSMODULENAME, SETTING_MAXDELAY, DEFAULT_MAXDELAY); - maxRetries = db_get_b(0, KSMODULENAME, SETTING_MAXRETRIES, 0); - if (maxRetries == 0) - maxRetries = -1; - hProtoAckHook = HookEvent(ME_PROTO_ACK, ProcessProtoAck); - hStatusChangeHook = HookEvent(ME_CLIST_STATUSMODECHANGE, StatusChange); - if (ServiceExists(ME_CS_STATUSCHANGE)) - hCSStatusChangeHook = HookEvent(ME_CS_STATUSCHANGE, CSStatusChange); - hCSStatusChangeExHook = HookEvent(ME_CS_STATUSCHANGEEX, CSStatusChangeEx); - if (db_get_b(0, KSMODULENAME, SETTING_CHECKAPMRESUME, 0)) { - if (!IsWindow(hMessageWindow)) { - hMessageWindow = CreateWindowEx(0, L"STATIC", nullptr, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr); - SetWindowLongPtr(hMessageWindow, GWLP_WNDPROC, (LONG_PTR)MessageWndProc); - } - } - retryCount = 0; - } - - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int SMProto::AssignStatus(int iStatus, int iLastStatus, wchar_t *pwszMsg) -{ - if (iStatus < MIN_STATUS || iStatus > MAX_STATUS) - return -1; - if (iStatus != ID_STATUS_OFFLINE && m_status == ID_STATUS_DISABLED) - return -2; - if (!db_get_b(0, KSMODULENAME, SETTING_NOLOCKED, 0) && Proto_GetAccount(m_szName)->IsLocked()) - return -3; - - mir_cslock lck(GenStatusCS); - - char dbSetting[128]; - mir_snprintf(dbSetting, "%s_enabled", m_szName); - m_lastStatus = (iLastStatus == 0) ? m_status : iLastStatus; - if (!db_get_b(0, KSMODULENAME, dbSetting, 1)) - m_status = ID_STATUS_DISABLED; - else if (iStatus == ID_STATUS_LAST) - m_status = m_lastStatus; - else - m_status = iStatus; - - log_infoA("KeepStatus: assigning status %d (%d, %d) to %s", m_status, m_lastStatus, iLastStatus, m_szName); - - if (pwszMsg != nullptr && mir_wstrcmp(pwszMsg, m_szMsg)) { - if (m_szMsg != nullptr) - mir_free(m_szMsg); - - m_szMsg = mir_wstrdup(pwszMsg); - } - else if (pwszMsg != m_szMsg) { - if (m_szMsg != nullptr) - mir_free(m_szMsg); - - m_szMsg = nullptr; - } - return 0; -} - -int SMProto::GetStatus() const -{ - switch (m_status) { - case ID_STATUS_CURRENT: - return Proto_GetStatus(m_szName); - case ID_STATUS_LAST: - return m_lastStatus; - default: - return m_status; - } -} - -static int SetCurrentStatus() -{ - TProtoSettings ps(protoList); - for (auto &p : ps) { - int realStatus = Proto_GetStatus(p->m_szName); - int curStatus = p->GetStatus(); - if (curStatus == ID_STATUS_DISABLED) - continue; - if (curStatus == realStatus) { - p->m_status = ID_STATUS_DISABLED; - continue; - } - - log_infoA("KeepStatus: status for %s differs: stored = %d, real = %d", p->m_szName, curStatus, realStatus); - - // force offline before reconnecting? - if (realStatus != ID_STATUS_OFFLINE && db_get_b(0, KSMODULENAME, SETTING_FIRSTOFFLINE, FALSE)) { - log_infoA("KeepStatus: Setting %s offline before making a new connection attempt", p->m_szName); - CallProtoService(p->m_szName, PS_SETSTATUS, (WPARAM)ID_STATUS_OFFLINE, 0); - } - } - ProcessPopup(KS_CONN_STATE_RETRY, (LPARAM)ps.getArray()); - return SetStatusEx(ps); -} - -static int StatusChange(WPARAM wParam, LPARAM lParam) -{ - char *szProto = (char *)lParam; - if (szProto == nullptr) { // global status change - for (auto &it : protoList) - it->AssignStatus(wParam, 0, it->m_szMsg); - } - else { - for (auto &it : protoList) - if (!mir_strcmp(it->m_szName, szProto)) - it->AssignStatus(wParam, 0, it->m_szMsg); - } - - return 0; -} - -static int CSStatusChange(WPARAM wParam, LPARAM) -{ - // the status was changed by commonstatus (old) - if (wParam != 0) { - PROTOCOLSETTING **protoSettings = *(PROTOCOLSETTING***)wParam; - if (protoSettings == nullptr) - return -1; - - for (int i = 0; i < protoList.getCount(); i++) { - auto psi = protoSettings[i]; - if (psi->szName == nullptr) - continue; - - for (auto &it : protoList) { - if (it->m_szName == nullptr) - continue; - - if (!mir_strcmp(psi->szName, it->m_szName)) - it->AssignStatus(psi->status, psi->lastStatus, it->m_szMsg); - } - } - } - - return 0; -} - -static int CSStatusChangeEx(WPARAM wParam, LPARAM pCount) -{ - // the status was changed by commonstatus (new) - if (wParam != 0) { - PROTOCOLSETTINGEX** protoSettings = *(PROTOCOLSETTINGEX***)wParam; - if (protoSettings == nullptr) - return -1; - - for (int i = 0; i < pCount; i++) { - auto psi = protoSettings[i]; - if (psi->m_szName == nullptr) - continue; - - for (auto &it : protoList) { - if (it->m_szName == nullptr) - continue; - - if (!mir_strcmp(psi->m_szName, it->m_szName)) - it->AssignStatus(psi->m_status, psi->m_lastStatus, psi->m_szMsg); - } - } - } - - return 0; -} - -struct TimerInfo -{ - int timer; - int timeout; - BOOL restart; -}; - -static INT_PTR CALLBACK StartTimerApcProc(void *param) -{ - TimerInfo *ti = (TimerInfo *)param; - int res = 0; - - mir_cslock lck(GenTimerCS); - log_debugA("StartTimer: %d, %d, %d", ti->timer, ti->timeout, ti->restart); - log_debugA("ack: %u, chk: %u, aft: %u, cnt: %u, con: %u", processAckTimerId, checkConnectionTimerId, afterCheckTimerId, checkContinTimerId, checkConnectingTimerId); - if (ti->timer & IDT_PROCESSACK) { - res = (processAckTimerId == 0) ? 0 : 1; - if (((processAckTimerId == 0) && (checkConnectionTimerId == 0)) || (ti->restart)) { - if (ti->timeout != -1) { - if (ti->restart) - KillTimer(nullptr, processAckTimerId); - if (ti->timeout == 0) - ti->timeout = ackDelay; - processAckTimerId = SetTimer(nullptr, 0, ti->timeout, CheckAckStatusTimer); - } - } - } - - if (ti->timer & IDT_CHECKCONN) { - res = (checkConnectionTimerId == 0 ? 0 : 1) || res; - if ((checkConnectionTimerId == 0) || (ti->restart)) { - if (ti->timeout != -1) { - if (ti->restart) - KillTimer(nullptr, checkConnectionTimerId); - - if (ti->timeout == 0) - ti->timeout = initDelay; - checkConnectionTimerId = SetTimer(nullptr, 0, ti->timeout, CheckConnectionTimer); - } - } - } - - if (ti->timer & IDT_AFTERCHECK) { - res = (afterCheckTimerId == 0 ? 0 : 1) || res; - if ((afterCheckTimerId == 0) || (ti->restart)) { - if (ti->timeout != -1) { - if (ti->restart) - KillTimer(nullptr, afterCheckTimerId); - - if (ti->timeout == 0) - ti->timeout = initDelay / 2; - afterCheckTimerId = SetTimer(nullptr, 0, ti->timeout, AfterCheckTimer); - } - } - } - - if (ti->timer & IDT_CHECKCONTIN) { - res = (checkContinTimerId == 0 ? 0 : 1) || res; - if ((checkContinTimerId == 0) || (ti->restart)) { - if (ti->timeout != -1) { - if (ti->restart) - KillTimer(nullptr, checkContinTimerId); - - if (ti->timeout == 0) - ti->timeout = 1000 * db_get_dw(0, KSMODULENAME, SETTING_CNTDELAY, CHECKCONTIN_DELAY); - checkContinTimerId = SetTimer(nullptr, 0, ti->timeout, CheckContinueslyTimer); - } - } - } - - if (ti->timer & IDT_CHECKCONNECTING) { - res = (checkConnectingTimerId == 0 ? 0 : 1) || res; - if ((checkConnectingTimerId == 0) || (ti->restart)) { - if (ti->timeout != -1) { - if (ti->restart) - KillTimer(nullptr, checkConnectingTimerId); - if (ti->timeout == 0) - ti->timeout = initDelay / 2; - checkConnectingTimerId = SetTimer(nullptr, 0, ti->timeout, CheckConnectingTimer); - } - } - } - - log_debugA("ack: %u, chk: %u, aft: %u, cnt: %u, con: %u", processAckTimerId, checkConnectionTimerId, afterCheckTimerId, checkContinTimerId, checkConnectingTimerId); - log_debugA("StartTimer done %d", res); - return res; -} - -static int StartTimer(int timer, int timeout, BOOL restart) -{ - TimerInfo ti = { timer, timeout, restart }; - return CallFunctionSync(&StartTimerApcProc, &ti); -} - -static int StopTimer(int timer) -{ - int res = 0; - - mir_cslock lck(GenTimerCS); - log_debugA("StopTimer %d", timer); - log_debugA("ack: %u, chk: %u, aft: %u, cnt: %u, con: %u", processAckTimerId, checkConnectionTimerId, afterCheckTimerId, checkContinTimerId, checkConnectingTimerId); - - if (timer & IDT_PROCESSACK) { - if (processAckTimerId == 0) - res = 0; - else { - KillTimer(nullptr, processAckTimerId); - processAckTimerId = 0; - res = 1; - } - } - - if (timer & IDT_CHECKCONN) { - if (checkConnectionTimerId == 0) - res = 0 || res; - else { - KillTimer(nullptr, checkConnectionTimerId); - checkConnectionTimerId = 0; - res = 1; - } - } - - if (timer & IDT_AFTERCHECK) { - if (afterCheckTimerId == 0) - res = 0 || res; - else { - KillTimer(nullptr, afterCheckTimerId); - afterCheckTimerId = 0; - res = 1; - } - } - - if (timer & IDT_CHECKCONTIN) { - if (checkContinTimerId == 0) - res = 0 || res; - else { - KillTimer(nullptr, checkContinTimerId); - checkContinTimerId = 0; - res = 1; - } - } - - if (timer & IDT_CHECKCONNECTING) { - if (checkConnectingTimerId == 0) - res = 0 || res; - else { - KillTimer(nullptr, checkConnectingTimerId); - checkConnectingTimerId = 0; - res = 1; - } - } - - log_debugA("ack: %u, chk: %u, aft: %u, cnt: %u, con: %u", processAckTimerId, checkConnectionTimerId, afterCheckTimerId, checkContinTimerId, checkConnectingTimerId); - log_debugA("StopTimer done %d", res); - return res; -} - -static int ProcessProtoAck(WPARAM, LPARAM lParam) -{ - ACKDATA *ack = (ACKDATA*)lParam; - if (ack->type != ACKTYPE_STATUS && ack->type != ACKTYPE_LOGIN) - return 0; - - char dbSetting[128]; - mir_snprintf(dbSetting, "%s_enabled", ack->szModule); - if (!db_get_b(0, KSMODULENAME, dbSetting, 1)) - return 0; - - if (ack->type == ACKTYPE_STATUS && ack->result == ACKRESULT_SUCCESS) { - for (auto &it : protoList) - if (!mir_strcmp(it->m_szName, ack->szModule)) - it->lastStatusAckTime = GetTickCount(); - - StartTimer(IDT_PROCESSACK, 0, FALSE); - return 0; - } - - if (ack->type == ACKTYPE_LOGIN) { - if (ack->lParam == LOGINERR_OTHERLOCATION) { - for (auto &it : protoList) { - if (!mir_strcmp(ack->szModule, it->m_szName)) { - it->AssignStatus(ID_STATUS_OFFLINE); - if (db_get_b(0, KSMODULENAME, SETTING_CNCOTHERLOC, 0)) { - StopTimer(IDT_PROCESSACK); - for (auto &jt : protoList) - jt->AssignStatus(ID_STATUS_OFFLINE); - } - - NotifyEventHooks(hConnectionEvent, (WPARAM)KS_CONN_STATE_OTHERLOCATION, (LPARAM)it->m_szName); - ProcessPopup(KS_CONN_STATE_OTHERLOCATION, (LPARAM)ack->szModule); - } - } - } - else if (ack->result == ACKRESULT_FAILED) { - // login failed - NotifyEventHooks(hConnectionEvent, (WPARAM)KS_CONN_STATE_LOGINERROR, (LPARAM)ack->szModule); - - switch (db_get_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_NOTHING)) { - case LOGINERR_CANCEL: - log_infoA("KeepStatus: cancel on login error (%s)", ack->szModule); - for (auto &it : protoList) - if (!mir_strcmp(ack->szModule, it->m_szName)) - it->AssignStatus(ID_STATUS_OFFLINE); - - ProcessPopup(KS_CONN_STATE_LOGINERROR, (LPARAM)ack->szModule); - StopChecking(); - break; - - case LOGINERR_SETDELAY: - { - int newDelay = 1000 * db_get_dw(0, KSMODULENAME, SETTING_LOGINERR_DELAY, DEFAULT_MAXDELAY); - log_infoA("KeepStatus: set delay to %d ms on login error (%s)", newDelay, ack->szModule); - StartTimer(IDT_CHECKCONN, newDelay, TRUE); - } - ProcessPopup(KS_CONN_STATE_LOGINERROR, (LPARAM)ack->szModule); - break; - - default: - case LOGINERR_NOTHING: - StartTimer(IDT_PROCESSACK, 0, FALSE); - break; - } - } - } - - return 0; -} - -static VOID CALLBACK CheckConnectingTimer(HWND, UINT, UINT_PTR, DWORD) -{ - StopTimer(IDT_CHECKCONNECTING); - - for (auto &it : protoList) { - int curStatus = it->GetStatus(); - if (IsStatusConnecting(curStatus)) { // connecting - int maxConnectingTime = db_get_dw(0, KSMODULENAME, SETTING_MAXCONNECTINGTIME, 0); - if (maxConnectingTime > 0) { - if ((unsigned int)maxConnectingTime <= ((GetTickCount() - it->lastStatusAckTime) / 1000)) { - // set offline - log_infoA("KeepStatus: %s is too long connecting; setting offline", it->m_szName); - CallProtoService(it->m_szName, PS_SETSTATUS, (WPARAM)ID_STATUS_OFFLINE, 0); - } - } - } - } -} - -static VOID CALLBACK CheckAckStatusTimer(HWND, UINT, UINT_PTR, DWORD) -{ - bool needChecking = false; - - StopTimer(IDT_PROCESSACK); - for (auto &it : protoList) { - int curStatus = it->GetStatus(); - int newStatus = Proto_GetStatus(it->m_szName); - // ok, np - if (curStatus == ID_STATUS_CURRENT || curStatus == ID_STATUS_DISABLED || curStatus == newStatus || newStatus > MAX_STATUS) - continue; - - if (IsStatusConnecting(newStatus)) { // connecting - int maxConnectingTime = db_get_dw(0, KSMODULENAME, SETTING_MAXCONNECTINGTIME, 0); - if (maxConnectingTime > 0) - StartTimer(IDT_CHECKCONNECTING, (maxConnectingTime * 1000 - (GetTickCount() - it->lastStatusAckTime)), FALSE); - } - // keepstatus' administration was wrong! - else if (newStatus != ID_STATUS_OFFLINE) - it->AssignStatus(newStatus); - - // connection lost - else if (newStatus == ID_STATUS_OFFLINE) {// start checking connection - if (!StartTimer(IDT_CHECKCONN, -1, FALSE)) { /* check if not already checking */ - needChecking = true; - log_infoA("KeepStatus: connection lost! (%s)", it->m_szName); - NotifyEventHooks(hConnectionEvent, (WPARAM)KS_CONN_STATE_LOST, (LPARAM)it->m_szName); - ProcessPopup(KS_CONN_STATE_LOST, (LPARAM)it->m_szName); - } - } - } - - if (needChecking) - StartTimer(IDT_CHECKCONN, initDelay, FALSE); -} - -static VOID CALLBACK CheckConnectionTimer(HWND, UINT, UINT_PTR, DWORD) -{ - log_debugA("CheckConnectionTimer"); - bool setStatus = false; - - for (auto &it : protoList) { - int realStatus = Proto_GetStatus(it->m_szName); - int shouldBeStatus = it->GetStatus(); - if (shouldBeStatus == ID_STATUS_LAST) - shouldBeStatus = it->m_lastStatus; - if (shouldBeStatus == ID_STATUS_DISABLED) - continue; - if ((shouldBeStatus != realStatus) && (realStatus == ID_STATUS_OFFLINE) || (realStatus < MIN_STATUS)) { - setStatus = true; - break; - } - } - - // one of the status was wrong - if (setStatus && (maxRetries == -1 || retryCount < maxRetries)) { - if (increaseExponential) - currentDelay = min(2 * currentDelay, maxDelay); - - if (((db_get_b(0, KSMODULENAME, SETTING_CHKINET, 0)) && (!InternetGetConnectedState(nullptr, 0))) || ((db_get_b(0, KSMODULENAME, SETTING_BYPING, FALSE)) && (!bLastPingResult))) { - // no network - NotifyEventHooks(hConnectionEvent, (WPARAM)KS_CONN_STATE_RETRYNOCONN, (LPARAM)retryCount + 1); - ProcessPopup(KS_CONN_STATE_RETRYNOCONN, 0); - } - else { - NotifyEventHooks(hConnectionEvent, (WPARAM)KS_CONN_STATE_RETRY, (LPARAM)retryCount + 1); - SetCurrentStatus(); // set the status - } - retryCount += 1; - StartTimer(IDT_AFTERCHECK, min(currentDelay, AFTERCHECK_DELAY) / 2, FALSE); - StartTimer(IDT_CHECKCONN, currentDelay, TRUE); // restart this timer - } - else // all status set ok already, or stop checking - StopChecking(); - - log_debugA("CheckConnectionTimer done"); -} - -static int StopChecking() -{ - StopTimer(IDT_CHECKCONN | IDT_PROCESSACK | IDT_AFTERCHECK | IDT_CHECKCONNECTING); - - BOOL isOk = TRUE; - for (auto &it : protoList) { - int curStatus = it->GetStatus(); - int newStatus = Proto_GetStatus(it->m_szName); - if (newStatus != curStatus) { - it->AssignStatus(newStatus); - isOk = FALSE; - break; - } - } - - NotifyEventHooks(hConnectionEvent, (WPARAM)KS_CONN_STATE_STOPPEDCHECKING, (LPARAM)isOk); - ProcessPopup(KS_CONN_STATE_STOPPEDCHECKING, (LPARAM)isOk); - log_infoA("KeepStatus: stop checking (%s)", isOk ? "success" : "failure"); - retryCount = 0; - currentDelay = initDelay; - - return 0; -} - -static VOID CALLBACK AfterCheckTimer(HWND, UINT, UINT_PTR, DWORD) -{ - // after each connection check, this function is called to see if connection was recovered - StopTimer(IDT_AFTERCHECK); - - bool setStatus = false; - - for (auto &it : protoList) { - int realStatus = Proto_GetStatus(it->m_szName); - int shouldBeStatus = it->GetStatus(); - if (shouldBeStatus == ID_STATUS_LAST) // this should never happen - shouldBeStatus = it->m_lastStatus; - if (shouldBeStatus == ID_STATUS_DISABLED) // (on ignoring proto) - continue; - if ((shouldBeStatus != realStatus) && (realStatus == ID_STATUS_OFFLINE) || (realStatus < MIN_STATUS)) - setStatus = true; - } - - if (!setStatus || retryCount == maxRetries) - StopChecking(); -} - -static void CheckContinuouslyFunction(void *) -{ - Thread_SetName("KeepStatus: CheckContinuouslyFunction"); - - static int pingFailures = 0; - - // one at the time is enough, do it the 'easy' way - mir_cslock lck(CheckContinueslyCS); - - // do a ping, even if reconnecting - bool doPing = false; - for (auto &it : protoList) { - int shouldBeStatus = it->GetStatus(); - if (shouldBeStatus == ID_STATUS_LAST) - shouldBeStatus = it->m_lastStatus; - - if (shouldBeStatus == ID_STATUS_DISABLED) - continue; - - if (shouldBeStatus != ID_STATUS_OFFLINE) { - log_debugA("CheckContinuouslyFunction: %s should be %d", it->m_szName, shouldBeStatus); - doPing = true; - } - } - - if (!doPing) { - log_debugA("CheckContinuouslyFunction: All protocols should be offline, no need to check connection"); - return; - } - - BOOL ping = db_get_b(0, KSMODULENAME, SETTING_BYPING, FALSE); - if (ping) { - DBVARIANT dbv; - if (db_get(0, KSMODULENAME, SETTING_PINGHOST, &dbv)) - ping = FALSE; - else { - char *start, *end; - char host[MAX_PATH]; - DWORD *addr; - struct hostent *hostent; - char reply[sizeof(ICMP_ECHO_REPLY) + 8]; - - bLastPingResult = FALSE; - HANDLE hICMPFile = (HANDLE)IcmpCreateFile(); - if (hICMPFile == INVALID_HANDLE_VALUE) { - bLastPingResult = TRUE; - log_infoA("KeepStatus: icmp.dll error (2)"); - } - if (bLastPingResult == FALSE) { - start = dbv.pszVal; - while ((*start != '\0') && (!bLastPingResult)) { - end = start; - while ((*end != ' ') && (*end != '\0')) - end++; - memset(host, '\0', sizeof(host)); - strncpy(host, start, end - start); - hostent = gethostbyname(host); - if (hostent != nullptr) { - addr = (DWORD *)(*hostent->h_addr_list); - bLastPingResult = (IcmpSendEcho(hICMPFile, *addr, nullptr, 0, nullptr, reply, sizeof(ICMP_ECHO_REPLY) + 8, 5000) != 0); - - if (bLastPingResult) - pingFailures = 0; - else - pingFailures++; - - log_debugA("CheckContinuouslyFunction: pinging %s (result: %d/%d)", host, bLastPingResult, pingFailures); - } - else log_debugA("CheckContinuouslyFunction: unable to resolve %s", host); - - start = end; - while (*start == ' ') - start++; - } - } - IcmpCloseHandle(hICMPFile); - } - db_free(&dbv); - } - - if (StartTimer(IDT_CHECKCONN, -1, FALSE)) // already connecting, leave - return; - - if (((!ping) && (!InternetGetConnectedState(nullptr, 0))) || ((ping) && (!bLastPingResult) && (pingFailures >= db_get_w(0, KSMODULENAME, SETTING_PINGCOUNT, DEFAULT_PINGCOUNT)))) { - pingFailures = 0; - - for (auto &pa : Accounts()) { - if (!IsSuitableProto(pa)) - continue; - - if (IsStatusConnecting(pa->iRealStatus)) { - log_debugA("CheckContinuouslyFunction: %s is connecting", pa->szModuleName); - continue; // connecting, leave alone - } - if (IsProtocolEnabledService(0, (LPARAM)pa->szModuleName)) { - log_debugA("CheckContinuouslyFunction: forcing %s offline", pa->szModuleName); - CallProtoService(pa->szModuleName, PS_SETSTATUS, (WPARAM)ID_STATUS_OFFLINE, 0); - } - } - - if (StartTimer(IDT_CHECKCONN | IDT_PROCESSACK, -1, FALSE)) {// are our 'set offlines' noticed? - log_debugA("CheckContinuouslyFunction: currently checking"); - return; - } - - log_infoA("KeepStatus: connection lost! (continuesly check)"); - NotifyEventHooks(hConnectionEvent, (WPARAM)KS_CONN_STATE_LOST, 0); - ProcessPopup(KS_CONN_STATE_LOST, 0); - maxRetries = db_get_b(0, KSMODULENAME, SETTING_MAXRETRIES, 0); - if (maxRetries == 0) - maxRetries = -1; - StartTimer(IDT_CHECKCONN, initDelay, FALSE); - } -} - -static VOID CALLBACK CheckContinueslyTimer(HWND, UINT, UINT_PTR, DWORD) -{ - if (db_get_b(0, KSMODULENAME, SETTING_BYPING, FALSE)) - mir_forkthread(CheckContinuouslyFunction); - else - CheckContinuouslyFunction(nullptr); -} - -///////////////////////////////////////////////////////////////////////////////////////// -// popup - -static INT_PTR ShowPopup(const wchar_t *msg, HICON hIcon) -{ - POPUPDATAT ppd = {}; - ppd.lchIcon = hIcon; - wcsncpy(ppd.lptzContactName, TranslateT("Keep status"), MAX_CONTACTNAME); - wcsncpy(ppd.lptzText, msg, MAX_SECONDLINE); - if (db_get_b(0, KSMODULENAME, SETTING_POPUP_USEWINCOLORS, 0)) { - ppd.colorBack = GetSysColor(COLOR_BTNFACE); - ppd.colorText = GetSysColor(COLOR_WINDOWTEXT); - } - else if (!db_get_b(0, KSMODULENAME, SETTING_POPUP_USEDEFCOLORS, 0)) { - ppd.colorBack = db_get_dw(0, KSMODULENAME, SETTING_POPUP_BACKCOLOR, 0xAAAAAA); - ppd.colorText = db_get_dw(0, KSMODULENAME, SETTING_POPUP_TEXTCOLOR, 0x0000CC); - } - ppd.PluginWindowProc = KSPopupDlgProc; - - switch (db_get_b(0, KSMODULENAME, SETTING_POPUP_DELAYTYPE, POPUP_DELAYFROMPU)) { - case POPUP_DELAYCUSTOM: - ppd.iSeconds = (int)db_get_dw(0, KSMODULENAME, SETTING_POPUP_TIMEOUT, 0); - if (ppd.iSeconds == 0) - ppd.iSeconds = currentDelay / 1000 - 1; - break; - - case POPUP_DELAYPERMANENT: - ppd.iSeconds = -1; - break; - - case POPUP_DELAYFROMPU: - default: - ppd.iSeconds = 0; - break; - } - return PUAddPopupT(&ppd); -} - -static wchar_t* GetHumanName(LPARAM lParam) -{ - PROTOACCOUNT *ProtoAccount = Proto_GetAccount((char*)lParam); - return (ProtoAccount != nullptr) ? ProtoAccount->tszAccountName : TranslateT("Protocol"); -} - -static int ProcessPopup(int reason, LPARAM lParam) -{ - if (!db_get_b(0, KSMODULENAME, SETTING_SHOWCONNECTIONPOPUPS, FALSE) || !ServiceExists(MS_POPUP_ADDPOPUPT)) - return -1; - - HICON hIcon = nullptr; - CMStringW wszText; - - switch (reason) { - case KS_CONN_STATE_OTHERLOCATION: // lParam = 1 proto - if (!db_get_b(0, KSMODULENAME, SETTING_PUOTHER, TRUE)) - return -1; - - hIcon = Skin_LoadProtoIcon((char*)lParam, SKINICON_STATUS_OFFLINE); - wszText.Format(TranslateT("%s connected from another location"), GetHumanName(lParam)); - break; - - case KS_CONN_STATE_LOGINERROR: // lParam = 1 proto - if (!db_get_b(0, KSMODULENAME, SETTING_PUOTHER, TRUE)) - return -1; - - hIcon = Skin_LoadProtoIcon((char*)lParam, SKINICON_STATUS_OFFLINE); - if (db_get_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_NOTHING) == LOGINERR_CANCEL) - wszText.Format(TranslateT("%s login error, cancel reconnecting"), GetHumanName(lParam)); - else if (db_get_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_NOTHING) == LOGINERR_SETDELAY) - wszText.Format(TranslateT("%s login error (next retry (%d) in %d s)"), GetHumanName(lParam), retryCount + 1, db_get_dw(0, KSMODULENAME, SETTING_LOGINERR_DELAY, DEFAULT_MAXDELAY)); - else - return -1; - break; - - case KS_CONN_STATE_LOST: // lParam = 1 proto, or nullptr - if (!db_get_b(0, KSMODULENAME, SETTING_PUCONNLOST, TRUE)) - return -1; - - if (lParam) { // указатель на имя модуля. - hIcon = Skin_LoadProtoIcon((char*)lParam, SKINICON_STATUS_OFFLINE); - wszText.Format(TranslateT("%s status error (next retry (%d) in %d s)"), GetHumanName(lParam), retryCount + 1, currentDelay / 1000); - } - else wszText.Format(TranslateT("Status error (next retry (%d) in %d s)"), retryCount + 1, currentDelay / 1000); - break; - - case KS_CONN_STATE_RETRY: // lParam = PROTOCOLSETTINGEX** - if (!db_get_b(0, KSMODULENAME, SETTING_PUCONNRETRY, TRUE)) - return -1; - - if (lParam) { - PROTOCOLSETTINGEX **ps = (PROTOCOLSETTINGEX **)lParam; - - if (retryCount == maxRetries - 1) - wszText.Format(TranslateT("Resetting status... (last try (%d))"), retryCount + 1); - else - wszText.Format(TranslateT("Resetting status... (next retry (%d) in %d s)"), retryCount + 2, currentDelay / 1000); - wszText.Append(L"\r\n"); - for (int i = 0; i < protoList.getCount(); i++) { - PROTOCOLSETTINGEX *p = ps[i]; - if (p->m_status == ID_STATUS_DISABLED) - continue; - - if (mir_wstrlen(p->m_tszAccName) > 0) - if (db_get_b(0, KSMODULENAME, SETTING_PUSHOWEXTRA, TRUE)) - wszText.AppendFormat(TranslateT("%s\t(will be set to %s)\r\n"), p->m_tszAccName, Clist_GetStatusModeDescription(p->m_status, 0)); - } - - hIcon = Skin_LoadProtoIcon(ps[0]->m_szName, SKINICON_STATUS_OFFLINE); - wszText.TrimRight(); - } - break; - - case KS_CONN_STATE_RETRYNOCONN: // lParam = nullptr - if (!db_get_b(0, KSMODULENAME, SETTING_PUOTHER, TRUE)) - return -1; - - if (retryCount == maxRetries - 1) - wszText.Format(TranslateT("No internet connection seems available... (last try (%d))"), retryCount + 1); - else - wszText.Format(TranslateT("No internet connection seems available... (next retry (%d) in %d s)"), retryCount + 2, currentDelay / 1000); - break; - - case KS_CONN_STATE_STOPPEDCHECKING: // lParam == BOOL succes - if (!db_get_b(0, KSMODULENAME, SETTING_PURESULT, TRUE)) - return -1; - - if (lParam) { - hIcon = Skin_LoadIcon(SKINICON_STATUS_ONLINE); - wszText.Format(TranslateT("Status was set ok")); - } - else wszText.Format(TranslateT("Giving up")); - break; - } - if (hIcon == nullptr) - hIcon = Skin_LoadIcon(SKINICON_STATUS_OFFLINE); - - log_info(L"KeepStatus: %s", wszText.c_str()); - return ShowPopup(wszText, hIcon); -} - -LRESULT CALLBACK KSPopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_CONTEXTMENU: // right - case WM_COMMAND: // left - switch (db_get_b(0, KSMODULENAME, - (message == WM_COMMAND) ? SETTING_POPUP_LEFTCLICK : SETTING_POPUP_RIGHTCLICK, - POPUP_ACT_CLOSEPOPUP)) { - case POPUP_ACT_CANCEL: - // cancel timer - StopChecking(); - PUDeletePopup(hWnd); - break; - - case POPUP_ACT_CLOSEPOPUP: - // close the popup - PUDeletePopup(hWnd); - break; - } - break; - } - - return DefWindowProc(hWnd, message, wParam, lParam); -} - -///////////////////////////////////////////////////////////////////////////////////////// -// services - -INT_PTR StopReconnectingService(WPARAM, LPARAM) -{ - int ret = StartTimer(IDT_CHECKCONN | IDT_AFTERCHECK, -1, FALSE); - StopChecking(); - return ret; -} - -INT_PTR EnableProtocolService(WPARAM wParam, LPARAM lParam) -{ - char *szProto = (char *)lParam; - if (szProto == nullptr) - return -1; - - char dbSetting[128]; - mir_snprintf(dbSetting, "%s_enabled", szProto); - if (!db_get_b(0, KSMODULENAME, dbSetting, 1)) // 'hard' disabled - return -1; - - int ret = -2; - for (auto &it : protoList) { - if (!mir_strcmp(szProto, it->m_szName)) { - if (wParam) - it->AssignStatus(Proto_GetStatus(it->m_szName)); - else - it->AssignStatus(ID_STATUS_DISABLED); - - ret = 0; - break; - } - } - return ret; -} - -INT_PTR IsProtocolEnabledService(WPARAM, LPARAM lParam) -{ - char *szProto = (char *)lParam; - - char dbSetting[128]; - mir_snprintf(dbSetting, "%s_enabled", szProto); - if (!db_get_b(0, KSMODULENAME, dbSetting, 1)) - return FALSE; - - for (auto &it : protoList) - if (!mir_strcmp(szProto, it->m_szName)) - return it->GetStatus() != ID_STATUS_DISABLED; - - return FALSE; -} - -INT_PTR AnnounceStatusChangeService(WPARAM, LPARAM lParam) -{ - PROTOCOLSETTINGEX *newSituation = (PROTOCOLSETTINGEX *)lParam; - log_infoA("Another plugin announced a status change to %d for %s", newSituation->m_status, newSituation->m_szName == nullptr ? "all" : newSituation->m_szName); - - for (auto &it : protoList) - if (!mir_strcmp(it->m_szName, newSituation->m_szName)) - it->AssignStatus(newSituation->m_status, newSituation->m_lastStatus, newSituation->m_szMsg); - - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// window for suspend - -static DWORD CALLBACK MessageWndProc(HWND, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static TProtoSettings *ps = nullptr; - - switch (msg) { - case WM_POWERBROADCAST: - switch (wParam) { - case PBT_APMSUSPEND: - log_infoA("KeepStatus: suspend state detected: %08X %08X", wParam, lParam); - if (ps == nullptr) { - ps = new TProtoSettings(protoList); - for (auto &it : *ps) - EnableProtocolService(0, (LPARAM)it->m_szName); - - // set proto's offline, the clist will not try to reconnect in that case - Clist_SetStatusMode(ID_STATUS_OFFLINE); - } - break; - - case PBT_APMRESUMESUSPEND: - case PBT_APMRESUMECRITICAL: - // case PBT_APMRESUMEAUTOMATIC: ? - log_infoA("KeepStatus: resume from suspend state"); - if (ps != nullptr) { - for (auto &it : *ps) { - SMProto *p = protoList.find(it); - if (p) - p->AssignStatus(it->m_status, it->m_lastStatus, it->m_szMsg); - } - delete ps; - ps = nullptr; - } - StartTimer(IDT_PROCESSACK, 0, FALSE); - break; - } - break; - - case WM_DESTROY: - if (ps != nullptr) { - delete ps; - ps = nullptr; - } - break; - } - - return TRUE; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// init stuff - -static int onShutdown(WPARAM, LPARAM) -{ - KSUnloadOptions(); - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -int KSModuleLoaded(WPARAM, LPARAM) -{ - hMessageWindow = nullptr; - KSLoadOptions(); - - hEvents[0] = HookEvent(ME_OPT_INITIALISE, KeepStatusOptionsInit); - hEvents[1] = HookEvent(ME_SYSTEM_PRESHUTDOWN, onShutdown); - return 0; -} - -void KeepStatusLoad() -{ - KSLangPack = GetPluginLangId(MIID_LAST, 0); - - if (g_bMirandaLoaded) - KSModuleLoaded(0, 0); - else - HookEvent(ME_SYSTEM_MODULESLOADED, KSModuleLoaded); - - hConnectionEvent = CreateHookableEvent(ME_KS_CONNECTIONEVENT); - - hServices[0] = CreateServiceFunction(MS_KS_STOPRECONNECTING, StopReconnectingService); - hServices[1] = CreateServiceFunction(MS_KS_ENABLEPROTOCOL, EnableProtocolService); - hServices[2] = CreateServiceFunction(MS_KS_ISPROTOCOLENABLED, IsProtocolEnabledService); - hServices[3] = CreateServiceFunction(MS_KS_ANNOUNCESTATUSCHANGE, AnnounceStatusChangeService); -} - -void KeepStatusUnload() -{ - if (g_bMirandaLoaded) - onShutdown(0, 0); - - KillModuleOptions(KSLangPack); - - for (auto &it : hServices) { - DestroyServiceFunction(it); - it = nullptr; - } - - for (auto &it : hEvents) { - UnhookEvent(it); - it = nullptr; - } - - DestroyHookableEvent(hConnectionEvent); hConnectionEvent = nullptr; -} diff --git a/plugins/StatusManager/src/KeepStatus/keepstatus.h b/plugins/StatusManager/src/KeepStatus/keepstatus.h deleted file mode 100644 index e4b1f5a7a4..0000000000 --- a/plugins/StatusManager/src/KeepStatus/keepstatus.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - KeepStatus Plugin for Miranda-IM (www.miranda-im.org) - Copyright 2003-2006 P. Boon - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __KEEPSTATUS_HEADER -#define __KEEPSTATUS_HEADER - -#define KSMODULENAME "KeepStatus" -#define SETTING_CHECKCONNECTION "CheckConnection" -#define SETTING_MAXRETRIES "MaxRetries" -#define SETTING_INCREASEEXPONENTIAL "IncreaseExponential" -#define SETTING_INITDELAY "InitDelay" -#define SETTING_MAXDELAY "MaxDelay" -#define SETTING_SHOWCONNECTIONPOPUPS "ShowConnectionPopups" -#define SETTING_CHKINET "CheckInet" -#define SETTING_CNCOTHERLOC "CancelIfOtherLocation" -#define SETTING_LOGINERR "OnLoginErr" -#define SETTING_LOGINERR_DELAY "OnLoginErrDelay" -#define SETTING_CONTCHECK "ContinueslyCheck" -#define SETTING_BYPING "ByPingingHost" -#define SETTING_PINGHOST "HostToPing" -#define SETTING_CHECKAPMRESUME "CheckAPMResume" -#define SETTING_FIRSTOFFLINE "FirstOffline" -#define SETTING_NOLOCKED "NoLocked" -#define SETTING_MAXCONNECTINGTIME "MaxConnectingTime" -#define SETTING_PINGCOUNT "PingCount" -#define DEFAULT_PINGCOUNT 1 -#define SETTING_CNTDELAY "CntDelay" -#define STATUSCHANGEDELAY 500 // ms -#define DEFAULT_MAXRETRIES 0 -#define DEFAULT_INITDELAY 10 // s -#define DEFAULT_MAXDELAY 900 // s -#define AFTERCHECK_DELAY 10000 //ms (divided by 2) -#define CHECKCONTIN_DELAY 10 // s -#define SETTING_POPUP_DELAYTYPE "PopupDelayType" -#define SETTING_POPUP_USEWINCOLORS "PopupUseWinColors" -#define SETTING_POPUP_USEDEFCOLORS "PopupUseDefColors" -#define SETTING_POPUP_BACKCOLOR "PopupBackColor" -#define SETTING_POPUP_TEXTCOLOR "PopupTextColor" -#define SETTING_POPUP_TIMEOUT "PopupTimeout" -#define SETTING_POPUP_LEFTCLICK "PopupLeftClickAction" -#define SETTING_POPUP_RIGHTCLICK "PopupRightClickAction" -#define SETTING_PUOTHER "PopupShowOther" -#define SETTING_PUCONNLOST "PopupShowConnLost" -#define SETTING_PUCONNRETRY "PopupShowConnRetry" -#define SETTING_PURESULT "PopupShowResult" -#define SETTING_PUSHOWEXTRA "PopupShowExtra" -#define POPUP_ACT_NOTHING 0 -#define POPUP_ACT_CANCEL 1 -#define POPUP_ACT_CLOSEPOPUP 2 -#define POPUP_DELAYFROMPU 0 -#define POPUP_DELAYCUSTOM 1 -#define POPUP_DELAYPERMANENT 2 -#define LOGINERR_NOTHING 0 -#define LOGINERR_CANCEL 1 -#define LOGINERR_SETDELAY 2 - -#define IDT_PROCESSACK 0x01 -#define IDT_CHECKCONN 0x02 -#define IDT_AFTERCHECK 0x04 -#define IDT_CHECKCONTIN 0x08 -#define IDT_CHECKCONNECTING 0x10 - -// action -#define SETTING_ENABLECHECKING "EnableChecking" -// trigger -#define TRIGGERNAME "KeepStatus: Connection state change" -#define TRIGGER_CONNLOST 0x01 -#define TRIGGER_LOGINERROR 0x02 -#define TRIGGER_OTHERLOC 0x04 -#define TRIGGER_CONNRETRY 0x08 -#define TRIGGER_CONNSUCCESS 0x10 -#define TRIGGER_CONNGIVEUP 0x20 -#define SETTING_TRIGGERON "TriggerOn" - -/* old; replaced by PROTOCOLSETTINGEX see m_statusplugins.h */ -typedef struct { - char *szName; // pointer to protocol modulename - WORD status; // the status - WORD lastStatus;// last status -} PROTOCOLSETTING; - -/* old; replaced by ME_CS_STATUSCHANGE see m_statusplugins.h */ -// wParam = PROTOCOLSETTING** -// lParam = 0 -#define ME_CS_STATUSCHANGE "CommonStatus/StatusChange" - -///////////////////////////////////////////////////////////////////////////////////////// -// keepstatus.cpp - -void KeepStatusLoad(); -void KeepStatusUnload(); -int KSLoadOptions(); - -LRESULT CALLBACK KSPopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - -#endif //__KEEPSTATUS_HEADER diff --git a/plugins/StatusManager/src/KeepStatus/ks_options.cpp b/plugins/StatusManager/src/KeepStatus/ks_options.cpp deleted file mode 100644 index fe96ea81b2..0000000000 --- a/plugins/StatusManager/src/KeepStatus/ks_options.cpp +++ /dev/null @@ -1,487 +0,0 @@ -/* - KeepStatus Plugin for Miranda-IM (www.miranda-im.org) - Copyright 2003-2006 P. Boon - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "..\stdafx.h" - -///////////////////////////////////////////////////////////////////////////////////////// -// Basic options - -static INT_PTR CALLBACK DlgProcKSBasicOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - { - LVCOLUMN lvCol; - LVITEM lvItem; - DBVARIANT dbv; - - SetDlgItemInt(hwndDlg, IDC_MAXRETRIES, db_get_b(0, KSMODULENAME, SETTING_MAXRETRIES, DEFAULT_MAXRETRIES), FALSE); - SetDlgItemInt(hwndDlg, IDC_INITDELAY, db_get_dw(0, KSMODULENAME, SETTING_INITDELAY, DEFAULT_INITDELAY), FALSE); - CheckDlgButton(hwndDlg, IDC_CHECKCONNECTION, db_get_b(0, KSMODULENAME, SETTING_CHECKCONNECTION, FALSE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_SHOWCONNECTIONPOPUPS, (db_get_b(0, KSMODULENAME, SETTING_SHOWCONNECTIONPOPUPS, FALSE) && ServiceExists(MS_POPUP_SHOWMESSAGE)) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHKINET, db_get_b(0, KSMODULENAME, SETTING_CHKINET, FALSE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CONTCHECK, db_get_b(0, KSMODULENAME, SETTING_CONTCHECK, FALSE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_BYPING, db_get_b(0, KSMODULENAME, SETTING_BYPING, FALSE) ? BST_CHECKED : BST_UNCHECKED); - if (!db_get_s(0, KSMODULENAME, SETTING_PINGHOST, &dbv)) { - SetDlgItemTextA(hwndDlg, IDC_PINGHOST, dbv.pszVal); - db_free(&dbv); - } - - // proto list - HWND hList = GetDlgItem(hwndDlg, IDC_PROTOCOLLIST); - ListView_SetExtendedListViewStyleEx(hList, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); - memset(&lvCol, 0, sizeof(lvCol)); - lvCol.mask = LVCF_WIDTH | LVCF_TEXT; - lvCol.pszText = TranslateT("Protocol"); - lvCol.cx = 118; - ListView_InsertColumn(hList, 0, &lvCol); - // fill the list - memset(&lvItem, 0, sizeof(lvItem)); - lvItem.mask = LVIF_TEXT | LVIF_PARAM; - lvItem.iItem = 0; - lvItem.iSubItem = 0; - - for (auto &pa : Accounts()) { - if (!IsSuitableProto(pa)) - continue; - - lvItem.pszText = pa->tszAccountName; - lvItem.lParam = (LPARAM)pa->szModuleName; - ListView_InsertItem(hList, &lvItem); - - char dbSetting[128]; - mir_snprintf(dbSetting, "%s_enabled", pa->szModuleName); - ListView_SetCheckState(hList, lvItem.iItem, db_get_b(0, KSMODULENAME, dbSetting, TRUE)); - lvItem.iItem++; - } - EnableWindow(GetDlgItem(hwndDlg, IDC_MAXRETRIES), IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)); - EnableWindow(GetDlgItem(hwndDlg, IDC_SHOWCONNECTIONPOPUPS), ServiceExists(MS_POPUP_SHOWMESSAGE) && IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)); - EnableWindow(GetDlgItem(hwndDlg, IDC_INITDELAY), IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)); - EnableWindow(GetDlgItem(hwndDlg, IDC_PROTOCOLLIST), IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)); - EnableWindow(GetDlgItem(hwndDlg, IDC_CHKINET), IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)); - EnableWindow(GetDlgItem(hwndDlg, IDC_CONTCHECK), IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)); - EnableWindow(GetDlgItem(hwndDlg, IDC_BYPING), (IsDlgButtonChecked(hwndDlg, IDC_CONTCHECK) && IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)) ? TRUE : FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_PINGHOST), (IsDlgButtonChecked(hwndDlg, IDC_CONTCHECK)) && (IsDlgButtonChecked(hwndDlg, IDC_BYPING) && IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)) ? TRUE : FALSE); - } - break; - - case WM_COMMAND: - if (((HIWORD(wParam) == EN_CHANGE) || (HIWORD(wParam) == BN_CLICKED)) && ((HWND)lParam == GetFocus())) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - // something changed - switch (LOWORD(wParam)) { - case IDC_CHECKCONNECTION: - case IDC_CONTCHECK: - case IDC_BYPING: - BOOL bEnabled = IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION); - EnableWindow(GetDlgItem(hwndDlg, IDC_MAXRETRIES), bEnabled); - EnableWindow(GetDlgItem(hwndDlg, IDC_SHOWCONNECTIONPOPUPS), ServiceExists(MS_POPUP_SHOWMESSAGE) && bEnabled); - EnableWindow(GetDlgItem(hwndDlg, IDC_INITDELAY), bEnabled); - EnableWindow(GetDlgItem(hwndDlg, IDC_PROTOCOLLIST), bEnabled); - EnableWindow(GetDlgItem(hwndDlg, IDC_CHKINET), bEnabled); - EnableWindow(GetDlgItem(hwndDlg, IDC_CONTCHECK), bEnabled); - EnableWindow(GetDlgItem(hwndDlg, IDC_BYPING), (IsDlgButtonChecked(hwndDlg, IDC_CONTCHECK) && bEnabled) ? TRUE : FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_PINGHOST), (IsDlgButtonChecked(hwndDlg, IDC_CONTCHECK)) && (IsDlgButtonChecked(hwndDlg, IDC_BYPING) && bEnabled) ? TRUE : FALSE); - break; - } - break; - - case WM_NOTIFY: - if (((NMHDR*)lParam)->idFrom == IDC_PROTOCOLLIST) { - switch (((NMHDR*)lParam)->code) { - case LVN_ITEMCHANGED: - NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; - if (IsWindowVisible(GetDlgItem(hwndDlg, IDC_PROTOCOLLIST)) && ((nmlv->uNewState^nmlv->uOldState)&LVIS_STATEIMAGEMASK)) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - } - } - - switch (((LPNMHDR)lParam)->code) { - case PSN_WIZFINISH: - KSLoadOptions(); - break; - - case PSN_APPLY: - db_set_b(0, KSMODULENAME, SETTING_MAXRETRIES, (BYTE)GetDlgItemInt(hwndDlg, IDC_MAXRETRIES, nullptr, FALSE)); - db_set_b(0, KSMODULENAME, SETTING_CHECKCONNECTION, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CHECKCONNECTION)); - db_set_b(0, KSMODULENAME, SETTING_SHOWCONNECTIONPOPUPS, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SHOWCONNECTIONPOPUPS)); - db_set_dw(0, KSMODULENAME, SETTING_INITDELAY, (DWORD)GetDlgItemInt(hwndDlg, IDC_INITDELAY, nullptr, FALSE)); - db_set_b(0, KSMODULENAME, SETTING_CHKINET, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CHKINET)); - db_set_b(0, KSMODULENAME, SETTING_CONTCHECK, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CONTCHECK)); - db_set_b(0, KSMODULENAME, SETTING_BYPING, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_BYPING)); - if (IsDlgButtonChecked(hwndDlg, IDC_BYPING)) { - int len = SendDlgItemMessage(hwndDlg, IDC_PINGHOST, WM_GETTEXTLENGTH, 0, 0); - if (len > 0) { - ptrA host((char*)mir_alloc(len + 1)); - GetDlgItemTextA(hwndDlg, IDC_PINGHOST, host, len + 1); - db_set_s(0, KSMODULENAME, SETTING_PINGHOST, host); - } - } - - HWND hList = GetDlgItem(hwndDlg, IDC_PROTOCOLLIST); - LVITEM lvItem; - lvItem.mask = LVIF_PARAM; - for (int i = 0; i < ListView_GetItemCount(hList); i++) { - lvItem.iItem = i; - lvItem.iSubItem = 0; - ListView_GetItem(hList, &lvItem); - - char dbSetting[128]; - mir_snprintf(dbSetting, "%s_enabled", (char *)lvItem.lParam); - db_set_b(0, KSMODULENAME, dbSetting, (BYTE)ListView_GetCheckState(hList, lvItem.iItem)); - } - } - break; - } - - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// Advanced options - -static INT_PTR CALLBACK DlgProcKSAdvOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - SetDlgItemInt(hwndDlg, IDC_MAXDELAY, db_get_dw(0, KSMODULENAME, SETTING_MAXDELAY, DEFAULT_MAXDELAY), FALSE); - SetDlgItemInt(hwndDlg, IDC_MAXCONNECTINGTIME, db_get_dw(0, KSMODULENAME, SETTING_MAXCONNECTINGTIME, 0), FALSE); - CheckDlgButton(hwndDlg, IDC_INCREASEEXPONENTIAL, db_get_b(0, KSMODULENAME, SETTING_INCREASEEXPONENTIAL, FALSE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CNCOTHERLOC, (db_get_b(0, KSMODULENAME, SETTING_CNCOTHERLOC, FALSE)) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_LOGINERR, db_get_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_NOTHING) == LOGINERR_NOTHING ? BST_UNCHECKED : BST_CHECKED); - CheckDlgButton(hwndDlg, IDC_CHECKAPMRESUME, (db_get_b(0, KSMODULENAME, SETTING_CHECKAPMRESUME, FALSE)) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_FIRSTOFFLINE, (db_get_b(0, KSMODULENAME, SETTING_FIRSTOFFLINE, FALSE)) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_NOLOCKED, (db_get_b(0, KSMODULENAME, SETTING_NOLOCKED, FALSE)) ? BST_CHECKED : BST_UNCHECKED); - SetDlgItemInt(hwndDlg, IDC_LOGINERR_DELAY, db_get_dw(0, KSMODULENAME, SETTING_LOGINERR_DELAY, DEFAULT_MAXDELAY), FALSE); - SetDlgItemInt(hwndDlg, IDC_PINGCOUNT, db_get_w(0, KSMODULENAME, SETTING_PINGCOUNT, DEFAULT_PINGCOUNT), FALSE); - SetDlgItemInt(hwndDlg, IDC_CNTDELAY, db_get_dw(0, KSMODULENAME, SETTING_CNTDELAY, CHECKCONTIN_DELAY), FALSE); - - switch (db_get_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_CANCEL)) { - case LOGINERR_SETDELAY: - CheckRadioButton(hwndDlg, IDC_LOGINERR_CANCEL, IDC_LOGINERR_SETDELAY, IDC_LOGINERR_SETDELAY); - break; - default: - case LOGINERR_CANCEL: - CheckRadioButton(hwndDlg, IDC_LOGINERR_CANCEL, IDC_LOGINERR_SETDELAY, IDC_LOGINERR_CANCEL); - break; - } - - EnableWindow(GetDlgItem(hwndDlg, IDC_LOGINERR_CANCEL), IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - EnableWindow(GetDlgItem(hwndDlg, IDC_LOGINERR_SETDELAY), IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - EnableWindow(GetDlgItem(hwndDlg, IDC_LOGINERR_DELAY), IsDlgButtonChecked(hwndDlg, IDC_LOGINERR_SETDELAY) && IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - break; - - case WM_COMMAND: - if (((HIWORD(wParam) == EN_CHANGE) || (HIWORD(wParam) == BN_CLICKED)) && ((HWND)lParam == GetFocus())) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - - // something changed - switch (LOWORD(wParam)) { - case IDC_LOGINERR: - EnableWindow(GetDlgItem(hwndDlg, IDC_LOGINERR_CANCEL), IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - EnableWindow(GetDlgItem(hwndDlg, IDC_LOGINERR_SETDELAY), IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - EnableWindow(GetDlgItem(hwndDlg, IDC_LOGINERR_DELAY), IsDlgButtonChecked(hwndDlg, IDC_LOGINERR_SETDELAY) && IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - break; - - case IDC_LOGINERR_CANCEL: - case IDC_LOGINERR_SETDELAY: - CheckRadioButton(hwndDlg, IDC_LOGINERR_CANCEL, IDC_LOGINERR_SETDELAY, LOWORD(wParam)); - EnableWindow(GetDlgItem(hwndDlg, IDC_LOGINERR_DELAY), IsDlgButtonChecked(hwndDlg, IDC_LOGINERR_SETDELAY) && IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - break; - } - break; - - case WM_NOTIFY: - switch (((LPNMHDR)lParam)->code) { - case PSN_WIZFINISH: - KSLoadOptions(); - break; - - case PSN_APPLY: - db_set_b(0, KSMODULENAME, SETTING_INCREASEEXPONENTIAL, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_INCREASEEXPONENTIAL)); - db_set_dw(0, KSMODULENAME, SETTING_MAXDELAY, (DWORD)GetDlgItemInt(hwndDlg, IDC_MAXDELAY, nullptr, FALSE)); - db_set_dw(0, KSMODULENAME, SETTING_MAXCONNECTINGTIME, (DWORD)GetDlgItemInt(hwndDlg, IDC_MAXCONNECTINGTIME, nullptr, FALSE)); - db_set_b(0, KSMODULENAME, SETTING_FIRSTOFFLINE, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_FIRSTOFFLINE)); - db_set_b(0, KSMODULENAME, SETTING_NOLOCKED, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_NOLOCKED)); - db_set_b(0, KSMODULENAME, SETTING_CNCOTHERLOC, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CNCOTHERLOC)); - db_set_b(0, KSMODULENAME, SETTING_LOGINERR, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)); - if (IsDlgButtonChecked(hwndDlg, IDC_LOGINERR)) { - if (IsDlgButtonChecked(hwndDlg, IDC_LOGINERR_SETDELAY)) { - db_set_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_SETDELAY); - db_set_dw(0, KSMODULENAME, SETTING_LOGINERR_DELAY, GetDlgItemInt(hwndDlg, IDC_LOGINERR_DELAY, nullptr, FALSE)); - } - else db_set_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_CANCEL); - } - else db_set_b(0, KSMODULENAME, SETTING_LOGINERR, LOGINERR_NOTHING); - - db_set_b(0, KSMODULENAME, SETTING_CHECKAPMRESUME, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CHECKAPMRESUME)); - db_set_w(0, KSMODULENAME, SETTING_PINGCOUNT, (WORD)GetDlgItemInt(hwndDlg, IDC_PINGCOUNT, nullptr, FALSE)); - db_set_dw(0, KSMODULENAME, SETTING_CNTDELAY, (DWORD)GetDlgItemInt(hwndDlg, IDC_CNTDELAY, nullptr, FALSE) == 0 ? CHECKCONTIN_DELAY : GetDlgItemInt(hwndDlg, IDC_CNTDELAY, nullptr, FALSE)); - } - break; - } - - return 0; -} - -///////////////////////////////////////////////////////////////////////////////////////// -// Popup options - -static INT_PTR CALLBACK PopupOptDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static bool bFreeze = false; - - switch (msg) { - case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - - bFreeze = true; - - // left action - switch (db_get_b(0, KSMODULENAME, SETTING_POPUP_LEFTCLICK, POPUP_ACT_CANCEL)) { - case POPUP_ACT_CLOSEPOPUP: - CheckDlgButton(hwndDlg, IDC_LCLOSE, BST_CHECKED); - break; - - case POPUP_ACT_CANCEL: - CheckDlgButton(hwndDlg, IDC_LCANCEL, BST_CHECKED); - break; - - case POPUP_ACT_NOTHING: - default: - CheckDlgButton(hwndDlg, IDC_LNOTHING, BST_CHECKED); - break; - } - - // right action - switch (db_get_b(0, KSMODULENAME, SETTING_POPUP_RIGHTCLICK, POPUP_ACT_CANCEL)) { - case POPUP_ACT_CLOSEPOPUP: - CheckDlgButton(hwndDlg, IDC_RCLOSE, BST_CHECKED); - break; - - case POPUP_ACT_CANCEL: - CheckDlgButton(hwndDlg, IDC_RCANCEL, BST_CHECKED); - break; - - case POPUP_ACT_NOTHING: - default: - CheckDlgButton(hwndDlg, IDC_RNOTHING, BST_CHECKED); - break; - } - - // delay - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAYCUSTOM), ServiceExists(MS_POPUP_ADDPOPUPT)); - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAYFROMPU), ServiceExists(MS_POPUP_ADDPOPUPT)); - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAYPERMANENT), ServiceExists(MS_POPUP_ADDPOPUPT)); - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAY), ServiceExists(MS_POPUP_ADDPOPUPT)); - switch (db_get_b(0, KSMODULENAME, SETTING_POPUP_DELAYTYPE, POPUP_DELAYFROMPU)) { - case POPUP_DELAYCUSTOM: - CheckDlgButton(hwndDlg, IDC_DELAYCUSTOM, BST_CHECKED); - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAY), ServiceExists(MS_POPUP_ADDPOPUPT)); - break; - - case POPUP_DELAYPERMANENT: - CheckDlgButton(hwndDlg, IDC_DELAYPERMANENT, BST_CHECKED); - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAY), FALSE); - break; - - case POPUP_DELAYFROMPU: - default: - CheckDlgButton(hwndDlg, IDC_DELAYFROMPU, BST_CHECKED); - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAY), FALSE); - break; - } - // delay - SetDlgItemInt(hwndDlg, IDC_DELAY, db_get_dw(0, KSMODULENAME, SETTING_POPUP_TIMEOUT, 0), FALSE); - // back color - SendDlgItemMessage(hwndDlg, IDC_BGCOLOR, CPM_SETCOLOUR, 0, db_get_dw(0, KSMODULENAME, SETTING_POPUP_BACKCOLOR, 0xAAAAAA)); - // text - SendDlgItemMessage(hwndDlg, IDC_TEXTCOLOR, CPM_SETCOLOUR, 0, db_get_dw(0, KSMODULENAME, SETTING_POPUP_TEXTCOLOR, 0x0000CC)); - // wincolors - CheckDlgButton(hwndDlg, IDC_WINCOLORS, db_get_b(0, KSMODULENAME, SETTING_POPUP_USEWINCOLORS, 0) ? BST_CHECKED : BST_UNCHECKED); - // defaultcolors - CheckDlgButton(hwndDlg, IDC_DEFAULTCOLORS, ((db_get_b(0, KSMODULENAME, SETTING_POPUP_USEDEFCOLORS, 0)) && (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS))) ? BST_CHECKED : BST_UNCHECKED); - EnableWindow(GetDlgItem(hwndDlg, IDC_BGCOLOR), ((BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS)) && (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS)))); - EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTCOLOR), ((BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS)) && (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS)))); - EnableWindow(GetDlgItem(hwndDlg, IDC_DEFAULTCOLORS), (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS))); - EnableWindow(GetDlgItem(hwndDlg, IDC_WINCOLORS), (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS))); - // popup types - CheckDlgButton(hwndDlg, IDC_PUCONNLOST, db_get_b(0, KSMODULENAME, SETTING_PUCONNLOST, TRUE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_PUOTHER, db_get_b(0, KSMODULENAME, SETTING_PUOTHER, TRUE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_PUCONNRETRY, db_get_b(0, KSMODULENAME, SETTING_PUCONNRETRY, TRUE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_PURESULT, db_get_b(0, KSMODULENAME, SETTING_PURESULT, TRUE) ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_PUSHOWEXTRA, db_get_b(0, KSMODULENAME, SETTING_PUSHOWEXTRA, TRUE) ? BST_CHECKED : BST_UNCHECKED); - bFreeze = false; - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_WINCOLORS: - case IDC_DEFAULTCOLORS: - EnableWindow(GetDlgItem(hwndDlg, IDC_BGCOLOR), ((BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS)) && (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS)))); - EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTCOLOR), ((BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS)) && (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS)))); - EnableWindow(GetDlgItem(hwndDlg, IDC_DEFAULTCOLORS), (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS))); - EnableWindow(GetDlgItem(hwndDlg, IDC_WINCOLORS), (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS))); - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - - case IDC_DELAYFROMPU: - case IDC_DELAYPERMANENT: - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAY), FALSE); - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - - case IDC_DELAYCUSTOM: - EnableWindow(GetDlgItem(hwndDlg, IDC_DELAY), TRUE); - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - - case IDC_BGCOLOR: - case IDC_TEXTCOLOR: - case IDC_DELAY: - case IDC_LNOTHING: - case IDC_LCLOSE: - case IDC_LCANCEL: - case IDC_RNOTHING: - case IDC_RCLOSE: - case IDC_RCANCEL: - case IDC_PUCONNLOST: - case IDC_PUOTHER: - case IDC_PUCONNRETRY: - case IDC_PURESULT: - case IDC_PUSHOWEXTRA: - if (!bFreeze) - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - - case IDC_PREV: - { - POPUPDATAT ppd = {}; - ppd.lchIcon = Skin_LoadIcon(SKINICON_STATUS_OFFLINE); - wcsncpy(ppd.lptzContactName, TranslateT("Keep status"), MAX_CONTACTNAME); - wcsncpy(ppd.lptzText, TranslateT("You broke the Internet!"), MAX_SECONDLINE); - if (IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS)) { - ppd.colorBack = GetSysColor(COLOR_BTNFACE); - ppd.colorText = GetSysColor(COLOR_WINDOWTEXT); - } - else if (IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS)) { - ppd.colorBack = 0; - ppd.colorText = 0; - } - else { - ppd.colorBack = SendDlgItemMessage(hwndDlg, IDC_BGCOLOR, CPM_GETCOLOUR, 0, 0); - ppd.colorText = SendDlgItemMessage(hwndDlg, IDC_TEXTCOLOR, CPM_GETCOLOUR, 0, 0); - } - ppd.PluginWindowProc = KSPopupDlgProc; - ppd.PluginData = nullptr; - if (IsDlgButtonChecked(hwndDlg, IDC_DELAYFROMPU)) { - ppd.iSeconds = 0; - } - else if (IsDlgButtonChecked(hwndDlg, IDC_DELAYCUSTOM)) { - ppd.iSeconds = GetDlgItemInt(hwndDlg, IDC_DELAY, nullptr, FALSE); - } - else if (IsDlgButtonChecked(hwndDlg, IDC_DELAYPERMANENT)) { - ppd.iSeconds = -1; - } - PUAddPopupT(&ppd); - } - break; - } - break; - - case WM_NOTIFY: - if (((LPNMHDR)lParam)->code == PSN_APPLY) { - // left action - if (IsDlgButtonChecked(hwndDlg, IDC_LNOTHING)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_LEFTCLICK, POPUP_ACT_NOTHING); - else if (IsDlgButtonChecked(hwndDlg, IDC_LCLOSE)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_LEFTCLICK, POPUP_ACT_CLOSEPOPUP); - else if (IsDlgButtonChecked(hwndDlg, IDC_LCANCEL)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_LEFTCLICK, POPUP_ACT_CANCEL); - // right action - if (IsDlgButtonChecked(hwndDlg, IDC_RNOTHING)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_RIGHTCLICK, POPUP_ACT_NOTHING); - else if (IsDlgButtonChecked(hwndDlg, IDC_RCLOSE)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_RIGHTCLICK, POPUP_ACT_CLOSEPOPUP); - else if (IsDlgButtonChecked(hwndDlg, IDC_RCANCEL)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_RIGHTCLICK, POPUP_ACT_CANCEL); - // delay - if (IsDlgButtonChecked(hwndDlg, IDC_DELAYFROMPU)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_DELAYTYPE, POPUP_DELAYFROMPU); - else if (IsDlgButtonChecked(hwndDlg, IDC_DELAYCUSTOM)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_DELAYTYPE, POPUP_DELAYCUSTOM); - else if (IsDlgButtonChecked(hwndDlg, IDC_DELAYPERMANENT)) - db_set_b(0, KSMODULENAME, SETTING_POPUP_DELAYTYPE, POPUP_DELAYPERMANENT); - // delay - db_set_dw(0, KSMODULENAME, SETTING_POPUP_TIMEOUT, GetDlgItemInt(hwndDlg, IDC_DELAY, nullptr, FALSE)); - // back color - db_set_dw(0, KSMODULENAME, SETTING_POPUP_BACKCOLOR, SendDlgItemMessage(hwndDlg, IDC_BGCOLOR, CPM_GETCOLOUR, 0, 0)); - // text color - db_set_dw(0, KSMODULENAME, SETTING_POPUP_TEXTCOLOR, SendDlgItemMessage(hwndDlg, IDC_TEXTCOLOR, CPM_GETCOLOUR, 0, 0)); - // use win - db_set_b(0, KSMODULENAME, SETTING_POPUP_USEWINCOLORS, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_WINCOLORS)); - // use def - db_set_b(0, KSMODULENAME, SETTING_POPUP_USEDEFCOLORS, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_DEFAULTCOLORS)); - // store types - db_set_b(0, KSMODULENAME, SETTING_PUCONNLOST, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_PUCONNLOST)); - db_set_b(0, KSMODULENAME, SETTING_PUOTHER, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_PUOTHER)); - db_set_b(0, KSMODULENAME, SETTING_PUCONNRETRY, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_PUCONNRETRY)); - db_set_b(0, KSMODULENAME, SETTING_PURESULT, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_PURESULT)); - db_set_b(0, KSMODULENAME, SETTING_PUSHOWEXTRA, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_PUSHOWEXTRA)); - } - break; - } - - return 0; -} - -int KeepStatusOptionsInit(WPARAM wparam, LPARAM) -{ - OPTIONSDIALOGPAGE odp = {}; - odp.hInstance = g_plugin.getInst(); - odp.szGroup.a = LPGEN("Status"); - odp.szTitle.a = LPGEN("Keep status"); - odp.flags = ODPF_BOLDGROUPS; - - odp.szTab.a = LPGEN("Basic"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_KS_BASIC); - odp.pfnDlgProc = DlgProcKSBasicOpts; - Options_AddPage(wparam, &odp, KSLangPack); - - odp.szTab.a = LPGEN("Advanced"); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_KS_ADV); - odp.pfnDlgProc = DlgProcKSAdvOpts; - Options_AddPage(wparam, &odp, KSLangPack); - - if (ServiceExists(MS_POPUP_ADDPOPUPT)) { - memset(&odp, 0, sizeof(odp)); - odp.position = 150000000; - odp.szGroup.a = LPGEN("Popups"); - odp.hInstance = g_plugin.getInst(); - odp.pszTemplate = MAKEINTRESOURCEA(IDD_PUOPT_KEEPSTATUS); - odp.szTitle.a = LPGEN("Keep status"); - odp.pfnDlgProc = PopupOptDlgProc; - odp.flags = ODPF_BOLDGROUPS; - Options_AddPage(wparam, &odp, KSLangPack); - } - return 0; -} |
