Annotation of elwix/tools/oldlzma/SRC/Common/MyCom.h, revision 1.1

1.1     ! misho       1: // MyCom.h
        !             2: 
        !             3: #ifndef __MYCOM_H
        !             4: #define __MYCOM_H
        !             5: 
        !             6: #include "MyWindows.h"
        !             7: 
        !             8: #define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }
        !             9: 
        !            10: template <class T>
        !            11: class CMyComPtr
        !            12: {
        !            13:   T* _p;
        !            14: public:
        !            15:   // typedef T _PtrClass;
        !            16:   CMyComPtr() { _p = NULL;}
        !            17:   CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }
        !            18:   CMyComPtr(const CMyComPtr<T>& lp)
        !            19:   {
        !            20:     if ((_p = lp._p) != NULL)
        !            21:       _p->AddRef();
        !            22:   }
        !            23:   ~CMyComPtr() { if (_p) _p->Release(); }
        !            24:   void Release() { if (_p) { _p->Release(); _p = NULL; } }
        !            25:   operator T*() const {  return (T*)_p;  }
        !            26:   // T& operator*() const {  return *_p; }
        !            27:   T** operator&() { return &_p; }
        !            28:   T* operator->() const { return _p; }
        !            29:   T* operator=(T* p) 
        !            30:   { 
        !            31:     if (p != 0)
        !            32:       p->AddRef();
        !            33:     if (_p) 
        !            34:       _p->Release();
        !            35:     _p = p;
        !            36:     return p;
        !            37:   }
        !            38:   T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
        !            39:   bool operator!() const { return (_p == NULL); }
        !            40:   // bool operator==(T* pT) const {  return _p == pT; }
        !            41:   // Compare two objects for equivalence
        !            42:   void Attach(T* p2)
        !            43:   {
        !            44:     Release();
        !            45:     _p = p2;
        !            46:   }
        !            47:   T* Detach()
        !            48:   {
        !            49:     T* pt = _p;
        !            50:     _p = NULL;
        !            51:     return pt;
        !            52:   }
        !            53:   #ifdef _WIN32
        !            54:   HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
        !            55:   {
        !            56:     return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
        !            57:   }
        !            58:   #endif
        !            59:   /*
        !            60:   HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
        !            61:   {
        !            62:     CLSID clsid;
        !            63:     HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
        !            64:     ATLASSERT(_p == NULL);
        !            65:     if (SUCCEEDED(hr))
        !            66:       hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
        !            67:     return hr;
        !            68:   }
        !            69:   */
        !            70:   template <class Q>
        !            71:   HRESULT QueryInterface(REFGUID iid, Q** pp) const
        !            72:   {
        !            73:     return _p->QueryInterface(iid, (void**)pp);
        !            74:   }
        !            75: };
        !            76: 
        !            77: //////////////////////////////////////////////////////////
        !            78: 
        !            79: class CMyComBSTR
        !            80: {
        !            81: public:
        !            82:   BSTR m_str;
        !            83:   CMyComBSTR() { m_str = NULL; }
        !            84:   CMyComBSTR(LPCOLESTR pSrc) {  m_str = ::SysAllocString(pSrc);  }
        !            85:   // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
        !            86:   // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize);  }
        !            87:   CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
        !            88:   /*
        !            89:   CMyComBSTR(REFGUID src)
        !            90:   {
        !            91:     LPOLESTR szGuid;
        !            92:     StringFromCLSID(src, &szGuid);
        !            93:     m_str = ::SysAllocString(szGuid);
        !            94:     CoTaskMemFree(szGuid);
        !            95:   }
        !            96:   */
        !            97:   ~CMyComBSTR() { ::SysFreeString(m_str); }
        !            98:   CMyComBSTR& operator=(const CMyComBSTR& src)
        !            99:   {
        !           100:     if (m_str != src.m_str)
        !           101:     {
        !           102:       if (m_str)
        !           103:         ::SysFreeString(m_str);
        !           104:       m_str = src.MyCopy();
        !           105:     }
        !           106:     return *this;
        !           107:   }
        !           108:   CMyComBSTR& operator=(LPCOLESTR pSrc)
        !           109:   {
        !           110:     ::SysFreeString(m_str);
        !           111:     m_str = ::SysAllocString(pSrc);
        !           112:     return *this;
        !           113:   }
        !           114:   unsigned int Length() const { return ::SysStringLen(m_str); }
        !           115:   operator BSTR() const { return m_str; }
        !           116:   BSTR* operator&() { return &m_str; }
        !           117:   BSTR MyCopy() const 
        !           118:   { 
        !           119:     int byteLen = ::SysStringByteLen(m_str);
        !           120:     BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
        !           121:     memmove(res, m_str, byteLen);
        !           122:     return res;
        !           123:   }
        !           124:   void Attach(BSTR src) {  m_str = src; }
        !           125:   BSTR Detach()
        !           126:   {
        !           127:     BSTR s = m_str;
        !           128:     m_str = NULL;
        !           129:     return s;
        !           130:   }
        !           131:   void Empty()
        !           132:   {
        !           133:     ::SysFreeString(m_str);
        !           134:     m_str = NULL;
        !           135:   }
        !           136:   bool operator!() const {  return (m_str == NULL); }
        !           137: };
        !           138: 
        !           139: 
        !           140: //////////////////////////////////////////////////////////
        !           141: 
        !           142: class CMyUnknownImp
        !           143: {
        !           144: public:
        !           145:   ULONG __m_RefCount;
        !           146:   CMyUnknownImp(): __m_RefCount(0) {}
        !           147: };
        !           148: 
        !           149: #define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
        !           150:     (REFGUID iid, void **outObject) { 
        !           151: 
        !           152: #define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \
        !           153:     { *outObject = (void *)(i *)this; AddRef(); return S_OK; }
        !           154: 
        !           155: #define MY_QUERYINTERFACE_END return E_NOINTERFACE; }
        !           156: 
        !           157: #define MY_ADDREF_RELEASE \
        !           158: STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \
        !           159: STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0)  \
        !           160:   return __m_RefCount; delete this; return 0; }
        !           161: 
        !           162: #define MY_UNKNOWN_IMP_SPEC(i) \
        !           163:   MY_QUERYINTERFACE_BEGIN \
        !           164:   i \
        !           165:   MY_QUERYINTERFACE_END \
        !           166:   MY_ADDREF_RELEASE
        !           167: 
        !           168: 
        !           169: #define MY_UNKNOWN_IMP MY_UNKNOWN_IMP_SPEC(;)
        !           170: 
        !           171: #define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
        !           172:   MY_QUERYINTERFACE_ENTRY(i) \
        !           173:   )
        !           174: 
        !           175: #define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
        !           176:   MY_QUERYINTERFACE_ENTRY(i1) \
        !           177:   MY_QUERYINTERFACE_ENTRY(i2) \
        !           178:   )
        !           179: 
        !           180: #define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
        !           181:   MY_QUERYINTERFACE_ENTRY(i1) \
        !           182:   MY_QUERYINTERFACE_ENTRY(i2) \
        !           183:   MY_QUERYINTERFACE_ENTRY(i3) \
        !           184:   )
        !           185: 
        !           186: #define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
        !           187:   MY_QUERYINTERFACE_ENTRY(i1) \
        !           188:   MY_QUERYINTERFACE_ENTRY(i2) \
        !           189:   MY_QUERYINTERFACE_ENTRY(i3) \
        !           190:   MY_QUERYINTERFACE_ENTRY(i4) \
        !           191:   )
        !           192: 
        !           193: #define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \
        !           194:   MY_QUERYINTERFACE_ENTRY(i1) \
        !           195:   MY_QUERYINTERFACE_ENTRY(i2) \
        !           196:   MY_QUERYINTERFACE_ENTRY(i3) \
        !           197:   MY_QUERYINTERFACE_ENTRY(i4) \
        !           198:   MY_QUERYINTERFACE_ENTRY(i5) \
        !           199:   )
        !           200: 
        !           201: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>