static CORBA_boolean put_objref (GIOPSendBuffer *buf, CORBA_TypeCode tc, SV *sv) { CORBA_Object obj; if (!SvOK(sv)) obj = CORBA_OBJECT_NIL; else { if (!sv_derived_from(sv, "CORBA::Object")) { warn("not an object reference"); return CORBA_FALSE; } obj = (CORBA_Object)SvIV((SV *)SvRV(sv)); } ORBit_marshal_object (buf, obj); return CORBA_TRUE; }
CORBA_char * CORBA_ORB_object_to_string (CORBA_ORB orb, const CORBA_Object obj, CORBA_Environment *ev) { GIOPSendBuffer *buf; CORBA_octet endianness = GIOP_FLAG_ENDIANNESS; CORBA_char *out; int i, j, k; g_return_val_if_fail (ev != NULL, NULL); if(!orb || !obj || ORBIT_ROOT_OBJECT_TYPE (obj) != ORBIT_ROT_OBJREF) { CORBA_exception_set_system ( ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return NULL; } if (orbit_use_corbaloc) { out = ORBit_object_to_corbaloc (obj, ev); if (ev->_major == CORBA_NO_EXCEPTION) return out; CORBA_exception_free (ev); /* fall thru, common marshalling */ } buf = giop_send_buffer_use (orb->default_giop_version); g_assert (buf->num_used == 1); buf->header_size = 0; buf->lastptr = NULL; buf->num_used = 0; /* we don't want the header in there */ buf->msg.header.message_size = 0; giop_send_buffer_append (buf, &endianness, 1); ORBit_marshal_object (buf, obj); out = CORBA_string_alloc (4 + (buf->msg.header.message_size * 2) + 1); strcpy (out, "IOR:"); for (i = 0, k = 4; i < buf->num_used; i++) { struct iovec *curvec; guchar *ptr; curvec = &buf->iovecs [i]; ptr = curvec->iov_base; for (j = 0; j < curvec->iov_len; j++, ptr++) { int n1, n2; n1 = (*ptr & 0xF0) >> 4; n2 = (*ptr & 0xF); out [k++] = num2hexdigit (n1); out [k++] = num2hexdigit (n2); } } out [k++] = '\0'; giop_send_buffer_unuse (buf); return out; }