1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105 |
- #ifndef __PropertyClass_h__
- #define __PropertyClass_h__
- #include <..\TCLib\ObjectLock.h>
- class ATL_NO_VTABLE TCComPropertyClassRoot
- {
- public:
- #ifdef _DEBUG
- TCComPropertyClassRoot(LPCSTR pszType);
- #else
- TCComPropertyClassRoot();
- #endif
- public:
- void SetDirty(BOOL bDirty);
- BOOL GetDirty() const;
- bool IsLoading();
- void SetLoading(bool bLoading);
- bool IsSaving();
- void SetSaving(bool bSaving);
- public:
- HRESULT TCPersistStreamInit_Load(IStream* pStm, ATL_PROPMAP_ENTRY* pMap,
- void* pT, IUnknown* pUnk);
- HRESULT TCPersistStreamInit_Save(IStream* pStm, BOOL ,
- ATL_PROPMAP_ENTRY* pMap, void* pT, IUnknown* pUnk);
- HRESULT TCPersistPropertyBag_Load(IPropertyBag* pPropBag,
- LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap, void* pT, IUnknown* pUnk);
- HRESULT TCPersistPropertyBag_Save(IPropertyBag* pPropBag,
- BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap,
- void* pT, IUnknown* pUnk);
- HRESULT ISpecifyPropertyPages_GetPages(CAUUID* pPages,
- ATL_PROPMAP_ENTRY* pMap);
- protected:
-
-
-
-
-
-
-
-
- class CLoadSaveScope
- {
-
- public:
- CLoadSaveScope(TCComPropertyClassRoot* pObject, bool bLoading = true);
- ~CLoadSaveScope();
-
- protected:
-
- TCComPropertyClassRoot* m_pObject;
-
-
- bool m_bLoading;
- };
- public:
- bool m_bRequiresSave:1;
- protected:
- #pragma pack(push, 4)
- long m_nLoadingRefs;
- long m_nSavingRefs;
- #pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- CComPtr<IDataAdviseHolder> m_spDataAdviseHolder;
- #ifdef _DEBUG
-
-
- LPCSTR m_pszType;
- #endif
- };
- inline TCComPropertyClassRoot::CLoadSaveScope::CLoadSaveScope(
- TCComPropertyClassRoot* pObject, bool bLoading) :
- m_pObject(pObject), m_bLoading(bLoading)
- {
- if (m_pObject)
- {
- if (m_bLoading)
- m_pObject->SetLoading(true);
- else
- m_pObject->SetSaving(true);
- }
- }
- inline TCComPropertyClassRoot::CLoadSaveScope::~CLoadSaveScope()
- {
- if (m_pObject)
- {
- if (m_bLoading)
- m_pObject->SetLoading(false);
- else
- m_pObject->SetSaving(false);
- }
- }
- class TCComFakeNotifySink
- {
- public:
- void Fire_OnChanged(DISPID dispID) {UNUSED(dispID);}
- void Fire_OnRequestEdit(DISPID dispID) {UNUSED(dispID);}
- };
- template <class T, class PNSCP = TCComFakeNotifySink>
- class ATL_NO_VTABLE TCComPropertyClass :
- public TCComPropertyClassRoot,
- public PNSCP
- {
- public:
- TCComPropertyClass();
- public:
- HRESULT FireOnChanged(DISPID dispID);
- HRESULT FireOnRequestEdit(DISPID dispID);
- HRESULT SendOnDataChange(DWORD advf = 0);
- public:
- virtual HRESULT ControlQueryInterface(const IID& iid, void** ppv);
- public:
-
-
- typedef TCComPropertyClass<T, PNSCP> TCComPropertyClassBase;
- protected:
-
-
- typedef TCObjectLock<T> CLock;
- };
- #ifdef _DEBUG
-
-
-
- template <class T, class PNSCP>
- inline TCComPropertyClass<T, PNSCP>::TCComPropertyClass()
- : TCComPropertyClassRoot(TCTypeName(T))
- {
- }
- #else
- template <class T, class PNSCP>
- inline TCComPropertyClass<T, PNSCP>::TCComPropertyClass()
- {
- }
- #endif
- template <class T, class PNSCP>
- inline HRESULT TCComPropertyClass<T, PNSCP>::FireOnChanged(DISPID dispID)
- {
-
- static_cast<PNSCP*>(this)->Fire_OnChanged(dispID);
- return S_OK;
- }
- template <class T, class PNSCP>
- inline HRESULT TCComPropertyClass<T, PNSCP>::FireOnRequestEdit(DISPID dispID)
- {
-
- static_cast<PNSCP*>(this)->Fire_OnRequestEdit(dispID);
- return S_OK;
- }
- template <class T, class PNSCP>
- HRESULT TCComPropertyClass<T, PNSCP>::SendOnDataChange(DWORD advf)
- {
- HRESULT hRes = S_OK;
- if (m_spDataAdviseHolder)
- {
- CComPtr<IDataObject> pdo;
- if (SUCCEEDED(ControlQueryInterface(IID_IDataObject, (void**)&pdo)))
- hRes = m_spDataAdviseHolder->SendOnDataChange(pdo, 0, advf);
- }
- return hRes;
- }
- template <class T, class PNSCP>
- HRESULT TCComPropertyClass<T, PNSCP>::ControlQueryInterface(const IID& iid,
- void** ppv)
- {
- T* pT = static_cast<T*>(this);
- return pT->_InternalQueryInterface(iid, ppv);
- }
- template <class T>
- class ATL_NO_VTABLE TCPersistStreamInitImpl :
- public IPersistStreamInit
- {
- public:
-
-
- typedef TCPersistStreamInitImpl<T> TCPersistStreamInitImplBase;
- public:
- STDMETHODIMP GetClassID(CLSID *pClassID);
- public:
- STDMETHODIMP IsDirty();
- STDMETHODIMP Load(IStream* pStm);
- STDMETHODIMP Save(IStream* pStm, BOOL fClearDirty);
- STDMETHODIMP GetSizeMax(ULARGE_INTEGER* pcbSize);
- public:
- STDMETHODIMP InitNew();
- };
- template <class T>
- STDMETHODIMP TCPersistStreamInitImpl<T>::GetClassID(CLSID *pClassID)
- {
- _TRACE0("TCPersistStreamInitImpl<T>::GetClassID\n");
- *pClassID = T::GetObjectCLSID();
- return S_OK;
- }
- template <class T>
- STDMETHODIMP TCPersistStreamInitImpl<T>::IsDirty()
- {
- _TRACE0("TCPersistStreamInitImpl<T>::IsDirty\n");
- T* pT = static_cast<T*>(this);
- return (pT->m_bRequiresSave) ? S_OK : S_FALSE;
- }
- template <class T>
- STDMETHODIMP TCPersistStreamInitImpl<T>::Load(IStream* pStm)
- {
- _TRACE0("TCPersistStreamInitImpl<T>::Load\n");
- T* pT = static_cast<T*>(this);
- return pT->TCPersistStreamInit_Load(pStm, T::GetPropertyMap(), pT,
- pT->GetUnknown());
- }
- template <class T>
- STDMETHODIMP TCPersistStreamInitImpl<T>::Save(IStream* pStm, BOOL fClearDirty)
- {
- T* pT = static_cast<T*>(this);
- _TRACE0("TCPersistStreamInitImpl<T>::Save\n");
- return pT->TCPersistStreamInit_Save(pStm, fClearDirty, T::GetPropertyMap(),
- pT, pT->GetUnknown());
- }
- template <class T>
- STDMETHODIMP TCPersistStreamInitImpl<T>::GetSizeMax(ULARGE_INTEGER* pcbSize)
- {
-
- T* pThis = static_cast<T*>(this);
-
- HRESULT hr = TCGetPersistStreamSize(pThis->GetUnknown(), pcbSize);
-
- _TRACE_BEGIN
- _TRACE_PART1("TCPersistStreamInitImpl<%hs>::GetSizeMax():", TCTypeName(T));
- if (SUCCEEDED(hr))
- _TRACE_PART2("Counted 0x%08X (%d) bytes\n", pcbSize->LowPart, pcbSize->LowPart);
- else
- _TRACE_PART1("Failed, hr = 0x%08X\n", hr);
- _TRACE_END
-
- return hr;
- }
- template <class T>
- STDMETHODIMP TCPersistStreamInitImpl<T>::InitNew()
- {
- _TRACE0("TCPersistStreamInitImpl<T>::InitNew\n");
- T* pT = static_cast<T*>(this);
- pT->SetDirty(false);
- return S_OK;
- }
- template <class T>
- class ATL_NO_VTABLE TCPersistPropertyBagImpl :
- public IPersistPropertyBag
- {
- public:
- STDMETHODIMP GetClassID(CLSID *pClassID);
- public:
- STDMETHODIMP InitNew();
- STDMETHODIMP Load(IPropertyBag* pPropBag, IErrorLog* pErrorLog);
- STDMETHODIMP Save(IPropertyBag* pPropBag, BOOL fClearDirty,
- BOOL fSaveAllProperties);
- };
- template <class T>
- STDMETHODIMP TCPersistPropertyBagImpl<T>::GetClassID(CLSID *pClassID)
- {
- _TRACE0("IPersistPropertyBagImpl::GetClassID\n");
- *pClassID = T::GetObjectCLSID();
- return S_OK;
- }
- template <class T>
- STDMETHODIMP TCPersistPropertyBagImpl<T>::InitNew()
- {
- _TRACE0("IPersistPropertyBagImpl::InitNew\n");
- T* pT = static_cast<T*>(this);
- pT->SetDirty(false);
- return S_OK;
- }
- template <class T>
- STDMETHODIMP TCPersistPropertyBagImpl<T>::Load(IPropertyBag* pPropBag,
- IErrorLog* pErrorLog)
- {
- _TRACE0("IPersistPropertyBagImpl::Load\n");
- T* pT = static_cast<T*>(this);
- ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
- ATLASSERT(pMap != NULL);
- return pT->TCPersistPropertyBag_Load(pPropBag, pErrorLog, pMap, pT,
- pT->GetUnknown());
- }
- template <class T>
- STDMETHODIMP TCPersistPropertyBagImpl<T>::Save(IPropertyBag* pPropBag,
- BOOL fClearDirty, BOOL fSaveAllProperties)
- {
- _TRACE0("IPersistPropertyBagImpl::Save\n");
- T* pT = static_cast<T*>(this);
- ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
- ATLASSERT(pMap != NULL);
- return pT->TCPersistPropertyBag_Save(pPropBag, fClearDirty,
- fSaveAllProperties, pMap, pT, pT->GetUnknown());
- }
- template <class Dest, class Src>
- inline bool TCComPropertyCompare(Dest& dest, Src& src)
- {
- return !!(dest == src);
- }
- template <class Dest>
- inline void TCComPropertyInit(Dest& dest)
- {
- dest = (Dest)0;
- }
- template <class Dest, class Src>
- inline HRESULT TCComPropertyAssign(Dest& dest, Src& src)
- {
- dest = src;
- return S_OK;
- }
- template <class T, class Dest, class Src>
- HRESULT TCComPropertyPut(T* pThis, Dest& dest, Src& src,
- bool* pbChanged = NULL)
- {
- assert(NULL != pThis);
- bool bLocked = false;
- HRESULT hr = S_OK;
- __try
- {
-
- if (NULL != pbChanged)
- *pbChanged = false;
-
- pThis->Lock();
- bLocked = true;
-
- if (!TCComPropertyCompare(dest, src))
- {
-
- hr = TCComPropertyAssign(dest, src);
- if (SUCCEEDED(hr))
- {
-
- pThis->SetDirty(TRUE);
-
- if (NULL != pbChanged)
- *pbChanged = true;
- }
- }
- }
- __except(1)
- {
- _TRACE0("TCComPropertyPut(): Caught an unknown exception ");
- _TRACE0("(probably an invalid pointer was specified)");
- hr = E_POINTER;
- }
-
- if (bLocked)
- pThis->Unlock();
-
- return hr;
- }
- template <class T, class Dest, class Src>
- HRESULT TCComPropertyPut(T* pThis, Dest& dest, Src& src, DISPID dispid,
- bool* pbChanged = NULL)
- {
- __try
- {
- bool bChanged;
- HRESULT hr = TCComPropertyPut(pThis, dest, src, &bChanged);
- if (bChanged)
- pThis->FireOnChanged(dispid);
- if (pbChanged)
- *pbChanged = bChanged;
- return hr;
- }
- __except(1)
- {
- _TRACE0("TCComPropertyPut(): Caught an unknown exception\n");
- return E_UNEXPECTED;
- }
- }
- template <class T, class Dest, class Src>
- HRESULT TCComPropertyGet(T* pThis, Dest* pDest, Src& src, bool bLock = true)
- {
- assert(NULL != pThis);
- bool bLocked = false;
- HRESULT hr = S_OK;
- __try
- {
-
- if (bLock)
- {
- pThis->Lock();
- bLocked = true;
- }
-
- TCComPropertyInit(*pDest);
-
- hr = TCComPropertyAssign(*pDest, src);
- }
- __except(1)
- {
- _TRACE_BEGIN
- _TRACE_PART0("TCComPropertyGet(): Caught an unknown exception ");
- _TRACE_PART0("(probably an invalid pointer was specified)");
- _TRACE_END
- hr = E_POINTER;
- }
-
- if (bLocked)
- pThis->Unlock();
-
- return hr;
- }
- template <> inline
- bool TCComPropertyCompare<bool, VARIANT_BOOL>(bool& dest, VARIANT_BOOL& src)
- {
- return dest == !!src;
- }
- template <> inline
- HRESULT TCComPropertyAssign<bool, VARIANT_BOOL>(bool& dest, VARIANT_BOOL& src)
- {
- dest = !!src;
- return S_OK;
- }
- template <> inline
- HRESULT TCComPropertyAssign<VARIANT_BOOL, bool>(VARIANT_BOOL& dest, bool& src)
- {
- dest = (src ? VARIANT_TRUE : VARIANT_FALSE);
- return S_OK;
- }
- #ifdef _AFX
- template <> inline
- bool TCComPropertyCompare<DATE, COleDateTime>(DATE& dest, COleDateTime& src)
- {
- COleDateTime destDate(dest);
- return (destDate == src)?true:false;
- }
- #endif
- template <>
- inline void TCComPropertyInit<VARIANT>(VARIANT& dest)
- {
- VariantInit(&dest);
- }
- template <> inline
- HRESULT TCComPropertyAssign<VARIANT, VARIANT>(VARIANT& dest, VARIANT& src)
- {
- RETURN_FAILED(VariantCopy(&dest, const_cast<VARIANT*>(&src)));
- if (NULL == V_ARRAY(&dest) && (VT_ARRAY & V_VT(&dest)))
- VariantClear(&dest);
- return S_OK;
- }
- #ifdef _ATL
- bool TCComVariantCompare(CComVariant& dest, VARIANT& src);
- template <>
- inline bool TCComPropertyCompare<CComVariant, VARIANT>(CComVariant& dest,
- VARIANT& src)
- {
- return TCComVariantCompare(dest, src);
- }
- #endif
- template <>
- inline HRESULT TCComPropertyAssign<SAFEARRAY*, SAFEARRAY*>(SAFEARRAY*& dest,
- SAFEARRAY*& src)
- {
- return SafeArrayCopy(const_cast<SAFEARRAY*>(src), &dest);
- }
- template <>
- inline bool TCComPropertyCompare<CComBSTR, BSTR>(CComBSTR& dest, BSTR& src)
- {
- if (NULL == BSTR(dest))
- return NULL == src;
- else
- return (NULL == src) ? false : !wcscmp(dest, src);
- }
- template <>
- inline HRESULT TCComPropertyAssign<BSTR, BSTR>(BSTR& dest, BSTR& src)
- {
- return SysReAllocString(&dest, src);
- }
- template <>
- inline HRESULT TCComPropertyAssign<BSTR, CComBSTR>(BSTR& dest, CComBSTR& src)
- {
- dest = src.Copy();
- return S_OK;
- }
- #ifdef _AFX
- template <>
- inline HRESULT TCComPropertyAssign<VARIANT, COleVariant>(VARIANT& dest,
- COleVariant& src)
- {
- return TCComPropertyAssign(dest, VARIANT(src));
- }
- template <>
- inline HRESULT TCComPropertyAssign<VARIANT, COleSafeArray>(VARIANT& dest,
- COleSafeArray& src)
- {
- return TCComPropertyAssign(dest, VARIANT(src));
- }
- #endif
- #ifdef _ATL
- template <>
- inline HRESULT TCComPropertyAssign<VARIANT, CComVariant>(VARIANT& dest,
- CComVariant& src)
- {
- return TCComPropertyAssign(dest, VARIANT(src));
- }
- #endif
- #endif
|