Leaked source code of windows server 2003
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

//***************************************************************************
//
// 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;
}
}