summaryrefslogtreecommitdiff
path: root/TAO/tao/compat/objbase.h
blob: 1307b5aec244fc464c74ee60665325d2c2871e3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/* This may look like C, but it's really -*- C++ -*- */
// @(#)objbase.h        1.4 95/09/25
// Copyright 1995 by Sun Microsystems, Inc.
//
// COM          Basic Component Object Model definitions
//
// This has "enough COM" to compile (on UNIX) a recent version of the
// IIOP engine code, which more or less uses COM as a source standard.
//
// (It's unknown whether the C++ compilers on UNIX put vtables as the first
// member or not; that matters to folk writing "objects in C", relying on the
// COM ABI.  In any case, the API to a pure C++ programmer is the same.)
//
// Note that Microsoft changed the header file structure so that some
// development environments now prefer "objbase.h" not "compobj.h".
//

#ifndef _compobj_h
#define _compobj_h

#  if !defined(ACE_OS_H)
#    error You did not include "ace/OS.h" before objbase.h.  This will break on WIN32 platforms.
#  endif

//
// Random data types that come from Microsoft's APIs.
//
typedef u_long ULONG;
typedef u_long HRESULT;

//
// Details of the procedure calling convention matter.
//
#define __stdcall               // MS-Windows non-varargs call convention

#if defined(__cplusplus)
#  define EXTERN_C extern "C"
#else
#  define EXTERN_C extern
#endif

//
// IDs come built from UUIDs
//      IID -- interface ID
//      CLSID -- implementation ID
//
typedef char IID [16];          // XXX actually a struct
typedef const IID &REFIID;
#if !defined(INITGUID)
#  define DEFINE_GUID(name,b,c,d,e,f,g,h,i,j,k,l) extern "C" const IID name
#else
#  define DEFINE_GUID(name,b,c,d,e,f,g,h,i,j,k,l) extern "C" const IID name = { 0 }
#endif


//
// All objects in the "Component Object Model" (COM) inherit from
// this pure virtual base class.
//
DEFINE_GUID (IID_IUnknown, b,c,d,e,f,g,h,i,j,k,l);

class IUnknown 
{
public:
  virtual HRESULT __stdcall QueryInterface (REFIID riid,
                                            void **ppv) = 0;
  virtual ULONG __stdcall AddRef (void) = 0;
  virtual ULONG __stdcall Release (void) = 0;
};

// XXX haven't looked closely at COM's fault reporting yet ...

typedef u_long SCODE;

inline HRESULT ResultFromScode(SCODE scode) { return scode; }

#define NOERROR         ((SCODE) 0)
#define E_NOINTERFACE   ((SCODE) 17)


// VARIANT is OLE's extremely limited version of "Any".  There are
// numerous definitions of this type in different MS environments;
// this one's the Win32 version.  We need it here because part of the
// CORBA-COM mapping is conversions between Any and VARIANT.
//
// XXX not all of these types are worth trying to support portably,
// and even those that are worth supporting portably aren't fully
// supported at this writing.

typedef u_short         VARTYPE;
enum VARENUM 
{                  // only types suitable for VARIANTs
  VT_EMPTY    = 0,            // nothing
  VT_NULL     = 1,            // SQL style ull (XXX)
  VT_I2       = 2,            // signed 2 byte integer
  VT_I4       = 3,            // signed 4 byte integer
  VT_R4       = 4,            // IEEE "single" floating point
  VT_R8       = 5,            // IEEE "double" floating point
  VT_CY       = 6,            // currency
  VT_DATE     = 7,            // date
  VT_BSTR     = 8,            // counted string
  VT_DISPATCH = 9,            // IDispatch COM object
  VT_ERROR    = 10,           // SCODE
  VT_BOOL     = 11,           // true=1, false=0
  VT_VARIANT  = 12,           // variant pointer
  VT_UNKNOWN  = 13,           // IUnknown COM object
  VT_UI1      = 17,           // octet
  VT_ARRAY    = 0x2000,       // SAFEARRAY * of more primitive type
  VT_BYREF    = 0x4000        // pointer to more primitive type
};

struct CY 
  // = TITLE
  //   Currency is an eight byte fixed point number (could be "long long").  
{
#if defined (WORDS_BIGENDIAN)
    long Hi;
    u_long Lo;
#else
    u_long Lo;
    long Hi;
#endif /* WORDS_BIGENDIAN */
};

// DATE format is days since 30-Dec-1889 ... days in the "whole"
// part, time in the fractional part (part of a day).

typedef double DATE;

struct VARIANT 
{
  VARTYPE               vt;             // type ID
  u_short       wReserved1, wReserved2, wReserved3;
  union 
  {
    //
    // By-Value fields
    //
    long                lVal;                   // VT_I4
    u_char      bVal;                   // VT_UI1
    short               iVal;                   // VT_I2
    float               fltVal;                 // VT_R4
    double              dblVal;                 // VT_R8
    // VARIANT_BOOL     bool;                   // VT_BOOL
    SCODE               scode;                  // VT_ERROR
    CY          cyVal;                  // VT_CY
    DATE                date;                   // VT_DATE
    // BSTR             bstrVal;                // VT_BSTR
    IUnknown    *punkVal;               // VT_UNKNOWN
    // IDispatch        *pdispVal;              // VT_DISPATCH
    // SAFEARRAY        *parray;                // VT_ARRAY

    //
    // By-Reference fields (for VARIANTARG)
    //
    u_char      *pbVal;                 // VT_BYREF|VT_UI1
    short               *piVal;                 // VT_BYREF|VT_I2
    long                *plVal;                 // VT_BYREF|VT_I4
    float               *pfltVal;               // VT_BYREF|VT_R4
    double              *pdblVal;               // VT_BYREF|VT_R8
    // VARIANT_BOOL     *pbool;                 // VT_BYREF|VT_BOOL
    SCODE               *pscode;                // VT_BYREF|VT_ERROR
    CY          *pcyVal;                // VT_BYREF|VT_CY
    DATE                *pdate;                 // VT_BYREF|VT_DATE
    // BSTR             *pbstrVal;              // VT_BYREF|VT_BSTR
    IUnknown    **ppunkVal;             // VT_BYREF|VT_UNKNOWN
    // IDispatch        **ppdisVal;             // VT_BYREF|VT_DISPATCH
    // SAFEARRAY        *pparray;               // VT_BYREF|VT_ARRAY

    VARIANT             *pvarVal;               // VT_BYREF|VT_VARIANT
    void                *byref;                 // generic VT_BYREF
  };
};

#endif  // _compobj_h