#include "idl_types.h"

/**
  DCOM interfaces
  http://www.ietf.org/internet-drafts/draft-brown-dcom-v1-spec-04.txt
 */

[
	pointer_default(unique),
	keepref
]
interface ObjectRpcBaseTypes
{
	/* COM_MINOR_VERSION = 1 (NT4.0, SP1, SP2, DCOM95). */
	/* - Initial Release */
	/* - Must be used when talking to downlevel machines, including */
	/* on Remote Activation calls. */
	/* COM_MINOR_VERSION = 2 (NT4.0 SP3 and beyond). */
	/* - Added ResolveOxid2 to IObjectExporter to retrieve the */
	/* COM version number of the server. Passed to the NDR engine */
	/* to fix fatal endian-ness flaw in the way OLEAUTOMATION marshals */
	/* BSTRS. Previous way used trailing padding, which is not NDR */
	/* compatible. See Bug# 69189. */
	/* COM_MINOR_VERSION = 3 (NT4.0 SP4 and DCOM95 builds 1018 and beyond) */
	/* - OLEAUT32 added two new types to the SAFEARRAY, but SAFEARRAY */
	/* previously included the "default" keyword, which prevented */
	/* downlevel NDR engines from correctly handling any extensions. */
	/* Machines with version >=5.3 don't use "default" and will */
	/* gracefully handle future extensions to SAFEARRAY. */
	/* old constants (for convenience) */

	/* current version */
	const uint16 COM_MAJOR_VERSION = 5;
	const uint16 COM_MINOR_VERSION = 1;

	/* Body Extensions */
	const string dcom_ext_debugging = "f1f19680-4d2a-11ce-a66a-0020af6e72f4";
	const string dcom_ext_extended_error = "f1f19681-4d2a-11ce-a66a-0020af6e72f4";

	/* Component Object Model version number */


	typedef [public] struct 
	{
		uint16 MajorVersion; /* Major version number */
		uint16 MinorVersion; /* Minor version number */
	} COMVERSION;

	/* enumeration of additional information present in the call packet. */
	typedef bitmap {
		ORPCF_NULL = 			0x00, /* no additional info in packet */
		ORPCF_LOCAL = 			0x01, /* call is local to this machine */
		ORPCF_RESERVED1 = 		0x02, /* reserved for local use */
		ORPCF_RESERVED2 = 		0x04, /* reserved for local use */
		ORPCF_RESERVED3 = 		0x08, /* reserved for local use */
		ORPCF_RESERVED4 = 	    0x10  /* reserved for local use */
	} ORPC_FLAGS;

	/* Extension to implicit parameters. */
	typedef [public] struct 
	{ 	
		GUID id; /* Extension identifier. */
		uint32 size; /* Extension size. */
		[size_is(((size+7)&~7))] uint8 data[]; /* Extension data. */
	} 	ORPC_EXTENT;


	/* Array of extensions. */
	typedef struct 
	{
		uint32 size; /* Num extents. */
		uint32 reserved; /* Must be zero. */
		[size_is(((size+1)&~1))] ORPC_EXTENT **extent; /* extents */
	} ORPC_EXTENT_ARRAY;


	/* implicit 'this' pointer which is the first [in] parameter on */
	/* every ORPC call. */
	typedef [public] struct 
	{
		COMVERSION version; /* COM version number */
		uint32 flags; /* ORPCF flags for presence of other data */
		uint32 reserved1; /* set to zero */
		GUID cid; /* causality id of caller */
		/* Extensions. */
		[unique] ORPC_EXTENT_ARRAY *extensions;
	} 	ORPCTHIS;


	/* implicit 'that' pointer which is the first [out] parameter on */
	/* every ORPC call. */
	typedef [public] struct 
	{
		uint32 flags; /* ORPCF flags for presence of other data */
		/* Extensions. */
		[unique] ORPC_EXTENT_ARRAY *extensions;
	} 	ORPCTHAT;


	/* DUALSTRINGARRAYS are the return type for arrays of network addresses, */
	/* arrays of endpoints and arrays of both used in many ORPC interfaces */
	typedef [public,flag(NDR_NOALIGN)] struct 
	{
		uint16 wTowerId; /* Cannot be zero. */
		nstring NetworkAddr; 
	} 	STRINGBINDING;

	typedef [public,nopush,nopull,noprint] struct 
	{
		STRINGBINDING **stringbindings;
	} STRINGARRAY;

	typedef [public,nopush,nopull,noprint] struct 
	{
		STRINGBINDING **stringbindings;
		SECURITYBINDING **securitybindings;
	} DUALSTRINGARRAY;

	const uint16 COM_C_AUTHZ_NONE = 0xffff;
	typedef [public,flag(NDR_NOALIGN)] struct 
	{
		uint16 wAuthnSvc; /* Cannot be zero. */
		uint16 wAuthzSvc;
		nstring PrincName; 
	} 	SECURITYBINDING;

	/* signature value for OBJREF (object reference, actually the */
	/* marshaled form of a COM interface). 
	 * MEOW apparently stands for "Microsoft Extended Object Wireformat"
	 */
	const uint32 OBJREF_SIGNATURE = 0x574f454d; /* 'MEOW' */

	/* flag values for OBJREF */
	typedef enum {
		OBJREF_NULL = 0x0, /* NULL pointer */
		OBJREF_STANDARD = 0x1, /* standard marshaled objref */
		OBJREF_HANDLER = 0x2, /* handler marshaled objref */
		OBJREF_CUSTOM = 0x4 /* custom marshaled objref */
	} OBJREF_FLAGS;

	/* Flag values for a STDOBJREF (standard part of an OBJREF). */
	/* SORF_OXRES1 - SORF_OXRES8 are reserved for the object exporters */
	/* use only, object importers must ignore them and must not enforce MBZ. */
	typedef bitmap {
		SORF_NULL   = 0x0000, /* convenient for initializing SORF */
		SORF_OXRES1 = 0x0001, /* reserved for exporter */
		SORF_OXRES2 = 0x0020, /* reserved for exporter */
		SORF_OXRES3 = 0x0040, /* reserved for exporter */
		SORF_OXRES4 = 0x0080, /* reserved for exporter */
		SORF_OXRES5 = 0x0100, /* reserved for exporter */
		SORF_OXRES6 = 0x0200, /* reserved for exporter */
		SORF_OXRES7 = 0x0400, /* reserved for exporter */
		SORF_OXRES8 = 0x0800, /* reserved for exporter */
		SORF_NOPING = 0x1000  /* Pinging is not required  */
	} STDOBJREF_FLAGS;

	/* standard object reference */
	typedef [public] struct 
	{
		uint32 flags; /* STDOBJREF flags (see above) */
		uint32 cPublicRefs; /* count of references passed */
		hyper oxid; /* oxid of server with this oid */
		hyper oid; /* oid of object with this ipid */
		GUID ipid; /* ipid of interface pointer to this object */
	} 	STDOBJREF;

	typedef struct
	{
		STDOBJREF std; /* standard objref */
		STRINGARRAY saResAddr; /* resolver address */
	} u_standard;

	typedef struct
	{
		STDOBJREF std; /* standard objref */
		GUID clsid; /* Clsid of handler code */
		STRINGARRAY saResAddr; /* resolver address */
	} u_handler;

	typedef struct
	{
		GUID clsid; /* Clsid of unmarshaling code */
		uint32 cbExtension; /* size of extension data */
		uint32 size; /* size of data that follows */
		uint8 pData[size]; /* extension + class specific data */
	} u_custom;

	typedef struct
	{
	} u_null;

	typedef [nodiscriminant] union 
	{
		[case(OBJREF_NULL)] u_null u_null;
		[case(OBJREF_STANDARD)] u_standard u_standard;
		[case(OBJREF_HANDLER)] u_handler u_handler;
		[case(OBJREF_CUSTOM)] u_custom u_custom;
	} OBJREF_Types;

	/* OBJREF is the format of a marshaled interface pointer. */
	typedef [public,flag(NDR_LITTLE_ENDIAN)] struct 
	{
		uint32 signature;
		uint32 flags; /* OBJREF flags (see above) */
		GUID iid; /* interface identifier */
		[switch_is(flags), switch_type(uint32)] OBJREF_Types u_objref;
	} OBJREF;

	/* wire representation of a marshalled interface pointer */
	typedef [public] struct 
	{
		uint32 size;
		[subcontext(4)] OBJREF obj;
	} MInterfacePointer;

	typedef [v1_enum,public] enum 
	{
		COM_OK 				= 0x00000000,
		COM_OUTOFMEMORY 	= 0x80000002,
		COM_INVALIDARG		= 0x80000003,
		COM_NOINTERFACE		= 0x80000004,
		COM_ACCESSDENIED	= 0x80070005,
		COM_INVALID_OXID	= 0x80070776,
		COM_INVALID_OID		= 0x80070777,
		COM_INVALID_SET		= 0x80070778,
		COM_UNEXPECTED		= 0x8000FFFF,
		COM_CLSNOTFOUND		= 0x80040154
	} COMRESULT;
}