Source: classlib/include/variant.h


Annotated List
Files
Globals
Hierarchy
Index
/***************************************************************************
                          variant.h - tipo universale
                             -------------------
    begin                : Sat Sep 28 2002
    copyright            : (C) 2002 by Nicola De Nisco
    email                : nicola@winada.it
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef __VARIANT_H
#define __VARIANT_H

#ifdef __cplusplus
  extern "C" {
#endif


struct tagBSTR {
	long length;
	char data[1];
};

typedef tagBSTR* BSTR;

char* BstrToString(BSTR bstr);
BSTR StringToBstr(const char* s);
BSTR Bstrdup(BSTR bstr);
int readBstr(int handle, BSTR* ptBstr);
int writeBstr(int handle, BSTR str);
int recvBstr(int handle, BSTR* ptBstr, int flags);
int sendBstr(int handle, BSTR str, int flags);


typedef double DATE;

typedef struct tagCY {
	unsigned long Lo;
	long      Hi;
} CY;

typedef LONG SCODE;

typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)0xffff)
#define VARIANT_FALSE ((VARIANT_BOOL)0)

enum VARENUM
    {	VT_EMPTY	= 0,
	VT_NULL	= 1,
	VT_I2	= 2,
	VT_I4	= 3,
	VT_R4	= 4,
	VT_R8	= 5,
	VT_CY	= 6,
	VT_DATE	= 7,
	VT_BSTR	= 8,
	VT_DISPATCH	= 9,
	VT_ERROR	= 10,
	VT_BOOL	= 11,
	VT_VARIANT	= 12,
	VT_UNKNOWN	= 13,
	VT_I1	= 16,
	VT_UI1	= 17,
	VT_UI2	= 18,
	VT_UI4	= 19,
	VT_I8	= 20,
	VT_UI8	= 21,
	VT_INT	= 22,
	VT_UINT	= 23,
	VT_VOID	= 24,
	VT_HRESULT	= 25,
	VT_PTR	= 26,
	VT_SAFEARRAY	= 27,
	VT_CARRAY	= 28,
	VT_USERDEFINED	= 29,
	VT_LPSTR	= 30,
	VT_LPWSTR	= 31,
	VT_FILETIME	= 64,
	VT_BLOB	= 65,
	VT_STREAM	= 66,
	VT_STORAGE	= 67,
	VT_STREAMED_OBJECT	= 68,
	VT_STORED_OBJECT	= 69,
	VT_BLOB_OBJECT	= 70,
	VT_CF	= 71,
	VT_CLSID	= 72
    };

const USHORT VT_BYREF = 0x4000;

typedef unsigned short VARTYPE;
typedef struct tagVARIANT VARIANT;

typedef void* IUnknown;
typedef void* IDispatch;
typedef void* SAFEARRAY;

struct tagVARIANT
{
    VARTYPE vt;
    WORD wReserved1;
    WORD wReserved2;
    WORD wReserved3;
    union
    {
      long          lVal;           /* VT_I4                */
      unsigned char bVal;           /* VT_UI1               */
      short         iVal;           /* VT_I2                */
      float         fltVal;         /* VT_R4                */
      double        dblVal;         /* VT_R8                */
      VARIANT_BOOL  vbool;          /* 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|*           */
      unsigned 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     **ppdispVal;    /* VT_BYREF|VT_DISPATCH */
      SAFEARRAY     **pparray;      /* VT_BYREF|VT_ARRAY|*  */
      VARIANT       *pvarVal;       /* VT_BYREF|VT_VARIANT  */
      void     * byref;             /* Generic ByRef        */
    } u;
};

typedef struct tagVARIANT *LPVARIANT;
typedef struct tagVARIANT VARIANTARG;
typedef struct tagVARIANT *LPVARIANTARG;


/*---------------------------------------------------------------------*/
/*                           VARIANT API                               */
/*---------------------------------------------------------------------*/

void VariantInit(VARIANT* pvarg);

int VariantClear(VARIANT* pvarg);

int VariantCopy(
    VARIANT* pvargDest,
    VARIANT* pvargSrc);

int VariantChangeType(
    VARIANT* pvargDest,
    VARIANT* pvarSrc,
    unsigned short wFlags,
    VARTYPE vt);

int readVariant(int handle, VARIANT* valore);
int writeVariant(int handle, VARIANT* valore);
int recvVariant(int handle, VARIANT* valore, int flags);
int sendVariant(int handle, VARIANT* valore, int flags);

#define VARIANT_NOVALUEPROP 1

void Int16ToVariant( short valore, VARIANT* dest );
void Int32ToVariant( int valore, VARIANT* dest );
void FloatToVariant( float valore, VARIANT* dest );
void DoubleToVariant( double valore, VARIANT* dest );
void StringToVariant( const char* valore, VARIANT* dest );
void DateToVariant( DATE valore, VARIANT* dest );
void BOOLToVariant( BOOL valore, VARIANT* dest );
short VariantToInt16( VARIANT* valore );
long  VariantToInt32( VARIANT* valore );
float VariantToFloat( VARIANT* valore );
double VariantToDouble( VARIANT* valore );
char*  VariantToString( VARIANT* valore );
DATE  VariantToDate( VARIANT* valore );
BOOL  VariantToBOOL( VARIANT* valore );
void SafeStringToVariant( const char* valore, VARIANT* dest, int maxlen );

	
#define V_UNION(X, Y) ((X)->u.Y)


/* Variant access macros */
#define V_VT(X)          ((X)->vt)
#define V_ISBYREF(X)     (V_VT(X)&VT_BYREF)
#define V_ISARRAY(X)     (V_VT(X)&VT_ARRAY)
#define V_ISVECTOR(X)    (V_VT(X)&VT_VECTOR)

#define V_NONE(X)        V_I2(X)

#define V_UI1(X)         V_UNION(X, bVal)
#define V_UI1REF(X)      V_UNION(X, pbVal)

#define V_I2(X)          V_UNION(X, iVal)
#define V_I2REF(X)       V_UNION(X, piVal)

#define V_I4(X)          V_UNION(X, lVal)
#define V_I4REF(X)       V_UNION(X, plVal)

#define V_I8(X)          V_UNION(X, hVal)
#define V_I8REF(X)       V_UNION(X, phVal)

#define V_R4(X)          V_UNION(X, fltVal)
#define V_R4REF(X)       V_UNION(X, pfltVal)

#define V_R8(X)          V_UNION(X, dblVal)
#define V_R8REF(X)       V_UNION(X, pdblVal)

#define V_CY(X)          V_UNION(X, cyVal)
#define V_CYREF(X)       V_UNION(X, pcyVal)

#define V_DATE(X)        V_UNION(X, date)
#define V_DATEREF(X)     V_UNION(X, pdate)

#define V_BSTR(X)        V_UNION(X, bstrVal)
#define V_BSTRREF(X)     V_UNION(X, pbstrVal)

#define V_DISPATCH(X)    V_UNION(X, pdispVal)
#define V_DISPATCHREF(X) V_UNION(X, ppdispVal)

#define V_ERROR(X)       V_UNION(X, scode)
#define V_ERRORREF(X)    V_UNION(X, pscode)

#define V_BOOL(X)        V_UNION(X, vbool)
#define V_BOOLREF(X)     V_UNION(X, pbool)

#define V_UNKNOWN(X)     V_UNION(X, punkVal)
#define V_UNKNOWNREF(X)  V_UNION(X, ppunkVal)


#define V_VARIANTREF(X)  V_UNION(X, pvarVal)

#define V_LPSTR(X)        V_UNION(X, pszVal)
#define V_LPSTRREF(X)     V_UNION(X, ppszVal)

#define V_LPWSTR(X)        V_UNION(X, pwszVal)
#define V_LPWSTRREF(X)     V_UNION(X, ppwszVal)

#define V_FILETIME(X)        V_UNION(X, filetime)
#define V_FILETIMEREF(X)        V_UNION(X, pfiletime)

#define V_BLOB(X)        V_UNION(X, blob)

#define V_UUID(X)        V_UNION(X, puuid)
#define V_CLSID(X)       V_UNION(X, puuid)

#define V_ARRAY(X)       V_UNION(X, parray)
#define V_ARRAYREF(X)    V_UNION(X, pparray)

#define V_BYREF(X)       V_UNION(X, byref)


#ifdef __cplusplus
  }
#endif

#ifdef __cplusplus
// solo per C++ -----------------------------
#include 
class Socket;

int send(Socket& sock, VARIANT& valore, int flags = MSG_NOSIGNAL);
int recv(Socket& sock, VARIANT& valore, int flags = MSG_NOSIGNAL | MSG_WAITALL);
int send(Socket& sock, BSTR stringa, int flags = MSG_NOSIGNAL);
int recv(Socket& sock, BSTR& valore, int flags = MSG_NOSIGNAL | MSG_WAITALL);
#endif

#endif // __VARIANT_H

Generated by: nicola on gulliver.wadahome.it on Sun May 25 13:54:34 2003, using kdoc 2.0a53.