1
0

loginData.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "./loginData.h"
  2. #include "./loginBox.h"
  3. #include "./loginProvider.h"
  4. #include "./loginStatus.h"
  5. #include "../api.h"
  6. LoginData::LoginData(const GUID *pRealm, HWND hPage, HWND hLoginbox)
  7. : ref(1), hPage(hPage), hLoginbox(hLoginbox), provider(NULL), status(NULL), statusCookie(-1)
  8. {
  9. if (NULL != pRealm)
  10. {
  11. realm = *pRealm;
  12. }
  13. else
  14. {
  15. if (NULL == hLoginbox || FALSE == LoginBox_GetRealm(hLoginbox, &realm))
  16. realm = GUID_NULL;
  17. }
  18. if (FALSE == LoginBox_GetActiveProvider(hLoginbox, &provider))
  19. provider = NULL;
  20. LoginBox_GetStatus(hLoginbox, &status);
  21. }
  22. LoginData::~LoginData()
  23. {
  24. if (NULL != provider)
  25. provider->Release();
  26. if (NULL != status)
  27. {
  28. if (-1 != statusCookie)
  29. status->Remove(statusCookie);
  30. status->Release();
  31. }
  32. }
  33. HRESULT LoginData::CreateInstance(const GUID *pRealm, HWND hPage, HWND hLoginbox, LoginData **instance)
  34. {
  35. if (NULL == instance) return E_POINTER;
  36. if (NULL == hPage || NULL == hLoginbox) return E_INVALIDARG;
  37. *instance = new LoginData(pRealm, hPage, hLoginbox);
  38. if (NULL == *instance) return E_OUTOFMEMORY;
  39. return S_OK;
  40. }
  41. ULONG LoginData::AddRef()
  42. {
  43. return InterlockedIncrement((LONG*)&ref);
  44. }
  45. ULONG LoginData::Release()
  46. {
  47. if (0 == ref)
  48. return ref;
  49. LONG r = InterlockedDecrement((LONG*)&ref);
  50. if (0 == r)
  51. delete(this);
  52. return r;
  53. }
  54. HRESULT LoginData::QueryInterface(REFIID riid, void** ppObject)
  55. {
  56. if (NULL == ppObject)
  57. return E_POINTER;
  58. if (IsEqualIID(riid, IID_LoginData))
  59. *ppObject = static_cast<LoginData*>(this);
  60. else
  61. {
  62. *ppObject = NULL;
  63. return E_NOINTERFACE;
  64. }
  65. if (NULL == *ppObject)
  66. return E_UNEXPECTED;
  67. AddRef();
  68. return S_OK;
  69. }
  70. HWND LoginData::GetLoginbox()
  71. {
  72. return hLoginbox;
  73. }
  74. HWND LoginData::GetPage()
  75. {
  76. return hPage;
  77. }
  78. HRESULT LoginData::GetRealm(GUID *pRealm)
  79. {
  80. if (NULL == pRealm) return E_POINTER;
  81. *pRealm = realm;
  82. return S_OK;
  83. }
  84. HRESULT LoginData::GetProvider(LoginProvider **ppProvider)
  85. {
  86. if (NULL == ppProvider) return E_POINTER;
  87. *ppProvider = provider;
  88. if (NULL != provider)
  89. provider->AddRef();
  90. return S_OK;
  91. }
  92. HRESULT LoginData::GetStatus(LoginStatus **ppStatus)
  93. {
  94. if (NULL == ppStatus) return E_POINTER;
  95. *ppStatus = status;
  96. if (NULL != status)
  97. status->AddRef();
  98. return S_OK;
  99. }
  100. HRESULT LoginData::SetStatus(LPCWSTR pszStatus)
  101. {
  102. if (NULL == status)
  103. return E_FAIL;
  104. BSTR bstrText;
  105. if (NULL == pszStatus || FALSE == IS_INTRESOURCE(pszStatus))
  106. bstrText = SysAllocString(pszStatus);
  107. else
  108. {
  109. WCHAR szBuffer[256] = {0};
  110. WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)pszStatus, szBuffer, ARRAYSIZE(szBuffer));
  111. bstrText = SysAllocString(szBuffer);
  112. }
  113. if (-1 == statusCookie)
  114. {
  115. statusCookie = status->Add(bstrText);
  116. if (-1 == statusCookie)
  117. return E_FAIL;
  118. }
  119. else
  120. {
  121. if (FALSE == status->Set(statusCookie, bstrText))
  122. return E_FAIL;
  123. }
  124. return S_OK;
  125. }