| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | #include "main.h"#include "./storageHandler.h"StorageHandler::StorageHandler(LPCWSTR pszKey, ifc_omstoragehelper::HandlerProc handlerProc, UINT flags): ref(1), key(NULL), handler(handlerProc), flags(flags){	if (0 != (flagCopyKey & flags))		key = Plugin_CopyString(pszKey);	else		key = (LPWSTR)pszKey;}StorageHandler::~StorageHandler(){	if (0 != (flagCopyKey & flags))		Plugin_FreeString(key);}HRESULT StorageHandler::CreateInstance(LPCWSTR pszKey, ifc_omstoragehelper::HandlerProc handlerProc, UINT flags, StorageHandler **instance){	if (NULL == instance) 		return E_POINTER;	if (NULL == pszKey || L'\0' == pszKey || NULL == handlerProc) 	{		*instance = NULL;		return E_INVALIDARG;	}	*instance = new StorageHandler(pszKey, handlerProc, flags);	if (NULL == *instance) return E_OUTOFMEMORY;	return S_OK;}size_t StorageHandler::AddRef(){	return InterlockedIncrement((LONG*)&ref);}size_t StorageHandler::Release(){	if (0 == ref)		return ref;		LONG r = InterlockedDecrement((LONG*)&ref);	if (0 == r)		delete(this);		return r;}int StorageHandler::QueryInterface(GUID interface_guid, void **object){	if (NULL == object) return E_POINTER;		if (IsEqualIID(interface_guid, IFC_OmStorageHandler))		*object = static_cast<ifc_omstoragehandler*>(this);	else	{		*object = NULL;		return E_NOINTERFACE;	}	if (NULL == *object)		return E_UNEXPECTED;	AddRef();	return S_OK;}HRESULT StorageHandler::GetKey(LPCWSTR *ppKey){	if (NULL == ppKey) return E_POINTER;	*ppKey = key;	return S_OK;}void StorageHandler::Invoke(ifc_omservice *service, LPCWSTR pszKey, LPCWSTR pszValue){	handler(service, pszKey, pszValue);}#define CBCLASS StorageHandlerSTART_DISPATCH;CB(ADDREF, AddRef)CB(RELEASE, Release)CB(QUERYINTERFACE, QueryInterface)CB(API_GETKEY, GetKey)VCB(API_INVOKE, Invoke)END_DISPATCH;#undef CBCLASS
 |