/*
 * This file was generated by orbit-idl - DO NOT EDIT!
 */

#include <string.h>
#include "echo.h"
#define GET_ATOM(x) G_STMT_START{ GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->decoder(&x, (GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur), sizeof(x)); ((guchar *)GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) += sizeof(x); }G_STMT_END

static void
skel_Echo_echoString(POA_Echo * _ORBIT_servant,
		     GIOPRecvBuffer * _ORBIT_recv_buffer,
		     CORBA_Environment * ev,
		     Echo(*_impl_echoString) (PortableServer_Servant servant,
					      const CORBA_char * astring,
					      CORBA_long * anum,
					      CORBA_Environment * ev))
{
   CORBA_char *astring;
   CORBA_long anum;
   Echo _ORBIT_retval;
   GIOPSendBuffer *_ORBIT_send_buffer;

   if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) {

      /* demarshal parameter astring */
      {
	 GIOP_unsigned_long len;

	 GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = ALIGN_ADDRESS(GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur, 4);
	 GET_ATOM(len);
	 astring = len ? (GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) : (((char *) GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) - sizeof(CORBA_unsigned_long));
	 ((char *) GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) += len;
      }
   } else {

      /* demarshal parameter astring */
      {
	 GIOP_unsigned_long len;

	 GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = ALIGN_ADDRESS(GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur, 4);
	 len = *((CORBA_unsigned_long *) GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur);
	 ((char *) GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) += sizeof(CORBA_unsigned_long);
	 astring = len ? (GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) : (((char *) GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) - sizeof(CORBA_unsigned_long));
	 ((char *) GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur) += len;
      }
   }

   _ORBIT_retval = _impl_echoString(_ORBIT_servant, astring,
				    &(anum),
				    ev);
   _ORBIT_send_buffer =
      giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)->connection, NULL,
			   _ORBIT_recv_buffer->message.u.request.request_id,
				 ev->_major);

   if (ev->_major == CORBA_NO_EXCEPTION) {
      /* marshal return value */
      ORBit_marshal_object(_ORBIT_send_buffer, _ORBIT_retval);
      /* marshal parameter anum */
      giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), 4);
      giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &anum, sizeof(anum));
   } else if (ev->_major == CORBA_SYSTEM_EXCEPTION)
      ORBit_send_system_exception(_ORBIT_send_buffer, ev);
   else if (ev->_major == CORBA_USER_EXCEPTION)
      ORBit_send_user_exception(_ORBIT_send_buffer, ev, NULL);
   giop_send_buffer_write(_ORBIT_send_buffer);
   giop_send_buffer_unuse(_ORBIT_send_buffer);
   if (ev->_major == CORBA_NO_EXCEPTION)
      CORBA_Object_release(_ORBIT_retval, ev);
}

static ORBitSkeleton 
get_skel_Echo(POA_Echo * servant,
	      GIOPRecvBuffer * _ORBIT_recv_buffer,
	      gpointer * impl)
{
   gchar *opname = _ORBIT_recv_buffer->message.u.request.operation;

   switch (opname[0]) {
     case 'e':
	*impl = servant->vepv->Echo_epv->echoString;
	return (gpointer) skel_Echo_echoString;
	break;
     default:
	return NULL;
   }
}

static void 
init_local_objref_Echo(CORBA_Object obj, POA_Echo * servant)
{
   obj->vepv[Echo__classid] = servant->vepv->Echo_epv;
}

void 
POA_Echo__init(POA_Echo * servant,
	       CORBA_Environment * env)
{
   static const PortableServer_ClassInfo class_info =
   {(gpointer) & get_skel_Echo, "IDL:Echo:1.0", (gpointer) & init_local_objref_Echo};

   PortableServer_ServantBase__init(((PortableServer_ServantBase *) servant), env);
   ORBIT_OBJECT_KEY(servant->_private)->class_info = (PortableServer_ClassInfo *) & class_info;
   if (!Echo__classid)
      Echo__classid = ORBit_register_class(&class_info);
}

void 
POA_Echo__fini(POA_Echo * servant,
	       CORBA_Environment * env)
{
   PortableServer_ServantBase__fini(servant, env);
}
