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