summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2018-03-04 15:06:19 +0300
committerGeorge Hazan <ghazan@miranda.im>2018-03-04 15:06:19 +0300
commitf02ba61c1480c33b801aa7f7acefac9e3735c551 (patch)
treeaa44e2ccfa277bb4b877f867d035e7cabded1f83
parentc257e17520118623ef8ae6ec7cf57249b4fd9ba0 (diff)
StatusManager:
- fixes #1150 (Status Manager no longer reconnects when connection breaks); - hopefully also fixes #1139 (KeepStatus: option "Reconnect on APM resume" don't work); - removed major clutch with assigning "" to a protocol name to disable it in the confirmdialog; - another ancient evil destroyed that tried to save 4 bytes of memory by storing temporary status values in the main status field in AAA; - version bump
-rw-r--r--plugins/StatusManager/src/AdvancedAutoAway/advancedautoaway.cpp58
-rw-r--r--plugins/StatusManager/src/KeepStatus/keepstatus.cpp87
-rw-r--r--plugins/StatusManager/src/StartupStatus/startupstatus.cpp25
-rw-r--r--plugins/StatusManager/src/commonstatus.cpp29
-rw-r--r--plugins/StatusManager/src/commonstatus.h23
-rw-r--r--plugins/StatusManager/src/confirmdialog.cpp3
-rw-r--r--plugins/StatusManager/src/version.h2
7 files changed, 99 insertions, 128 deletions
diff --git a/plugins/StatusManager/src/AdvancedAutoAway/advancedautoaway.cpp b/plugins/StatusManager/src/AdvancedAutoAway/advancedautoaway.cpp
index 3f638f22db..80f3d8be37 100644
--- a/plugins/StatusManager/src/AdvancedAutoAway/advancedautoaway.cpp
+++ b/plugins/StatusManager/src/AdvancedAutoAway/advancedautoaway.cpp
@@ -144,15 +144,14 @@ static int ProcessProtoAck(WPARAM, LPARAM lParam)
return 0;
log_debugA("ProcessProtoAck: ack->szModule: %s", ack->szModule);
- for (int i = 0; i < protoList.getCount(); i++) {
- SMProto &p = protoList[i];
- log_debugA("chk: %s", p.m_szName);
- if (!mir_strcmp(p.m_szName, ack->szModule)) {
- log_debugA("ack->szModule: %s p.statusChanged: %d", ack->szModule, p.statusChanged);
- if (!p.statusChanged)
- p.mStatus = TRUE;
-
- p.statusChanged = FALSE;
+ for (auto &it : protoList) {
+ log_debugA("chk: %s", it->m_szName);
+ if (!mir_strcmp(it->m_szName, ack->szModule)) {
+ log_debugA("ack->szModule: %s p.statusChanged: %d", ack->szModule, it->bStatusChanged);
+ if (!it->bStatusChanged)
+ it->bManualStatus = true;
+
+ it->bStatusChanged = false;
}
}
@@ -184,15 +183,15 @@ static int changeState(SMProto &setting, STATES newState)
log_debugA("%s state change: %s -> %s", setting.m_szName, status2descr(setting.oldState), status2descr(setting.curState));
- if (setting.curState != SET_ORGSTATUS && setting.curState != ACTIVE && setting.statusChanged) {
+ if (setting.curState != SET_ORGSTATUS && setting.curState != ACTIVE && setting.bStatusChanged) {
/* change the awaymessage */
if (setting.m_szMsg != nullptr) {
mir_free(setting.m_szMsg);
setting.m_szMsg = nullptr;
}
- if (db_get_b(0, AAAMODULENAME, StatusModeToDbSetting(setting.m_status, SETTING_MSGCUSTOM), FALSE))
- setting.m_szMsg = db_get_wsa(0, AAAMODULENAME, StatusModeToDbSetting(setting.m_status, SETTING_STATUSMSG));
+ if (db_get_b(0, AAAMODULENAME, StatusModeToDbSetting(setting.aaaStatus, SETTING_MSGCUSTOM), FALSE))
+ setting.m_szMsg = db_get_wsa(0, AAAMODULENAME, StatusModeToDbSetting(setting.aaaStatus, SETTING_STATUSMSG));
}
else if (setting.m_szMsg != nullptr) {
mir_free(setting.m_szMsg);
@@ -208,7 +207,7 @@ static VOID CALLBACK AutoAwayTimer(HWND, UINT, UINT_PTR, DWORD)
int confirm = FALSE;
for (auto &it : protoList) {
- it->m_status = ID_STATUS_DISABLED;
+ it->aaaStatus = ID_STATUS_DISABLED;
BOOL bTrigger = false;
@@ -237,17 +236,17 @@ static VOID CALLBACK AutoAwayTimer(HWND, UINT, UINT_PTR, DWORD)
if (((mouseStationaryTimer >= sts1Time && (it->optionFlags & FLAG_ONMOUSE)) || bTrigger) && currentMode != it->lv1Status && it->statusFlags&StatusModeToProtoFlag(currentMode)) {
/* from ACTIVE to STATUS1_SET */
it->m_lastStatus = it->originalStatusMode = CallProtoService(it->m_szName, PS_GETSTATUS, 0, 0);
- it->m_status = it->lv1Status;
+ it->aaaStatus = it->lv1Status;
it->sts1setTimer = GetTickCount();
sts1setTime = 0;
- it->statusChanged = statusChanged = TRUE;
+ it->bStatusChanged = statusChanged = true;
changeState(*it, STATUS1_SET);
}
else if (mouseStationaryTimer >= sts2Time && currentMode == it->lv1Status && currentMode != it->lv2Status && (it->optionFlags & FLAG_SETNA) && (it->statusFlags & StatusModeToProtoFlag(currentMode))) {
/* from ACTIVE to STATUS2_SET */
it->m_lastStatus = it->originalStatusMode = CallProtoService(it->m_szName, PS_GETSTATUS, 0, 0);
- it->m_status = it->lv2Status;
- it->statusChanged = statusChanged = TRUE;
+ it->aaaStatus = it->lv2Status;
+ it->bStatusChanged = statusChanged = true;
changeState(*it, STATUS2_SET);
}
}
@@ -268,8 +267,8 @@ static VOID CALLBACK AutoAwayTimer(HWND, UINT, UINT_PTR, DWORD)
/* when set STATUS2, currentMode doesn't have to be in the selected status list (statusFlags) */
/* from STATUS1_SET to STATUS2_SET */
it->m_lastStatus = CallProtoService(it->m_szName, PS_GETSTATUS, 0, 0);
- it->m_status = it->lv2Status;
- it->statusChanged = statusChanged = TRUE;
+ it->aaaStatus = it->lv2Status;
+ it->bStatusChanged = statusChanged = true;
changeState(*it, STATUS2_SET);
}
}
@@ -288,40 +287,39 @@ static VOID CALLBACK AutoAwayTimer(HWND, UINT, UINT_PTR, DWORD)
}
if (it->curState == HIDDEN_ACTIVE) {
- if (it->mStatus) {
+ if (it->bManualStatus) {
/* HIDDEN_ACTIVE to ACTIVE */
- //it->statusChanged = FALSE;
+ // it->bStatusChanged = false;
changeState(*it, ACTIVE);
it->sts1setTimer = 0;
- it->mStatus = FALSE;
+ it->bManualStatus = false;
}
else if ((it->optionFlags & FLAG_SETNA) && currentMode == it->lv1Status &&
currentMode != it->lv2Status && (it->statusFlags & StatusModeToProtoFlag(currentMode)) &&
(mouseStationaryTimer >= sts2Time || (sts1setTime >= sts2Time && !(it->optionFlags & FLAG_LV2ONINACTIVE)))) {
/* HIDDEN_ACTIVE to STATUS2_SET */
it->m_lastStatus = it->originalStatusMode = CallProtoService(it->m_szName, PS_GETSTATUS, 0, 0);
- it->m_status = it->lv2Status;
- it->statusChanged = statusChanged = TRUE;
+ it->aaaStatus = it->lv2Status;
+ it->bStatusChanged = statusChanged = true;
changeState(*it, STATUS2_SET);
}
}
if (it->curState == SET_ORGSTATUS) {
/* SET_ORGSTATUS to ACTIVE */
it->m_lastStatus = CallProtoService(it->m_szName, PS_GETSTATUS, 0, 0);
- it->m_status = it->originalStatusMode;
+ it->aaaStatus = it->originalStatusMode;
confirm = (it->optionFlags & FLAG_CONFIRM) ? TRUE : confirm;
- it->statusChanged = statusChanged = TRUE;
+ it->bStatusChanged = statusChanged = true;
changeState(*it, ACTIVE);
it->sts1setTimer = 0;
}
- it->mStatus = FALSE;
+ it->bManualStatus = false;
}
if (confirm || statusChanged) {
- TProtoSettings ps = protoList;
+ TProtoSettings ps = protoList; // make a copy of data not to pollute main array
for (auto &it : ps)
- if (it->m_status == ID_STATUS_DISABLED)
- it->m_szName = "";
+ it->m_status = it->aaaStatus;
if (confirm)
confirmDialog = ShowConfirmDialogEx(&ps, db_get_w(0, AAAMODULENAME, SETTING_CONFIRMDELAY, 5));
diff --git a/plugins/StatusManager/src/KeepStatus/keepstatus.cpp b/plugins/StatusManager/src/KeepStatus/keepstatus.cpp
index 42e715a262..ceb12f56d4 100644
--- a/plugins/StatusManager/src/KeepStatus/keepstatus.cpp
+++ b/plugins/StatusManager/src/KeepStatus/keepstatus.cpp
@@ -127,41 +127,6 @@ int KSLoadOptions()
/////////////////////////////////////////////////////////////////////////////////////////
-static PROTOCOLSETTINGEX** GetCurrentProtoSettingsCopy()
-{
- mir_cslock lck(GenStatusCS);
- PROTOCOLSETTINGEX **ps = (PROTOCOLSETTINGEX**)mir_alloc(protoList.getCount() * sizeof(PROTOCOLSETTINGEX *));
- if (ps == nullptr)
- return nullptr;
-
- for (int i = 0; i < protoList.getCount(); i++) {
- ps[i] = (PROTOCOLSETTINGEX*)mir_calloc(sizeof(PROTOCOLSETTINGEX));
- if (ps[i] == nullptr) {
- mir_free(ps);
- return nullptr;
- }
-
- SMProto &cs = protoList[i];
- ps[i]->m_lastStatus = cs.m_lastStatus;
- ps[i]->m_status = cs.m_status;
- ps[i]->m_szMsg = nullptr;
- ps[i]->m_szName = cs.m_szName;
- ps[i]->m_tszAccName = cs.m_tszAccName;
- }
-
- return ps;
-}
-
-static void FreeProtoSettings(PROTOCOLSETTINGEX** ps)
-{
- for (int i = 0; i < protoList.getCount(); i++) {
- if (ps[i]->m_szMsg != nullptr)
- mir_free(ps[i]->m_szMsg);
- mir_free(ps[i]);
- }
- mir_free(ps);
-}
-
int SMProto::AssignStatus(int iStatus, int iLastStatus, wchar_t *pwszMsg)
{
if (iStatus < MIN_STATUS || iStatus > MAX_STATUS)
@@ -214,29 +179,27 @@ int SMProto::GetStatus() const
static int SetCurrentStatus()
{
- PROTOCOLSETTINGEX **ps = GetCurrentProtoSettingsCopy();
- for (int i = 0; i < protoList.getCount(); i++) {
- auto p = ps[i];
+ TProtoSettings ps(protoList);
+ for (auto &p : ps) {
int realStatus = CallProtoService(p->m_szName, PS_GETSTATUS, 0, 0);
- int curStatus = protoList[i].GetStatus();
- if (curStatus == ID_STATUS_DISABLED || curStatus == realStatus) { // ignore this proto by removing it's name (not so nice)
- p->m_szName = "";
+ int curStatus = p->GetStatus();
+ if (curStatus == ID_STATUS_DISABLED)
+ continue;
+ if (curStatus == realStatus) {
+ p->m_status = ID_STATUS_DISABLED;
+ continue;
}
- else {
- 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);
- }
+ 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);
- INT_PTR ret = CallService(MS_CS_SETSTATUSEX, (WPARAM)&ps, 0);
- FreeProtoSettings(ps);
-
- return ret;
+ ProcessPopup(KS_CONN_STATE_RETRY, (LPARAM)ps.getArray());
+ return CallService(MS_CS_SETSTATUSEX, (WPARAM)ps.getArray(), 0);
}
static int StatusChange(WPARAM wParam, LPARAM lParam)
@@ -1038,7 +1001,7 @@ INT_PTR AnnounceStatusChangeService(WPARAM, LPARAM lParam)
static DWORD CALLBACK MessageWndProc(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
{
- static PROTOCOLSETTINGEX** ps = nullptr;
+ static TProtoSettings *ps = nullptr;
switch (msg) {
case WM_POWERBROADCAST:
@@ -1046,23 +1009,23 @@ static DWORD CALLBACK MessageWndProc(HWND, UINT msg, WPARAM wParam, LPARAM lPara
case PBT_APMSUSPEND:
log_infoA("KeepStatus: suspend state detected: %08X %08X", wParam, lParam);
if (ps == nullptr) {
- ps = GetCurrentProtoSettingsCopy();
- for (int i = 0; i < protoList.getCount(); i++)
- EnableProtocolService(0, (LPARAM)ps[i]->m_szName);
+ 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_APMRESUMEAUTOMATIC: ?
case PBT_APMRESUMESUSPEND:
case PBT_APMRESUMECRITICAL:
+ // case PBT_APMRESUMEAUTOMATIC: ?
log_infoA("KeepStatus: resume from suspend state");
if (ps != nullptr) {
- for (int i = 0; i < protoList.getCount(); i++)
- protoList[i].AssignStatus(ps[i]->m_status, ps[i]->m_lastStatus, ps[i]->m_szMsg);
- FreeProtoSettings(ps);
+ for (auto &it : *ps)
+ it->AssignStatus(it->m_status, it->m_lastStatus, it->m_szMsg);
+ delete ps;
ps = nullptr;
}
StartTimer(IDT_PROCESSACK, 0, FALSE);
@@ -1072,7 +1035,7 @@ static DWORD CALLBACK MessageWndProc(HWND, UINT msg, WPARAM wParam, LPARAM lPara
case WM_DESTROY:
if (ps != nullptr) {
- FreeProtoSettings(ps);
+ delete ps;
ps = nullptr;
}
break;
diff --git a/plugins/StatusManager/src/StartupStatus/startupstatus.cpp b/plugins/StatusManager/src/StartupStatus/startupstatus.cpp
index 0c44c09a9c..ab82c229db 100644
--- a/plugins/StatusManager/src/StartupStatus/startupstatus.cpp
+++ b/plugins/StatusManager/src/StartupStatus/startupstatus.cpp
@@ -38,7 +38,7 @@ static BYTE showDialogOnStartup = 0;
static PROTOCOLSETTINGEX* IsValidProtocol(TProtoSettings &protoSettings, const char *protoName)
{
for (auto &it : protoSettings)
- if (!strncmp(it->m_szName, protoName, mir_strlen(it->m_szName)))
+ if (!it->ssDisabled && !strncmp(it->m_szName, protoName, mir_strlen(it->m_szName)))
return it;
return nullptr;
@@ -143,7 +143,7 @@ static int ProcessProtoAck(WPARAM, LPARAM lParam)
for (auto &it : protoList) {
if (!mir_strcmp(ack->szModule, it->m_szName)) {
- it->m_szName = "";
+ it->ssDisabled = true;
log_debugA("StartupStatus: %s overridden by ME_PROTO_ACK, status will not be set", ack->szModule);
}
}
@@ -160,14 +160,14 @@ static int StatusChange(WPARAM, LPARAM lParam)
char *szProto = (char *)lParam;
if (szProto == nullptr) { // global status change
for (auto &it : protoList) {
- it->m_szName = "";
+ it->ssDisabled = true;
log_debugA("StartupStatus: all protos overridden by ME_CLIST_STATUSMODECHANGE, status will not be set");
}
}
else {
for (auto &it : protoList) {
if (!mir_strcmp(it->m_szName, szProto)) {
- it->m_szName = "";
+ it->ssDisabled = true;
log_debugA("StartupStatus: %s overridden by ME_CLIST_STATUSMODECHANGE, status will not be set", szProto);
}
}
@@ -188,14 +188,13 @@ static int CSStatusChangeEx(WPARAM wParam, LPARAM)
return -1;
for (int i = 0; i < protoList.getCount(); i++) {
- for (int j = 0; j < protoList.getCount(); j++) {
- if (ps[i]->m_szName == nullptr || protoList[j].m_szName == nullptr)
+ for (auto &it : protoList) {
+ if (ps[i]->m_szName == nullptr || it->m_szName == nullptr)
continue;
- if (!mir_strcmp(ps[i]->m_szName, protoList[j].m_szName)) {
+ if (!mir_strcmp(ps[i]->m_szName, it->m_szName)) {
log_debugA("StartupStatus: %s overridden by MS_CS_SETSTATUSEX, status will not be set", ps[i]->m_szName);
- // use a hack to disable this proto
- protoList[j].m_szName = "";
+ it->ssDisabled = true;
}
}
}
@@ -210,7 +209,13 @@ static void CALLBACK SetStatusTimed(HWND, UINT, UINT_PTR, DWORD)
UnhookEvent(hProtoAckHook);
UnhookEvent(hCSStatusChangeHook);
UnhookEvent(hStatusChangeHook);
- CallService(MS_CS_SETSTATUSEX, (WPARAM)&protoList, 0);
+
+ TProtoSettings ps(protoList);
+ for (auto &it : ps)
+ if (it->ssDisabled)
+ it->m_status = ID_STATUS_DISABLED;
+
+ CallService(MS_CS_SETSTATUSEX, (WPARAM)ps.getArray(), 0);
}
static int OnOkToExit(WPARAM, LPARAM)
diff --git a/plugins/StatusManager/src/commonstatus.cpp b/plugins/StatusManager/src/commonstatus.cpp
index 6355cc9839..a0e7e0f7a4 100644
--- a/plugins/StatusManager/src/commonstatus.cpp
+++ b/plugins/StatusManager/src/commonstatus.cpp
@@ -233,38 +233,41 @@ INT_PTR SetStatusEx(WPARAM wParam, LPARAM)
// set all status messages first
for (int i = 0; i < protoList.getCount(); i++) {
- char *szProto = protoSettings[i]->m_szName;
- if (!Proto_GetAccount(szProto)) {
- log_debugA("CommonStatus: %s is not loaded", szProto);
+ PROTOCOLSETTINGEX *p = protoSettings[i];
+ if (p->m_status == ID_STATUS_DISABLED)
+ continue;
+
+ if (!Proto_GetAccount(p->m_szName)) {
+ log_debugA("CommonStatus: %s is not loaded", p->m_szName);
continue;
}
// some checks
int newstatus = GetActualStatus(protoSettings[i]);
if (newstatus == 0) {
- log_debugA("CommonStatus: incorrect status for %s (%d)", szProto, protoSettings[i]->m_status);
+ log_debugA("CommonStatus: incorrect status for %s (%d)", p->m_szName, p->m_status);
continue;
}
- int oldstatus = CallProtoService(szProto, PS_GETSTATUS, 0, 0);
+ int oldstatus = CallProtoService(p->m_szName, PS_GETSTATUS, 0, 0);
// set last status
- protoSettings[i]->m_lastStatus = oldstatus;
+ p->m_lastStatus = oldstatus;
if (IsStatusConnecting(oldstatus)) {
// ignore if connecting, but it didn't came this far if it did
- log_debugA("CommonStatus: %s is already connecting", szProto);
+ log_debugA("CommonStatus: %s is already connecting", p->m_szName);
continue;
}
// status checks
long protoFlag = Proto_Status2Flag(newstatus);
- int b_Caps2 = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_2, 0) & protoFlag;
- int b_Caps5 = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_5, 0) & protoFlag;
+ int b_Caps2 = CallProtoService(p->m_szName, PS_GETCAPS, PFLAGNUM_2, 0) & protoFlag;
+ int b_Caps5 = CallProtoService(p->m_szName, PS_GETCAPS, PFLAGNUM_5, 0) & protoFlag;
if (newstatus != ID_STATUS_OFFLINE && (!b_Caps2 || b_Caps5)) {
// status and status message for this status not supported
//log_debug("CommonStatus: status not supported %s", szProto);
continue;
}
- int b_Caps1 = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND & ~PF1_INDIVMODEMSG;
- int b_Caps3 = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & protoFlag;
+ int b_Caps1 = CallProtoService(p->m_szName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND & ~PF1_INDIVMODEMSG;
+ int b_Caps3 = CallProtoService(p->m_szName, PS_GETCAPS, PFLAGNUM_3, 0) & protoFlag;
if (newstatus == oldstatus && (!b_Caps1 || !b_Caps3)) {
// no status change and status messages are not supported
//log_debug("CommonStatus: no change, %s (%d %d)", szProto, oldstatus, newstatus);
@@ -277,8 +280,8 @@ INT_PTR SetStatusEx(WPARAM wParam, LPARAM)
// set the status
if (newstatus != oldstatus /*&& !(b_Caps1 && b_Caps3 && ServiceExists(MS_NAS_SETSTATE))*/) {
- log_debugA("CommonStatus sets status for %s to %d", szProto, newstatus);
- CallProtoService(szProto, PS_SETSTATUS, newstatus, 0);
+ log_debugA("CommonStatus sets status for %s to %d", p->m_szName, newstatus);
+ CallProtoService(p->m_szName, PS_SETSTATUS, newstatus, 0);
}
}
diff --git a/plugins/StatusManager/src/commonstatus.h b/plugins/StatusManager/src/commonstatus.h
index 488d28bfb6..ee9fa8b128 100644
--- a/plugins/StatusManager/src/commonstatus.h
+++ b/plugins/StatusManager/src/commonstatus.h
@@ -106,17 +106,15 @@ struct SMProto : public PROTOCOLSETTINGEX, public MZeroedObject
// AdvancedAutoAway settings
int originalStatusMode = ID_STATUS_CURRENT;
- STATES
- oldState,
- curState = ACTIVE;
- BOOL statusChanged; // AAA changed the status, don't update mStatus
- BOOL mStatus; // status changed manually or not ?
- int optionFlags, // db: see above
- awayTime, // db: time to wait for inactivity
- naTime, // db: time to wait after away is set
- statusFlags; // db: set lv1 status if this is original status
- WORD lv1Status, // db
- lv2Status; // db
+ int aaaStatus;
+ STATES oldState, curState = ACTIVE;
+ bool bStatusChanged; // AAA changed the status, don't update bManualStatus
+ bool bManualStatus; // status changed manually or not ?
+ int optionFlags; // db: see above
+ int awayTime; // db: time to wait for inactivity
+ int naTime; // db: time to wait after away is set
+ int statusFlags; // db: set lv1 status if this is original status
+ WORD lv1Status, lv2Status; // db: statuses to switch protocol to
unsigned int sts1setTimer;
// KeepStatus
@@ -124,6 +122,9 @@ struct SMProto : public PROTOCOLSETTINGEX, public MZeroedObject
int GetStatus() const;
int lastStatusAckTime; // the time the last status ack was received
+
+ // StartupStatus
+ bool ssDisabled; // prohibits status restoration at startup
};
struct TProtoSettings : public OBJLIST<SMProto>
diff --git a/plugins/StatusManager/src/confirmdialog.cpp b/plugins/StatusManager/src/confirmdialog.cpp
index 5cdcf88237..2c7c386ff7 100644
--- a/plugins/StatusManager/src/confirmdialog.cpp
+++ b/plugins/StatusManager/src/confirmdialog.cpp
@@ -403,7 +403,8 @@ HWND ShowConfirmDialogEx(TProtoSettings *params, int _timeout)
confirmSettings = new OBJLIST<TConfirmSetting>(10, CompareSettings);
for (auto &it : *params)
- confirmSettings->insert(new TConfirmSetting(*it));
+ if (it->m_status != ID_STATUS_DISABLED)
+ confirmSettings->insert(new TConfirmSetting(*it));
timeOut = _timeout;
if (timeOut < 0)
diff --git a/plugins/StatusManager/src/version.h b/plugins/StatusManager/src/version.h
index 50de31c953..45db33e0dc 100644
--- a/plugins/StatusManager/src/version.h
+++ b/plugins/StatusManager/src/version.h
@@ -2,7 +2,7 @@
#define __MAJOR_VERSION 1
#define __MINOR_VERSION 1
#define __RELEASE_NUM 0
-#define __BUILD_NUM 3
+#define __BUILD_NUM 4
// other stuff for Version resource
#include <stdver.h>