/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/**
 * bonobo-persist-client.c: Client-side utility functions dealing with persistancy
 *
 * Author:
 *   ÉRDI Gergõ <cactus@cactus.rulez.org>
 *
 * Copyright 2001 Gergõ Érdi
 */

#include <bonobo/bonobo-persist-client.h>

#include <bonobo/bonobo-exception.h>
#include <bonobo/bonobo-stream-client.h>
#include <bonobo/bonobo-moniker-util.h>

void
bonobo_object_save_to_stream (Bonobo_Unknown     object,
			      Bonobo_Stream      stream,
			      CORBA_Environment *opt_ev)
{
	char                           *iid = NULL;
	CORBA_Environment               my_ev;
	Bonobo_PersistStream            pstream = CORBA_OBJECT_NIL;

	CORBA_exception_init (&my_ev);
	pstream = Bonobo_Unknown_queryInterface (object, "IDL:Bonobo/PersistStream:1.0", &my_ev);
	CORBA_exception_free (&my_ev);

	if (!pstream) {
		bonobo_exception_set (opt_ev, ex_Bonobo_Moniker_InterfaceNotFound);
		goto out;
	}

	CORBA_exception_init (&my_ev);
	iid = Bonobo_Persist_getIId (pstream, &my_ev);
	bonobo_stream_client_write_string (stream, iid, TRUE, &my_ev);
	if (BONOBO_EX (&my_ev)) {
		if (opt_ev)
			bonobo_exception_set (opt_ev, BONOBO_EX_REPOID (&my_ev));
		CORBA_exception_free (&my_ev);
		goto out;
	}

	if (opt_ev) {
		Bonobo_PersistStream_save (pstream, stream, "", opt_ev);
	} else {
		Bonobo_PersistStream_save (pstream, stream, "", opt_ev);
		CORBA_exception_free (&my_ev);
	}

 out:
	g_free (iid);
	if (pstream != CORBA_OBJECT_NIL) {
		CORBA_exception_init (&my_ev);
		Bonobo_Unknown_unref (pstream, &my_ev);
		CORBA_exception_free (&my_ev);
	}
}


Bonobo_Unknown
bonobo_object_from_stream (Bonobo_Stream      stream,
			   CORBA_Environment *opt_ev)
{
	char                 *iid = NULL;
	CORBA_Environment     my_ev, *ev;
	Bonobo_PersistStream  pstream = CORBA_OBJECT_NIL;

	CORBA_exception_init (&my_ev);

	if (opt_ev)
		ev = opt_ev;
	else
		ev = &my_ev;

	bonobo_stream_client_read_string (stream, &iid, ev);
	if (BONOBO_EX (ev)) {
		goto out;
	}
	
	pstream = bonobo_get_object (iid, "IDL:Bonobo/PersistStream:1.0",
				     ev);
	if (BONOBO_EX (ev)) {
		pstream = CORBA_OBJECT_NIL;
		goto out;
	}
	
	Bonobo_PersistStream_load (pstream, stream, "", ev);
	
 out:
	CORBA_exception_free (&my_ev);
	g_free (iid);
	
	return pstream;
}


syntax highlighted by Code2HTML, v. 0.9.1