1
/***************************************************************************
2
* Copyright 2005-2008 Last.fm Ltd. *
4
* This program is free software; you can redistribute it and/or modify *
5
* it under the terms of the GNU General Public License as published by *
6
* the Free Software Foundation; either version 2 of the License, or *
7
* (at your option) any later version. *
9
* This program 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. *
14
* You should have received a copy of the GNU General Public License *
15
* along with this program; if not, write to the *
16
* Free Software Foundation, Inc., *
17
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18
***************************************************************************/
20
#include "WmiSink_win.h"
21
#include "NdisEvents_win.h"
24
WmiSink::WmiSink(NdisEvents *callback)
26
, m_callback(callback)
39
WmiSink::QueryInterface(REFIID riid, LPVOID * ppv)
43
if (IID_IUnknown==riid || IID_IWbemObjectSink == riid)
45
*ppv = (IWbemObjectSink *) this;
70
// This method receives notification objects.
72
WmiSink::Indicate(long lObjectCount, IWbemClassObject** ppObjArray)
74
// For each object in the array, extract the object and display the
75
// information in the object.
76
for (long i=0; i<lObjectCount; i++)
78
CComVariant vt, vtClass;
79
ppObjArray[i]->Get(L"InstanceName", 0, &vt, NULL, NULL);
80
ppObjArray[i]->Get(L"__Class", 0, &vtClass, NULL, NULL);
82
if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusMediaDisconnect"))
84
if (m_callback) m_callback->onConnectionDown(vt.bstrVal);
86
else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusMediaConnect"))
88
if (m_callback) m_callback->onConnectionUp(vt.bstrVal);
90
// notifications we aren't interested in right now:
92
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyAdapterRemoval"))
94
// bstrLog = (_bstr_t) vt.bstrVal;
95
// VariantClear (&vt);
96
// ppObjArray[i]->Get (L"DeviceName", 0, &vt, NULL, NULL);
97
// bstrLog += (_bstr_t) _T(": ") + (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has been removed");
98
// displayDlg.LogEvent (bstrLog);
100
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyAdapterArrival"))
102
// bstrLog = (_bstr_t) vt.bstrVal;
103
// VariantClear (&vt);
104
// ppObjArray[i]->Get(L"DeviceName", 0, &vt, NULL, NULL);
105
// bstrLog += (_bstr_t) _T(": ") + (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has been added");
106
// displayDlg.LogEvent (bstrLog);
108
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusResetStart"))
110
// bstrLog = (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has begun a reset");
111
// displayDlg.LogEvent (bstrLog);
113
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusResetEnd"))
115
// bstrLog = (_bstr_t) vt.bstrVal + (_bstr_t) _T(" has finished a reset");
116
// displayDlg.LogEvent (bstrLog);
118
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyVcArrival"))
120
// bstrLog = (_bstr_t) _T("VC arrival: ") + (_bstr_t) vt.bstrVal;
121
// displayDlg.LogEvent (bstrLog);
123
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_NotifyVcRemoval"))
125
// bstrLog = (_bstr_t) _T("VC removal: ") + (_bstr_t) vt.bstrVal;
126
// displayDlg.LogEvent (bstrLog);
128
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusMediaSpecificIndication"))
130
// ATLTRACE (_T("Media specific indication: %s\n"), (TCHAR *) (_bstr_t) vt.bstrVal);
131
// VariantClear (&vt);
132
// ppObjArray[i]->Get (L"NdisStatusMediaSpecificIndication", 0, &vt, NULL, NULL);
133
// LONG lLowerBound, lUpperBound, j;
135
// SafeArrayGetLBound (V_ARRAY (&vt), 1, &lLowerBound);
136
// SafeArrayGetUBound (V_ARRAY (&vt), 1, &lUpperBound);
138
// for (j = lLowerBound; j<= lUpperBound; j++ )
140
// SafeArrayGetElement (V_ARRAY (&vt), &j, &ch);
141
// ATLTRACE (_T("%4i"), ch);
143
// if (((j - lLowerBound) % 8 == 7) && (j <= lUpperBound))
144
// ATLTRACE (_T("\n"));
147
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusProtocolBind"))
149
// bstrLog = (_bstr_t) vt.bstrVal;
150
// VariantClear (&vt);
151
// ppObjArray[i]->Get (L"Transport", 0, &vt, NULL, NULL);
152
// bstrLog += (_bstr_t) _T(" is now bound to ") + (_bstr_t) vt.bstrVal;
153
// displayDlg.LogEvent (bstrLog);
155
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusProtocolBind"))
157
// bstrLog = (_bstr_t) vt.bstrVal;
158
// VariantClear (&vt);
159
// ppObjArray[i]->Get(L"Transport", 0, &vt, NULL, NULL);
160
// bstrLog += (_bstr_t) _T(" was unbound from ") + (_bstr_t) vt.bstrVal;
161
// displayDlg.LogEvent (bstrLog);
163
//else if (!wcscmp (vtClass.bstrVal, L"MSNdis_StatusLinkSpeedChange"))
165
// IWbemClassObject* pWMIObj=NULL;
166
// bstrLog = (_bstr_t) _T("Link speed change ") + (_bstr_t) vt.bstrVal;
167
// VariantClear (&vt);
168
// ppObjArray[i]->Get (L"NdisStatusLinkSpeedChange", 0, &vt, NULL, NULL);
169
// if SUCCEEDED (vt.punkVal->QueryInterface (IID_IWbemClassObject, (void**)&pWMIObj))
172
// pWMIObj->Get (L"Inbound", 0, &vt2, NULL, NULL);
173
// _stprintf (szNum, _T(" Inbound = %u "), vt2.lVal);
174
// bstrLog += (_bstr_t) szNum;
175
// VariantClear (&vt2);
176
// pWMIObj->Get (L"Outbound", 0, &vt2, NULL, NULL);
177
// _stprintf (szNum, _T(" Outbound = %u "), vt2.lVal);
178
// bstrLog += (_bstr_t) szNum;
179
// VariantClear (&vt2);
180
// pWMIObj->Release ();
183
// displayDlg.LogEvent (bstrLog);
186
VariantClear (&vtClass);
189
return WBEM_NO_ERROR;
193
// Misc. status codes sent by sink.
195
WmiSink::SetStatus(long lFlags, HRESULT hResult, BSTR strParam, IWbemClassObject __RPC_FAR *pObjParam)
201
return WBEM_NO_ERROR;