#ifndef __PORBIT_INTERFACES_H__
#define __PORBIT_INTERFACES_H__

#include <orb/interface_repository.h>
#include "porbit-perl.h"

typedef struct _PORBitIfaceInfo PORBitIfaceInfo;

/* Encapsulates knowledge about a particular interface
 */
struct _PORBitIfaceInfo {
    char *pkg;
    CORBA_InterfaceDef_FullInterfaceDescription *desc;

    /* Information for servers */
    CORBA_unsigned_long class_id;
    PortableServer_ClassInfo class_info;
};

/* Given either a pointer to an IR object, or a repository ID, load
 * the definition of the IR object from the repository. _orb optionally
 * gives the orb to resolve the initial InterfaceRepository in
 * if iface is not specified
 */
PORBitIfaceInfo  *porbit_load_contained  (CORBA_Contained    container, 
					  const char        *id,
					  CORBA_Environment *ev);
/* Look up interface information for a given repoid
 */
PORBitIfaceInfo  *porbit_find_interface_description (const char *repo_id);

/* Store a new interface into the type system, desc will be used or freed.
 */
PORBitIfaceInfo *porbit_init_interface (CORBA_InterfaceDef_FullInterfaceDescription *desc,
					const char                                  *package_name,
					CORBA_Environment                           *ev);

/* Initialize a constant. Assumes ownership of SV's refcount
 */
void porbit_init_constant (const char *pkgname, const char *name, SV *sv);

/* Find or create a TypeCode object for the given ID
 */
CORBA_TypeCode porbit_find_typecode (const char *id);

/* Store a TypeCode object for the given repoid
 */
void      porbit_store_typecode  (const char *repoid, CORBA_TypeCode tc);

/* Remove a TypeCode object for the given repoid
 */
void      porbit_remove_typecode  (const char *repoid);

/* Initialize interface descriptions for the standard types
 */
void porbit_init_interfaces (void);

/* Initialize typecodes for the standard types
 */
void      porbit_init_typecodes  (void);

#define PORBIT_REPOID_KEY "_repoid"

#define PORBIT_OFFSET 0x10000000
#define PORBIT_OPERATION_BASE 0
#define PORBIT_GETTER_BASE (PORBIT_OPERATION_BASE + PORBIT_OFFSET)
#define PORBIT_SETTER_BASE (PORBIT_GETTER_BASE + PORBIT_OFFSET)

#endif /* __PORBIT_INTERFACES_H__ */
