Run dos2unix on bayou and remove white space at the end of lines.
[coreboot.git] / payloads / bayou / util / pbuilder / lzma / C / Common / MyCom.h
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 STDMETHOD(QueryInterface)(REFGUID, void **) { \
170   MY_QUERYINTERFACE_END \
171   MY_ADDREF_RELEASE
172
173 #define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
174   MY_QUERYINTERFACE_ENTRY(i) \
175   )
176
177 #define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
178   MY_QUERYINTERFACE_ENTRY(i1) \
179   MY_QUERYINTERFACE_ENTRY(i2) \
180   )
181
182 #define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
183   MY_QUERYINTERFACE_ENTRY(i1) \
184   MY_QUERYINTERFACE_ENTRY(i2) \
185   MY_QUERYINTERFACE_ENTRY(i3) \
186   )
187
188 #define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
189   MY_QUERYINTERFACE_ENTRY(i1) \
190   MY_QUERYINTERFACE_ENTRY(i2) \
191   MY_QUERYINTERFACE_ENTRY(i3) \
192   MY_QUERYINTERFACE_ENTRY(i4) \
193   )
194
195 #define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \
196   MY_QUERYINTERFACE_ENTRY(i1) \
197   MY_QUERYINTERFACE_ENTRY(i2) \
198   MY_QUERYINTERFACE_ENTRY(i3) \
199   MY_QUERYINTERFACE_ENTRY(i4) \
200   MY_QUERYINTERFACE_ENTRY(i5) \
201   )
202
203 #endif