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.
2712 lines
58 KiB
2712 lines
58 KiB
//***************************************************************************
|
|
|
|
//
|
|
|
|
// File:
|
|
|
|
//
|
|
|
|
// Module: MS SNMP Provider
|
|
|
|
//
|
|
|
|
// Purpose:
|
|
|
|
//
|
|
|
|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//***************************************************************************
|
|
|
|
#define __UNICODE
|
|
|
|
#include <precomp.h>
|
|
#include "csmir.h"
|
|
#include "handles.h"
|
|
#include "classfac.h"
|
|
#include "enum.h"
|
|
|
|
#include <textdef.h>
|
|
#include <helper.h>
|
|
#include "bstring.h"
|
|
#include <scopeguard.h>
|
|
#ifdef ICECAP_PROFILE
|
|
#include <icapexp.h>
|
|
#endif
|
|
|
|
extern CRITICAL_SECTION g_CriticalSection ;
|
|
|
|
|
|
/*
|
|
* CSmir:: Constructor and destructor
|
|
*
|
|
* Purpose:
|
|
* Standard constructor and destructor for CSmir object
|
|
* There should only ever be one CSmir object because it holds the
|
|
* connection point object and controlls the access to the database.
|
|
* When the database changes it flaggs the chamce using the conenction
|
|
* point object. If you have more than one CSmir object you will miss
|
|
* database changes. The class factory handles all of this.
|
|
* Parameters: None
|
|
*
|
|
* Return Value: None
|
|
*/
|
|
|
|
#pragma warning (disable:4355)
|
|
|
|
CSmir :: CSmir ()
|
|
:m_Interrogator(this), m_Administrator(this),
|
|
m_Configuration(this)
|
|
{
|
|
//init reference count
|
|
m_cRef=0;
|
|
//increase the reference count in the class factory
|
|
CSMIRClassFactory::objectsInProgress++;
|
|
}
|
|
|
|
#pragma warning (default:4355)
|
|
|
|
CSmir :: ~CSmir ()
|
|
{
|
|
//decrease the reference count in the class factory
|
|
CSMIRClassFactory::objectsInProgress--;
|
|
}
|
|
|
|
/*
|
|
* CSmir::QueryInterface
|
|
*
|
|
* Purpose:
|
|
* Manages the interfaces for this object which supports the IUnknown,
|
|
* ISmirDatabase, ISmirInterrogator, and ISmirAdministrator interfaces.
|
|
*
|
|
* 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 CSmir::QueryInterface(IN REFIID riid, OUT PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
/*this lock is to protect the caller from changing his own
|
|
*parameter (ppv) whilst I am using it. This is unlikely and
|
|
*he deserves what he gets if he does it but it is still worth
|
|
*the effort.
|
|
*/
|
|
criticalSection.Lock () ;
|
|
//Always NULL the out-parameters
|
|
*ppv=NULL;
|
|
|
|
/*
|
|
* IUnknown comes from CSmir. Note that here we do not need
|
|
* to explicitly typecast the object pointer into an interface
|
|
* pointer because the vtables are identical. If we had
|
|
* additional virtual member functions in the object, we would
|
|
* have to cast in order to set the right vtable.
|
|
*/
|
|
|
|
/*CLSID_ISMIR_Database serves very little purpose but it does provide
|
|
*an entry point from which you can ittetate the other interfaces; it
|
|
*makes sense to create an CLSID_ISMIR_Database instance and move to the
|
|
*other interfaces rather than picking one of the other interfaces as the
|
|
*entry point.
|
|
*/
|
|
|
|
if ((IID_IUnknown==riid)||(IID_ISMIR_Database == riid))
|
|
*ppv=this;
|
|
|
|
//Other interfaces come from contained classes
|
|
if (IID_ISMIR_Interrogative==riid)
|
|
*ppv=&m_Interrogator;
|
|
|
|
if (IID_ISMIR_Administrative==riid)
|
|
*ppv=&m_Administrator;
|
|
|
|
if((IID_IConnectionPointContainer == riid)||(IID_ISMIR_Notify == riid))
|
|
*ppv = sm_ConnectionObjects;
|
|
|
|
if(IID_ISMIRWbemConfiguration == riid)
|
|
*ppv = &m_Configuration;
|
|
|
|
if (NULL==*ppv)
|
|
{
|
|
criticalSection.Unlock () ;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
//AddRef any interface we'll return.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
criticalSection.Unlock () ;
|
|
return NOERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmir ::AddRef
|
|
* CSmir::Release
|
|
*
|
|
* Reference counting members. When Release sees a zero count
|
|
* the object destroys itself.
|
|
*/
|
|
|
|
ULONG CSmir::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
/*The CSmir object is a shared resource (as long as there is at leasr
|
|
*one connection object) so I must protect the reference count.
|
|
*/
|
|
//increase the reference
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmir::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;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmir::AddNotify
|
|
* CSmir::DeleteNotify
|
|
*
|
|
* Purpose:
|
|
* These methods provide the hooks into the notification interface.
|
|
* The caller implements the ISMIRNotify and passes ti to AddNotify, AddNotify
|
|
* marshals the connection point interface and calls Advise to add the
|
|
* callers ISMIRNotify to the collection of objects to notify when the SMIR
|
|
* changes. DeleteNotify does the opposite.
|
|
*
|
|
* Parameters:
|
|
* pNotifySink The caller's ISMIRNotify implementation
|
|
* pRichTea,lRichTea Cookie used to identify the caller's
|
|
* ISMIRNotify (generated by CSmir)
|
|
*
|
|
* Return Value:
|
|
* SCODE S_OK on success, WBEM_E_FAILED of failure, E_NOINTERFACE if the
|
|
* interface is not supported, E_INVALIDARG if the parameters
|
|
* are invalid
|
|
*/
|
|
|
|
STDMETHODIMP CSmir :: AddNotify(IN ISMIRNotify *pNotifySink, OUT DWORD *pRichTea)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
EnterCriticalSection ( & g_CriticalSection );
|
|
ScopeGuard t_1 = MakeGuard ( LeaveCriticalSection , &g_CriticalSection ) ;
|
|
|
|
if (sm_ConnectionObjects == NULL)
|
|
{
|
|
sm_ConnectionObjects = new CSmirConnObject(this);
|
|
sm_ConnectionObjects->AddRef ();
|
|
}
|
|
|
|
t_1.Dismiss () ;
|
|
LeaveCriticalSection ( & g_CriticalSection );
|
|
|
|
/*make sure that I don't get deleted whilst doing this. I should not have
|
|
*to do this since it can only happen if the caller releases the interface
|
|
*whilst making the call.
|
|
*/
|
|
if (NULL == pNotifySink)
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
/*I do not need a lock for this piece of code; having found the interface someone
|
|
*could release it from beneath me but the FindConnectionPoint causes an addref
|
|
*so I can rely on m_ConnectionObjects to keep his own house in order.
|
|
*/
|
|
IConnectionPoint *pCP = NULL ;
|
|
SCODE hr = sm_ConnectionObjects->FindConnectionPoint(IID_ISMIR_Notify, &pCP);
|
|
|
|
if ((S_OK != hr)||(NULL == pCP))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
hr = ((CSmirNotifyCP*)(pCP))->Advise(this, pNotifySink, pRichTea);
|
|
pCP->Release();
|
|
if (S_OK != hr)
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
return ((S_OK == hr)?S_OK:WBEM_E_FAILED);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP CSmir :: DeleteNotify(IN DWORD lRichTea)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
EnterCriticalSection ( & g_CriticalSection ) ;
|
|
ScopeGuard t_1 = MakeGuard ( LeaveCriticalSection , &g_CriticalSection ) ;
|
|
|
|
if (sm_ConnectionObjects == NULL)
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
t_1.Dismiss () ;
|
|
LeaveCriticalSection ( & g_CriticalSection );
|
|
|
|
/*I don't need to lock the SMIR object until the unadvise but it
|
|
*is safer and future proof if I do it here.
|
|
*/
|
|
SCODE hr=S_OK;
|
|
/*I do not need a lock for this piece of code; having found the interface someone
|
|
*could release it from beneath me but the FindConnectionPoint causes an addref
|
|
*so I can rely on m_ConnectionObjects to keep his own house in order.
|
|
*/
|
|
IConnectionPoint *pCP = NULL;
|
|
hr=sm_ConnectionObjects->FindConnectionPoint(IID_ISMIR_Notify, &pCP);
|
|
|
|
if (hr != S_OK||(NULL == pCP))
|
|
{
|
|
return CONNECT_E_NOCONNECTION;
|
|
}
|
|
|
|
hr=((CSmirNotifyCP*)(pCP))->Unadvise(this, lRichTea);
|
|
pCP->Release();
|
|
|
|
return ((S_OK == hr)?S_OK:CONNECT_E_NOCONNECTION==hr?E_INVALIDARG:WBEM_E_FAILED);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
/*CSmirInterrogator interface implementation
|
|
* Constructor/destructor
|
|
* CSmirInterrogator::QueryInterface
|
|
* CSmirInterrogator::AddRef
|
|
* CSmirInterrogator::Release
|
|
*
|
|
* IUnknown members that delegate to m_pSmir
|
|
*/
|
|
|
|
CSmirInterrogator :: CSmirInterrogator ( CSmir *pSmir ) : m_cRef ( 1 ) , m_pSmir ( pSmir )
|
|
{
|
|
}
|
|
|
|
STDMETHODIMP CSmirInterrogator::QueryInterface(IN REFIID riid, OUT PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return m_pSmir->QueryInterface(riid, ppv);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirInterrogator::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
/*
|
|
* We maintain an "interface reference count" for debugging
|
|
* purposes, because the client of an object should match
|
|
* AddRef and Release calls through each interface pointer.
|
|
*/
|
|
++m_cRef;
|
|
return m_pSmir->AddRef();
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirInterrogator::Release(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
/*
|
|
* m_cRef is again only for debugging. It doesn't affect
|
|
* CSmirInterrogator although the call to m_pSmir->Release does.
|
|
*/
|
|
--m_cRef;
|
|
return m_pSmir->Release();
|
|
//do not do anything after this release because you may have been deleted
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/* Interface implementations for the enumerator access methods
|
|
*
|
|
* CSmirInterrogator::EnumModules
|
|
* CSmirInterrogator::EnumGroups
|
|
* CSmirInterrogator::EnumClasses
|
|
*
|
|
* Parameters:
|
|
* Return Value:
|
|
* SCODE S_OK on success, WBEM_E_FAILED of failure
|
|
*
|
|
*/
|
|
|
|
SCODE CSmirInterrogator::EnumModules(OUT IEnumModule **ppEnumSmirMod)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL == ppEnumSmirMod)
|
|
return E_INVALIDARG;
|
|
PENUMSMIRMOD pTmpEnumSmirMod = new CEnumSmirMod ( m_pSmir ) ;
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirMod)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pTmpEnumSmirMod->QueryInterface(IID_ISMIR_ModuleEnumerator,(void**)ppEnumSmirMod);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator:: EnumGroups (OUT IEnumGroup **ppEnumSmirGroup,
|
|
IN ISmirModHandle *hModule)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirGroup)
|
|
return E_INVALIDARG;
|
|
PENUMSMIRGROUP pTmpEnumSmirGroup = new CEnumSmirGroup( m_pSmir , hModule);
|
|
if(NULL == pTmpEnumSmirGroup)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
//we have an enumerator so get the interface to pass back
|
|
pTmpEnumSmirGroup->QueryInterface(IID_ISMIR_GroupEnumerator,(void**)ppEnumSmirGroup);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: EnumAllClasses (OUT IEnumClass **ppEnumSmirclass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirclass)
|
|
return E_INVALIDARG;
|
|
|
|
PENUMSMIRCLASS pTmpEnumSmirClass = new CEnumSmirClass ( m_pSmir ) ;
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirClass)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
pTmpEnumSmirClass->QueryInterface(IID_ISMIR_ClassEnumerator,(void**)ppEnumSmirclass);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: EnumClassesInGroup (OUT IEnumClass **ppEnumSmirclass,
|
|
IN ISmirGroupHandle *hGroup)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirclass)
|
|
return E_INVALIDARG;
|
|
PENUMSMIRCLASS pTmpEnumSmirClass = new CEnumSmirClass(m_pSmir , NULL,hGroup);
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirClass)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
pTmpEnumSmirClass->QueryInterface(IID_ISMIR_ClassEnumerator,(void**)ppEnumSmirclass);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: EnumClassesInModule (OUT IEnumClass **ppEnumSmirclass,
|
|
IN ISmirModHandle *hModule)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirclass)
|
|
return E_INVALIDARG;
|
|
PENUMSMIRCLASS pTmpEnumSmirClass = new CEnumSmirClass(m_pSmir , NULL, hModule);
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirClass)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
pTmpEnumSmirClass->QueryInterface(IID_ISMIR_ClassEnumerator,(void**)ppEnumSmirclass);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: GetWBEMClass(OUT IWbemClassObject **ppClass, IN BSTR pszClassName)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if((NULL == pszClassName)||(NULL == ppClass))
|
|
return E_INVALIDARG;
|
|
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE res= CSmirAccess :: GetContext (m_pSmir , &moContext);
|
|
res= CSmirAccess :: Open(m_pSmir , &moServ);
|
|
|
|
if ((S_FALSE==res)||(NULL == (void*)moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
//we have a problem the SMIR is not there and cannot be created
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
CBString t_BStr ( pszClassName ) ;
|
|
res = moServ->GetObject(t_BStr.GetString (),RESERVED_WBEM_FLAG, moContext,ppClass,NULL);
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
moServ->Release();
|
|
if ((S_FALSE==res)||(NULL == *ppClass))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: EnumAllNotificationClasses(IEnumNotificationClass **ppEnumSmirclass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirclass)
|
|
return E_INVALIDARG;
|
|
|
|
PENUMNOTIFICATIONCLASS pTmpEnumSmirClass = new CEnumNotificationClass ( m_pSmir ) ;
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirClass)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
pTmpEnumSmirClass->QueryInterface(IID_ISMIR_EnumNotificationClass,(void**)ppEnumSmirclass);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: EnumAllExtNotificationClasses(IEnumExtNotificationClass **ppEnumSmirclass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirclass)
|
|
return E_INVALIDARG;
|
|
|
|
PENUMEXTNOTIFICATIONCLASS pTmpEnumSmirClass = new CEnumExtNotificationClass ( m_pSmir ) ;
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirClass)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
pTmpEnumSmirClass->QueryInterface(IID_ISMIR_EnumExtNotificationClass,(void**)ppEnumSmirclass);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: EnumNotificationClassesInModule(IEnumNotificationClass **ppEnumSmirclass,
|
|
ISmirModHandle *hModule)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirclass)
|
|
return E_INVALIDARG;
|
|
PENUMNOTIFICATIONCLASS pTmpEnumSmirClass = new CEnumNotificationClass( m_pSmir , NULL, hModule);
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirClass)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
pTmpEnumSmirClass->QueryInterface(IID_ISMIR_EnumNotificationClass,(void**)ppEnumSmirclass);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirInterrogator :: EnumExtNotificationClassesInModule(IEnumExtNotificationClass **ppEnumSmirclass,
|
|
ISmirModHandle *hModule)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == ppEnumSmirclass)
|
|
return E_INVALIDARG;
|
|
PENUMEXTNOTIFICATIONCLASS pTmpEnumSmirClass = new CEnumExtNotificationClass( m_pSmir , NULL, hModule);
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pTmpEnumSmirClass)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
pTmpEnumSmirClass->QueryInterface(IID_ISMIR_EnumExtNotificationClass,(void**)ppEnumSmirclass);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirAdministrator::QueryInterface
|
|
* CSmirAdministrator::AddRef
|
|
* CSmirAdministrator::Release
|
|
*
|
|
* IUnknown members that delegate to m_pSmir
|
|
*/
|
|
|
|
CSmirAdministrator :: CSmirAdministrator ( CSmir *pSmir ) : m_cRef ( 1 ) , m_pSmir ( pSmir )
|
|
{
|
|
}
|
|
|
|
STDMETHODIMP CSmirAdministrator::QueryInterface(IN REFIID riid,
|
|
OUT PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return m_pSmir->QueryInterface(riid, ppv);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirAdministrator::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
/*
|
|
* We maintain an "interface reference count" for debugging
|
|
* purposes, because the client of an object should match
|
|
* AddRef and Release calls through each interface pointer.
|
|
*/
|
|
++m_cRef;
|
|
return m_pSmir->AddRef();
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirAdministrator::Release(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
/*
|
|
* m_cRef is again only for debugging. It doesn't affect
|
|
* CObject2 although the call to m_pObj->Release does.
|
|
*/
|
|
--m_cRef;
|
|
return m_pSmir->Release();
|
|
//do not do anything after this release because you may have been deleted
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: GetSerialiseHandle(ISmirSerialiseHandle **hSerialise,BOOL bClassDefinitionsOnly)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL ==hSerialise)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
CSmirSerialiseHandle *pSerialise = new CSmirSerialiseHandle(bClassDefinitionsOnly);
|
|
//we have an enumerator so get the interface to pass back
|
|
if(NULL == pSerialise)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
pSerialise->QueryInterface(IID_ISMIR_SerialiseHandle,(void**)hSerialise);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirAdministrator::AddModule
|
|
* Purpose: Creates the module namespace in the SMIR
|
|
* Parameters:
|
|
* ISmirModHandle* A module handle interface obtained through ISmirModHandle and
|
|
* filled in by the called
|
|
* Return Value:
|
|
* SCODE S_OK on success, WBEM_E_FAILED of failure
|
|
*/
|
|
|
|
SCODE CSmirAdministrator :: AddModuleToSerialise(ISmirModHandle *hModule,
|
|
ISmirSerialiseHandle *hSerialise)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL ==hSerialise || NULL == hModule)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
if((*((CSmirModuleHandle*)hModule))!=NULL)
|
|
{
|
|
*((CSmirModuleHandle*)hModule)>>hSerialise;
|
|
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 CSmirAdministrator :: AddClassToSerialise(ISmirGroupHandle *hGroup,
|
|
ISmirClassHandle *hClass,
|
|
ISmirSerialiseHandle *hSerialise)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL ==hSerialise || NULL == hClass || NULL == hGroup)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
BSTR szGroupName=NULL;
|
|
BSTR szModuleName=NULL;
|
|
hGroup->GetName(&szGroupName);
|
|
hGroup->GetModuleName(&szModuleName);
|
|
|
|
hClass->SetGroupName(szGroupName);
|
|
hClass->SetModuleName(szModuleName);
|
|
|
|
SysFreeString(szModuleName);
|
|
SysFreeString(szGroupName);
|
|
|
|
if(*((CSmirClassHandle*)hClass)!=NULL )
|
|
{
|
|
//it is a valid handle so serialise it
|
|
*((CSmirClassHandle*)hClass)>>hSerialise;
|
|
return S_OK;
|
|
}
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: AddGroupToSerialise(ISmirModHandle *hModule,
|
|
ISmirGroupHandle *hGroup,
|
|
ISmirSerialiseHandle *hSerialise)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL ==hSerialise || NULL == hGroup|| NULL == hModule)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
BSTR szModuleName=NULL;
|
|
|
|
hModule->GetName(&szModuleName);
|
|
|
|
hGroup->SetModuleName(szModuleName);
|
|
//clean up
|
|
SysFreeString(szModuleName);
|
|
|
|
if(*((CSmirGroupHandle*)hGroup)!=NULL)
|
|
{
|
|
//do the serialise
|
|
*((CSmirGroupHandle*)hGroup)>>hSerialise;
|
|
return S_OK;
|
|
}
|
|
|
|
//either the modfule or group name were not set so it is an error
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: AddModule(IN ISmirModHandle *hModule)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == hModule)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
if(S_OK==((CSmirModuleHandle*)hModule)->AddToDB(m_pSmir))
|
|
{
|
|
//notify people of the change
|
|
return S_OK ;
|
|
}
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
/*
|
|
* CSmirAdministrator::DeleteModule
|
|
* Purpose: Delete the module namespace from the SMIR
|
|
* Parameters:
|
|
* ISmirModHandle* A module handle interface obtained through ISmirModHandle and
|
|
* filled in by the called
|
|
* Return Value:
|
|
* SCODE S_OK on success, WBEM_E_FAILED of failure
|
|
*/
|
|
|
|
SCODE CSmirAdministrator :: DeleteModule(IN ISmirModHandle *hModule)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the arguments
|
|
if(NULL == hModule)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
if(S_OK==((CSmirModuleHandle *)hModule)->DeleteFromDB(m_pSmir))
|
|
{
|
|
return S_OK;
|
|
}
|
|
return WBEM_E_FAILED;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
/*
|
|
* CSmirAdministrator::DeleteAllModules
|
|
* Purpose: Delete the SMIR
|
|
* Parameters:
|
|
* ISmirModHandle* A module handle interface obtained through ISmirModHandle and
|
|
* filled in by the called
|
|
* Return Value:
|
|
* SCODE S_OK on success, WBEM_E_FAILED of failure
|
|
*/
|
|
|
|
SCODE CSmirAdministrator :: DeleteAllModules()
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//enumerate all modules and delete them...
|
|
IEnumModule *pEnumSmirMod = NULL;
|
|
SCODE result = m_pSmir->m_Interrogator.EnumModules(&pEnumSmirMod);
|
|
|
|
if((S_OK != result)||(NULL == pEnumSmirMod))
|
|
{
|
|
//no modules
|
|
return WBEM_NO_ERROR;
|
|
}
|
|
|
|
ISmirModHandle *phModule = NULL ;
|
|
|
|
for(int iCount=0;S_OK==pEnumSmirMod->Next(1, &phModule, NULL);iCount++)
|
|
{
|
|
//we have the module so delete it...
|
|
if (FAILED(DeleteModule(phModule)))
|
|
{
|
|
result = WBEM_E_FAILED;
|
|
}
|
|
|
|
phModule->Release();
|
|
}
|
|
|
|
pEnumSmirMod->Release();
|
|
return result;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirAdministrator::AddGroup
|
|
* Purpose: Delete the group namespace from the SMIR
|
|
* Parameters:
|
|
* ISmirModHandle* A module handle interface
|
|
* ISmirGroupHandle* A group handle interface obtained through ISmirModHandle and
|
|
* filled in by the called
|
|
* Return Value:
|
|
* SCODE S_OK on success, WBEM_E_FAILED of failure
|
|
*/
|
|
|
|
SCODE CSmirAdministrator :: AddGroup(IN ISmirModHandle *hModule,
|
|
IN ISmirGroupHandle *hGroup)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the args
|
|
if((NULL == hModule)||(NULL == hGroup))
|
|
{
|
|
//MyTraceEvent.Generate(__FILE__,__LINE__, "E_INVALIDARG");
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if(S_OK==((CSmirGroupHandle *)hGroup)->AddToDB(m_pSmir,hModule))
|
|
{
|
|
return S_OK;
|
|
}
|
|
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 CSmirAdministrator :: DeleteGroup(IN ISmirGroupHandle *hGroup)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//fill in the path etc
|
|
if(NULL ==hGroup)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if ( FAILED( ((CSmirGroupHandle*)hGroup)->DeleteFromDB(m_pSmir) ) )
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: AddClass(IN ISmirGroupHandle *hGroup,
|
|
IN ISmirClassHandle *hClass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the parameters
|
|
if((NULL == hGroup)||(NULL == hClass)||
|
|
(NULL == ((CSmirClassHandle*)hClass)->m_pIMosClass))
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if(S_OK==((CSmirClassHandle*)hClass)->AddToDB(m_pSmir,hGroup))
|
|
{
|
|
return S_OK;
|
|
}
|
|
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 CSmirAdministrator :: DeleteClass(IN ISmirClassHandle *hClass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the parameters
|
|
if((NULL == hClass)||(NULL == ((CSmirClassHandle*)hClass)->m_pIMosClass))
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//Let the class do it's own work
|
|
((CSmirClassHandle*)hClass)->DeleteFromDB( m_pSmir);
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: AddNotificationClass(ISmirNotificationClassHandle *hClass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the parameter
|
|
if((NULL == hClass) ||
|
|
((CSmirNotificationClassHandle*)NULL == *((CSmirNotificationClassHandle*)hClass)))
|
|
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if(S_OK==((CSmirNotificationClassHandle*)hClass)->AddToDB(m_pSmir))
|
|
{
|
|
return S_OK;
|
|
}
|
|
return WBEM_E_FAILED;
|
|
//release the handles via the garbage collector
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: AddExtNotificationClass(ISmirExtNotificationClassHandle *hClass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the parameter
|
|
if((NULL == hClass) ||
|
|
((CSmirExtNotificationClassHandle*)NULL == *((CSmirExtNotificationClassHandle*)hClass)))
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if(S_OK==((CSmirExtNotificationClassHandle*)hClass)->AddToDB(m_pSmir))
|
|
{
|
|
return S_OK;
|
|
}
|
|
return WBEM_E_FAILED;
|
|
//release the handles via the garbage collector
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
SCODE CSmirAdministrator :: DeleteNotificationClass(ISmirNotificationClassHandle *hClass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the parameters
|
|
if((NULL == hClass)||(NULL == ((CSmirNotificationClassHandle*)hClass)->m_pIMosClass))
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//Let the class do it's own work
|
|
((CSmirNotificationClassHandle*)hClass)->DeleteFromDB(m_pSmir);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: DeleteExtNotificationClass(ISmirExtNotificationClassHandle *hClass)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//check the parameters
|
|
if((NULL == hClass)||(NULL == ((CSmirExtNotificationClassHandle*)hClass)->m_pIMosClass))
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//Let the class do it's own work
|
|
((CSmirExtNotificationClassHandle*)hClass)->DeleteFromDB(m_pSmir);
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: AddNotificationClassToSerialise(ISmirNotificationClassHandle *hClass, ISmirSerialiseHandle *hSerialise)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL ==hSerialise || NULL == hClass)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
if(*((CSmirNotificationClassHandle*)hClass) !=NULL )
|
|
{
|
|
//it is a valid handle so serialise it
|
|
*((CSmirNotificationClassHandle*)hClass)>>hSerialise;
|
|
return S_OK;
|
|
}
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: AddExtNotificationClassToSerialise(ISmirExtNotificationClassHandle *hClass, ISmirSerialiseHandle *hSerialise)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if(NULL ==hSerialise || NULL == hClass)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
if(*((CSmirExtNotificationClassHandle*)hClass) !=NULL )
|
|
{
|
|
//it is a valid handle so serialise it
|
|
*((CSmirExtNotificationClassHandle*)hClass)>>hSerialise;
|
|
return S_OK;
|
|
}
|
|
return E_INVALIDARG;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: CreateWBEMClass(
|
|
|
|
BSTR pszClassName,
|
|
ISmirClassHandle **pHandle
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == pHandle)
|
|
return E_INVALIDARG;
|
|
|
|
*pHandle = NULL ;
|
|
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (m_pSmir, &moContext);
|
|
result= CSmirAccess :: Open(m_pSmir,&moServ);
|
|
if(FAILED(result)||(NULL == moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
|
|
IWbemClassObject *baseClass = NULL ;
|
|
//OK we have the namespace so create the class
|
|
CBString t_BStr ( HMOM_SNMPOBJECTTYPE_STRING ) ;
|
|
result = moServ->GetObject(t_BStr.GetString (), RESERVED_WBEM_FLAG,
|
|
moContext,&baseClass,NULL);
|
|
|
|
//finished with this
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
if (FAILED(result)||(NULL==baseClass))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
IWbemClassObject *t_MosClass = NULL ;
|
|
|
|
result = baseClass->SpawnDerivedClass (0 , &t_MosClass);
|
|
baseClass->Release () ;
|
|
|
|
if ( ! SUCCEEDED ( result ) )
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//name the class __CLASS Class
|
|
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(pszClassName);
|
|
|
|
result = t_MosClass->Put(OLEMS_CLASS_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
t_MosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
ISmirClassHandle *classHandle = NULL;
|
|
|
|
result = CoCreateInstance (
|
|
|
|
CLSID_SMIR_ClassHandle ,
|
|
NULL ,
|
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
|
|
IID_ISMIR_ClassHandle,
|
|
(PPVOID)&classHandle
|
|
);
|
|
|
|
if ( SUCCEEDED ( result ) )
|
|
{
|
|
classHandle->SetWBEMClass ( t_MosClass ) ;
|
|
*pHandle = classHandle ;
|
|
t_MosClass->Release();
|
|
}
|
|
else
|
|
{
|
|
t_MosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
return S_OK ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: CreateWBEMNotificationClass(
|
|
|
|
BSTR pszClassName,
|
|
ISmirNotificationClassHandle **pHandle
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == pHandle)
|
|
return E_INVALIDARG;
|
|
|
|
*pHandle = NULL ;
|
|
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (m_pSmir , &moContext);
|
|
result= CSmirAccess :: Open(m_pSmir, &moServ);
|
|
if(FAILED(result)||(NULL == moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
|
|
IWbemClassObject *baseClass = NULL ;
|
|
//OK we have the namespace so create the class
|
|
CBString t_BStr ( NOTIFICATION_CLASS_NAME ) ;
|
|
result = moServ->GetObject(t_BStr.GetString (), RESERVED_WBEM_FLAG,
|
|
moContext,&baseClass, NULL);
|
|
|
|
//finished with this
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
if (FAILED(result)||(NULL==baseClass))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
IWbemClassObject *t_MosClass = NULL ;
|
|
result = baseClass->SpawnDerivedClass (0 , &t_MosClass);
|
|
baseClass->Release () ;
|
|
|
|
if ( ! SUCCEEDED ( result ) )
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//name the class __CLASS Class
|
|
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(pszClassName);
|
|
|
|
result = t_MosClass->Put(OLEMS_CLASS_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
t_MosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
ISmirNotificationClassHandle *classHandle = NULL;
|
|
|
|
result = CoCreateInstance (
|
|
|
|
CLSID_SMIR_NotificationClassHandle ,
|
|
NULL ,
|
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
|
|
IID_ISMIR_NotificationClassHandle,
|
|
(PPVOID)&classHandle
|
|
);
|
|
|
|
if ( SUCCEEDED ( result ) )
|
|
{
|
|
classHandle->SetWBEMNotificationClass ( t_MosClass ) ;
|
|
t_MosClass->Release();
|
|
*pHandle = classHandle ;
|
|
}
|
|
else
|
|
{
|
|
t_MosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
SCODE CSmirAdministrator :: CreateWBEMExtNotificationClass (
|
|
|
|
BSTR pszClassName,
|
|
ISmirExtNotificationClassHandle **pHandle
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if (NULL == pHandle)
|
|
return E_INVALIDARG;
|
|
|
|
*pHandle = NULL ;
|
|
|
|
//open the smir name space
|
|
IWbemServices * moServ = NULL ;
|
|
IWbemContext *moContext = NULL ;
|
|
SCODE result= CSmirAccess :: GetContext (m_pSmir , &moContext);
|
|
result= CSmirAccess :: Open(m_pSmir ,&moServ);
|
|
if(FAILED(result)||(NULL == moServ))
|
|
{
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
|
|
IWbemClassObject *baseClass = NULL ;
|
|
//OK we have the namespace so create the class
|
|
CBString t_BStr ( HMOM_SNMPEXTNOTIFICATIONTYPE_STRING ) ;
|
|
result = moServ->GetObject(t_BStr.GetString () , RESERVED_WBEM_FLAG,
|
|
moContext,&baseClass, NULL);
|
|
|
|
//finished with this
|
|
|
|
if ( moContext )
|
|
moContext->Release () ;
|
|
|
|
moServ->Release();
|
|
if (FAILED(result)||(NULL==baseClass))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
IWbemClassObject *t_MosClass = NULL ;
|
|
|
|
result = baseClass->SpawnDerivedClass (0 , &t_MosClass );
|
|
baseClass->Release () ;
|
|
|
|
if ( ! SUCCEEDED ( result ) )
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
//name the class __CLASS Class
|
|
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
V_VT(&v) = VT_BSTR;
|
|
V_BSTR(&v)=SysAllocString(pszClassName);
|
|
|
|
result = t_MosClass->Put(OLEMS_CLASS_PROP,RESERVED_WBEM_FLAG, &v,0);
|
|
VariantClear(&v);
|
|
if (FAILED(result))
|
|
{
|
|
t_MosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
ISmirExtNotificationClassHandle *classHandle = NULL;
|
|
|
|
result = CoCreateInstance (
|
|
|
|
CLSID_SMIR_ExtNotificationClassHandle ,
|
|
NULL ,
|
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
|
|
IID_ISMIR_ExtNotificationClassHandle,
|
|
(PPVOID)&classHandle
|
|
);
|
|
|
|
if ( SUCCEEDED ( result ) )
|
|
{
|
|
classHandle->SetWBEMExtNotificationClass ( t_MosClass ) ;
|
|
t_MosClass->Release();
|
|
*pHandle = classHandle ;
|
|
}
|
|
else
|
|
{
|
|
t_MosClass->Release();
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CSmirSerialiseHandle::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 CSmirSerialiseHandle::QueryInterface(REFIID riid, PPVOID ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
//Always NULL the out-parameters
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv=this;
|
|
|
|
if (IID_ISMIR_SerialiseHandle==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;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* CSmirSerialiseHandle::AddRef
|
|
* CSmirSerialiseHandle::Release
|
|
*
|
|
* Reference counting members. When Release sees a zero count
|
|
* the object destroys itself.
|
|
*/
|
|
|
|
ULONG CSmirSerialiseHandle::AddRef(void)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirSerialiseHandle::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;
|
|
}
|
|
}
|
|
|
|
CSmirSerialiseHandle :: CSmirSerialiseHandle(BOOL bClassDefinitionsOnly)
|
|
{
|
|
m_cRef=0;
|
|
//I have two variables so that I can expand this at a later date
|
|
m_bMOFPragmas = m_bMOFAssociations = !bClassDefinitionsOnly;
|
|
|
|
m_serialiseString=QUALIFIER_PROPAGATION;
|
|
|
|
//start in the root\default namespace
|
|
if (TRUE == m_bMOFPragmas)
|
|
m_serialiseString+=CString(ROOT_DEFAULT_NAMESPACE_PRAGMA);
|
|
/**************************************************************************
|
|
* create the SMIR namespace class
|
|
**************************************************************************/
|
|
if(TRUE == m_bMOFAssociations)
|
|
{
|
|
/******************then create an instance*********************************/
|
|
|
|
m_serialiseString+=SMIR_CLASS_DEFINITION;
|
|
m_serialiseString+=SMIR_INSTANCE_DEFINITION;
|
|
}
|
|
//go to the SMIR namespace
|
|
if (TRUE == m_bMOFPragmas)
|
|
m_serialiseString+=CString(SMIR_NAMESPACE_PRAGMA);
|
|
|
|
|
|
/******************create the SnmpMacro class******************************/
|
|
|
|
m_serialiseString+=SNMPMACRO_CLASS_START;
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
/******************create the SnmpObjectType class*************************/
|
|
|
|
m_serialiseString+=SNMPOBJECTTYPE_CLASS_START;
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
/******************create the SnmpNotifyStatus class*************************/
|
|
|
|
m_serialiseString+=SNMPNOTIFYSTATUS_CLASS_START;
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
/****************if asked for, create the SMIR specific stuff****************/
|
|
if(TRUE == m_bMOFAssociations)
|
|
{
|
|
/******************create the SnmpNotification class*********************/
|
|
|
|
m_serialiseString+=SNMPNOTIFICATION_CLASS_START;
|
|
|
|
//add the properties
|
|
m_serialiseString+=TIMESTAMP_QUALS_TYPE;
|
|
m_serialiseString+=CString(TIMESTAMP_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=TRAPOID_QUALS_TYPE;
|
|
m_serialiseString+=CString(TRAPOID_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=SENDER_ADDR_QUALS_TYPE;
|
|
m_serialiseString+=CString(SENDER_ADDR_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=SENDER_TADDR_QUALS_TYPE;
|
|
m_serialiseString+=CString(SENDER_TADDR_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=TRANSPORT_QUALS_TYPE;
|
|
m_serialiseString+=CString(TRANSPORT_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=COMMUNITY_QUALS_TYPE;
|
|
m_serialiseString+=CString(COMMUNITY_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
|
|
/******************create the SnmpExtendedNotification class*************/
|
|
|
|
m_serialiseString+=SNMPEXTNOTIFICATION_CLASS_START;
|
|
|
|
//add the properties
|
|
m_serialiseString+=TIMESTAMP_QUALS_TYPE;
|
|
m_serialiseString+=CString(TIMESTAMP_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=TRAPOID_QUALS_TYPE;
|
|
m_serialiseString+=CString(TRAPOID_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=SENDER_ADDR_QUALS_TYPE;
|
|
m_serialiseString+=CString(SENDER_ADDR_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=SENDER_TADDR_QUALS_TYPE;
|
|
m_serialiseString+=CString(SENDER_TADDR_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=TRANSPORT_QUALS_TYPE;
|
|
m_serialiseString+=CString(TRANSPORT_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=COMMUNITY_QUALS_TYPE;
|
|
m_serialiseString+=CString(COMMUNITY_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
/******************create the NotificationMapper class*********************/
|
|
|
|
m_serialiseString+=NOTIFICATIONMAPPER_CLASS_START;
|
|
|
|
//add the two properies..
|
|
m_serialiseString+=READ_ONLY_KEY_STRING;
|
|
m_serialiseString+=CString(SMIR_NOTIFICATION_TRAP_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(SMIR_NOTIFICATION_CLASS_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
/******************create the ExtendedNotificationMapper class*************/
|
|
|
|
m_serialiseString+=EXTNOTIFICATIONMAPPER_CLASS_START;
|
|
|
|
//add the two properies..
|
|
m_serialiseString+=READ_ONLY_KEY_STRING;
|
|
m_serialiseString+=CString(SMIR_NOTIFICATION_TRAP_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(SMIR_NOTIFICATION_CLASS_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
|
|
/******************create the module class*****************************/
|
|
|
|
m_serialiseString+=MODULE_CLASS_START;
|
|
//add the properties
|
|
|
|
//give the instance a name
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_NAME_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the module oid property
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_OID_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the module identity
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_ID_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the organisation property
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_ORG_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the contact info property
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_CONTACT_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the Description property
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_DESCRIPTION_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the revision property
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_REVISION_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the last update property
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_LAST_UPDATE_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the snmp version property
|
|
m_serialiseString+=READONLY_LONG;
|
|
m_serialiseString+=CString(MODULE_SNMP_VERSION_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//add the module imports as an property
|
|
m_serialiseString+=READONLY_STRING;
|
|
m_serialiseString+=CString(MODULE_IMPORTS_PROPERTY);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
//end the class definition
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
#if 0
|
|
//each module will create it's own instance
|
|
/**************************************************************************
|
|
* create the SMIR Associator class
|
|
*[assoc]
|
|
*class SmirToClassAssociator
|
|
*{
|
|
*[read, key] AssocName;
|
|
*[read] ClassName;
|
|
*[read] SmirName;
|
|
*};
|
|
*
|
|
**************************************************************************/
|
|
|
|
m_serialiseString+=ASSOC_QUALIFIER;
|
|
m_serialiseString+=CString(CLASS_STRING);
|
|
m_serialiseString+=CString(SMIR_ASSOC_CLASS_NAME);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
m_serialiseString+=CString(OPEN_BRACE_STR);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
|
|
m_serialiseString+=READ_ONLY_KEY_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_ASSOC_SMIR_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
#endif
|
|
|
|
/**************************************************************************
|
|
* create the Module Associator class
|
|
*[assoc]
|
|
*class SmirToClassAssociator
|
|
*{
|
|
*[read, key] AssocName;
|
|
*[read] ClassName;
|
|
*[read] SmirName;
|
|
*};
|
|
*
|
|
**************************************************************************/
|
|
|
|
m_serialiseString+=ASSOC_QUALIFIER;
|
|
m_serialiseString+=CString(CLASS_STRING);
|
|
m_serialiseString+=CString(SMIR_MODULE_ASSOC_CLASS_NAME);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
m_serialiseString+=CString(OPEN_BRACE_STR);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
|
|
m_serialiseString+=READ_ONLY_KEY_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_MODULE_ASSOC_MODULE_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=END_OF_CLASS;
|
|
/**************************************************************************
|
|
* create the Group Associator class
|
|
*[assoc]
|
|
*class SmirToClassAssociator
|
|
*{
|
|
*[read, key] AssocName;
|
|
*[read] ClassName;
|
|
*[read] SmirName;
|
|
*};
|
|
*
|
|
**************************************************************************/
|
|
|
|
m_serialiseString+=ASSOC_QUALIFIER;
|
|
m_serialiseString+=CString(CLASS_STRING);
|
|
m_serialiseString+=CString(SMIR_GROUP_ASSOC_CLASS_NAME);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
m_serialiseString+=CString(OPEN_BRACE_STR);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
|
|
m_serialiseString+=READ_ONLY_KEY_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_GROUP_ASSOC_GROUP_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
/**************************************************************************
|
|
* create the Notification/Module Associator class
|
|
*[assoc]
|
|
*class ModToNotificationClassAssociator
|
|
*{
|
|
*[read, key] AssocName;
|
|
*[read] SmirClass;
|
|
*[read] SmirModule;
|
|
*};
|
|
*
|
|
**************************************************************************/
|
|
|
|
m_serialiseString+=ASSOC_QUALIFIER;
|
|
m_serialiseString+=CString(CLASS_STRING);
|
|
m_serialiseString+=CString(SMIR_MODULE_ASSOC_NCLASS_NAME);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
m_serialiseString+=CString(OPEN_BRACE_STR);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
|
|
m_serialiseString+=READ_ONLY_KEY_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_MODULE_ASSOC_MODULE_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
/**************************************************************************
|
|
* create the ExtNotification/Module Associator class
|
|
*[assoc]
|
|
*class ModToExtNotificationClassAssociator
|
|
*{
|
|
*[read, key] AssocName;
|
|
*[read] SmirClass;
|
|
*[read] SmirModule;
|
|
*};
|
|
*
|
|
**************************************************************************/
|
|
|
|
m_serialiseString+=ASSOC_QUALIFIER;
|
|
m_serialiseString+=CString(CLASS_STRING);
|
|
m_serialiseString+=CString(SMIR_MODULE_ASSOC_EXTNCLASS_NAME);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
m_serialiseString+=CString(OPEN_BRACE_STR);
|
|
m_serialiseString+=CString(NEWLINE_STR);
|
|
|
|
m_serialiseString+=READ_ONLY_KEY_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_NAME_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_X_ASSOC_CLASS_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=READ_ONLY_REF_STRING;
|
|
m_serialiseString+=CString(SMIR_MODULE_ASSOC_MODULE_PROP);
|
|
m_serialiseString+=END_OF_PROPERTY;
|
|
|
|
m_serialiseString+=END_OF_CLASS;
|
|
|
|
}
|
|
}
|
|
|
|
SCODE CSmirSerialiseHandle :: GetText(BSTR *pszText)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
*pszText = m_serialiseString.AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
CSmirWbemConfiguration :: CSmirWbemConfiguration ( CSmir *a_Smir ) :
|
|
|
|
m_Smir ( a_Smir ) ,
|
|
m_ReferenceCount ( 1 ) ,
|
|
m_Context ( NULL ) ,
|
|
m_Service ( NULL )
|
|
{
|
|
InterlockedIncrement ( & CSMIRClassFactory::objectsInProgress ) ;
|
|
}
|
|
|
|
CSmirWbemConfiguration :: ~CSmirWbemConfiguration ()
|
|
{
|
|
InterlockedDecrement ( & CSMIRClassFactory :: objectsInProgress ) ;
|
|
|
|
if ( m_Context )
|
|
m_Context->Release () ;
|
|
|
|
if ( m_Service )
|
|
m_Service->Release () ;
|
|
}
|
|
|
|
HRESULT CSmirWbemConfiguration :: QueryInterface(IN REFIID iid,OUT PPVOID iplpv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
return m_Smir->QueryInterface(iid, iplpv);
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirWbemConfiguration :: AddRef()
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
InterlockedIncrement ( & m_ReferenceCount ) ;
|
|
return m_Smir->AddRef () ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
ULONG CSmirWbemConfiguration :: Release()
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
LONG ref ;
|
|
if ( ( ref = InterlockedDecrement ( & m_ReferenceCount ) ) == 0 )
|
|
{
|
|
}
|
|
return m_Smir->Release () ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
HRESULT CSmirWbemConfiguration :: Authenticate (
|
|
|
|
BSTR Server,
|
|
BSTR User,
|
|
BSTR Password,
|
|
BSTR Locale,
|
|
long lSecurityFlags,
|
|
BSTR Authority ,
|
|
BOOL InProc
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
IWbemLocator *t_Locator = NULL ;
|
|
|
|
|
|
HRESULT t_Result = CoCreateInstance (
|
|
|
|
CLSID_WbemLocator ,
|
|
NULL ,
|
|
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
|
|
IID_IUnknown ,
|
|
( void ** ) & t_Locator
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IWbemServices *t_Unknown = NULL ;
|
|
|
|
if ( Server )
|
|
{
|
|
CString t_BStr = CString ( BACKSLASH_STR ) ;
|
|
t_BStr += CString ( BACKSLASH_STR ) ;
|
|
t_BStr += CString ( Server ) ;
|
|
t_BStr += CString ( BACKSLASH_STR ) ;
|
|
t_BStr += CString ( SMIR_NAMESPACE ) ;
|
|
|
|
BSTR t_Str = SysAllocString ( t_BStr.GetBuffer ( 0 ) ) ;
|
|
|
|
t_Result = t_Locator->ConnectServer (
|
|
|
|
t_Str ,
|
|
Password, // Password
|
|
User, // User
|
|
Locale, // Locale id
|
|
lSecurityFlags, // Flags
|
|
Authority, // Authority
|
|
NULL, // Context
|
|
&t_Unknown
|
|
);
|
|
|
|
SysFreeString ( t_Str ) ;
|
|
}
|
|
else
|
|
{
|
|
CString t_BStr = CString ( SMIR_NAMESPACE ) ;
|
|
LPCTSTR t_Str = SysAllocString ( t_BStr.GetBuffer ( 0 ) ) ;
|
|
|
|
t_Result = t_Locator->ConnectServer (
|
|
|
|
t_Str ,
|
|
Password, // Password
|
|
User, // User
|
|
Locale, // Locale id
|
|
lSecurityFlags, // Flags
|
|
Authority, // Authority
|
|
NULL, // Context
|
|
&t_Unknown
|
|
);
|
|
|
|
SysFreeString ( t_Str ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( m_Service )
|
|
{
|
|
m_Service->Release () ;
|
|
}
|
|
|
|
t_Result = t_Unknown->QueryInterface (
|
|
|
|
IID_IWbemServices ,
|
|
( void **) & m_Service
|
|
) ;
|
|
|
|
t_Unknown->Release () ;
|
|
}
|
|
|
|
t_Locator->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
HRESULT CSmirWbemConfiguration :: Impersonate ( ISMIRWbemConfiguration *a_Configuration )
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if ( m_Context )
|
|
m_Context->Release () ;
|
|
|
|
if ( m_Service )
|
|
m_Service->Release () ;
|
|
|
|
CSmirWbemConfiguration *t_Configuration = ( CSmirWbemConfiguration * ) a_Configuration ;
|
|
|
|
m_Context = t_Configuration->m_Context ;
|
|
m_Service = t_Configuration->m_Service ;
|
|
|
|
if ( m_Context )
|
|
m_Context->AddRef () ;
|
|
|
|
if ( m_Service )
|
|
m_Service->AddRef () ;
|
|
|
|
return S_OK ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
HRESULT CSmirWbemConfiguration :: SetContext ( IWbemContext *a_Context )
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if ( m_Context )
|
|
{
|
|
m_Context->Release () ;
|
|
}
|
|
|
|
m_Context = a_Context ;
|
|
|
|
if ( m_Context )
|
|
{
|
|
m_Context->AddRef () ;
|
|
}
|
|
|
|
return S_OK ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
HRESULT CSmirWbemConfiguration :: GetContext ( IWbemContext **a_Context )
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if ( a_Context && m_Context )
|
|
{
|
|
m_Context->AddRef () ;
|
|
|
|
*a_Context = m_Context ;
|
|
return S_OK ;
|
|
}
|
|
else
|
|
{
|
|
if (a_Context)
|
|
{
|
|
*a_Context = NULL ;
|
|
}
|
|
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
HRESULT CSmirWbemConfiguration :: GetServices ( IWbemServices **a_Service )
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
if ( a_Service && m_Service )
|
|
{
|
|
m_Service->AddRef () ;
|
|
*a_Service = m_Service ;
|
|
return S_OK ;
|
|
}
|
|
else
|
|
{
|
|
*a_Service = NULL ;
|
|
return WBEM_E_FAILED ;
|
|
}
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|