/*
 * bonobo-moniker-cache.c: 
 *
 * Author:
 *	Dietmar Maurer (dietmar@helixcode.com)
 *
 * Copyright 2000 Helix Code, Inc.
 */
#include <config.h>
#include <bonobo/bonobo-exception.h>

#include "bonobo-moniker-std.h"
#include "bonobo-stream-cache.h"

Bonobo_Unknown
bonobo_moniker_cache_resolve (BonoboMoniker               *moniker,
			      const Bonobo_ResolveOptions *options,
			      const CORBA_char            *requested_interface,
			      CORBA_Environment           *ev)
{
	Bonobo_Moniker parent;
	BonoboStream *stream;
	Bonobo_Stream in_stream;

	if (!strcmp (requested_interface, "IDL:Bonobo/Stream:1.0")) {

		parent = bonobo_moniker_get_parent (moniker, ev);

		if (BONOBO_EX (ev) || parent == CORBA_OBJECT_NIL)
			return CORBA_OBJECT_NIL;
	
		in_stream = Bonobo_Moniker_resolve (parent, options, 
						    "IDL:Bonobo/Stream:1.0",
						    ev);

		if (BONOBO_EX (ev) || in_stream == CORBA_OBJECT_NIL) {
			bonobo_object_release_unref (parent, NULL);
			return CORBA_OBJECT_NIL;
		}

		bonobo_object_release_unref (parent, ev);

		if (BONOBO_EX (ev))
			return CORBA_OBJECT_NIL;
	       
		stream = bonobo_stream_cache_create (in_stream, ev);

		if (BONOBO_EX (ev) || stream == CORBA_OBJECT_NIL) {
			bonobo_object_release_unref (in_stream, NULL);
			return CORBA_OBJECT_NIL;
		}

		bonobo_object_release_unref (in_stream, ev);

		if (BONOBO_EX (ev))
			return CORBA_OBJECT_NIL;
	      
		return CORBA_Object_duplicate (BONOBO_OBJREF (stream), ev);
	}

	return CORBA_OBJECT_NIL; /* use the extender */
}


syntax highlighted by Code2HTML, v. 0.9.1