| OLD | NEW |
| 1 // Copyright 2007 Igor Tandetnik | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 | |
| 15 #ifndef PASSTHROUGHAPP_PROTOCOLCF_H | 1 #ifndef PASSTHROUGHAPP_PROTOCOLCF_H |
| 16 #define PASSTHROUGHAPP_PROTOCOLCF_H | 2 #define PASSTHROUGHAPP_PROTOCOLCF_H |
| 17 | 3 |
| 18 #if _MSC_VER > 1000 | 4 #if _MSC_VER > 1000 |
| 19 #pragma once | 5 #pragma once |
| 20 #endif // _MSC_VER > 1000 | 6 #endif // _MSC_VER > 1000 |
| 21 | 7 |
| 22 namespace PassthroughAPP | 8 namespace PassthroughAPP |
| 23 { | 9 { |
| 24 | 10 |
| 25 namespace Detail | 11 namespace Detail |
| 26 { | 12 { |
| 27 // A bit of template metaprogramming allows to avoid requiring | 13 // A bit of template metaprogramming allows to avoid requiring |
| 28 // the protocol class to either derive from CComCoClass or explicitly | 14 // the protocol class to either derive from CComCoClass or explicitly |
| 29 // specify DECLARE_*AGGREGATABLE macro. If the class does it, the declared | 15 // specify DECLARE_*AGGREGATABLE macro. If the class does it, the declared |
| 30 // behavior is used, otherwise the default behavior is as if | 16 // behavior is used, otherwise the default behavior is as if |
| 31 // DECLARE_AGGREGATABLE is specified | 17 // DECLARE_AGGREGATABLE is specified |
| 32 | 18 |
| 33 // If T has a typedef _CreatorClass, Derived would pick it from its base. | 19 // If T has a typedef _CreatorClass, Derived would pick it from its base. |
| 34 // If T does not define _CreatorClass, the definition is picked from the nex
t | 20 // If T does not define _CreatorClass, the definition is picked from the next |
| 35 // enclosing scope, which is ChooseCreatorClass::_CreatorClass, or Default | 21 // enclosing scope, which is ChooseCreatorClass::_CreatorClass, or Default |
| 36 template <typename T, typename Default> | 22 template <typename T, typename Default> |
| 37 struct ChooseCreatorClass | 23 struct ChooseCreatorClass |
| 38 { | 24 { |
| 39 typedef Default _CreatorClass; | 25 » typedef Default _CreatorClass; |
| 40 struct Derived : private T | 26 » struct Derived : private T |
| 41 { | 27 » { |
| 42 typedef _CreatorClass CreatorClass; | 28 » » typedef _CreatorClass CreatorClass; |
| 43 }; | 29 » }; |
| 44 typedef typename Derived::CreatorClass CreatorClass; | 30 » typedef typename Derived::CreatorClass CreatorClass; |
| 45 }; | 31 }; |
| 46 | 32 |
| 47 } // end namespace PassthroughAPP::Detail | 33 } // end namespace PassthroughAPP::Detail |
| 48 | 34 |
| 49 class ATL_NO_VTABLE CComClassFactoryProtocol : | 35 class ATL_NO_VTABLE CComClassFactoryProtocol : |
| 50 public CComClassFactory | 36 » public CComClassFactory |
| 51 { | 37 { |
| 52 typedef CComClassFactory BaseClass; | 38 » typedef CComClassFactory BaseClass; |
| 53 public: | 39 public: |
| 54 STDMETHODIMP CreateInstance(IUnknown* punkOuter, REFIID riid, | 40 » STDMETHODIMP CreateInstance(IUnknown* punkOuter, REFIID riid, |
| 55 void** ppvObj); | 41 » » void** ppvObj); |
| 56 | 42 |
| 57 HRESULT CreateInstanceTarget(IUnknown** ppTargetProtocol); | 43 » HRESULT CreateInstanceTarget(IUnknown** ppTargetProtocol); |
| 58 | 44 |
| 59 HRESULT GetTargetClassFactory(IClassFactory** ppCF); | 45 » HRESULT GetTargetClassFactory(IClassFactory** ppCF); |
| 60 HRESULT SetTargetClassFactory(IClassFactory* pCF); | 46 » HRESULT SetTargetClassFactory(IClassFactory* pCF); |
| 61 HRESULT SetTargetCLSID(REFCLSID clsid, DWORD clsContext = CLSCTX_ALL); | 47 » HRESULT SetTargetCLSID(REFCLSID clsid, DWORD clsContext = CLSCTX_ALL); |
| 62 | 48 |
| 63 void FinalRelease(); | 49 » void FinalRelease(); |
| 64 private: | 50 private: |
| 65 CComPtr<IClassFactory> m_spTargetCF; | 51 » CComPtr<IClassFactory> m_spTargetCF; |
| 66 }; | 52 }; |
| 67 | 53 |
| 68 template <class Factory, class Protocol, | 54 template <class Factory, class Protocol, |
| 69 class FactoryComObject = CComObjectNoLock<Factory> > | 55 » class FactoryComObject = CComObjectNoLock<Factory> > |
| 70 struct CMetaFactory | 56 struct CMetaFactory |
| 71 { | 57 { |
| 72 typedef | 58 » typedef |
| 73 CComCreator2<CComCreator<CComObject<Protocol> >, | 59 » » CComCreator2<CComCreator<CComObject<Protocol> >, |
| 74 CComCreator<CComAggObject<Protocol> > > | 60 » » » CComCreator<CComAggObject<Protocol> > > |
| 75 DefaultCreatorClass; | 61 » DefaultCreatorClass; |
| 76 | 62 |
| 77 typedef typename | 63 » typedef typename |
| 78 Detail::ChooseCreatorClass<Protocol, DefaultCreatorClass>::CreatorClass | 64 » » Detail::ChooseCreatorClass<Protocol, DefaultCreatorClass>::Creat
orClass |
| 79 CreatorClass; | 65 » » » CreatorClass; |
| 80 | 66 |
| 81 // returns a non-AddRef'ed pointer to FactoryComObject, already initialized | 67 » // returns a non-AddRef'ed pointer to FactoryComObject, already initiali
zed |
| 82 // with Protocol's creator function, via ppObj [out] parameter | 68 » // with Protocol's creator function, via ppObj [out] parameter |
| 83 static HRESULT CreateInstance(Factory** ppObj); | 69 » static HRESULT CreateInstance(Factory** ppObj); |
| 84 | 70 |
| 85 static HRESULT CreateInstance(IClassFactory* pTargetCF, | 71 » static HRESULT CreateInstance(IClassFactory* pTargetCF, |
| 86 IClassFactory** ppCF); | 72 » » IClassFactory** ppCF); |
| 87 static HRESULT CreateInstance(REFCLSID clsidTarget, IClassFactory** ppCF); | 73 » static HRESULT CreateInstance(REFCLSID clsidTarget, IClassFactory** ppCF
); |
| 88 }; | 74 }; |
| 89 | 75 |
| 90 } // end namespace PassthroughAPP | 76 } // end namespace PassthroughAPP |
| 91 | 77 |
| 92 #include "ProtocolCF.inl" | 78 #include "ProtocolCF.inl" |
| 93 | 79 |
| 94 #endif // PASSTHROUGHAPP_PROTOCOLCF_H | 80 #endif // PASSTHROUGHAPP_PROTOCOLCF_H |
| OLD | NEW |