loginStatus.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include "./loginStatus.h"
  2. #include "./common.h"
  3. LoginStatus::LoginStatus(HWND hTarget)
  4. : ref(1), hwnd(hTarget)
  5. {
  6. InitializeCriticalSection(&lock);
  7. }
  8. LoginStatus::~LoginStatus()
  9. {
  10. DeleteCriticalSection(&lock);
  11. }
  12. HRESULT LoginStatus::CreateInstance(HWND hTarget, LoginStatus **instance)
  13. {
  14. if (NULL == instance)
  15. return E_POINTER;
  16. *instance = new LoginStatus(hTarget);
  17. if (NULL == *instance) return E_OUTOFMEMORY;
  18. return S_OK;
  19. }
  20. ULONG LoginStatus::AddRef()
  21. {
  22. return InterlockedIncrement((LONG*)&ref);
  23. }
  24. ULONG LoginStatus::Release()
  25. {
  26. if (0 == ref)
  27. return ref;
  28. LONG r = InterlockedDecrement((LONG*)&ref);
  29. if (0 == r)
  30. delete(this);
  31. return r;
  32. }
  33. UINT LoginStatus::Add(BSTR status)
  34. {
  35. EnterCriticalSection(&lock);
  36. Record r;
  37. r.cookie = GetNextCookie();
  38. r.text = status;
  39. list.push_back(r);
  40. LeaveCriticalSection(&lock);
  41. UpdateWindowText();
  42. return r.cookie;
  43. }
  44. BOOL LoginStatus::Set(UINT cookie, BSTR status)
  45. {
  46. BOOL foundOk = FALSE;
  47. EnterCriticalSection(&lock);
  48. size_t index = list.size();
  49. while(index--)
  50. {
  51. if (cookie == list[index].cookie)
  52. {
  53. SysFreeString(list[index].text);
  54. list[index].text = status;
  55. foundOk = TRUE;
  56. break;
  57. }
  58. }
  59. LeaveCriticalSection(&lock);
  60. UpdateWindowText();
  61. return foundOk;
  62. }
  63. void LoginStatus::Remove(UINT cookie)
  64. {
  65. EnterCriticalSection(&lock);
  66. size_t index = list.size();
  67. while(index--)
  68. {
  69. if (cookie == list[index].cookie)
  70. {
  71. SysFreeString(list[index].text);
  72. list.eraseAt(index);
  73. break;
  74. }
  75. }
  76. LeaveCriticalSection(&lock);
  77. UpdateWindowText();
  78. }
  79. BOOL LoginStatus::AttachWindow(HWND hTarget)
  80. {
  81. DetachWindow();
  82. hwnd = hTarget;
  83. UpdateWindowText();
  84. return TRUE;
  85. }
  86. BOOL LoginStatus::DetachWindow()
  87. {
  88. hwnd = NULL;
  89. return TRUE;
  90. }
  91. UINT LoginStatus::GetNextCookie()
  92. {
  93. size_t i, count;
  94. count = list.size();
  95. UINT cookie = (UINT)count;
  96. do
  97. {
  98. for (i = 0; i < count; i++)
  99. {
  100. if (list[i].cookie == cookie)
  101. {
  102. cookie++;
  103. break;
  104. }
  105. }
  106. } while(i != count);
  107. return cookie;
  108. }
  109. BOOL LoginStatus::UpdateWindowText()
  110. {
  111. EnterCriticalSection(&lock);
  112. BOOL resultOk = FALSE;
  113. if (NULL != hwnd)
  114. {
  115. BSTR text = NULL;
  116. size_t index = list.size();
  117. while(index--)
  118. {
  119. if (NULL != list[index].text && L'\0' != list[index].text)
  120. {
  121. text = list[index].text;
  122. break;
  123. }
  124. }
  125. resultOk = (BOOL)SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)text);
  126. }
  127. LeaveCriticalSection(&lock);
  128. return resultOk;
  129. }