| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- #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;
- }
|