#include <config.h>
#include <gnome.h>
#include <liboaf/liboaf.h>

#include <gdk/gdkprivate.h>
#include <gdk/gdkx.h>
#include <orb/orbit.h>
#include <bonobo.h>
#include <bonobo/bonobo-property-bag-xml.h>

#define CHECK_OK(ev) g_assert ((ev)->_major == CORBA_NO_EXCEPTION)

static const CORBA_TypeCode
octet_subtypes_array [] = {
	TC_octet
};

static const struct CORBA_TypeCode_struct
TC_CORBA_sequence_CORBA_octet_struct = {
      {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
       ORBIT_PSEUDO_TYPECODE},

      CORBA_tk_sequence, NULL, NULL,
      0, 1,
      NULL,
      (CORBA_TypeCode *) octet_subtypes_array,
      NULL,
      CORBA_OBJECT_NIL, 0, -1, 0, 0
};

static const char *
enum_subnames_array [] = {
	"KIPPER",
	"BLOATER",
	"HERRING"
};

const struct CORBA_TypeCode_struct
TC_org_fish_packers_Fishy_struct = {
   
	{{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
	 ORBIT_PSEUDO_TYPECODE},
	
	CORBA_tk_enum, "Fishy", "IDL:org/fish/packers/Fishy:1.0",
	0, 3,
	(const char **) enum_subnames_array,
	NULL,
	NULL,
	CORBA_OBJECT_NIL, 0, -1, 0, 0
};

static const char *
union_subnames_array [] = {
	"tgw",
	"nut",
	"atl",
	"rmt",
	"ibid"
};

static CORBA_unsigned_long 
union_sublabel_values_array [] = {
	0, 1, 2, 3, 4
};

static const CORBA_TypeCode
union_subtypes_array [] = {
	TC_long,
	TC_long,
	TC_string,
	(CORBA_TypeCode) & TC_org_fish_packers_Fishy_struct,
	(CORBA_TypeCode) & TC_CORBA_sequence_CORBA_octet_struct
};

static const CORBA_any
union_sublabels_array [] = {
	{ (CORBA_TypeCode) TC_CORBA_unsigned_long, 
	  &union_sublabel_values_array [0], CORBA_FALSE },
	{ (CORBA_TypeCode) TC_CORBA_unsigned_long,
	  &union_sublabel_values_array [1], CORBA_FALSE },
	{ (CORBA_TypeCode) TC_CORBA_unsigned_long,
	  &union_sublabel_values_array [2], CORBA_TRUE  },
	{ (CORBA_TypeCode) TC_CORBA_unsigned_long,
	  &union_sublabel_values_array [3], CORBA_FALSE },
	{ (CORBA_TypeCode) TC_CORBA_unsigned_long,
	  &union_sublabel_values_array [4], CORBA_FALSE },
};

const struct CORBA_TypeCode_struct
TC_England_Unions_Struct_struct = {
   
      {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
       ORBIT_PSEUDO_TYPECODE},

      CORBA_tk_struct, "Struct", "IDL:England/Unions/Struct:1.0",
      0, 5,
      (const char **)    union_subnames_array,
      (CORBA_TypeCode *) union_subtypes_array,
      NULL,
      CORBA_OBJECT_NIL, 0, -1, 0, 0
};

int
main (int argc, char *argv [])
{
	DynamicAny_DynAny dyn_any;
	CORBA_Environment real_ev, *ev;
	CORBA_any   *any, *any2;
	CORBA_ORB    orb;
	const char  *test_str = "one is not amused";

	free (malloc (8));

	fprintf (stderr, "Testing DynamicAny\n");

	ev = &real_ev;
	CORBA_exception_init (ev);

	gtk_type_init ();

	orb = oaf_init (argc, argv);
	
	if (bonobo_init (orb, NULL, NULL) == FALSE)
		g_error ("Can not bonobo_init");
	
	dyn_any = CORBA_ORB_create_basic_dyn_any (
		orb, (CORBA_TypeCode) &TC_England_Unions_Struct_struct, ev);
	CHECK_OK (ev);
	g_assert (dyn_any != CORBA_OBJECT_NIL);

	g_assert (DynamicAny_DynStruct_seek (dyn_any, 0, ev));
	CHECK_OK (ev);

	DynamicAny_DynAny_insert_long (dyn_any, 345, ev);
	CHECK_OK (ev);

	g_assert (DynamicAny_DynAny_next (dyn_any, ev));
	CHECK_OK (ev);

	DynamicAny_DynAny_insert_long (dyn_any, 1, ev);
	CHECK_OK (ev);

	g_assert (DynamicAny_DynAny_next (dyn_any, ev));
	CHECK_OK (ev);

	DynamicAny_DynAny_insert_string (dyn_any, test_str, ev);
	CHECK_OK (ev);

	any = DynamicAny_DynAny_to_any (dyn_any, ev);
	CHECK_OK (ev);

	{
		BonoboUINode *node;
		char *str;

		node = bonobo_property_bag_xml_encode_any (NULL, any, ev);
		str = bonobo_ui_node_to_string (node, TRUE);

		printf ("'%s'\n", str);
		bonobo_ui_node_free_string (str);

		any2 = bonobo_property_bag_xml_decode_any (node, ev);

		g_assert (any2);
		g_assert (ORBit_any_equivalent (any, any2, ev));
		CHECK_OK (ev);

		CORBA_free (any2);
		CORBA_free (any);

		bonobo_ui_node_free (node);
	}

	CORBA_Object_release ((CORBA_Object) dyn_any, ev);
	CHECK_OK (ev);

	fprintf (stderr, "Testing BonoboArg\n");
	{
		int            i;
		CORBA_TypeCode tcs [] = {
			TC_null,
			TC_void,
			TC_string,
			TC_short,
			TC_long,
			TC_ushort,
			TC_ulong,
			TC_float,
			TC_double,
			TC_longdouble,
			TC_boolean,
			TC_char,
			TC_wchar,
			TC_octet,
			TC_any,
			TC_TypeCode,
			TC_Object,
			TC_wstring,
			TC_longlong,
			TC_ulonglong,
			(CORBA_TypeCode) & TC_org_fish_packers_Fishy_struct,
			(CORBA_TypeCode) & TC_CORBA_sequence_CORBA_octet_struct,
			(CORBA_TypeCode) &TC_England_Unions_Struct_struct
		};
		for (i = 0; i < sizeof (tcs)/sizeof(CORBA_TypeCode); i++) {
			BonoboArg *arg;

			arg = bonobo_arg_new (tcs [i]);
			bonobo_arg_release (arg);
		}
	}

	return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1