/****************************************************************************
**
** Definition of the TQUcom interfaces
**
** Created : 990101
**
** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA.
**
** This file is part of the tools module of the TQt GUI Toolkit.
**
** This file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free
** Software Foundation and appearing in the files LICENSE.GPL2
** and LICENSE.GPL3 included in the packaging of this file.
** Alternatively you may (at your option) use any later version
** of the GNU General Public License if such license has been
** publicly approved by Trolltech ASA (or its successors, if any)
** and the KDE Free TQt Foundation.
**
** Please review the following information to ensure GNU General
** Public Licensing requirements will be met:
** http://trolltech.com/products/qt/licenses/licensing/opensource/.
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
** or contact the sales department at sales@trolltech.com.
**
** This file may be used under the terms of the Q Public License as
** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
** included in the packaging of this file.  Licensees holding valid TQt
** Commercial licenses may use this file in accordance with the TQt
** Commercial License Agreement provided with the Software.
**
** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
** herein.
**
**********************************************************************/

#ifndef TQUCOM_P_H
#define TQUCOM_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the TQt API.  It exists for the convenience
// of a number of TQt sources files.  This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//

#ifndef TQT_H
#include "tqstring.h"
#include "tquuid.h"
#endif // TQT_H

#ifdef check
#undef check
#endif

#if __GNUC__ - 0 > 3
#pragma GCC system_header
#endif

struct TQUObject;
struct TQUInterfaceDescription;
struct TQUnknownInterface;
struct TQDispatchInterface;


struct TQ_EXPORT TQUBuffer
{
    virtual long read( char *data, ulong maxlen ) = 0;
    virtual long write( const char *data, ulong len ) = 0;
};


// A type for a TQUObject
struct TQ_EXPORT TQUType
{
    virtual const TQUuid *uuid() const = 0;
    virtual const char *desc() const = 0;


    virtual bool canConvertFrom( TQUObject *, TQUType * ) = 0;
    // virtual private, only called by canConvertFrom
    virtual bool canConvertTo( TQUObject *, TQUType * ) = 0;


    virtual bool convertFrom( TQUObject *, TQUType * ) = 0;
    // virtual private, only called by convertFrom
    virtual bool convertTo( TQUObject *, TQUType * ) = 0;

    virtual void clear( TQUObject * ) = 0;

    virtual int serializeTo( TQUObject *, TQUBuffer * ) = 0;
    virtual int serializeFrom( TQUObject *, TQUBuffer * ) = 0;

    static bool isEqual( const TQUType *t1, const TQUType *t2 );
    static bool check( TQUObject* o, TQUType* t );
};


// {DE56510E-4E9F-4b76-A3C2-D1E2EF42F1AC}
extern TQ_EXPORT const TQUuid TID_TQUType_Null;
struct TQ_EXPORT TQUType_Null : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * );
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_Null static_TQUType_Null;


// The magic TQUObject
struct TQ_EXPORT TQUObject
{
public: // scary MSVC bug makes this necessary
    TQUObject() : type( &static_TQUType_Null ) {}
    ~TQUObject() { type->clear( this ); }

    TQUType *type;

    // the unavoidable union
    union
    {
	bool b;

	char c;
	short s;
	int i;
	long l;

	unsigned char uc;
	unsigned short us;
	unsigned int ui;
	unsigned long ul;

	float f;
	double d;

	char byte[16];

	struct {
	   char* data;
	   unsigned long size;
	} bytearray;

	void* ptr;

	struct {
	    void *ptr;
	    bool owner;
	} voidstar;

	struct {
	    char *ptr;
	    bool owner;
	} charstar;

	struct {
	    char *ptr;
	    bool owner;
	} utf8;

	struct {
	    char *ptr;
	    bool owner;
	} local8bit;

	TQUnknownInterface* iface;
	TQDispatchInterface* idisp;

    } payload;

};


// A parameter description describes one method parameters. A
// parameter has a name, a type and a flag describing whether it's an
// in parameter, an out parameter, or both ways
struct TQ_EXPORT TQUParameter
{
    const char* name;
    TQUType *type;
    const void* typeExtra; //Usually 0, UEnum* for TQUType_enum, const char* for TQUType_ptr, int* for TQUType_varptr
    enum { In = 1, Out = 2, InOut = In | Out };
    int inOut;
};

// A method description describes one method. A method has a name and
// an array of parameters.
struct TQ_EXPORT TQUMethod
{
    const char* name;
    int count;
    const TQUParameter* parameters;
};

// A Property description. Not used yet in the example.
struct TQ_EXPORT TQUProperty
{
    const char* name;
    TQUType* type;
    const void* typeExtra; //type dependend. Usually 0, but UEnum for TQUTypeenum or const char* for TQUTypeptr

    int set; // -1 undefined
    int get; // -1 undefined

    int designable; // -1 FALSE, -2 TRUE, else method
    int stored; // -1 FALSE, -2 TRUE, else method
};

// An interface description describes one interface, that is all its
// methods and properties.
struct TQ_EXPORT TQUInterfaceDescription
{
    int methodCount;
    const TQUMethod* methods;
    int propertyCount;
    const TQUProperty* properties;
};


// A component description describe one component, that is its name,
// vendor, release, info, its component uuid and all its interface
// uuids.
struct TQ_EXPORT TQUComponentDescription
{
    const char* name;
    const char* vendor;
    const char* release;
    const char* info;
    TQUuid cid;
    int count;
    const TQUuid* interfaces;
};


// A component server description describe one component server, that
// is its name, vendor, release, info and the descriptions of all
// components it can instantiate.
struct TQ_EXPORT TQUComponentServerDescription
{
    const char* name;
    const char* vendor;
    const char* release;
    const char* info;
    int count;
    const TQUComponentDescription* components;
};



struct TQ_EXPORT TQUEnumItem 				// - a name/value pair
{
    const char *key;
    int value;
};

struct TQ_EXPORT TQUEnum
{
    const char *name;			// - enumerator name
    unsigned int count;			// - number of values
    const TQUEnumItem *items;		// - the name/value pairs
    bool set;				// whether enum has to be treated as a set
};

inline bool TQUType::isEqual( const TQUType *t1, const TQUType *t2 ) {
    return t1 == t2 || t1->uuid() == t2->uuid() ||
	*(t1->uuid()) == *(t2->uuid());
}

inline bool TQUType::check( TQUObject* o, TQUType* t ) {
    return isEqual( o->type, t ) || t->convertFrom( o, o->type );
}



// {7EE17B08-5419-47e2-9776-8EEA112DCAEC}
extern TQ_EXPORT const TQUuid TID_TQUType_enum;
struct TQ_EXPORT TQUType_enum : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, int );
    int &get( TQUObject * o ) { return o->payload.i; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * ) {}
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_enum static_TQUType_enum;


// {8AC26448-5AB4-49eb-968C-8F30AB13D732}
extern TQ_EXPORT const TQUuid TID_TQUType_ptr;
struct TQ_EXPORT TQUType_ptr : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, const void* );
    void* &get( TQUObject * o ) { return o->payload.ptr; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * ) {}
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_ptr static_TQUType_ptr;

// {97A2594D-6496-4402-A11E-55AEF2D4D25C}
extern TQ_EXPORT const TQUuid TID_TQUType_iface;
struct TQ_EXPORT TQUType_iface : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, TQUnknownInterface* );
    TQUnknownInterface* &get( TQUObject *o ){ return o->payload.iface; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * ) {}
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_iface static_TQUType_iface;

// {2F358164-E28F-4bf4-9FA9-4E0CDCABA50B}
extern TQ_EXPORT const TQUuid TID_TQUType_idisp;
struct TQ_EXPORT TQUType_idisp : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, TQDispatchInterface* );
    TQDispatchInterface* &get( TQUObject *o ){ return o->payload.idisp; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * ) {}
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_idisp static_TQUType_idisp;

// {CA42115D-13D0-456c-82B5-FC10187F313E}
extern TQ_EXPORT const TQUuid TID_TQUType_bool;
struct TQ_EXPORT TQUType_bool : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, bool );
    bool &get( TQUObject *o ) { return o->payload.b; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * ) {}
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_bool static_TQUType_bool;

// {53C1F3BE-73C3-4c7d-9E05-CCF09EB676B5}
extern TQ_EXPORT const TQUuid TID_TQUType_int;
struct TQ_EXPORT TQUType_int : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, int );
    int &get( TQUObject *o ) { return o->payload.i; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * ) {}
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_int static_TQUType_int;


// {2D0974E5-0BA6-4ec2-8837-C198972CB48C}
extern TQ_EXPORT const TQUuid TID_TQUType_double;
struct TQ_EXPORT TQUType_double : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, double );
    double &get( TQUObject *o ) { return o->payload.d; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * ) {}
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );
};
extern TQ_EXPORT TQUType_double static_TQUType_double;


// {EFCDD1D4-77A3-4b8e-8D46-DC14B8D393E9}
extern TQ_EXPORT const TQUuid TID_TQUType_charstar;
struct TQ_EXPORT TQUType_charstar : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, const char*, bool take = FALSE );
    char* get( TQUObject *o ){ return o->payload.charstar.ptr; }
    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * );
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );

};
extern TQ_EXPORT TQUType_charstar static_TQUType_charstar;

// {44C2A547-01E7-4e56-8559-35AF9D2F42B7}
extern const TQUuid TID_TQUType_TQString;

struct TQ_EXPORT TQUType_TQString : public TQUType
{
    const TQUuid *uuid() const;
    const char *desc() const;

    void set( TQUObject *, const TQString & );
    TQString &get( TQUObject * o ) { return *(TQString*)o->payload.ptr; }

    bool canConvertFrom( TQUObject *, TQUType * );
    bool canConvertTo( TQUObject *, TQUType * );
    bool convertFrom( TQUObject *, TQUType * );
    bool convertTo( TQUObject *, TQUType * );
    void clear( TQUObject * );
    int serializeTo( TQUObject *, TQUBuffer * );
    int serializeFrom( TQUObject *, TQUBuffer * );

};
extern TQ_EXPORT TQUType_TQString static_TQUType_TQString;


#endif // TQUCOM_P_H
