aboutsummaryrefslogtreecommitdiff
path: root/Src/auth/Loginbox/loginStatus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/auth/Loginbox/loginStatus.cpp')
-rw-r--r--Src/auth/Loginbox/loginStatus.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/Src/auth/Loginbox/loginStatus.cpp b/Src/auth/Loginbox/loginStatus.cpp
new file mode 100644
index 00000000..4df32bb4
--- /dev/null
+++ b/Src/auth/Loginbox/loginStatus.cpp
@@ -0,0 +1,159 @@
+#include "./loginStatus.h"
+#include "./common.h"
+
+
+LoginStatus::LoginStatus(HWND hTarget)
+ : ref(1), hwnd(hTarget)
+{
+ InitializeCriticalSection(&lock);
+}
+LoginStatus::~LoginStatus()
+{
+ DeleteCriticalSection(&lock);
+}
+
+HRESULT LoginStatus::CreateInstance(HWND hTarget, LoginStatus **instance)
+{
+ if (NULL == instance)
+ return E_POINTER;
+ *instance = new LoginStatus(hTarget);
+ if (NULL == *instance) return E_OUTOFMEMORY;
+ return S_OK;
+}
+
+
+ULONG LoginStatus::AddRef()
+{
+ return InterlockedIncrement((LONG*)&ref);
+}
+
+ULONG LoginStatus::Release()
+{
+ if (0 == ref)
+ return ref;
+
+ LONG r = InterlockedDecrement((LONG*)&ref);
+ if (0 == r)
+ delete(this);
+
+ return r;
+}
+
+
+UINT LoginStatus::Add(BSTR status)
+{
+ EnterCriticalSection(&lock);
+
+ Record r;
+ r.cookie = GetNextCookie();
+ r.text = status;
+ list.push_back(r);
+
+ LeaveCriticalSection(&lock);
+
+ UpdateWindowText();
+ return r.cookie;
+}
+
+BOOL LoginStatus::Set(UINT cookie, BSTR status)
+{
+ BOOL foundOk = FALSE;
+ EnterCriticalSection(&lock);
+
+ size_t index = list.size();
+ while(index--)
+ {
+ if (cookie == list[index].cookie)
+ {
+ SysFreeString(list[index].text);
+ list[index].text = status;
+ foundOk = TRUE;
+ break;
+ }
+ }
+
+ LeaveCriticalSection(&lock);
+
+ UpdateWindowText();
+ return foundOk;
+}
+
+void LoginStatus::Remove(UINT cookie)
+{
+ EnterCriticalSection(&lock);
+
+ size_t index = list.size();
+ while(index--)
+ {
+ if (cookie == list[index].cookie)
+ {
+ SysFreeString(list[index].text);
+ list.eraseAt(index);
+ break;
+ }
+ }
+
+ LeaveCriticalSection(&lock);
+ UpdateWindowText();
+}
+
+BOOL LoginStatus::AttachWindow(HWND hTarget)
+{
+ DetachWindow();
+
+ hwnd = hTarget;
+ UpdateWindowText();
+ return TRUE;
+}
+
+BOOL LoginStatus::DetachWindow()
+{
+ hwnd = NULL;
+ return TRUE;
+}
+
+UINT LoginStatus::GetNextCookie()
+{
+ size_t i, count;
+
+ count = list.size();
+ UINT cookie = (UINT)count;
+
+ do
+ {
+ for (i = 0; i < count; i++)
+ {
+ if (list[i].cookie == cookie)
+ {
+ cookie++;
+ break;
+ }
+ }
+ } while(i != count);
+ return cookie;
+}
+
+BOOL LoginStatus::UpdateWindowText()
+{
+
+ EnterCriticalSection(&lock);
+
+ BOOL resultOk = FALSE;
+ if (NULL != hwnd)
+ {
+ BSTR text = NULL;
+ size_t index = list.size();
+ while(index--)
+ {
+ if (NULL != list[index].text && L'\0' != list[index].text)
+ {
+ text = list[index].text;
+ break;
+ }
+ }
+ resultOk = (BOOL)SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)text);
+ }
+ LeaveCriticalSection(&lock);
+ return resultOk;
+}
+