1/*
2 * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#ifndef AWT_OLE_H
27#define AWT_OLE_H
28
29#include "awt.h"
30#include <ole2.h>
31#include <comdef.h>
32#include <comutil.h>
33
34#ifdef _DEBUG
35    #define _SUN_DEBUG
36#endif
37
38
39#ifndef SUN_DBG_NS
40  #ifdef _LIB
41    #define SUN_DBG_NS SUN_dbg_lib
42  #else
43    #define SUN_DBG_NS SUN_dbg_glb
44  #endif //_LIB
45#endif //SUN_DBG_NS
46
47
48#ifndef  TRACE_SUFFIX
49  #define TRACE_SUFFIX
50#endif
51
52namespace SUN_DBG_NS{
53  LPCTSTR CreateTimeStamp(LPTSTR lpBuffer, size_t iBufferSize);
54  inline void snTraceEmp(LPCTSTR, ...) { }
55  void snvTrace(LPCTSTR lpszFormat, va_list argList);
56  void snTrace(LPCTSTR lpszFormat, ... );
57}//SUN_DBG_NS namespace end
58
59#define STRACE1       SUN_DBG_NS::snTrace
60#ifdef _SUN_DEBUG
61  #define STRACE      SUN_DBG_NS::snTrace
62#else
63  #define STRACE      SUN_DBG_NS::snTraceEmp
64#endif
65#define STRACE0       SUN_DBG_NS::snTraceEmp
66
67struct CLogEntryPoint1 {
68    LPCTSTR m_lpTitle;
69    CLogEntryPoint1(LPCTSTR lpTitle):m_lpTitle(lpTitle) { STRACE(_T("{%s"), m_lpTitle); }
70    ~CLogEntryPoint1(){ STRACE(_T("}%s"), m_lpTitle); }
71};
72struct CLogEntryPoint0 {
73    LPCTSTR m_lpTitle;
74    CLogEntryPoint0(LPCTSTR lpTitle):m_lpTitle(lpTitle) { STRACE0(_T("{%s"), m_lpTitle); }
75    ~CLogEntryPoint0(){ STRACE0(_T("}%s"), m_lpTitle); }
76};
77
78#define SEP1(msg)    CLogEntryPoint1 _ep1_(msg);
79#define SEP0(msg)    CLogEntryPoint0 _ep0_(msg);
80#ifdef  _SUN_DEBUG
81  #define SEP(msg)   CLogEntryPoint1 _ep1_(msg);
82#else
83  #define SEP(msg)   CLogEntryPoint0 _ep0_(msg);
84#endif
85
86
87#define OLE_BAD_COOKIE ((DWORD)-1)
88
89#define OLE_TRACENOTIMPL(msg)\
90        STRACE(_T("Warning:%s"), msg);\
91        return E_NOTIMPL;
92
93#define OLE_TRACEOK(msg)\
94        STRACE0(_T("Info:%s"), msg);\
95        return S_OK;
96
97
98#define OLE_DECL\
99        HRESULT _hr_ = S_OK;
100
101#define OLE_NEXT_TRY\
102        try {
103
104#define OLE_TRY\
105        OLE_DECL\
106        try {
107
108#define OLE_HRT(fnc)\
109        _hr_ = fnc;\
110        if (FAILED(_hr_)) {\
111            STRACE1(_T("Error:%08x in ") _T(#fnc),  _hr_);\
112            _com_raise_error(_hr_);\
113        }
114
115#define OLE_WINERROR2HR(msg, erCode)\
116        _hr_ = erCode;\
117        STRACE1(_T("OSError:%d in ") msg,  _hr_);\
118        _hr_ = HRESULT_FROM_WIN32(_hr_);
119
120#define OLE_THROW_LASTERROR(msg)\
121        OLE_WINERROR2HR(msg, ::GetLastError())\
122        _com_raise_error(_hr_);
123
124#define OLE_CHECK_NOTNULL(x)\
125        if (!(x)) {\
126            STRACE1(_T("Null pointer:") _T(#x));\
127            _com_raise_error(_hr_ = E_POINTER);\
128        }
129
130#define OLE_CHECK_NOTNULLSP(x)\
131        if (!bool(x)) {\
132            STRACE1(_T("Null pointer:") _T(#x));\
133            _com_raise_error(_hr_ = E_POINTER);\
134        }
135
136#define OLE_HRW32(fnc)\
137        _hr_ = fnc;\
138        if (ERROR_SUCCESS != _hr_) {\
139            STRACE1(_T("OSError:%d in ") _T(#fnc),  _hr_);\
140            _com_raise_error(_hr_ = HRESULT_FROM_WIN32(_hr_));\
141        }
142
143#define OLE_HRW32_BOOL(fnc)\
144        if (!fnc) {\
145            OLE_THROW_LASTERROR(_T(#fnc))\
146        }
147
148#define OLE_CATCH\
149        } catch (_com_error &e) {\
150            _hr_ = e.Error();\
151            STRACE1(_T("COM Error:%08x %s"), _hr_, e.ErrorMessage());\
152        }
153
154#define OLE_CATCH_BAD_ALLOC\
155        } catch (_com_error &e) {\
156            _hr_ = e.Error();\
157            STRACE1(_T("COM Error:%08x %s"), _hr_, e.ErrorMessage());\
158        } catch (std::bad_alloc&) {\
159            _hr_ = E_OUTOFMEMORY;\
160            STRACE1(_T("Error: Out of Memory"));\
161        }
162
163#define OLE_CATCH_ALL\
164        } catch (_com_error &e) {\
165            _hr_ = e.Error();\
166            STRACE1(_T("COM Error:%08x %s"), _hr_, e.ErrorMessage());\
167        } catch(...) {\
168            _hr_ = E_FAIL;\
169            STRACE1(_T("Error: General Pritection Failor"));\
170        }
171
172#define OLE_RETURN_SUCCESS return SUCCEEDED(_hr_);
173#define OLE_RETURN_HR      return _hr_;
174#define OLE_HR             _hr_
175
176#define _B(x)    _bstr_t(x)
177#define _BT(x)    (LPCTSTR)_bstr_t(x)
178#define _V(x)    _variant_t(x)
179#define _VV(vrt) _variant_t(vrt, false)
180#define _VE      _variant_t()
181#define _VB(b)   _variant_t(bool(b))
182
183struct OLEHolder
184{
185    OLEHolder()
186    : m_hr(::OleInitialize(NULL))
187    {}
188
189    ~OLEHolder(){}
190    operator bool() const { return S_OK==SUCCEEDED(m_hr); }
191    HRESULT m_hr;
192};
193
194#endif//AWT_OLE_H
195