1/**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the mingw-w64 runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5 */
6#ifndef _INC_COMDEF
7#define _INC_COMDEF
8
9#include <_mingw.h>
10
11#ifndef RC_INVOKED
12
13#ifndef __cplusplus
14#error Native Compiler support only available in C++ compiler
15#endif
16
17#include <ole2.h>
18#include <olectl.h>
19#include <comutil.h>
20
21#ifndef WINAPI
22#define WINAPI __stdcall
23#endif
24
25#ifdef __cplusplus
26
27class _com_error;
28void WINAPI _com_raise_error(HRESULT hr,IErrorInfo *perrinfo = 0);
29void WINAPI _set_com_error_handler(void (WINAPI *pHandler)(HRESULT hr,IErrorInfo *perrinfo));
30void WINAPI _com_issue_error(HRESULT);
31void WINAPI _com_issue_errorex(HRESULT,IUnknown*,REFIID);
32HRESULT WINAPI _com_dispatch_propget(IDispatch*,DISPID,VARTYPE,void*);
33HRESULT __cdecl _com_dispatch_propput(IDispatch*,DISPID,VARTYPE,...);
34HRESULT __cdecl _com_dispatch_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...);
35HRESULT WINAPI _com_dispatch_raw_propget(IDispatch*,DISPID,VARTYPE,void*) throw();
36HRESULT __cdecl _com_dispatch_raw_propput(IDispatch*,DISPID,VARTYPE,...) throw();
37HRESULT __cdecl _com_dispatch_raw_method(IDispatch*,DISPID,WORD,VARTYPE,void*,const wchar_t*,...) throw();
38
39class _com_error {
40public:
41  _com_error(HRESULT hr,IErrorInfo *perrinfo = NULL,bool fAddRef = false) throw();
42  _com_error(const _com_error &that) throw();
43  virtual ~_com_error() throw();
44  _com_error &operator=(const _com_error &that) throw();
45  HRESULT Error() const throw();
46  WORD WCode() const throw();
47  IErrorInfo *ErrorInfo() const throw();
48  _bstr_t Description() const;
49  DWORD HelpContext() const throw();
50  _bstr_t HelpFile() const;
51  _bstr_t Source() const;
52  GUID GUID_() const throw();
53  const TCHAR *ErrorMessage() const throw();
54  static HRESULT WCodeToHRESULT(WORD wCode) throw();
55  static WORD HRESULTToWCode(HRESULT hr) throw();
56private:
57  void Dtor() throw();
58  void Ctor(const _com_error &that) throw();
59  enum {
60    WCODE_HRESULT_FIRST = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF,0x200),WCODE_HRESULT_LAST = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_ITF+1,0) - 1
61  };
62  HRESULT m_hresult;
63  IErrorInfo *m_perrinfo;
64  mutable TCHAR *m_pszMsg;
65};
66
67inline _com_error::_com_error(HRESULT hr,IErrorInfo *perrinfo,bool fAddRef) throw() : m_hresult(hr),m_perrinfo(perrinfo),m_pszMsg(NULL) {
68  if(m_perrinfo!=NULL && fAddRef) m_perrinfo->AddRef();
69}
70
71inline _com_error::_com_error(const _com_error &that) throw() {
72  Ctor(that);
73}
74
75inline _com_error::~_com_error() throw() {
76	Dtor();
77}
78
79inline _com_error &_com_error::operator=(const _com_error &that) throw() {
80  if(this!=&that) {
81    Dtor();
82    Ctor(that);
83  }
84  return *this;
85}
86
87inline HRESULT _com_error::Error() const throw() { return m_hresult; }
88inline WORD _com_error::WCode() const throw() { return HRESULTToWCode(m_hresult); }
89
90inline IErrorInfo *_com_error::ErrorInfo() const throw() {
91  if(m_perrinfo!=NULL) m_perrinfo->AddRef();
92  return m_perrinfo;
93}
94
95inline _bstr_t _com_error::Description() const {
96  BSTR bstr = NULL;
97  if(m_perrinfo!=NULL) m_perrinfo->GetDescription(&bstr);
98  return _bstr_t(bstr,false);
99}
100
101inline DWORD _com_error::HelpContext() const throw() {
102  DWORD dwHelpContext = 0;
103  if(m_perrinfo!=NULL) m_perrinfo->GetHelpContext(&dwHelpContext);
104  return dwHelpContext;
105}
106
107inline _bstr_t _com_error::HelpFile() const {
108  BSTR bstr = NULL;
109  if(m_perrinfo!=NULL)  m_perrinfo->GetHelpFile(&bstr);
110  return _bstr_t(bstr,false);
111}
112
113inline _bstr_t _com_error::Source() const {
114  BSTR bstr = NULL;
115  if(m_perrinfo!=NULL) m_perrinfo->GetSource(&bstr);
116  return _bstr_t(bstr,false);
117}
118
119inline _GUID _com_error::GUID_() const throw() {
120  _GUID guid;
121  memset (&guid, 0, sizeof (_GUID));
122  if(m_perrinfo!=NULL) m_perrinfo->GetGUID(&guid);
123  return guid;
124}
125
126inline const TCHAR *_com_error::ErrorMessage() const throw() {
127  if(!m_pszMsg) {
128    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,m_hresult,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&m_pszMsg,0,NULL);
129    if(m_pszMsg!=NULL) {
130      int nLen = lstrlen(m_pszMsg);
131      if(nLen > 1 && m_pszMsg[nLen - 1]=='\n') {
132	m_pszMsg[nLen-1] = 0;
133	if(m_pszMsg[nLen - 2]=='\r') m_pszMsg[nLen-2] = 0;
134      }
135    } else {
136      m_pszMsg = (LPTSTR)LocalAlloc(0,32 *sizeof(TCHAR));
137      if(m_pszMsg!=NULL) {
138	WORD wCode = WCode();
139	if(wCode!=0) {
140	  _COM_PRINTF_S_1(m_pszMsg,32,TEXT("IDispatch error #%d"),wCode);
141	} else {
142	  _COM_PRINTF_S_1(m_pszMsg,32,TEXT("Unknown error 0x%0lX"),m_hresult);
143	}
144      }
145    }
146  }
147  return m_pszMsg;
148}
149
150inline HRESULT _com_error::WCodeToHRESULT(WORD wCode) throw() { return wCode >= 0xFE00 ? WCODE_HRESULT_LAST : WCODE_HRESULT_FIRST + wCode; }
151inline WORD _com_error::HRESULTToWCode(HRESULT hr) throw() { return (hr >= WCODE_HRESULT_FIRST && hr <= WCODE_HRESULT_LAST) ? WORD(hr - WCODE_HRESULT_FIRST) : 0; }
152
153inline void _com_error::Dtor() throw() {
154  if(m_perrinfo!=NULL) m_perrinfo->Release();
155  if(m_pszMsg!=NULL) LocalFree((HLOCAL)m_pszMsg);
156}
157
158inline void _com_error::Ctor(const _com_error &that) throw() {
159  m_hresult = that.m_hresult;
160  m_perrinfo = that.m_perrinfo;
161  m_pszMsg = NULL;
162  if(m_perrinfo!=NULL) m_perrinfo->AddRef();
163}
164
165typedef int __missing_type__;
166
167#if !defined(_COM_SMARTPTR)
168#if !defined(_INC_COMIP)
169#include <comip.h>
170#endif
171#define _COM_SMARTPTR _com_ptr_t
172#define _COM_SMARTPTR_LEVEL2 _com_IIID
173#endif
174#if defined(_COM_SMARTPTR)
175#if !defined(_COM_SMARTPTR_TYPEDEF)
176#if defined(_COM_SMARTPTR_LEVEL2)
177#define _COM_SMARTPTR_TYPEDEF(Interface,IID) UUID IIDArgForTypedef ## Interface = IID; typedef _COM_SMARTPTR< _COM_SMARTPTR_LEVEL2<Interface, &IIDArgForTypedef ## Interface > > Interface ## Ptr
178#else
179#define _COM_SMARTPTR_TYPEDEF(Interface,IID) UUID IIDArgForTypedef ## Interface  = IID; typedef _COM_SMARTPTR<Interface,&IIDArgForTypedef ## Interface > Interface ## Ptr
180#endif
181#endif
182#endif
183
184#if !defined(_COM_NO_STANDARD_GUIDS_)
185#if defined(__IFontDisp_INTERFACE_DEFINED__)
186#if !defined(Font)
187  struct Font : IFontDisp {};
188#endif
189_COM_SMARTPTR_TYPEDEF(Font,__uuidof(IDispatch));
190
191#endif
192#if defined(__IFontEventsDisp_INTERFACE_DEFINED__)
193#if !defined(FontEvents)
194  struct FontEvents : IFontEventsDisp {};
195#endif
196_COM_SMARTPTR_TYPEDEF(FontEvents,__uuidof(IDispatch));
197#endif
198#if defined(__IPictureDisp_INTERFACE_DEFINED__)
199#if !defined(Picture)
200  struct Picture : IPictureDisp {};
201#endif
202_COM_SMARTPTR_TYPEDEF(Picture,__uuidof(IDispatch));
203#endif
204
205#include "comdefsp.h"
206#endif
207#endif
208
209#endif /* __cplusplus */
210
211#endif
212