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