errorinfo.cpp

来自「firtext搜索引擎源码」· C++ 代码 · 共 262 行

CPP
262
字号
#include "com/Com.h"
#include "com/comerror.h"#include <assert.h>#include <pthread.h>#include <stdlib.h>#include "com/linux/internal.h"namespace firtex{	namespace com 	{		namespace internal 		{			class ErrorInfo : public IErrorInfo, public ICreateErrorInfo, ISupportErrorInfo {			public:				ErrorInfo();				~ErrorInfo();				FX_STDMETHOD(QueryInterface)( firtex::com::FX_IID const& riid, void** ptr );				uint32_t   AddRef();
				uint32_t   Release();				FX_STDMETHOD(GetGUID)( firtex::com::FX_GUID* retVal );				FX_STDMETHOD(GetSource)( firtex::com::FX_BSTR* retVal );				FX_STDMETHOD(GetDescription)( firtex::com::FX_BSTR* retVal );				FX_STDMETHOD(GetHelpFile)( firtex::com::FX_BSTR* retVal );				FX_STDMETHOD(GetHelpContext)( uint32_t* retVal );				FX_STDMETHOD(SetGUID)( firtex::com::FX_REFGUID newVal );				FX_STDMETHOD(SetSource)( wchar_t const*  newVal );				FX_STDMETHOD(SetDescription)( wchar_t const*  newVal );				FX_STDMETHOD(SetHelpFile)( wchar_t const*  newVal );				FX_STDMETHOD(SetHelpContext)( uint32_t newVal );				FX_STDMETHOD(InterfaceSupportsErrorInfo)( firtex::com::FX_REFIID riid );			private:				uint32_t volatile	ref;				firtex::com::FX_GUID		guid;				firtex::com::FX_BSTR		source;				firtex::com::FX_BSTR		description;				firtex::com::FX_BSTR		helpfile;				uint32_t	helpcontext;				pthread_mutex_t mutex;			};		};	};};//static firtex::com::FX_IID const IUnknown__iid = {0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
//static firtex::com::FX_IID const ICreateErrorInfo__iid = {0x22F03340,0x547D,0x101B,{0x8E,0x65,0x08,0x00,0x2B,0x2B,0xD1,0x19}};
//static firtex::com::FX_IID const IErrorInfo__iid = {0x1CF2B120,0x547D,0x101B,{0x8E,0x65,0x08,0x00,0x2B,0x2B,0xD1,0x19}};
//static firtex::com::FX_IID const ISupportErrorInfo__iid = {0xDF0B3D60,0x548F,0x101B,{0x8E,0x65,0x08,0x00,0x2B,0x2B,0xD1,0x19}};
firtex::com::internal::ErrorInfo::ErrorInfo(){	ref = 0;	memset( &guid, 0, sizeof(guid) );	source = 0;	description = 0;	helpfile = 0;	helpcontext = 0;	pthread_mutex_init( &mutex, 0 );}firtex::com::internal::ErrorInfo::~ErrorInfo(){	assert( ref == 0 );	pthread_mutex_destroy( &mutex );}FX_STDMETHODIMP firtex::com::internal::ErrorInfo::QueryInterface( firtex::com::FX_IID const& riid, void** ptr )
{
	if ( !ptr ) return FX_E_INVALIDARG;		if(FX_IsEqualIID(riid, IErrorInfo::iid))	{	  *ptr = static_cast<IErrorInfo*>(this);	}	else if(FX_IsEqualIID(riid, ICreateErrorInfo::iid))	{	  *ptr = static_cast<ICreateErrorInfo*>(this);	}	else if(FX_IsEqualIID(riid, ISupportErrorInfo::iid))	{	  *ptr = static_cast<ISupportErrorInfo*>(this);	}	else if(FX_IsEqualIID(riid, IUnknown::iid))	{	  *ptr = static_cast<IUnknown*>(static_cast<IErrorInfo*>(this));	}	if (*ptr) {		reinterpret_cast<IUnknown*>(ptr)->AddRef();	  	return FX_S_OK;	}	return FX_E_NOINTERFACE;}uint32_t firtex::com::internal::ErrorInfo::AddRef(){	::pthread_mutex_lock( &mutex );	uint32_t retval = ++ref; 	::pthread_mutex_unlock( &mutex );	return retval;}uint32_t firtex::com::internal::ErrorInfo::Release(){	::pthread_mutex_lock( &mutex );	uint32_t tmp = --ref;	::pthread_mutex_unlock( &mutex );	if ( tmp == 0 ) {		delete this;	}	return tmp;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::GetGUID( firtex::com::FX_GUID * pGUID ){	if ( !pGUID ) return FX_E_INVALIDARG;	memcpy(pGUID, &guid, sizeof(firtex::com::FX_GUID));	return FX_S_OK;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::GetSource(firtex::com::FX_BSTR *retVal){	if (retVal == NULL) return FX_E_INVALIDARG;	*retVal = FX_SysAllocString(source);	return *retVal ? FX_S_OK : FX_E_INVALIDARG;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::GetDescription(firtex::com::FX_BSTR *retVal){	if (retVal == NULL) return FX_E_INVALIDARG;	*retVal = FX_SysAllocString(description);	return *retVal ? FX_S_OK : FX_E_INVALIDARG;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::GetHelpFile(firtex::com::FX_BSTR *retVal){	if (retVal == NULL) return FX_E_INVALIDARG;	*retVal = FX_SysAllocString(helpfile);	return *retVal ? FX_S_OK : FX_E_INVALIDARG;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::GetHelpContext(uint32_t *retVal){	if (retVal == NULL) return FX_E_INVALIDARG;	*retVal = helpcontext;	return FX_S_OK;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::SetGUID(firtex::com::FX_REFGUID rguid){	memcpy(&guid, &rguid, sizeof(firtex::com::FX_GUID));	return FX_S_OK;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::SetSource(wchar_t const* newVal){	firtex::com::FX_BSTR cpy = FX_SysAllocString( newVal );	if ( !cpy ) return FX_E_INVALIDARG;	if ( source ) FX_SysFreeString( source );	source = cpy;	return FX_S_OK;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::SetDescription(wchar_t const* newVal){	firtex::com::FX_BSTR cpy = FX_SysAllocString( newVal );	if ( !cpy ) return FX_E_INVALIDARG;	if ( description ) FX_SysFreeString( description );	description = cpy;	return FX_S_OK;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::SetHelpFile(wchar_t const* newVal){	firtex::com::FX_BSTR cpy = FX_SysAllocString( newVal );	if ( !cpy ) return FX_E_INVALIDARG;	if ( helpfile ) FX_SysFreeString( helpfile );	helpfile = cpy;	return FX_S_OK;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::SetHelpContext(uint32_t newVal){	helpcontext = newVal;	return FX_S_OK;}firtex::com::FX_HRESULT firtex::com::internal::ErrorInfo::InterfaceSupportsErrorInfo(firtex::com::FX_REFIID riid){	return FX_IsEqualIID(riid, guid) ? FX_S_OK : FX_S_FALSE;}/*********************************************************************** *		CreateErrorInfo (OLE32.@) */firtex::com::FX_HRESULT FX_STDAPICALLTYPE firtex::com::FX_CreateErrorInfo(ICreateErrorInfo **pperrinfo){	if ( !pperrinfo ) return FX_E_INVALIDARG;		firtex::com::IErrorInfo* pei = 0;	try {		pei = new firtex::com::internal::ErrorInfo();	}	catch (...) {		return FX_E_INVALIDARG;	};		if ( !pei ) return FX_E_INVALIDARG;		firtex::com::FX_HRESULT hr = pei->QueryInterface( firtex::com::ICreateErrorInfo::iid, (void**)pperrinfo);	pei->Release();	return hr;}/*********************************************************************** *		GetErrorInfo (OLE32.@) */firtex::com::FX_HRESULT FX_STDAPICALLTYPE firtex::com::FX_GetErrorInfo(uint32_t dwReserved, firtex::com::IErrorInfo **pperrinfo){	if(!pperrinfo) return FX_E_INVALIDARG;		firtex::com::internal::apartment_t* apt = firtex::com::internal::GetThreadSpecificData()->apartment;	if ( !apt || !apt->errorinfo ) {	   *pperrinfo = NULL;	   return FX_S_FALSE;	}	firtex::com::internal::pthread_mutex_lock lock( &apt->mutex );	*pperrinfo = apt->errorinfo;	/* clear thread error state */	apt->errorinfo = NULL;	return FX_S_OK;}/*********************************************************************** *		SetErrorInfo (OLE32.@) */firtex::com::FX_HRESULT FX_STDAPICALLTYPE firtex::com::FX_SetErrorInfo(uint32_t dwReserved, firtex::com::IErrorInfo *perrinfo){	firtex::com::internal::apartment_t* apt = firtex::com::internal::GetThreadSpecificData()->apartment;	if (!apt) {		apt = firtex::com::internal::CreateApartment(COINIT_UNINITIALIZED);	}	assert( apt );	firtex::com::internal::pthread_mutex_lock lock( &apt->mutex );		/* release old errorinfo */	firtex::com::IErrorInfo* pei = apt->errorinfo;	if (pei) pei->Release();	/* set to new value */	apt->errorinfo = perrinfo;	if (apt->errorinfo) apt->errorinfo->AddRef();	return FX_S_OK;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?