|
|
// ReportEvent.cpp
#include "precomp.h"
#include "ReportEvent.h"
CReportEventMap::~CReportEventMap() { for (CReportEventMapIterator i = begin(); i != end(); i++) delete ((*i).second); }
CIMTYPE CReportEventMap::PrintfTypeToCimType(LPCWSTR szType) { CIMTYPE type = 0; LPWSTR szArray = wcsstr(szType, L"[]");
// Look to see if this should be an array.
if (szArray) { type = CIM_FLAG_ARRAY; *szArray = 0; }
// See if the remainder of the string is only a single character.
if (*szType && !*(szType + 1)) { // Set the type for the single character cases.
switch(*szType) { case 'u': type |= CIM_UINT32; break;
case 'd': case 'i': type |= CIM_SINT32; break;
case 'f': type |= CIM_REAL32; break;
case 'g': type |= CIM_REAL64; break;
case 's': type |= CIM_STRING; break;
case 'c': type |= CIM_UINT8; break;
case 'w': type |= CIM_UINT16; break;
case 'b': type |= CIM_BOOLEAN; break; case 'o': type |= CIM_OBJECT; break;
case 'O': type |= CIM_IUNKNOWN; break;
default: type = CIM_EMPTY; break; } } // Else check for the more complicated cases.
else if (!wcscmp(szType, L"I64d") || !wcscmp(szType, L"I64i")) type |= CIM_SINT64; else if (!wcscmp(szType, L"I64u")) type |= CIM_UINT64; else type = CIM_EMPTY; return type; }
HANDLE CReportEventMap::CreateEvent( HANDLE hConnection, LPCWSTR szName, DWORD dwFlags, LPCWSTR szFormat) { if ( szName == NULL ) return NULL;
LPWSTR szTempFormat = _wcsdup(szFormat); HANDLE hEvent;
// Out of memory?
if (!szTempFormat) return NULL;
hEvent = WmiCreateObject( hConnection, szName, dwFlags); if (hEvent == NULL) { free(szTempFormat); return NULL; }
LPWSTR szCurrent = wcstok(szTempFormat, L" "); BOOL bBad = FALSE;
while (szCurrent && !bBad) { LPWSTR szType = wcschr(szCurrent, '!'), szBang2;
bBad = TRUE;
if (szType) { szBang2 = wcschr(szType + 1, '!');
if (szBang2) { *szBang2 = 0; *szType = 0; szType++;
CIMTYPE type = PrintfTypeToCimType(szType);
if (type != CIM_EMPTY) { bBad = !WmiAddObjectProp( hEvent, szCurrent, type, NULL); } } } szCurrent = wcstok(NULL, L" "); }
if (bBad && hEvent) { // Something went wrong, so blow away the event and return NULL.
WmiDestroyObject(hEvent); hEvent = NULL; }
free(szTempFormat); return hEvent; }
HANDLE CReportEventMap::GetEvent( HANDLE hConnection, LPCWSTR szName, LPCWSTR szFormat) { HANDLE hEvent; CReportParams params(szName, szFormat); CReportEventMapIterator i;
// First find a match using the pointers, then verify it's a real match
// by using string compares.
if ((i = find(params)) != end()) { // If it's a match, return the event we already have.
if (params.IsEquivalent((*i).first)) return (*i).second->GetEvent(); else { // Was not a match, so free up the mapping.
delete ((*i).second); erase(i); } }
hEvent = CreateEvent( hConnection, szName, 0, szFormat);
if (hEvent) { // If everything was OK then we need to store this event in our
// map.
CReportItem *pItem = new CReportItem( ); if (pItem) { if ( pItem->Initialize( szName, szFormat, hEvent) ) { (*this)[params] = pItem; return hEvent; } } WmiDestroyObject(hEvent); return NULL; } return hEvent; }
|