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 
  52 namespace 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 
  67 struct 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 };
  72 struct 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 
 183 struct 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