Files
Mozilla/mozilla/xpcom/reflect/xptcall/public/xptcall.h
dmose%mozilla.org 0efb7c174c updated xPL license boilerplate to v1.1, a=chofmann@netscape.com,r=endico@mozilla.org
git-svn-id: svn://10.0.0.236/trunk@52910 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-06 03:43:54 +00:00

187 lines
6.6 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
/* Public declarations for xptcall. */
#ifndef xptcall_h___
#define xptcall_h___
#include "prtypes.h"
#include "nscore.h"
#include "nsISupports.h"
#include "xpt_struct.h"
#include "xptinfo.h"
#include "nsIInterfaceInfo.h"
/***************************************************************************/
/*
* The linkage of XPTC API functions differs depending on whether the file is
* used within the XPTC library or not. Any source file within the XPTC
* library should define EXPORT_XPTC_API whereas any client of the library
* should not.
*/
#ifdef EXPORT_XPTC_API
#define XPTC_PUBLIC_API(t) PR_IMPLEMENT(t)
#define XPTC_PUBLIC_DATA(t) PR_IMPLEMENT_DATA(t)
#ifdef _WIN32
# define XPTC_EXPORT _declspec(dllexport)
#else
# define XPTC_EXPORT
#endif
#else
#ifdef _WIN32
# define XPTC_PUBLIC_API(t) _declspec(dllimport) t
# define XPTC_PUBLIC_DATA(t) _declspec(dllimport) t
# define XPTC_EXPORT _declspec(dllimport)
#else
# define XPTC_PUBLIC_API(t) PR_IMPLEMENT(t)
# define XPTC_PUBLIC_DATA(t) t
# define XPTC_EXPORT
#endif
#endif
#define XPTC_FRIEND_API(t) XPTC_PUBLIC_API(t)
#define XPTC_FRIEND_DATA(t) XPTC_PUBLIC_DATA(t)
/***************************************************************************/
struct nsXPTCMiniVariant
{
// No ctors or dtors so that we can use arrays of these on the stack
// with no penalty.
union
{
PRInt8 i8;
PRInt16 i16;
PRInt32 i32;
PRInt64 i64;
PRUint8 u8;
PRUint16 u16;
PRUint32 u32;
PRUint64 u64;
float f;
double d;
PRBool b;
char c;
PRUnichar wc;
void* p;
} val;
};
struct nsXPTCVariant : public nsXPTCMiniVariant
{
// No ctors or dtors so that we can use arrays of these on the stack
// with no penalty.
// inherits 'val' here
void* ptr;
nsXPTType type;
PRUint8 flags;
enum
{
// these are bitflags!
PTR_IS_DATA = 0x1, // ptr points to 'real' data in val
VAL_IS_OWNED = 0x2, // val.p holds alloc'd ptr that must be freed
VAL_IS_IFACE = 0x4, // val.p holds interface ptr that must be released
VAL_IS_ARRAY = 0x8 // val.p holds a pointer to an array needing cleanup
};
PRBool IsPtrData() const {return (PRBool) (flags & PTR_IS_DATA);}
PRBool IsValOwned() const {return (PRBool) (flags & VAL_IS_OWNED);}
PRBool IsValInterface() const {return (PRBool) (flags & VAL_IS_IFACE);}
PRBool IsValArray() const {return (PRBool) (flags & VAL_IS_ARRAY);}
void Init(const nsXPTCMiniVariant& mv, const nsXPTType& t)
{
switch(t.TagPart()) {
case nsXPTType::T_I8: val.i8 = mv.val.i8; break;
case nsXPTType::T_I16: val.i16 = mv.val.i16; break;
case nsXPTType::T_I32: val.i32 = mv.val.i32; break;
case nsXPTType::T_I64: val.i64 = mv.val.i64; break;
case nsXPTType::T_U8: val.u8 = mv.val.u8; break;
case nsXPTType::T_U16: val.u16 = mv.val.u16; break;
case nsXPTType::T_U32: val.u32 = mv.val.u32; break;
case nsXPTType::T_U64: val.u64 = mv.val.u64; break;
case nsXPTType::T_FLOAT: val.f = mv.val.f; break;
case nsXPTType::T_DOUBLE: val.d = mv.val.d; break;
case nsXPTType::T_BOOL: val.b = mv.val.b; break;
case nsXPTType::T_CHAR: val.c = mv.val.c; break;
case nsXPTType::T_WCHAR: val.wc = mv.val.wc; break;
case nsXPTType::T_VOID: /* fall through */
case nsXPTType::T_IID: /* fall through */
case nsXPTType::T_BSTR: /* fall through */
case nsXPTType::T_CHAR_STR: /* fall through */
case nsXPTType::T_WCHAR_STR: /* fall through */
case nsXPTType::T_INTERFACE: /* fall through */
case nsXPTType::T_INTERFACE_IS: /* fall through */
case nsXPTType::T_ARRAY: /* fall through */
case nsXPTType::T_PSTRING_SIZE_IS: /* fall through */
case nsXPTType::T_PWSTRING_SIZE_IS: /* fall through */
default: val.p = mv.val.p; break;
}
ptr = nsnull;
type = t;
flags = 0;
}
};
/***************************************************************************/
class nsXPTCStubBase : public nsISupports
{
public:
// We are going to implement this to force the compiler to generate a
// vtbl for this class. Since this is overridden in the inheriting class
// we expect it to never be called.
// *This is needed by the Irix implementation.*
XPTC_EXPORT NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
// Include generated vtbl stub declarations.
// These are virtual and *also* implemented by this class..
#include "xptcstubsdecl.inc"
// The following methods must be provided by inheritor of this class.
// return a refcounted pointer to the InterfaceInfo for this object
// NOTE: on some platforms this MUST not fail or we crash!
NS_IMETHOD GetInterfaceInfo(nsIInterfaceInfo** info) = 0;
// call this method and return result
NS_IMETHOD CallMethod(PRUint16 methodIndex,
const nsXPTMethodInfo* info,
nsXPTCMiniVariant* params) = 0;
};
PR_BEGIN_EXTERN_C
XPTC_PUBLIC_API(nsresult)
XPTC_InvokeByIndex(nsISupports* that, PRUint32 methodIndex,
PRUint32 paramCount, nsXPTCVariant* params);
// Used to force linking of these obj for the static library into the dll
extern void xptc_dummy();
extern void xptc_dummy2();
PR_END_EXTERN_C
#endif /* xptcall_h___ */