summaryrefslogtreecommitdiff
path: root/TAO/tao/compat/objbase.h
blob: 95166f92fc0ce18b69d5ea1bf19c94aa668697a9 (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
176
177
178
179
180
181
182
183
184
/* 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 TAO_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 TAO_IID [16];          // XXX actually a struct
typedef const TAO_IID &REFIID;
#if !defined(INITGUID)
#  define DEFINE_GUID(name,b,c,d,e,f,g,h,i,j,k,l) \
                      extern "C" const TAO_IID name
#else
#  define DEFINE_GUID(name,b,c,d,e,f,g,h,i,j,k,l) \
                      extern "C" const TAO_IID name = { 0 }
#endif


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

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

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

typedef u_long TAO_SCODE;

inline TAO_HRESULT
ResultFromScode(TAO_SCODE scode)
{
  return scode;
}

#define TAO_NOERROR         ((TAO_SCODE) 0)
#if !defined(NOERROR)
#  define NOERROR TAO_NOERROR
#endif /* ! NOERROR */
#define TAO_E_NOINTERFACE   ((TAO_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         TAO_VARTYPE;
enum TAO_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 TAO_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 TAO_DATE;

struct TAO_VARIANT
{
  TAO_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
    TAO_SCODE           scode;                  // VT_ERROR
    TAO_CY              cyVal;                  // VT_CY
    TAO_DATE            date;                   // VT_DATE
    // BSTR             bstrVal;                // VT_BSTR
    TAO_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
    TAO_SCODE           *pscode;                // VT_BYREF|VT_ERROR
    TAO_CY              *pcyVal;                // VT_BYREF|VT_CY
    TAO_DATE            *pdate;                 // VT_BYREF|VT_DATE
    // BSTR             *pbstrVal;              // VT_BYREF|VT_BSTR
    TAO_IUnknown            **ppunkVal;             // VT_BYREF|VT_UNKNOWN
    // IDispatch        **ppdisVal;             // VT_BYREF|VT_DISPATCH
    // SAFEARRAY        *pparray;               // VT_BYREF|VT_ARRAY

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

#endif  // _compobj_h