You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4577 lines
100 KiB
4577 lines
100 KiB
//***************************************************************************
|
|
|
|
//
|
|
|
|
// File:
|
|
|
|
//
|
|
|
|
// Module: MS SNMP Provider
|
|
|
|
//
|
|
|
|
// Purpose:
|
|
|
|
//
|
|
|
|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include <precomp.h>
|
|
#include "csmir.h"
|
|
#include "handles.h"
|
|
#include "classfac.h"
|
|
|
|
#include <textdef.h>
|
|
#include <helper.h>
|
|
#include "bstring.h"
|
|
|
|
#ifdef ICECAP_PROFILE
|
|
#include <icapexp.h>
|
|
#endif
|
|
|
|
|
|
// A function to escape newlines, tabs etc. from a property value
|
|
static BSTR EscapeSpecialCharacters(BSTR strInputString)
|
|
{
|
|
// Escape all the quotes - This code taken from winmgmt\common\var.cpp
|
|
// =====================
|
|
|
|
int nStrLen = wcslen(strInputString);
|
|
LPWSTR wszValue = new WCHAR[nStrLen*2+10];
|
|
LPWSTR pwc = wszValue;
|
|
for(int i = 0; i < (int)nStrLen; i++)
|
|
{
|
|
switch(strInputString[i])
|
|
{
|
|
case L'\n':
|
|
*(pwc++) = L'\\';
|
|
*(pwc++) = L'n';
|
|
break;
|
|
case L'\t':
|
|
*(pwc++) = L'\\';
|
|
*(pwc++) = L't';
|
|
break;
|
|
case L'"':
|
|
case L'\\':
|
|
*(pwc++) = L'\\';
|
|
*(pwc++) = strInputString[i];
|
|
break;
|
|
default:
|
|
*(pwc++) = strInputString[i];
|
|
break;
|
|
}
|
|
}
|
|
*pwc = 0;
|
|
BSTR retValue = SysAllocString(wszValue);
|
|
delete [] wszValue;
|
|
return retValue;
|
|
}
|
|
|
|
|
|
/*
|
|
* CSmirModuleHandle::QueryInterface
|
|
*
|
|
* Purpose:
|
|
* Manages the interfaces for this object which supports the
|
|
* IUnknown interface.
|
|
*
|
|
* Parameters:
|
|
* riid REFIID of the interface to return.
|
|
* ppv PPVOID in which to store the pointer.
|
|
*
|
|
* Return Value:
|
|
* SCODE NOERROR on success, E_NOINTERFACE if the
|
|
* interface is not supported.
|
|
*/
|
|
|
|
STDMETHODIMP CSmirModuleHandle::QueryInterface(REFIID riid, PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//Always NULL the out-parameters
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv=this;
|
|
|
|
if (IID_ISMIR_ModHandle==riid)
|
|
*ppv=this;
|
|
|
|
if (NULL==*ppv)
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
|
|
//AddRef any interface we'll return.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* CSmirModuleHandle::AddRef
|
|
* CSmirModuleHandle::Release
|
|
*
|
|
* Reference counting members. When Release sees a zero count
|
|
* the object destroys itself.
|
|
*/
|
|
|
|
ULONG CSmirModuleHandle::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
////CMOEvent_Trace MyTraceEvent(SMIR_STR);
|
|
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirModuleHandle::Release(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
long ret;
|
|
if (0!=(ret=InterlockedDecrement(&m_cRef)))
|
|
return ret;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
CSmirModuleHandle :: CSmirModuleHandle()
|
|
: m_lSnmp_version(DEFAULT_SNMP_VERSION), m_szLastUpdate(NULL),
|
|
m_szModuleOid(NULL), m_szName(NULL),
|
|
m_szModuleId(NULL), m_szOrganisation(NULL),
|
|
m_szContactInfo(NULL), m_szDescription(NULL),
|
|
m_szRevision(NULL), m_szModImports(NULL)
|
|
{
|
|
//start off as a handel to nothing
|
|
//init reference count
|
|
m_cRef=0;
|
|
CModHandleClassFactory::objectsInProgress++;
|
|
}
|
|
|
|
/*
|
|
* CSmirGroupHandle::void* operator
|
|
* validate handle
|
|
*/
|
|
|
|
CSmirModuleHandle::operator void*()
|
|
{
|
|
if(NULL!=m_szName)
|
|
return this;
|
|
return NULL;
|
|
}
|
|
|
|
/**************************************************************************************
|
|
*Methods not exposed by the ISmirModHandle interface.
|
|
*Used to encapsulate functionality.
|
|
**************************************************************************************/
|
|
|
|
STDMETHODIMP CSmirModuleHandle::DeleteFromDB ( CSmir *a_Smir )
|
|
{
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
res= CSmirAccess :: Open(a_Smir,&moServ);
|
|
if ((S_FALSE==res)||(NULL == moServ))
|
|
{
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//delete all of the classes in this module
|
|
|
|
ISmirInterrogator *pInterrogativeInt = NULL ;
|
|
res = g_pClassFactoryHelper->CreateInstance(
|
|
|
|
CLSID_SMIR_Database,
|
|
IID_ISMIR_Interrogative,
|
|
(PVOID *)&pInterrogativeInt
|
|
);
|
|
|
|
if(S_OK!=res)
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
ISMIRWbemConfiguration *t_Configuration = NULL ;
|
|
res = pInterrogativeInt->QueryInterface (
|
|
|
|
IID_ISMIRWbemConfiguration ,
|
|
( void ** ) &t_Configuration
|
|
) ;
|
|
|
|
if ( ! SUCCEEDED ( res ) )
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pInterrogativeInt->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
ISMIRWbemConfiguration *t_CopyConfiguration = NULL ;
|
|
res = a_Smir->QueryInterface (
|
|
|
|
IID_ISMIRWbemConfiguration ,
|
|
( void ** ) &t_CopyConfiguration
|
|
) ;
|
|
|
|
if ( ! SUCCEEDED ( res ) )
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
t_Configuration->Release () ;
|
|
pInterrogativeInt->Release();
|
|
return S_OK ;
|
|
}
|
|
|
|
t_Configuration->Impersonate ( t_CopyConfiguration ) ;
|
|
|
|
if ( ! SUCCEEDED ( res ) )
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
t_Configuration->Release () ;
|
|
t_CopyConfiguration->Release () ;
|
|
pInterrogativeInt->Release();
|
|
|
|
return S_OK ;
|
|
}
|
|
|
|
t_Configuration->Release () ;
|
|
t_CopyConfiguration->Release () ;
|
|
|
|
IEnumClass *pTEnumSmirClass = NULL ;
|
|
res = pInterrogativeInt->EnumClassesInModule(&pTEnumSmirClass,this);
|
|
|
|
if(S_OK!=res)
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pInterrogativeInt->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
//now use the enumerator
|
|
//loop over the classes and remove them
|
|
ISmirClassHandle *phClass = NULL ;
|
|
for(int iCount=0;S_OK==pTEnumSmirClass->Next(1, &phClass, NULL);iCount++)
|
|
{
|
|
/*got one so remove it. Don't check the return because there is nothing
|
|
*I can do about it.
|
|
*/
|
|
((CSmirClassHandle*)phClass)->DeleteFromDB(a_Smir);
|
|
phClass->Release();
|
|
}
|
|
|
|
pTEnumSmirClass->Release();
|
|
|
|
IEnumNotificationClass *pTEnumNotificationClass = NULL ;
|
|
res = pInterrogativeInt->EnumNotificationClassesInModule(&pTEnumNotificationClass,this);
|
|
|
|
if(S_OK!=res)
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pInterrogativeInt->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
//now use the enumerator
|
|
//loop over the classes and remove them
|
|
ISmirNotificationClassHandle *phNClass = NULL ;
|
|
for(iCount=0;S_OK==pTEnumNotificationClass->Next(1, &phNClass, NULL);iCount++)
|
|
{
|
|
/*got one so remove it. Don't check the return because there is nothing
|
|
*I can do about it.
|
|
*/
|
|
((CSmirNotificationClassHandle*)phNClass)->DeleteFromDB(a_Smir);
|
|
phNClass->Release();
|
|
}
|
|
|
|
pTEnumNotificationClass->Release();
|
|
|
|
IEnumExtNotificationClass *pTEnumExtNotificationClass = NULL ;
|
|
res = pInterrogativeInt->EnumExtNotificationClassesInModule(&pTEnumExtNotificationClass,this);
|
|
|
|
//not needed anymore...
|
|
pInterrogativeInt->Release();
|
|
|
|
if(S_OK!=res)
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
//now use the enumerator
|
|
//loop over the classes and remove them
|
|
ISmirExtNotificationClassHandle *phExtNClass = NULL ;
|
|
for(iCount=0;S_OK==pTEnumExtNotificationClass->Next(1, &phExtNClass, NULL);iCount++)
|
|
{
|
|
/*got one so remove it. Don't check the return because there is nothing
|
|
*I can do about it.
|
|
*/
|
|
((CSmirExtNotificationClassHandle*)phExtNClass)->DeleteFromDB(a_Smir);
|
|
phExtNClass->Release();
|
|
}
|
|
|
|
pTEnumExtNotificationClass->Release();
|
|
|
|
/********************Now delete the module********************/
|
|
|
|
//create a buffer big enough
|
|
wchar_t *pTstring = new wchar_t[wcslen(MODULE_NAMESPACE_NAME)+wcslen(EQUALS_STR)
|
|
+wcslen(m_szName)+2+1];
|
|
if(NULL == pTstring)
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
wcscpy(pTstring, MODULE_NAMESPACE_NAME);
|
|
wcscat(pTstring,EQUALS_STR);
|
|
wcscat(pTstring,QUOTE_STR);
|
|
// module =
|
|
|
|
wcscat(pTstring,m_szName);
|
|
wcscat(pTstring,QUOTE_STR);
|
|
// module = <module>
|
|
|
|
CBString t_Str (pTstring);
|
|
SCODE result = moServ->DeleteInstance(t_Str.GetString (),RESERVED_WBEM_FLAG, moContext,NULL );
|
|
|
|
//clean up
|
|
delete [] pTstring;
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
if (FAILED(result))
|
|
{
|
|
//problem!
|
|
return WBEM_E_FAILED;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSmirModuleHandle::AddToDB( CSmir *a_Smir )
|
|
{
|
|
/*open the smir name space this will addref it so it cannot be removed
|
|
*whilst we are using it
|
|
*/
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
result= CSmirAccess :: Open(a_Smir,&moServ);
|
|
|
|
if ((S_FALSE==result)||(NULL == (void*)moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
IWbemClassObject *pModClass = NULL ;
|
|
CBString t_BStr ( MODULE_NAMESPACE_NAME ) ;
|
|
result = moServ->GetObject(t_BStr.GetString () , RESERVED_WBEM_FLAG,moContext,
|
|
&pModClass,NULL);
|
|
|
|
if (!SUCCEEDED(result))
|
|
{
|
|
/*OK we have the smir namespace so create the module namespace
|
|
*first create a class...
|
|
*/
|
|
|
|
|
|
IWbemClassObject *pNewClass = NULL ;
|
|
CBString t_BStr ( OLEMS_NAMESPACE_CLASS ) ;
|
|
result = moServ->GetObject(t_BStr.GetString (), RESERVED_WBEM_FLAG,moContext,
|
|
&pNewClass,NULL);
|
|
|
|
if ((FAILED(result))||(NULL==pNewClass))
|
|
{
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
// Spawn derived class
|
|
|
|
IWbemClassObject *pNewDerivedClass = NULL ;
|
|
result = pNewClass->SpawnDerivedClass ( 0 , &pNewDerivedClass ) ;
|
|
if ((FAILED(result))||(NULL==pNewDerivedClass))
|
|
{
|
|
moServ->Release();
|
|
pNewClass->Release () ;
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
pNewClass->Release () ;
|
|
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
//I now have a new class so Give it a name
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(MODULE_NAMESPACE_NAME);
|
|
|
|
result = pNewDerivedClass->Put(OLEMS_CLASS_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
pNewDerivedClass->Release();
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
result = PutClassProperties(pNewDerivedClass) ;
|
|
if (FAILED(result))
|
|
{
|
|
pNewDerivedClass->Release();
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//now commit the changes
|
|
result = moServ->PutClass(pNewDerivedClass, RESERVED_WBEM_FLAG,moContext,NULL);
|
|
pNewDerivedClass->Release();
|
|
if (FAILED(result))
|
|
{
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//get an object
|
|
|
|
t_BStr = MODULE_NAMESPACE_NAME ;
|
|
result = moServ->GetObject(t_BStr.GetString (), 0,
|
|
moContext,&pModClass,NULL );
|
|
if (FAILED(result))
|
|
{
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
}
|
|
|
|
//and create an instance of the module namespace
|
|
|
|
// Spawn instance of class
|
|
|
|
IWbemClassObject *pNewInstance = NULL ;
|
|
result = pModClass->SpawnInstance ( 0 , &pNewInstance ) ;
|
|
if ((FAILED(result))||(NULL==pNewInstance))
|
|
{
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
pModClass->Release () ;
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
pModClass->Release () ;
|
|
|
|
//fill in the instance
|
|
*this >> pNewInstance;
|
|
|
|
//and commit it to the namespace
|
|
result = moServ->PutInstance(pNewInstance, RESERVED_WBEM_FLAG, moContext,NULL );
|
|
pNewInstance->Release();
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
moServ->Release();
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
moServ->Release();
|
|
|
|
if (FAILED(result))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
const CSmirModuleHandle& CSmirModuleHandle :: operator <<(IWbemClassObject *pSmirMosClassObject)
|
|
{
|
|
//get the name
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
pSmirMosClassObject->Get(MODULE_NAME_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetName(V_BSTR(&v));
|
|
}
|
|
|
|
VariantClear(&v);
|
|
|
|
//get the object id
|
|
pSmirMosClassObject->Get(MODULE_OID_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetModuleOID(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the object imports
|
|
pSmirMosClassObject->Get(MODULE_IMPORTS_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetModuleImports(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the object id
|
|
pSmirMosClassObject->Get(MODULE_ID_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetModuleIdentity(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the organisation
|
|
pSmirMosClassObject->Get(MODULE_ORG_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetOrganisation(V_BSTR(&v));
|
|
}
|
|
|
|
VariantClear(&v);
|
|
|
|
//get the contact
|
|
pSmirMosClassObject->Get(MODULE_CONTACT_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetContactInfo(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the description
|
|
pSmirMosClassObject->Get(MODULE_DESCRIPTION_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetDescription(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the revision
|
|
pSmirMosClassObject->Get(MODULE_REVISION_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetRevision(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the version
|
|
pSmirMosClassObject->Get(MODULE_SNMP_VERSION_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_I4)
|
|
{
|
|
SetSnmpVersion(V_I4(&v));
|
|
}
|
|
//get the last update value
|
|
pSmirMosClassObject->Get(MODULE_LAST_UPDATE_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetLastUpdate(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
return *this;
|
|
}
|
|
|
|
const CSmirModuleHandle& CSmirModuleHandle :: operator >>(IWbemClassObject *pInst)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
//give the instance a name
|
|
V_VT(&v) = VT_BSTR;
|
|
SCODE result;
|
|
if(NULL != m_szName)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szName);
|
|
|
|
result = pInst->Put(OLEMS_NAME_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//must have a name
|
|
return *this;
|
|
}
|
|
//add the module oid property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szModuleOid)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szModuleOid);
|
|
result = pInst->Put(MODULE_OID_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the module identity
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szModuleId)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szModuleId);
|
|
result = pInst->Put(MODULE_ID_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the organisation property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szOrganisation)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szOrganisation);
|
|
result = pInst->Put(MODULE_ORG_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the contact info property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szContactInfo)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szContactInfo);
|
|
result = pInst->Put(MODULE_CONTACT_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the Description property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szDescription)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szDescription);
|
|
result = pInst->Put(MODULE_DESCRIPTION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
|
|
//add the revision property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szRevision)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szRevision);
|
|
result = pInst->Put(MODULE_REVISION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the last update property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szLastUpdate)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szLastUpdate);
|
|
result = pInst->Put(MODULE_LAST_UPDATE_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the snmp version property
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v)=m_lSnmp_version;
|
|
|
|
result = pInst->Put(MODULE_SNMP_VERSION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
|
|
//add the module identity as an property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szModImports)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szModImports);
|
|
|
|
result = pInst->Put(MODULE_IMPORTS_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
HRESULT CSmirModuleHandle :: PutClassProperties (IWbemClassObject *pClass)
|
|
{
|
|
HRESULT result;
|
|
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
//give the instance a name
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
|
|
result = pClass->Put(OLEMS_NAME_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the module oid property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_OID_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the module identity
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_ID_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the organisation property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_ORG_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the contact info property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_CONTACT_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the Description property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_DESCRIPTION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the revision property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_REVISION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the last update property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_LAST_UPDATE_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the snmp version property
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v)=0;
|
|
result = pClass->Put(MODULE_SNMP_VERSION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the module identity as an property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
|
|
result = pClass->Put(MODULE_IMPORTS_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
return result ;
|
|
}
|
|
|
|
const CSmirModuleHandle& CSmirModuleHandle :: operator >>(ISmirSerialiseHandle *pSHandle)
|
|
{
|
|
if(NULL!=pSHandle)
|
|
{
|
|
BOOL bMOFPragmas=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFPragmas();
|
|
BOOL bMOFAssociations=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFAssociations();
|
|
|
|
CString szTmpString;
|
|
//start in the SMIR namepspace
|
|
if(TRUE==bMOFPragmas)
|
|
szTmpString=CString(SMIR_NAMESPACE_PRAGMA);
|
|
|
|
if (TRUE == bMOFAssociations)
|
|
{
|
|
//create an instance of the module namespac
|
|
szTmpString+=MODULE_INSTANCE_START;
|
|
//add the properties
|
|
|
|
//give the instance a name
|
|
szTmpString+=CString(MODULE_NAME_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szName);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the module oid property
|
|
szTmpString+=CString(MODULE_OID_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szModuleOid);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the module identity
|
|
szTmpString+=CString(MODULE_ID_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szModuleId);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the organisation property
|
|
szTmpString+=CString(MODULE_ORG_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
BSTR strOrganisation = EscapeSpecialCharacters(m_szOrganisation);
|
|
szTmpString+=CString(strOrganisation);
|
|
SysFreeString(strOrganisation);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the contact info property
|
|
szTmpString+=CString(MODULE_CONTACT_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
BSTR strContactInfo = EscapeSpecialCharacters(m_szContactInfo);
|
|
szTmpString+=CString(strContactInfo);
|
|
SysFreeString(strContactInfo);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the Description property
|
|
szTmpString+=CString(MODULE_DESCRIPTION_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
BSTR strDescription= EscapeSpecialCharacters(m_szDescription);
|
|
szTmpString+=CString(strDescription);
|
|
SysFreeString(strDescription);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the revision property
|
|
szTmpString+=CString(MODULE_REVISION_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
BSTR strRevision = EscapeSpecialCharacters(m_szRevision);
|
|
szTmpString+=CString(strRevision);
|
|
SysFreeString(strRevision);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the last update property
|
|
szTmpString+=CString(MODULE_LAST_UPDATE_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szLastUpdate);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//add the snmp version property
|
|
szTmpString+=CString(MODULE_SNMP_VERSION_PROPERTY);
|
|
szTmpString+=CString(EQUALS_STR);
|
|
wchar_t szVersion[17];
|
|
_itow(m_lSnmp_version,szVersion,2);
|
|
szTmpString+=CString(szVersion);
|
|
szTmpString+=END_OF_PROPERTY;
|
|
|
|
//add the module imports as an property
|
|
szTmpString+=CString(MODULE_IMPORTS_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szModImports);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
szTmpString+=END_OF_CLASS;
|
|
}
|
|
/*******create the group class***********/
|
|
//add the group class to the module namespace
|
|
if(TRUE==bMOFPragmas)
|
|
{
|
|
szTmpString+=CString(START_OF_SMIR_NAMESPACE_PRAGMA);
|
|
szTmpString+=CString(m_szName);
|
|
szTmpString+=CString(END_OF_NAMESPACE_PRAGMA);
|
|
}
|
|
if (TRUE == bMOFAssociations)
|
|
{
|
|
szTmpString+=GROUP_CLASS_START;
|
|
|
|
//add the properties
|
|
//give the instance a name
|
|
szTmpString+=READONLY_STRING;
|
|
szTmpString+=CString(GROUP_NAME_PROPERTY);
|
|
szTmpString+=END_OF_PROPERTY;
|
|
|
|
//give the instance a group id
|
|
szTmpString+=READONLY_STRING;
|
|
szTmpString+=CString(GROUP_ID_PROPERTY);
|
|
szTmpString+=END_OF_PROPERTY;
|
|
|
|
//give the instance a status
|
|
szTmpString+=READONLY_STRING;
|
|
szTmpString+=CString(GROUP_STATUS_PROPERTY);
|
|
szTmpString+=END_OF_PROPERTY;
|
|
|
|
//give the instance a description
|
|
szTmpString+=READONLY_STRING;
|
|
szTmpString+=CString(GROUP_DESCRIPTION_PROPERTY);
|
|
szTmpString+=END_OF_PROPERTY;
|
|
|
|
//give the instance a reference
|
|
szTmpString+=READONLY_STRING;
|
|
szTmpString+=CString(MODULE_REFERENCE_PROPERTY);
|
|
szTmpString+=END_OF_PROPERTY;
|
|
|
|
szTmpString+=END_OF_CLASS;
|
|
}
|
|
|
|
//and add the string to the serialise handle
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(szTmpString);
|
|
|
|
//each group will create it's own instance
|
|
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetName(BSTR *pszName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(pszName!=NULL)
|
|
{
|
|
*pszName=SysAllocString(m_szName);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetModuleOID(BSTR *pszModuleOid)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pszModuleOid)
|
|
{
|
|
*pszModuleOid=SysAllocString(m_szModuleOid);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetModuleIdentity(BSTR *pszModuleId)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pszModuleId)
|
|
{
|
|
*pszModuleId=SysAllocString(m_szModuleId);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetLastUpdate(BSTR *pszLastUpdate)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pszLastUpdate)
|
|
{
|
|
*pszLastUpdate=SysAllocString(m_szLastUpdate);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetOrganisation(BSTR *pszOrganisation)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pszOrganisation)
|
|
{
|
|
*pszOrganisation=SysAllocString(m_szOrganisation);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetContactInfo(BSTR *pszContactInfo)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pszContactInfo)
|
|
{
|
|
*pszContactInfo=SysAllocString(m_szContactInfo);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetDescription(BSTR *pszDescription)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pszDescription)
|
|
{
|
|
*pszDescription=SysAllocString(m_szDescription);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetRevision(BSTR *pszRevision)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pszRevision)
|
|
{
|
|
*pszRevision=SysAllocString(m_szRevision);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetSnmpVersion(ULONG *plSnmp_version)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != plSnmp_version)
|
|
{
|
|
*plSnmp_version=m_lSnmp_version;
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: GetModuleImports (BSTR* ppszModImports)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != ppszModImports)
|
|
{
|
|
*ppszModImports=SysAllocString(m_szModImports);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetName(BSTR pszName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szName,&pszName);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetModuleOID(BSTR pszModuleOid)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szModuleOid,&pszModuleOid);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetModuleIdentity(BSTR pszModuleId)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szModuleId,&pszModuleId);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetLastUpdate(BSTR pszLastUpdate)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szLastUpdate,&pszLastUpdate);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetOrganisation(BSTR pszOrganisation)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szOrganisation,&pszOrganisation);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetContactInfo(BSTR pszContactInfo)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szContactInfo,&pszContactInfo);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetDescription(BSTR pszDescription)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szDescription,&pszDescription);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetRevision(BSTR pszRevision)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szRevision,&pszRevision);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetSnmpVersion(ULONG plSnmp_version)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
m_lSnmp_version=plSnmp_version;
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirModuleHandle :: SetModuleImports (BSTR pszModImports)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szModImports,&pszModImports);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
CSmirModuleHandle :: ~ CSmirModuleHandle()
|
|
{
|
|
SysFreeString(m_szModuleOid);
|
|
SysFreeString(m_szName);
|
|
SysFreeString(m_szModuleId);
|
|
SysFreeString(m_szOrganisation);
|
|
SysFreeString(m_szContactInfo);
|
|
SysFreeString(m_szDescription);
|
|
SysFreeString(m_szRevision);
|
|
SysFreeString(m_szModImports);
|
|
SysFreeString(m_szLastUpdate);
|
|
|
|
CModHandleClassFactory::objectsInProgress--;
|
|
}
|
|
|
|
/*Group handle methods
|
|
*/
|
|
/*
|
|
* CSmirGroupHandle::QueryInterface
|
|
*
|
|
* Purpose:
|
|
* Manages the interfaces for this object which supports the
|
|
* IUnknown interface.
|
|
*
|
|
* Parameters:
|
|
* riid REFIID of the interface to return.
|
|
* ppv PPVOID in which to store the pointer.
|
|
*
|
|
* Return Value:
|
|
* SCODE NOERROR on success, E_NOINTERFACE if the
|
|
* interface is not supported.
|
|
*/
|
|
|
|
STDMETHODIMP CSmirGroupHandle::QueryInterface(REFIID riid, PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//Always NULL the out-parameters
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv=this;
|
|
|
|
if (IID_ISMIR_GroupHandle==riid)
|
|
*ppv=this;
|
|
|
|
if (NULL==*ppv)
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
|
|
//AddRef any interface we'll return.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirModuleHandle::AddRef
|
|
* CSmirModuleHandle::Release
|
|
*
|
|
* Reference counting members. When Release sees a zero count
|
|
* the object destroys itself.
|
|
*/
|
|
|
|
ULONG CSmirGroupHandle::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//CMOEvent_Trace MyTraceEvent(SMIR_STR);
|
|
//MyTraceEvent.Generate(__FILE__,__LINE__, "CSmirGroupHandle::AddRef( %ld", m_cRef);
|
|
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirGroupHandle::Release(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
long ret;
|
|
if (0!=(ret=InterlockedDecrement(&m_cRef)))
|
|
return ret;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
CSmirGroupHandle :: CSmirGroupHandle()
|
|
: m_szModuleName(NULL), m_szName(NULL),
|
|
m_szGroupId(NULL), m_szDescription(NULL),
|
|
m_szReference(NULL),m_szStatus(NULL)
|
|
{
|
|
//init the reference count
|
|
m_cRef=0;
|
|
//start off as a handel to nothing
|
|
|
|
//inc the factory count
|
|
CGroupHandleClassFactory::objectsInProgress++;
|
|
}
|
|
|
|
CSmirGroupHandle :: ~ CSmirGroupHandle()
|
|
{
|
|
SysFreeString(m_szModuleName);
|
|
SysFreeString(m_szName);
|
|
SysFreeString(m_szGroupId);
|
|
SysFreeString(m_szDescription);
|
|
SysFreeString(m_szReference);
|
|
SysFreeString(m_szStatus);
|
|
CGroupHandleClassFactory::objectsInProgress--;
|
|
}
|
|
|
|
/*
|
|
* CSmirGroupHandle::void* operator
|
|
* validate handle
|
|
*/
|
|
|
|
CSmirGroupHandle::operator void*()
|
|
{
|
|
if((NULL!=m_szModuleName)&&(NULL!=m_szName))
|
|
return this;
|
|
return NULL;
|
|
}
|
|
|
|
/**************************************************************************************
|
|
*Methods not exposed by the ISmirGroupHandle interface.
|
|
*Used to encapsulate functionality.
|
|
**************************************************************************************/
|
|
|
|
STDMETHODIMP CSmirGroupHandle::AddToDB( CSmir *a_Smir , ISmirModHandle *hModule)
|
|
{
|
|
//save the module name
|
|
BSTR szTmpStr;
|
|
hModule->GetName(&szTmpStr);
|
|
SetModuleName(szTmpStr);
|
|
SysFreeString(szTmpStr);
|
|
|
|
//open the module namespace
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
result= CSmirAccess :: Open(a_Smir,&moServ,hModule);
|
|
if (FAILED(result)||(NULL == moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//get an object
|
|
IWbemClassObject *pGrpClass = NULL ;
|
|
CBString t_BStr ( GROUP_NAMESPACE_NAME ) ;
|
|
result = moServ->GetObject(t_BStr.GetString (), 0,
|
|
moContext,&pGrpClass,NULL );
|
|
|
|
if ( !SUCCEEDED(result) )
|
|
{
|
|
//OK we have the module namespace so create the group class
|
|
IWbemClassObject *pNewClass = NULL ;
|
|
CBString t_BStr ( OLEMS_NAMESPACE_CLASS ) ;
|
|
result = moServ->GetObject(t_BStr.GetString (), RESERVED_WBEM_FLAG,
|
|
moContext, &pNewClass,NULL);
|
|
|
|
if ((FAILED(result))||(NULL==pNewClass))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
// Spawn derived class
|
|
|
|
IWbemClassObject *pNewDerivedClass = NULL ;
|
|
result = pNewClass->SpawnDerivedClass ( 0 , &pNewDerivedClass ) ;
|
|
pNewClass->Release();
|
|
|
|
if ((FAILED(result))||(NULL==pNewDerivedClass))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
//OK I have a new class so give it a name
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(GROUP_NAMESPACE_NAME);
|
|
|
|
result = pNewDerivedClass->Put(OLEMS_CLASS_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pNewDerivedClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
result = PutClassProperties(pNewDerivedClass) ;
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
pNewDerivedClass->Release();
|
|
moServ->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//now commit the changes
|
|
result = moServ->PutClass(pNewDerivedClass, RESERVED_WBEM_FLAG, moContext, NULL);
|
|
pNewDerivedClass->Release();
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//and create an instance of the group namespace
|
|
//get an object
|
|
|
|
//get an object
|
|
t_BStr = GROUP_NAMESPACE_NAME ;
|
|
result = moServ->GetObject(t_BStr.GetString (), 0,
|
|
moContext, &pGrpClass,NULL );
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
}
|
|
|
|
// Spawn instance of class
|
|
|
|
IWbemClassObject *pNewInstance ;
|
|
result = pGrpClass->SpawnInstance ( 0 , &pNewInstance ) ;
|
|
if ((FAILED(result))||(NULL==pNewInstance))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pGrpClass->Release () ;
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
pGrpClass->Release () ;
|
|
|
|
//fill in the instance
|
|
*this >> pNewInstance;
|
|
|
|
|
|
//and commit it to the namespace
|
|
result = moServ->PutInstance(pNewInstance, RESERVED_WBEM_FLAG,moContext, NULL);
|
|
pNewInstance->Release();
|
|
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
moServ->Release();
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
moServ->Release();
|
|
|
|
if (FAILED(result))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSmirGroupHandle::DeleteFromDB ( CSmir *a_Smir )
|
|
{
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE res= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
res= CSmirAccess :: Open(a_Smir,&moServ);
|
|
if ((S_FALSE==res)||(NULL == (void*)moServ))
|
|
{
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
/******************delete all of the classes in this group***********************/
|
|
|
|
IEnumClass *pTEnumSmirClass = NULL ;
|
|
ISmirInterrogator *pInterrogativeInt = NULL ;
|
|
SCODE result = g_pClassFactoryHelper->CreateInstance (
|
|
|
|
CLSID_SMIR_Database,
|
|
IID_ISMIR_Interrogative,
|
|
(PVOID *)&pInterrogativeInt
|
|
);
|
|
|
|
if ( ! SUCCEEDED ( result ) )
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
ISMIRWbemConfiguration *t_Configuration = NULL ;
|
|
result = pInterrogativeInt->QueryInterface (
|
|
|
|
IID_ISMIRWbemConfiguration ,
|
|
( void ** ) &t_Configuration
|
|
) ;
|
|
|
|
if ( ! SUCCEEDED ( result ) )
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pInterrogativeInt->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
ISMIRWbemConfiguration *t_CopyConfiguration = NULL ;
|
|
result = pInterrogativeInt->QueryInterface (
|
|
|
|
IID_ISMIRWbemConfiguration ,
|
|
( void ** ) &t_CopyConfiguration
|
|
) ;
|
|
|
|
if ( ! SUCCEEDED ( result ) )
|
|
{
|
|
t_Configuration->Release () ;
|
|
pInterrogativeInt->Release();
|
|
}
|
|
|
|
t_Configuration->Impersonate ( t_CopyConfiguration ) ;
|
|
|
|
if ( ! SUCCEEDED ( result ) )
|
|
{
|
|
t_Configuration->Release () ;
|
|
t_CopyConfiguration->Release () ;
|
|
pInterrogativeInt->Release();
|
|
}
|
|
|
|
t_Configuration->Release () ;
|
|
t_CopyConfiguration->Release () ;
|
|
|
|
res = pInterrogativeInt->EnumClassesInGroup (&pTEnumSmirClass,this);
|
|
//now use the enumerator
|
|
if(FAILED(res))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pInterrogativeInt->Release();
|
|
return S_OK;
|
|
}
|
|
//loop over the classes and remove them
|
|
ISmirClassHandle *phClass=NULL;
|
|
for(int iCount=0;S_OK==pTEnumSmirClass->Next(1, &phClass, NULL);iCount++)
|
|
{
|
|
/*got one so remove it. Don't check the return because there is nothing
|
|
*I can do about it.
|
|
*/
|
|
((CSmirClassHandle*)phClass)->DeleteClassFromGroup(a_Smir);
|
|
phClass->Release();
|
|
}
|
|
pTEnumSmirClass->Release();
|
|
pInterrogativeInt->Release();
|
|
/************************* delete the associations******************************/
|
|
//delete everthing that is associated with the group using
|
|
//references of {\\.\root\default\SMIR:<group>}
|
|
IEnumWbemClassObject *pEnum = NULL ;
|
|
|
|
CString sQuery(CString(SMIR_ASSOC_QUERY_STR2)
|
|
+CString(OPEN_BRACE_STR)
|
|
+CString(SMIR_NAMESPACE_FROM_ROOT)
|
|
+CString(BACKSLASH_STR)
|
|
+CString(m_szModuleName)
|
|
+CString(COLON_STR)
|
|
+CString(GROUP_NAMESPACE_NAME)
|
|
+CString(EQUALS_STR)
|
|
+CString(QUOTE_STR)
|
|
+CString(m_szName)
|
|
+CString(QUOTE_STR)
|
|
+CString(CLOSE_BRACE_STR)
|
|
);
|
|
BSTR szQuery = sQuery.AllocSysString();
|
|
CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE);
|
|
SCODE sRes = moServ->ExecQuery(t_QueryFormat.GetString (), szQuery,
|
|
RESERVED_WBEM_FLAG, moContext, &pEnum);
|
|
SysFreeString(szQuery);
|
|
|
|
if (FAILED(sRes)||(NULL==pEnum))
|
|
{
|
|
//all groups that contain classes are associated so this may not be a problem
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return S_OK;
|
|
}
|
|
|
|
ULONG uCount=1;
|
|
IWbemClassObject *pAssocMosClass = NULL ;
|
|
ULONG puReturned;
|
|
|
|
//loop over the associations
|
|
VARIANT assocClass;
|
|
VariantInit(&assocClass);
|
|
VARIANT assocName;
|
|
VariantInit(&assocName);
|
|
for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pAssocMosClass,&puReturned);)
|
|
{
|
|
pAssocMosClass->Get(SMIR_X_ASSOC_NAME_PROP, RESERVED_WBEM_FLAG, &assocName,NULL,NULL);
|
|
pAssocMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &assocClass,NULL,NULL);
|
|
pAssocMosClass->Release();
|
|
|
|
CString instString(
|
|
|
|
CString(V_BSTR(&assocClass))
|
|
+CString(EQUALS_STR)
|
|
+CString(QUOTE_STR)
|
|
+CString(V_BSTR(&assocName))
|
|
+CString(QUOTE_STR)
|
|
);
|
|
|
|
VariantClear(&assocName);
|
|
VariantClear(&assocClass);
|
|
|
|
BSTR instBString = instString.AllocSysString();
|
|
moServ->DeleteInstance(instBString, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
SysFreeString(instBString);
|
|
}
|
|
|
|
pEnum->Release();
|
|
moServ->Release();
|
|
|
|
/*************************now delete the group******************************/
|
|
//open the module name space
|
|
res= CSmirAccess :: Open(a_Smir,&moServ, this,CSmirAccess::eModule);
|
|
if ((S_FALSE==res)||(NULL == (void*)moServ))
|
|
{
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//OK we have the module namespace so delete the group
|
|
|
|
//build the object path
|
|
wchar_t *pTString = new wchar_t[wcslen(GROUP_NAMESPACE_NAME)+wcslen(EQUALS_STR)+
|
|
wcslen(m_szName)+2+1];
|
|
if(NULL == pTString)
|
|
{
|
|
//free the string we got from hGroup
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
wcscpy(pTString, GROUP_NAMESPACE_NAME);
|
|
wcscat(pTString,EQUALS_STR);
|
|
wcscat(pTString,QUOTE_STR);
|
|
// GROUP =
|
|
|
|
wcscat(pTString,m_szName);
|
|
wcscat(pTString,QUOTE_STR);
|
|
// GROUP = <group name>
|
|
|
|
|
|
CBString t_Str (pTString);
|
|
result = moServ->DeleteInstance(t_Str.GetString (), RESERVED_WBEM_FLAG, moContext,NULL);
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
delete [] pTString;
|
|
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return WBEM_E_FAILED;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
const CSmirGroupHandle& CSmirGroupHandle :: operator <<(IWbemClassObject *pSmirMosClassObject)
|
|
{
|
|
//get the name
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
pSmirMosClassObject->Get(GROUP_NAME_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetName(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the group id
|
|
pSmirMosClassObject->Get(GROUP_ID_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetGroupOID(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the status
|
|
pSmirMosClassObject->Get(GROUP_STATUS_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetStatus(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the description
|
|
pSmirMosClassObject->Get(GROUP_DESCRIPTION_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetDescription(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
//get the reference
|
|
pSmirMosClassObject->Get(MODULE_REFERENCE_PROPERTY, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
SetReference(V_BSTR(&v));
|
|
}
|
|
VariantClear(&v);
|
|
|
|
return *this;
|
|
}
|
|
|
|
const CSmirGroupHandle& CSmirGroupHandle :: operator >>(IWbemClassObject *pInst)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
//give the instance a name
|
|
V_VT(&v) = VT_BSTR;
|
|
SCODE result;
|
|
if(NULL != m_szName)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szName);
|
|
|
|
result = pInst->Put(OLEMS_NAME_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return *this;
|
|
}
|
|
//add the group oid property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szGroupId)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szGroupId);
|
|
result = pInst->Put(GROUP_ID_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the status property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szStatus)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szStatus);
|
|
result = pInst->Put(GROUP_STATUS_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the Description property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szDescription)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szDescription);
|
|
result = pInst->Put(GROUP_DESCRIPTION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the reference property
|
|
V_VT(&v) = VT_BSTR;
|
|
if(NULL != m_szReference)
|
|
{
|
|
V_BSTR(&v)=SysAllocString(m_szReference);
|
|
result = pInst->Put(MODULE_REFERENCE_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return *this;
|
|
}
|
|
}
|
|
//add the references to the classes
|
|
|
|
//and return
|
|
return *this;
|
|
}
|
|
|
|
HRESULT CSmirGroupHandle :: PutClassProperties (IWbemClassObject *pClass)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
//give the instance a name
|
|
V_VT(&v) = VT_BSTR;
|
|
HRESULT result;
|
|
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
|
|
result = pClass->Put(OLEMS_NAME_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the group oid property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(GROUP_ID_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the status property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(GROUP_STATUS_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
|
|
//add the Description property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(GROUP_DESCRIPTION_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result;
|
|
}
|
|
|
|
//add the reference property
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(L"");
|
|
result = pClass->Put(MODULE_REFERENCE_PROPERTY,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return result ;
|
|
}
|
|
//add the references to the classes
|
|
|
|
return result ;
|
|
}
|
|
|
|
const CSmirGroupHandle& CSmirGroupHandle :: operator >>(ISmirSerialiseHandle *pSHandle)
|
|
{
|
|
if(NULL!=pSHandle)
|
|
{
|
|
CString szTmpString;
|
|
BOOL bMOFPragmas=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFPragmas();
|
|
BOOL bMOFAssociations=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFAssociations();
|
|
|
|
//start in the group namepspace
|
|
if(TRUE==bMOFPragmas)
|
|
{
|
|
szTmpString=CString(START_OF_SMIR_NAMESPACE_PRAGMA);
|
|
szTmpString+=CString(m_szModuleName);
|
|
szTmpString+=CString(END_OF_NAMESPACE_PRAGMA);
|
|
}
|
|
if(TRUE==bMOFAssociations)
|
|
{
|
|
//create an instance of the group namespace
|
|
szTmpString+=GROUP_INSTANCE_START;
|
|
|
|
//add the properties
|
|
|
|
//give the instance a name
|
|
szTmpString+=CString(GROUP_NAME_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szName);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//give the instance a group id
|
|
szTmpString+=CString(GROUP_ID_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szGroupId);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//give the instance a status
|
|
szTmpString+=CString(GROUP_STATUS_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szStatus);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//give the instance a description
|
|
szTmpString+=CString(GROUP_DESCRIPTION_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szDescription);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//give the instance a reference
|
|
szTmpString+=CString(MODULE_REFERENCE_PROPERTY);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(m_szReference);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
szTmpString+=CString(END_OF_CLASS);
|
|
}
|
|
|
|
//and add the string to the serialise handle
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(szTmpString);
|
|
//each class will create it's self
|
|
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: GetModuleName(BSTR *szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szName)
|
|
{
|
|
*szName=SysAllocString(m_szModuleName);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: GetName(BSTR *szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szName)
|
|
{
|
|
*szName=SysAllocString(m_szName);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: GetGroupOID(BSTR *szGroupId)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szGroupId)
|
|
{
|
|
*szGroupId = SysAllocString(m_szGroupId);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: GetStatus(BSTR *szStatus)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szStatus)
|
|
{
|
|
*szStatus = SysAllocString(m_szStatus);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: GetDescription(BSTR *szDescription)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szDescription)
|
|
{
|
|
*szDescription = SysAllocString(m_szDescription);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: GetReference(BSTR *szReference)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szReference)
|
|
{
|
|
*szReference = SysAllocString(m_szReference);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: SetModuleName(BSTR szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szModuleName,&szName);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: SetName(BSTR szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szName,&szName);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: SetGroupOID(BSTR szGroupId)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szGroupId,&szGroupId);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: SetStatus(BSTR szStatus)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szStatus,&szStatus);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: SetDescription(BSTR szDescription)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szDescription,&szDescription);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirGroupHandle :: SetReference(BSTR szReference)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szReference,&szReference);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*Class handle methods
|
|
*/
|
|
/*
|
|
* CSmirClassHandle::QueryInterface
|
|
*
|
|
* Purpose:
|
|
* Manages the interfaces for this object which supports the
|
|
* IUnknown interface.
|
|
*
|
|
* Parameters:
|
|
* riid REFIID of the interface to return.
|
|
* ppv PPVOID in which to store the pointer.
|
|
*
|
|
* Return Value:
|
|
* SCODE NOERROR on success, E_NOINTERFACE if the
|
|
* interface is not supported.
|
|
*/
|
|
|
|
STDMETHODIMP CSmirClassHandle::QueryInterface(REFIID riid, PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//Always NULL the out-parameters
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv=this;
|
|
|
|
if (IID_ISMIR_ClassHandle==riid)
|
|
*ppv=this;
|
|
|
|
if (NULL==*ppv)
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
|
|
//AddRef any interface we'll return.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirModuleHandle::AddRef
|
|
* CSmirModuleHandle::Release
|
|
*
|
|
* Reference counting members. When Release sees a zero count
|
|
* the object destroys itself.
|
|
*/
|
|
|
|
ULONG CSmirClassHandle::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//CMOEvent_Trace MyTraceEvent(SMIR_STR);
|
|
//MyTraceEvent.Generate(__FILE__,__LINE__, "CSmirClassHandle::AddRef( %ld", m_cRef);
|
|
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirClassHandle::Release(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
long ret;
|
|
if (0!=(ret=InterlockedDecrement(&m_cRef)))
|
|
return ret;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
CSmirClassHandle :: CSmirClassHandle()
|
|
: m_pIMosClass(NULL), m_szModuleName(NULL), m_szGroupName(NULL)
|
|
{
|
|
CClassHandleClassFactory::objectsInProgress++;
|
|
|
|
//init the reference count
|
|
m_cRef=0;
|
|
}
|
|
|
|
CSmirClassHandle :: ~ CSmirClassHandle()
|
|
{
|
|
if (NULL != m_pIMosClass)
|
|
m_pIMosClass->Release();
|
|
SysFreeString(m_szModuleName);
|
|
SysFreeString(m_szGroupName);
|
|
CClassHandleClassFactory::objectsInProgress--;
|
|
}
|
|
|
|
/*
|
|
* CSmirModuleHandle::void* operator
|
|
* validate handle
|
|
*/
|
|
|
|
CSmirClassHandle::operator void*()
|
|
{
|
|
if((NULL!=m_szModuleName)&&(NULL!=m_szGroupName)&&(NULL!=m_pIMosClass))
|
|
return this;
|
|
return NULL;
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: SetWBEMClass(IWbemClassObject *pObj)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pObj)
|
|
{
|
|
m_pIMosClass = pObj;
|
|
m_pIMosClass->AddRef () ;
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: GetWBEMClass (
|
|
|
|
IWbemClassObject **pObj
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == pObj)
|
|
return E_INVALIDARG;
|
|
|
|
//if the class already exists return it
|
|
|
|
if(m_pIMosClass != NULL)
|
|
{
|
|
m_pIMosClass->AddRef();
|
|
*pObj=m_pIMosClass;
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
*pObj= NULL ;
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: SetModuleName(BSTR szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szModuleName,&szName);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: GetModuleName(BSTR *szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szName)
|
|
{
|
|
*szName=SysAllocString(m_szModuleName);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: SetGroupName(BSTR szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szGroupName,&szName);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: GetGroupName(BSTR *szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szName)
|
|
{
|
|
*szName=SysAllocString(m_szGroupName);
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************************
|
|
*Methods not exposed by the ISmirClassHandle interface.
|
|
*Used to encapsulate functionality.
|
|
**************************************************************************************/
|
|
|
|
SCODE CSmirClassHandle :: AddToDB(CSmir *a_Smir,ISmirGroupHandle *hGroup)
|
|
{
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
|
|
//open the root\default name space
|
|
result= CSmirAccess :: Open(a_Smir,&moServ);
|
|
if (FAILED(result)||(NULL == moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
//if we cant open the namespace the group handle must be invalid
|
|
return WBEM_E_FAILED;
|
|
}
|
|
//now commit the changes
|
|
result = moServ->PutClass(m_pIMosClass, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
//add the associations
|
|
BSTR szGroupName = NULL ;
|
|
BSTR szModuleName = NULL ;
|
|
hGroup->GetName(&szGroupName);
|
|
hGroup->GetModuleName(&szModuleName);
|
|
|
|
#if 0
|
|
CSMIRToClassAssociator :: Associate(a_Smir,this);
|
|
#endif
|
|
CGroupToClassAssociator :: Associate(a_Smir,szModuleName, szGroupName, this);
|
|
CModuleToClassAssociator :: Associate(a_Smir,szModuleName, this);
|
|
SysFreeString(szGroupName);
|
|
SysFreeString(szModuleName);
|
|
return S_OK;
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: DeleteClassFromGroup( CSmir *a_Smir )
|
|
{
|
|
//get the class
|
|
IWbemClassObject *pIMosClass = NULL ;
|
|
SCODE res = GetWBEMClass(&pIMosClass);
|
|
if (FAILED(res))
|
|
{
|
|
//nothing to delete
|
|
return S_OK;
|
|
}
|
|
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
res= CSmirAccess :: GetContext (NULL, &moContext);
|
|
//SCODE result= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
|
|
res= CSmirAccess :: Open(a_Smir,&moServ);
|
|
if (FAILED(res)||(NULL == moServ))
|
|
{
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
//get the class name
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
pIMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
//delete everthing that is associated with the class using
|
|
//references of {\\.\root\default\SMIR:<class>}
|
|
IEnumWbemClassObject *pEnum = NULL;
|
|
|
|
CString sQuery(CString(SMIR_ASSOC_QUERY_STR2)
|
|
+CString(OPEN_BRACE_STR)
|
|
+CString(SMIR_NAMESPACE_FROM_ROOT)
|
|
+CString(COLON_STR)
|
|
+CString(V_BSTR(&v))
|
|
+CString(CLOSE_BRACE_STR)
|
|
+CString(SPACE_STR)
|
|
+CString(SMIR_ASSOC_QUERY_STR4)
|
|
+CString(EQUALS_STR)
|
|
+CString(SMIR_GROUP_ASSOC_CLASS_NAME)
|
|
);
|
|
BSTR szQuery = sQuery.AllocSysString();
|
|
CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE);
|
|
SCODE sRes = moServ->ExecQuery(t_QueryFormat.GetString (), szQuery,
|
|
RESERVED_WBEM_FLAG,moContext, &pEnum);
|
|
SysFreeString(szQuery);
|
|
|
|
if (FAILED(sRes)||(NULL==pEnum))
|
|
{
|
|
//all classes are associated so this is a problem
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
ULONG uCount=1;
|
|
IWbemClassObject *pAssocMosClass = NULL ;
|
|
ULONG puReturned;
|
|
|
|
//loop over the associations to see how many there are
|
|
int iAssociations=0;
|
|
for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pAssocMosClass,&puReturned);)
|
|
{
|
|
iAssociations++;
|
|
if(iAssociations>1)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
if(1 == iAssociations)
|
|
{
|
|
//nly one so delete it
|
|
moServ->DeleteClass(V_BSTR(&v),RESERVED_WBEM_FLAG, moContext,NULL);
|
|
}
|
|
pEnum->Release();
|
|
}
|
|
//clean up
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
VariantClear(&v);
|
|
return S_OK;
|
|
}
|
|
|
|
SCODE CSmirClassHandle :: DeleteFromDB ( CSmir *a_Smir )
|
|
{
|
|
//get the class
|
|
IWbemClassObject *pIMosClass = NULL ;
|
|
SCODE res = GetWBEMClass(&pIMosClass);
|
|
if (FAILED(res))
|
|
{
|
|
//nothing to delete
|
|
return S_OK;
|
|
}
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
res= CSmirAccess :: GetContext (a_Smir, &moContext);
|
|
res= CSmirAccess :: Open(a_Smir,&moServ);
|
|
if ((S_FALSE==res)||(NULL == moServ))
|
|
{
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
//get the class name
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
pIMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
//delete everthing that is associated with the class using
|
|
//references of {\\.\root\default\SMIR:<class>}
|
|
IEnumWbemClassObject *pEnum = NULL ;
|
|
|
|
CString sQuery(CString(SMIR_ASSOC_QUERY_STR2)
|
|
+CString(OPEN_BRACE_STR)
|
|
+CString(SMIR_NAMESPACE_FROM_ROOT)
|
|
+CString(COLON_STR)
|
|
+CString(V_BSTR(&v))
|
|
+CString(CLOSE_BRACE_STR)
|
|
);
|
|
BSTR szQuery = sQuery.AllocSysString();
|
|
CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE);
|
|
SCODE sRes = moServ->ExecQuery(t_QueryFormat.GetString (), szQuery,
|
|
RESERVED_WBEM_FLAG,moContext, &pEnum);
|
|
SysFreeString(szQuery);
|
|
|
|
if (FAILED(sRes)||(NULL==pEnum))
|
|
{
|
|
//all classes are associated so this is a problem
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
ULONG uCount=1;
|
|
IWbemClassObject *pAssocMosClass = NULL ;
|
|
ULONG puReturned = 0;
|
|
|
|
//loop over the associations
|
|
VARIANT assocClass;
|
|
VariantInit(&assocClass);
|
|
VARIANT assocName;
|
|
VariantInit(&assocName);
|
|
for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pAssocMosClass,&puReturned);)
|
|
{
|
|
pAssocMosClass->Get(SMIR_X_ASSOC_NAME_PROP, RESERVED_WBEM_FLAG, &assocName,NULL,NULL);
|
|
pAssocMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &assocClass,NULL,NULL);
|
|
CString instString(
|
|
|
|
CString(V_BSTR(&assocClass))
|
|
+CString(EQUALS_STR)
|
|
+CString(QUOTE_STR)
|
|
+CString(V_BSTR(&assocName))
|
|
+CString(QUOTE_STR)
|
|
);
|
|
|
|
VariantClear(&assocName);
|
|
VariantClear(&assocClass);
|
|
|
|
BSTR instBString = instString.AllocSysString();
|
|
moServ->DeleteInstance(instBString, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
|
|
SysFreeString(instBString);
|
|
pAssocMosClass->Release();
|
|
}
|
|
pEnum->Release();
|
|
//and delete it
|
|
moServ->DeleteClass(V_BSTR(&v),RESERVED_WBEM_FLAG, moContext,NULL);
|
|
}
|
|
//clean up
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
VariantClear(&v);
|
|
return S_OK;
|
|
}
|
|
|
|
const CSmirClassHandle& CSmirClassHandle :: operator >>(ISmirSerialiseHandle *pSHandle)
|
|
{
|
|
if (m_pIMosClass)
|
|
{
|
|
BOOL bMOFPragmas=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFPragmas();
|
|
BOOL bMOFAssociations=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFAssociations();
|
|
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
m_pIMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
BSTR pszClassMof=NULL;
|
|
HRESULT result = m_pIMosClass->GetObjectText(WBEM_FLAG_NO_FLAVORS, &pszClassMof);
|
|
if (SUCCEEDED (result))
|
|
{
|
|
|
|
if(TRUE==bMOFPragmas)
|
|
{
|
|
//start in the SMIR namespace
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(SMIR_NAMESPACE_PRAGMA);
|
|
}
|
|
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(pszClassMof);
|
|
SysFreeString(pszClassMof);
|
|
|
|
if(TRUE==bMOFAssociations)
|
|
{
|
|
/*******************create the Module associations*************************/
|
|
//instance of <assoc> \n{\n
|
|
CString szTmpString =INSTANCE_START;
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_CLASS_NAME);
|
|
szTmpString+=NL_BRACE_NL_STR;
|
|
|
|
//association name
|
|
//<assoc name>=\"<name>SMIRAssociation\";\n
|
|
szTmpString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(V_BSTR(&v));
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_CLASS_NAME_POSTFIX);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//smir name
|
|
//SmirGroup="\\\\.\\root\\default\\SMIR\\<module>:Module="<Group>"";
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_MODULE_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(MODULE_NAMESPACE_NAME);
|
|
szTmpString+=CString(DOT_STR);
|
|
szTmpString+=CString(OLEMS_NAME_PROP);
|
|
szTmpString+=CString(EQUALS_STR);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=CString(m_szModuleName);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//class name
|
|
//SmirClass="\\\\.\\root\\default\\SMIR:MS_SNMP_RFC1213-MIB_udpTable";
|
|
szTmpString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(V_BSTR(&v));
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
|
|
szTmpString+=END_OF_CLASS;
|
|
|
|
/*******************create the Group associations*************************/
|
|
//instance of <assoc> \n{\n
|
|
szTmpString+=INSTANCE_START;
|
|
szTmpString+=CString(SMIR_GROUP_ASSOC_CLASS_NAME);
|
|
szTmpString+=NL_BRACE_NL_STR;
|
|
|
|
//association name
|
|
//<assoc name>=\"<name>SMIRAssociation\";\n
|
|
szTmpString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(V_BSTR(&v));
|
|
szTmpString+=CString(SMIR_GROUP_ASSOC_CLASS_NAME_POSTFIX);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//smir name
|
|
//SmirGroup="\\\\.\\root\\default\\SMIR\\<module>:Group="<Group>"";
|
|
szTmpString+=CString(SMIR_GROUP_ASSOC_GROUP_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(L"\\\\");
|
|
szTmpString+=CString(m_szModuleName);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(GROUP_NAMESPACE_NAME);
|
|
szTmpString+=CString(DOT_STR);
|
|
szTmpString+=CString(OLEMS_NAME_PROP);
|
|
szTmpString+=CString(EQUALS_STR);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=CString(m_szGroupName);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//class name
|
|
//SmirClass="\\\\.\\root\\default\\SMIR:MS_SNMP_RFC1213-MIB_udpTable";
|
|
szTmpString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(V_BSTR(&v));
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
|
|
szTmpString+=END_OF_CLASS;
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=szTmpString;
|
|
}
|
|
}
|
|
}
|
|
VariantClear(&v);
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
/*NotificationClass handle methods
|
|
*/
|
|
/*
|
|
* CSmirNotificationClassHandle::QueryInterface
|
|
*
|
|
* Purpose:
|
|
* Manages the interfaces for this object which supports the
|
|
* IUnknown interface.
|
|
*
|
|
* Parameters:
|
|
* riid REFIID of the interface to return.
|
|
* ppv PPVOID in which to store the pointer.
|
|
*
|
|
* Return Value:
|
|
* SCODE NOERROR on success, E_NOINTERFACE if the
|
|
* interface is not supported.
|
|
*/
|
|
|
|
STDMETHODIMP CSmirNotificationClassHandle::QueryInterface(REFIID riid, PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//Always NULL the out-parameters
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv=this;
|
|
|
|
if (IID_ISMIR_NotificationClassHandle==riid)
|
|
*ppv=this;
|
|
|
|
if (NULL==*ppv)
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
|
|
//AddRef any interface we'll return.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirNotificationClassHandle::AddRef
|
|
* CSmirNotificationClassHandle::Release
|
|
*
|
|
* Reference counting members. When Release sees a zero count
|
|
* the object destroys itself.
|
|
*/
|
|
|
|
ULONG CSmirNotificationClassHandle::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//CMOEvent_Trace MyTraceEvent(SMIR_STR);
|
|
//MyTraceEvent.Generate(__FILE__,__LINE__, "CSmirClassHandle::AddRef( %ld", m_cRef);
|
|
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirNotificationClassHandle::Release(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
long ret;
|
|
if (0!=(ret=InterlockedDecrement(&m_cRef)))
|
|
return ret;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
CSmirNotificationClassHandle :: CSmirNotificationClassHandle()
|
|
: m_pIMosClass(NULL), m_szModuleName(NULL)
|
|
{
|
|
CNotificationClassHandleClassFactory::objectsInProgress++;
|
|
|
|
//init the reference count
|
|
m_cRef=0;
|
|
}
|
|
|
|
CSmirNotificationClassHandle :: ~CSmirNotificationClassHandle()
|
|
{
|
|
if (NULL != m_pIMosClass)
|
|
m_pIMosClass->Release();
|
|
SysFreeString(m_szModuleName);
|
|
CNotificationClassHandleClassFactory::objectsInProgress--;
|
|
}
|
|
|
|
|
|
/*
|
|
* CSmirModuleHandle::void* operator
|
|
* validate handle
|
|
*/
|
|
|
|
CSmirNotificationClassHandle::operator void*()
|
|
{
|
|
if((NULL!=m_szModuleName) && (NULL!=m_pIMosClass))
|
|
return this;
|
|
return NULL;
|
|
}
|
|
|
|
SCODE CSmirNotificationClassHandle :: GetWBEMNotificationClass(
|
|
|
|
IWbemClassObject **pObj
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == pObj)
|
|
return E_INVALIDARG;
|
|
|
|
//if the class already exists return it
|
|
|
|
if(m_pIMosClass)
|
|
{
|
|
m_pIMosClass->AddRef();
|
|
*pObj=m_pIMosClass;
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
*pObj=NULL ;
|
|
return WBEM_E_FAILED;
|
|
}
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
SCODE CSmirNotificationClassHandle :: SetWBEMNotificationClass(IWbemClassObject *pObj)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pObj)
|
|
{
|
|
m_pIMosClass = pObj;
|
|
m_pIMosClass->AddRef () ;
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirNotificationClassHandle :: SetModule(BSTR szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szModuleName,&szName);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirNotificationClassHandle :: GetModule(BSTR *szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szName)
|
|
{
|
|
if (NULL == m_szModuleName)
|
|
{
|
|
*szName = NULL;
|
|
}
|
|
else
|
|
{
|
|
*szName=SysAllocString(m_szModuleName);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
/**************************************************************************************
|
|
*Methods not exposed by the ISmirClassHandle interface.
|
|
*Used to encapsulate functionality.
|
|
**************************************************************************************/
|
|
|
|
SCODE CSmirNotificationClassHandle :: AddToDB(CSmir *a_Smir)
|
|
{
|
|
BSTR szModuleName = NULL ;
|
|
GetModule(&szModuleName);
|
|
|
|
if (NULL == szModuleName)
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,E_INVALIDARG);
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//open the root\default name space
|
|
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
result= CSmirAccess :: Open(a_Smir,&moServ);
|
|
|
|
if (FAILED(result)||(NULL == moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//now commit the changes
|
|
result = moServ->PutClass(m_pIMosClass, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
|
|
//add the associations
|
|
CModuleToNotificationClassAssociator :: Associate(a_Smir,szModuleName, this);
|
|
SysFreeString(szModuleName);
|
|
CNotificationMapper :: Map(a_Smir,m_pIMosClass, SNMP_NOTIFICATION_CLASS);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
SCODE CSmirNotificationClassHandle :: DeleteFromDB ( CSmir *a_Smir )
|
|
{
|
|
//get the class
|
|
IWbemClassObject *pIMosClass = NULL ;
|
|
SCODE res = GetWBEMNotificationClass(&pIMosClass);
|
|
|
|
if (FAILED(res))
|
|
{
|
|
//nothing to delete
|
|
return S_OK;
|
|
}
|
|
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
res= CSmirAccess :: GetContext (a_Smir, &moContext);
|
|
res= CSmirAccess :: Open(a_Smir,&moServ);
|
|
|
|
if ((S_FALSE==res)||(NULL == moServ))
|
|
{
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//get the class name
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
pIMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
CString classnamestr(V_BSTR(&v));
|
|
|
|
//delete everthing that is associated with the class using
|
|
//references of {\\.\root\default\SMIR:<class>}
|
|
IEnumWbemClassObject *pEnum = 0;
|
|
|
|
CString sQuery(CString(SMIR_ASSOC_QUERY_STR2)
|
|
+CString(OPEN_BRACE_STR)
|
|
+CString(SMIR_NAMESPACE_FROM_ROOT)
|
|
+CString(COLON_STR)
|
|
+classnamestr
|
|
+CString(CLOSE_BRACE_STR)
|
|
);
|
|
BSTR szQuery = sQuery.AllocSysString();
|
|
CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE);
|
|
SCODE sRes = moServ->ExecQuery(t_QueryFormat.GetString (), szQuery,
|
|
RESERVED_WBEM_FLAG,moContext, &pEnum);
|
|
SysFreeString(szQuery);
|
|
|
|
if (FAILED(sRes)||(NULL==pEnum))
|
|
{
|
|
//all classes are associated so this is a problem
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
ULONG uCount=1;
|
|
IWbemClassObject *pAssocMosClass = NULL ;
|
|
ULONG puReturned = 0;
|
|
|
|
//loop over the associations
|
|
VARIANT assocClass;
|
|
VariantInit(&assocClass);
|
|
VARIANT assocName;
|
|
VariantInit(&assocName);
|
|
for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pAssocMosClass,&puReturned);)
|
|
{
|
|
pAssocMosClass->Get(SMIR_X_ASSOC_NAME_PROP, RESERVED_WBEM_FLAG, &assocName,NULL,NULL);
|
|
pAssocMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &assocClass,NULL,NULL);
|
|
CString instString(CString(V_BSTR(&assocClass))
|
|
+CString(EQUALS_STR)
|
|
+CString(V_BSTR(&assocName))
|
|
);
|
|
VariantClear(&assocName);
|
|
VariantClear(&assocClass);
|
|
|
|
BSTR instBString = instString.AllocSysString();
|
|
moServ->DeleteInstance(instBString, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
|
|
SysFreeString(instBString);
|
|
pAssocMosClass->Release();
|
|
}
|
|
pEnum->Release();
|
|
pEnum = NULL;
|
|
|
|
//now get the mapper instance and delete that too.
|
|
sQuery = CString(SQL_QUERY_STR1) +
|
|
CString(SMIR_NOTIFICATION_MAPPER) +
|
|
CString(SQL_QUERY_STR2) +
|
|
CString(SMIR_NOTIFICATION_CLASS_PROP) +
|
|
CString(EQUALS_STR) +
|
|
CString(QUOTE_STR) +
|
|
classnamestr +
|
|
CString(QUOTE_STR);
|
|
|
|
BSTR szQuery2 = sQuery.AllocSysString();
|
|
t_QueryFormat = SMIR_ASSOC_QUERY2_TYPE ;
|
|
sRes = moServ->ExecQuery(t_QueryFormat.GetString (), szQuery2,
|
|
|
|
RESERVED_WBEM_FLAG,moContext, &pEnum);
|
|
SysFreeString(szQuery2);
|
|
|
|
if (FAILED(sRes)||(NULL==pEnum))
|
|
{
|
|
//all classes are associated so this is a problem
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
uCount=1;
|
|
pAssocMosClass = NULL;
|
|
puReturned = 0;
|
|
VariantClear(&assocClass);
|
|
|
|
//loop over the associations and delete them
|
|
for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pAssocMosClass,&puReturned);)
|
|
{
|
|
sRes = pAssocMosClass->Get(OLEMS_PATH_PROP, RESERVED_WBEM_FLAG,
|
|
&assocClass, NULL, NULL);
|
|
pAssocMosClass->Release();
|
|
|
|
if (FAILED(sRes) && (VT_BSTR == assocClass.vt))
|
|
{
|
|
CString instString(V_BSTR(&assocClass));
|
|
VariantClear(&assocClass);
|
|
BSTR instBString = instString.AllocSysString();
|
|
moServ->DeleteInstance(instBString, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
SysFreeString(instBString);
|
|
}
|
|
}
|
|
|
|
pEnum->Release();
|
|
|
|
//now delete the class
|
|
moServ->DeleteClass(V_BSTR(&v),RESERVED_WBEM_FLAG, moContext,NULL);
|
|
}
|
|
|
|
//clean up
|
|
moServ->Release();
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
pIMosClass->Release();
|
|
VariantClear(&v);
|
|
return S_OK;
|
|
}
|
|
|
|
const CSmirNotificationClassHandle& CSmirNotificationClassHandle :: operator >>(ISmirSerialiseHandle *pSHandle)
|
|
{
|
|
if (m_pIMosClass)
|
|
{
|
|
BOOL bMOFPragmas=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFPragmas();
|
|
BOOL bMOFAssociations=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFAssociations();
|
|
|
|
VARIANT vclass;
|
|
VariantInit(&vclass);
|
|
VARIANT vtrapoid;
|
|
VariantInit(&vtrapoid);
|
|
|
|
m_pIMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &vclass,NULL,NULL);
|
|
m_pIMosClass->Get(TRAPOID_PROP, RESERVED_WBEM_FLAG, &vtrapoid,NULL,NULL);
|
|
|
|
if ((V_VT(&vclass) == VT_BSTR) && (V_VT(&vtrapoid) == VT_BSTR))
|
|
{
|
|
BSTR pszClassMof = NULL ;
|
|
m_pIMosClass->GetObjectText(WBEM_FLAG_NO_FLAVORS, &pszClassMof);
|
|
if (pszClassMof)
|
|
{
|
|
|
|
if(TRUE==bMOFPragmas)
|
|
{
|
|
//start in the SMIR namespace
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(SMIR_NAMESPACE_PRAGMA);
|
|
}
|
|
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(pszClassMof);
|
|
SysFreeString(pszClassMof);
|
|
|
|
/*******************create the TrapNotificationMapper*************************/
|
|
//instance of TrapNotificationMapper \n{\n
|
|
CString tmpString=INSTANCE_START;
|
|
tmpString+=CString(SMIR_NOTIFICATION_MAPPER);
|
|
tmpString+=NL_BRACE_NL_STR;
|
|
|
|
//SnmpTrapOID
|
|
tmpString+=CString(SMIR_NOTIFICATION_TRAP_PROP);
|
|
tmpString+=START_OF_PROPERTY_VALUE;
|
|
tmpString+=CString(V_BSTR(&vtrapoid));
|
|
tmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//Eventclass
|
|
tmpString+=CString(SMIR_NOTIFICATION_CLASS_PROP);
|
|
tmpString+=START_OF_PROPERTY_VALUE;
|
|
tmpString+=CString(V_BSTR(&vclass));
|
|
tmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
tmpString+=END_OF_CLASS;
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=tmpString;
|
|
|
|
if(TRUE==bMOFAssociations)
|
|
{
|
|
/*******************create the SMIR associations*************************/
|
|
/*******************create the Module associations***********************/
|
|
//instance of <assoc> \n{\n
|
|
CString szTmpString=INSTANCE_START;
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_NCLASS_NAME);
|
|
szTmpString+=NL_BRACE_NL_STR;
|
|
|
|
//association name
|
|
//<assoc name>=\"<name>SMIRAssociation\";\n
|
|
szTmpString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(V_BSTR(&vclass));
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_CLASS_NAME_POSTFIX);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//smir name
|
|
//SmirGroup="\\\\.\\root\\default\\SMIR\\<module>:Module="<Group>"";
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_MODULE_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(MODULE_NAMESPACE_NAME);
|
|
szTmpString+=CString(DOT_STR);
|
|
szTmpString+=CString(OLEMS_NAME_PROP);
|
|
szTmpString+=CString(EQUALS_STR);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=CString(m_szModuleName);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//class name
|
|
//SmirClass="\\\\.\\root\\default\\SMIR:MS_SNMP_RFC1213-MIB_udpTable";
|
|
szTmpString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(V_BSTR(&vclass));
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
|
|
szTmpString+=END_OF_CLASS;
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=szTmpString;
|
|
}
|
|
}
|
|
}
|
|
VariantClear(&vclass);
|
|
VariantClear(&vtrapoid);
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
|
|
|
|
/*ExtNotificationClass handle methods
|
|
*/
|
|
/*
|
|
* CSmirExtNotificationClassHandle::QueryInterface
|
|
*
|
|
* Purpose:
|
|
* Manages the interfaces for this object which supports the
|
|
* IUnknown interface.
|
|
*
|
|
* Parameters:
|
|
* riid REFIID of the interface to return.
|
|
* ppv PPVOID in which to store the pointer.
|
|
*
|
|
* Return Value:
|
|
* SCODE NOERROR on success, E_NOINTERFACE if the
|
|
* interface is not supported.
|
|
*/
|
|
|
|
STDMETHODIMP CSmirExtNotificationClassHandle::QueryInterface(REFIID riid, PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//Always NULL the out-parameters
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv=this;
|
|
|
|
if (IID_ISMIR_ExtNotificationClassHandle==riid)
|
|
*ppv=this;
|
|
|
|
if (NULL==*ppv)
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
|
|
//AddRef any interface we'll return.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirExtNotificationClassHandle::AddRef
|
|
* CSmirExtNotificationClassHandle::Release
|
|
*
|
|
* Reference counting members. When Release sees a zero count
|
|
* the object destroys itself.
|
|
*/
|
|
|
|
ULONG CSmirExtNotificationClassHandle::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//CMOEvent_Trace MyTraceEvent(SMIR_STR);
|
|
//MyTraceEvent.Generate(__FILE__,__LINE__, "CSmirClassHandle::AddRef( %ld", m_cRef);
|
|
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirExtNotificationClassHandle::Release(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
long ret;
|
|
if (0!=(ret=InterlockedDecrement(&m_cRef)))
|
|
return ret;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
CSmirExtNotificationClassHandle :: CSmirExtNotificationClassHandle()
|
|
: m_pIMosClass (NULL), m_szModuleName(NULL)
|
|
{
|
|
CExtNotificationClassHandleClassFactory::objectsInProgress++;
|
|
|
|
//init the reference count
|
|
m_cRef=0;
|
|
}
|
|
|
|
CSmirExtNotificationClassHandle :: ~CSmirExtNotificationClassHandle()
|
|
{
|
|
if (NULL != m_pIMosClass)
|
|
m_pIMosClass->Release();
|
|
SysFreeString(m_szModuleName);
|
|
CExtNotificationClassHandleClassFactory::objectsInProgress--;
|
|
}
|
|
|
|
|
|
/*
|
|
* CSmirModuleHandle::void* operator
|
|
* validate handle
|
|
*/
|
|
|
|
CSmirExtNotificationClassHandle::operator void*()
|
|
{
|
|
if((NULL!=m_szModuleName) && (NULL!=m_pIMosClass))
|
|
return this;
|
|
return NULL;
|
|
}
|
|
|
|
SCODE CSmirExtNotificationClassHandle :: GetWBEMExtNotificationClass (
|
|
|
|
IWbemClassObject **pObj
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == pObj)
|
|
return E_INVALIDARG;
|
|
|
|
//if the class already exists return it
|
|
|
|
if(m_pIMosClass)
|
|
{
|
|
m_pIMosClass->AddRef();
|
|
*pObj=m_pIMosClass;
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
*pObj=NULL;
|
|
return WBEM_E_FAILED;
|
|
}
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
SCODE CSmirExtNotificationClassHandle :: SetWBEMExtNotificationClass(IWbemClassObject *pObj)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != pObj)
|
|
{
|
|
m_pIMosClass = pObj;
|
|
m_pIMosClass->AddRef () ;
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirExtNotificationClassHandle :: SetModule(BSTR szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return CopyBSTR(&m_szModuleName,&szName);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirExtNotificationClassHandle :: GetModule(BSTR *szName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL != szName)
|
|
{
|
|
if (NULL == m_szModuleName)
|
|
{
|
|
*szName = NULL;
|
|
}
|
|
else
|
|
{
|
|
*szName=SysAllocString(m_szModuleName);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
/**************************************************************************************
|
|
*Methods not exposed by the ISmirClassHandle interface.
|
|
*Used to encapsulate functionality.
|
|
**************************************************************************************/
|
|
|
|
SCODE CSmirExtNotificationClassHandle :: AddToDB ( CSmir *a_Smir )
|
|
{
|
|
BSTR szModuleName = NULL ;
|
|
GetModule(&szModuleName);
|
|
|
|
if (NULL == szModuleName)
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,E_INVALIDARG);
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//open the root\default name space
|
|
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
result= CSmirAccess :: Open(a_Smir,&moServ);
|
|
if (FAILED(result)||(NULL == moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//now commit the changes
|
|
result = moServ->PutClass(m_pIMosClass, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
if (FAILED(result))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release () ;
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
if (FAILED(result))
|
|
{
|
|
FormatProviderErrorMsg(__FILE__,__LINE__,result);
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
//add the associations
|
|
CModuleToExtNotificationClassAssociator :: Associate(a_Smir,szModuleName, this);
|
|
SysFreeString(szModuleName);
|
|
CNotificationMapper :: Map(a_Smir,m_pIMosClass, SNMP_EXT_NOTIFICATION_CLASS);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
SCODE CSmirExtNotificationClassHandle :: DeleteFromDB ( CSmir *a_Smir )
|
|
{
|
|
//get the class
|
|
IWbemClassObject *pIMosClass = NULL ;
|
|
SCODE res = GetWBEMExtNotificationClass(&pIMosClass);
|
|
|
|
if (FAILED(res))
|
|
{
|
|
//nothing to delete
|
|
return S_OK;
|
|
}
|
|
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
res= CSmirAccess :: GetContext (a_Smir , &moContext);
|
|
res= CSmirAccess :: Open(a_Smir,&moServ);
|
|
|
|
if ((S_FALSE==res)||(NULL == moServ))
|
|
{
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//get the class name
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
pIMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &v,NULL,NULL);
|
|
|
|
if (V_VT(&v) == VT_BSTR)
|
|
{
|
|
CString classnamestr(V_BSTR(&v));
|
|
|
|
//delete everthing that is associated with the class using
|
|
//references of {\\.\root\default\SMIR:<class>}
|
|
IEnumWbemClassObject *pEnum = NULL ;
|
|
|
|
CString sQuery(CString(SMIR_ASSOC_QUERY_STR2)
|
|
+CString(OPEN_BRACE_STR)
|
|
+CString(SMIR_NAMESPACE_FROM_ROOT)
|
|
+CString(COLON_STR)
|
|
+classnamestr
|
|
+CString(CLOSE_BRACE_STR)
|
|
);
|
|
BSTR szQuery = sQuery.AllocSysString();
|
|
CBString t_QueryFormat (SMIR_ASSOC_QUERY1_TYPE);
|
|
SCODE sRes = moServ->ExecQuery(t_QueryFormat.GetString (), szQuery,
|
|
RESERVED_WBEM_FLAG,moContext, &pEnum);
|
|
SysFreeString(szQuery);
|
|
|
|
if (FAILED(sRes)||(NULL==pEnum))
|
|
{
|
|
//all classes are associated so this is a problem
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
ULONG uCount=1;
|
|
IWbemClassObject *pAssocMosClass = NULL ;
|
|
ULONG puReturned = 0;
|
|
|
|
//loop over the associations
|
|
VARIANT assocClass;
|
|
VariantInit(&assocClass);
|
|
VARIANT assocName;
|
|
VariantInit(&assocName);
|
|
for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pAssocMosClass,&puReturned);)
|
|
{
|
|
pAssocMosClass->Get(SMIR_X_ASSOC_NAME_PROP, RESERVED_WBEM_FLAG, &assocName,NULL,NULL);
|
|
pAssocMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &assocClass,NULL,NULL);
|
|
CString instString(CString(V_BSTR(&assocClass))
|
|
+CString(EQUALS_STR)
|
|
+CString(V_BSTR(&assocName))
|
|
);
|
|
VariantClear(&assocName);
|
|
VariantClear(&assocClass);
|
|
|
|
BSTR instBString = instString.AllocSysString();
|
|
moServ->DeleteInstance(instBString, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
|
|
SysFreeString(instBString);
|
|
pAssocMosClass->Release();
|
|
}
|
|
pEnum->Release();
|
|
pEnum = NULL;
|
|
|
|
//now get the mapper instance and delete that too.
|
|
sQuery = CString(SQL_QUERY_STR1) +
|
|
CString(SMIR_EXT_NOTIFICATION_MAPPER) +
|
|
CString(SQL_QUERY_STR2) +
|
|
CString(SMIR_NOTIFICATION_CLASS_PROP) +
|
|
CString(EQUALS_STR) +
|
|
CString(QUOTE_STR) +
|
|
classnamestr +
|
|
CString(QUOTE_STR);
|
|
|
|
BSTR szQuery2 = sQuery.AllocSysString();
|
|
t_QueryFormat = SMIR_ASSOC_QUERY2_TYPE;
|
|
sRes = moServ->ExecQuery(t_QueryFormat.GetString (), szQuery2,
|
|
RESERVED_WBEM_FLAG,moContext, &pEnum);
|
|
SysFreeString(szQuery2);
|
|
|
|
if (FAILED(sRes)||(NULL==pEnum))
|
|
{
|
|
//all classes are associated so this is a problem
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
uCount=1;
|
|
pAssocMosClass = NULL;
|
|
puReturned = 0;
|
|
VariantClear(&assocClass);
|
|
|
|
//loop over the associations and delete them
|
|
for(pEnum->Reset();S_OK==pEnum->Next(-1,uCount,&pAssocMosClass,&puReturned);)
|
|
{
|
|
sRes = pAssocMosClass->Get(OLEMS_PATH_PROP, RESERVED_WBEM_FLAG,
|
|
&assocClass, NULL, NULL);
|
|
pAssocMosClass->Release();
|
|
|
|
if (FAILED(sRes) && (VT_BSTR == assocClass.vt))
|
|
{
|
|
CString instString(V_BSTR(&assocClass));
|
|
VariantClear(&assocClass);
|
|
BSTR instBString = instString.AllocSysString();
|
|
moServ->DeleteInstance(instBString, RESERVED_WBEM_FLAG, moContext,NULL);
|
|
SysFreeString(instBString);
|
|
}
|
|
}
|
|
|
|
pEnum->Release();
|
|
|
|
//now delete the class
|
|
moServ->DeleteClass(V_BSTR(&v),RESERVED_WBEM_FLAG, moContext,NULL);
|
|
}
|
|
|
|
//clean up
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
pIMosClass->Release();
|
|
VariantClear(&v);
|
|
return S_OK;
|
|
}
|
|
|
|
const CSmirExtNotificationClassHandle& CSmirExtNotificationClassHandle :: operator >>(ISmirSerialiseHandle *pSHandle)
|
|
{
|
|
if (m_pIMosClass)
|
|
{
|
|
BOOL bMOFPragmas=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFPragmas();
|
|
BOOL bMOFAssociations=((CSmirSerialiseHandle*) pSHandle)->ReturnMOFAssociations();
|
|
|
|
VARIANT vclass;
|
|
VariantInit(&vclass);
|
|
VARIANT vtrapoid;
|
|
VariantInit(&vtrapoid);
|
|
|
|
m_pIMosClass->Get(OLEMS_CLASS_PROP, RESERVED_WBEM_FLAG, &vclass,NULL,NULL);
|
|
m_pIMosClass->Get(TRAPOID_PROP, RESERVED_WBEM_FLAG, &vtrapoid,NULL,NULL);
|
|
|
|
if ((V_VT(&vclass) == VT_BSTR) && (V_VT(&vtrapoid) == VT_BSTR))
|
|
{
|
|
BSTR pszClassMof = NULL ;
|
|
m_pIMosClass->GetObjectText(WBEM_FLAG_NO_FLAVORS, &pszClassMof);
|
|
if (pszClassMof)
|
|
{
|
|
|
|
if(TRUE==bMOFPragmas)
|
|
{
|
|
//start in the SMIR namespace
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(SMIR_NAMESPACE_PRAGMA);
|
|
}
|
|
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=CString(pszClassMof);
|
|
SysFreeString(pszClassMof);
|
|
|
|
/*******************create the ExtNotificationMapper*************************/
|
|
//instance of ExtNotificationMapper \n{\n
|
|
CString tmpString=INSTANCE_START;
|
|
tmpString+=CString(SMIR_EXT_NOTIFICATION_MAPPER);
|
|
tmpString+=NL_BRACE_NL_STR;
|
|
|
|
//SnmpTrapOID
|
|
tmpString+=CString(SMIR_NOTIFICATION_TRAP_PROP);
|
|
tmpString+=START_OF_PROPERTY_VALUE;
|
|
tmpString+=CString(V_BSTR(&vtrapoid));
|
|
tmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//Eventclass
|
|
tmpString+=CString(SMIR_NOTIFICATION_CLASS_PROP);
|
|
tmpString+=START_OF_PROPERTY_VALUE;
|
|
tmpString+=CString(V_BSTR(&vclass));
|
|
tmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
tmpString+=END_OF_CLASS;
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=tmpString;
|
|
|
|
if(TRUE==bMOFAssociations)
|
|
{
|
|
/*******************create the SMIR associations*************************/
|
|
/*******************create the Module associations***********************/
|
|
//instance of <assoc> \n{\n
|
|
CString szTmpString=INSTANCE_START;
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_EXTNCLASS_NAME);
|
|
szTmpString+=NL_BRACE_NL_STR;
|
|
|
|
//association name
|
|
//<assoc name>=\"<name>SMIRAssociation\";\n
|
|
szTmpString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(V_BSTR(&vclass));
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_CLASS_NAME_POSTFIX);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//smir name
|
|
//SmirGroup="\\\\.\\root\\default\\SMIR\\<module>:Module="<Group>"";
|
|
szTmpString+=CString(SMIR_MODULE_ASSOC_MODULE_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(MODULE_NAMESPACE_NAME);
|
|
szTmpString+=CString(DOT_STR);
|
|
szTmpString+=CString(OLEMS_NAME_PROP);
|
|
szTmpString+=CString(EQUALS_STR);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=CString(m_szModuleName);
|
|
szTmpString+=CString(ESCAPED_QUOTE_STR);
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
//class name
|
|
//SmirClass="\\\\.\\root\\default\\SMIR:MS_SNMP_RFC1213-MIB_udpTable";
|
|
szTmpString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
szTmpString+=START_OF_PROPERTY_VALUE;
|
|
szTmpString+=CString(SMIR_NAMESPACE_STR);
|
|
szTmpString+=CString(COLON_STR);
|
|
szTmpString+=CString(V_BSTR(&vclass));
|
|
szTmpString+=END_OF_PROPERTY_VALUE;
|
|
|
|
|
|
szTmpString+=END_OF_CLASS;
|
|
((CSmirSerialiseHandle*)pSHandle)->m_serialiseString+=szTmpString;
|
|
}
|
|
}
|
|
}
|
|
VariantClear(&vclass);
|
|
VariantClear(&vtrapoid);
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
|