/thirdparty/liblastfm2/src/ws/win/WmiSink.cpp

http://github.com/tomahawk-player/tomahawk · C++ · 202 lines · 68 code · 17 blank · 117 comment · 11 complexity · bf459195f8aa1b279d1e42d3693fffad MD5 · raw file

  1. /*
  2. Copyright 2009 Last.fm Ltd.
  3. - Primarily authored by Max Howell, Jono Cole and Doug Mansell
  4. This file is part of liblastfm.
  5. liblastfm is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. liblastfm is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with liblastfm. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "WmiSink.h"
  17. #include "NdisEvents.h"
  18. WmiSink::WmiSink(NdisEvents *callback)
  19. : m_cRef(1)
  20. , m_callback(callback)
  21. {}
  22. WmiSink::~WmiSink()
  23. {}
  24. void
  25. WmiSink::disconnect()
  26. {
  27. m_callback = 0;
  28. }
  29. STDMETHODIMP
  30. WmiSink::QueryInterface(REFIID riid, LPVOID * ppv)
  31. {
  32. *ppv = 0;
  33. if (IID_IUnknown==riid || IID_IWbemObjectSink == riid)
  34. {
  35. *ppv = (IWbemObjectSink *) this;
  36. AddRef();
  37. return NOERROR;
  38. }
  39. return E_NOINTERFACE;
  40. }
  41. ULONG
  42. WmiSink::AddRef()
  43. {
  44. return ++m_cRef;
  45. }
  46. ULONG
  47. WmiSink::Release()
  48. {
  49. if (0 != --m_cRef)
  50. return m_cRef;
  51. delete this;
  52. return 0;
  53. }
  54. // This method receives notification objects.
  55. HRESULT
  56. WmiSink::Indicate(long lObjectCount, IWbemClassObject** ppObjArray)
  57. {
  58. // For each object in the array, extract the object and display the
  59. // information in the object.
  60. for (long i=0; i<lObjectCount; i++)
  61. {
  62. CComVariant vt, vtClass;
  63. ppObjArray[i]->Get(L"InstanceName", 0, &vt, NULL, NULL);
  64. ppObjArray[i]->Get(L"__Class", 0, &vtClass, NULL, NULL);
  65. if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusMediaDisconnect"))
  66. {
  67. if (m_callback) m_callback->onConnectionDown(vt.bstrVal);
  68. }
  69. else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusMediaConnect"))
  70. {
  71. if (m_callback) m_callback->onConnectionUp(vt.bstrVal);
  72. }
  73. // notifications we aren't interested in right now:
  74. //
  75. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyAdapterRemoval"))
  76. //{
  77. // bstrLog = (_bstr_t) vt.bstrVal;
  78. // VariantClear (&vt);
  79. // ppObjArray[i]->Get (L"DeviceName", 0, &vt, NULL, NULL);
  80. // bstrLog += (_bstr_t) _T(": ") + (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has been removed");
  81. // displayDlg.LogEvent (bstrLog);
  82. //}
  83. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyAdapterArrival"))
  84. //{
  85. // bstrLog = (_bstr_t) vt.bstrVal;
  86. // VariantClear (&vt);
  87. // ppObjArray[i]->Get(L"DeviceName", 0, &vt, NULL, NULL);
  88. // bstrLog += (_bstr_t) _T(": ") + (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has been added");
  89. // displayDlg.LogEvent (bstrLog);
  90. //}
  91. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusResetStart"))
  92. //{
  93. // bstrLog = (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has begun a reset");
  94. // displayDlg.LogEvent (bstrLog);
  95. //}
  96. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusResetEnd"))
  97. //{
  98. // bstrLog = (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has finished a reset");
  99. // displayDlg.LogEvent (bstrLog);
  100. //}
  101. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyVcArrival"))
  102. //{
  103. // bstrLog = (_bstr_t) _T("VC arrival: ") + (_bstr_t) vt.bstrVal;
  104. // displayDlg.LogEvent (bstrLog);
  105. //}
  106. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyVcRemoval"))
  107. //{
  108. // bstrLog = (_bstr_t) _T("VC removal: ") + (_bstr_t) vt.bstrVal;
  109. // displayDlg.LogEvent (bstrLog);
  110. //}
  111. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusMediaSpecificIndication"))
  112. //{
  113. // ATLTRACE (_T("Media specific indication: %s\n"), (TCHAR *) (_bstr_t) vt.bstrVal);
  114. // VariantClear (&vt);
  115. // ppObjArray[i]->Get (L"NdisStatusMediaSpecificIndication", 0, &vt, NULL, NULL);
  116. // LONG lLowerBound, lUpperBound, j;
  117. // UCHAR ch;
  118. // SafeArrayGetLBound (V_ARRAY (&vt), 1, &lLowerBound);
  119. // SafeArrayGetUBound (V_ARRAY (&vt), 1, &lUpperBound);
  120. // ATLTRACE (" ");
  121. // for (j = lLowerBound; j<= lUpperBound; j++ )
  122. // {
  123. // SafeArrayGetElement (V_ARRAY (&vt), &j, &ch);
  124. // ATLTRACE (_T("%4i"), ch);
  125. // if (((j - lLowerBound) % 8 == 7) && (j <= lUpperBound))
  126. // ATLTRACE (_T("\n"));
  127. // }
  128. //}
  129. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusProtocolBind"))
  130. //{
  131. // bstrLog = (_bstr_t) vt.bstrVal;
  132. // VariantClear (&vt);
  133. // ppObjArray[i]->Get (L"Transport", 0, &vt, NULL, NULL);
  134. // bstrLog += (_bstr_t) _T(" is now bound to ") + (_bstr_t) vt.bstrVal;
  135. // displayDlg.LogEvent (bstrLog);
  136. //}
  137. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusProtocolBind"))
  138. //{
  139. // bstrLog = (_bstr_t) vt.bstrVal;
  140. // VariantClear (&vt);
  141. // ppObjArray[i]->Get(L"Transport", 0, &vt, NULL, NULL);
  142. // bstrLog += (_bstr_t) _T(" was unbound from ") + (_bstr_t) vt.bstrVal;
  143. // displayDlg.LogEvent (bstrLog);
  144. //}
  145. //else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusLinkSpeedChange"))
  146. //{
  147. // IWbemClassObject* pWMIObj=NULL;
  148. // bstrLog = (_bstr_t) _T("Link speed change ") + (_bstr_t) vt.bstrVal;
  149. // VariantClear (&vt);
  150. // ppObjArray[i]->Get (L"NdisStatusLinkSpeedChange", 0, &vt, NULL, NULL);
  151. // if SUCCEEDED (vt.punkVal->QueryInterface (IID_IWbemClassObject, (void**)&pWMIObj))
  152. // {
  153. // TCHAR szNum[50];
  154. // pWMIObj->Get (L"Inbound", 0, &vt2, NULL, NULL);
  155. // _stprintf (szNum, _T(" Inbound = %u "), vt2.lVal);
  156. // bstrLog += (_bstr_t) szNum;
  157. // VariantClear (&vt2);
  158. // pWMIObj->Get (L"Outbound", 0, &vt2, NULL, NULL);
  159. // _stprintf (szNum, _T(" Outbound = %u "), vt2.lVal);
  160. // bstrLog += (_bstr_t) szNum;
  161. // VariantClear (&vt2);
  162. // pWMIObj->Release ();
  163. // pWMIObj = NULL;
  164. // }
  165. // displayDlg.LogEvent (bstrLog);
  166. //}
  167. VariantClear (&vtClass);
  168. VariantClear (&vt);
  169. }
  170. return WBEM_NO_ERROR;
  171. }
  172. // Misc. status codes sent by sink.
  173. HRESULT
  174. WmiSink::SetStatus(long lFlags, HRESULT hResult, BSTR strParam, IWbemClassObject __RPC_FAR *pObjParam)
  175. {
  176. lFlags;
  177. hResult;
  178. strParam;
  179. pObjParam;
  180. return WBEM_NO_ERROR;
  181. }