GIOPSendBuffer * giop_send_buffer_use_locate_request (GIOPVersion giop_version, CORBA_unsigned_long request_id, const CORBA_sequence_CORBA_octet *objkey) { GIOPSendBuffer *buf = giop_send_buffer_use(giop_version); buf->msg.header.message_type = GIOP_LOCATEREQUEST; buf->msg.u.locate_request_1_0.request_id = request_id; giop_send_buffer_append(buf, &buf->msg.u.locate_request_1_0.request_id, sizeof(CORBA_unsigned_long)); switch(giop_version) { case GIOP_1_0: case GIOP_1_1: giop_send_buffer_append_aligned(buf, &objkey->_length, sizeof(CORBA_unsigned_long)); giop_send_buffer_append(buf, objkey->_buffer, objkey->_length); break; case GIOP_1_2: giop_send_buffer_append(buf, &giop_1_2_target_type, sizeof(giop_1_2_target_type)); giop_send_buffer_append_aligned(buf, &objkey->_length, sizeof(CORBA_unsigned_long)); giop_send_buffer_append(buf, objkey->_buffer, objkey->_length); default: break; } return buf; }
GIOPSendBuffer * giop_send_buffer_use_reply(GIOPVersion giop_version, CORBA_unsigned_long request_id, CORBA_unsigned_long reply_status) { GIOPSendBuffer *buf = giop_send_buffer_use(giop_version); buf->msg.header.message_type = GIOP_REPLY; switch(giop_version) { case GIOP_1_0: case GIOP_1_1: buf->msg.u.reply_1_0.reply_status = reply_status; buf->msg.u.reply_1_0.request_id = request_id; giop_send_buffer_append(buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data)); giop_send_buffer_append(buf, &buf->msg.u.reply_1_0.request_id, sizeof(CORBA_unsigned_long)); giop_send_buffer_append(buf, &buf->msg.u.reply_1_0.reply_status, sizeof(CORBA_unsigned_long)); break; case GIOP_1_2: buf->msg.u.reply_1_2.reply_status = reply_status; buf->msg.u.reply_1_2.request_id = request_id; giop_send_buffer_append(buf, &buf->msg.u.reply_1_2.request_id, sizeof(CORBA_unsigned_long)); giop_send_buffer_append(buf, &buf->msg.u.reply_1_2.reply_status, sizeof(CORBA_unsigned_long)); giop_send_buffer_append(buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data)); giop_send_buffer_align(buf, 8); /* alignment for the body */ default: break; } return buf; }
GIOPSendBuffer * giop_send_buffer_use_request (GIOPVersion giop_version, CORBA_unsigned_long request_id, CORBA_boolean response_expected, const CORBA_sequence_CORBA_octet *objkey, const struct iovec *operation_vec, const struct iovec *principal_vec) { GIOPSendBuffer *buf = giop_send_buffer_use (giop_version); struct iovec zerovec; if(!principal_vec) { zerovec.iov_base = (gpointer) giop_zero_buf; zerovec.iov_len = sizeof (CORBA_unsigned_long); principal_vec = &zerovec; } buf->msg.header.message_type = GIOP_REQUEST; giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long)); switch (giop_version) { case GIOP_1_0: case GIOP_1_1: buf->msg.u.request_1_0.request_id = request_id; buf->msg.u.request_1_0.response_expected = response_expected; giop_send_buffer_append (buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data)); giop_send_buffer_append (buf, &buf->msg.u.request_1_0.request_id, sizeof(CORBA_unsigned_long)); giop_send_buffer_append (buf, &buf->msg.u.request_1_0.response_expected, sizeof(CORBA_boolean)); giop_send_buffer_append_aligned (buf, &objkey->_length, sizeof(CORBA_unsigned_long)); giop_send_buffer_append (buf, objkey->_buffer, objkey->_length); giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long)); giop_send_buffer_append (buf, operation_vec->iov_base, operation_vec->iov_len); giop_send_buffer_append (buf, principal_vec->iov_base, principal_vec->iov_len); break; case GIOP_1_2: buf->msg.u.request_1_2.request_id = request_id; buf->msg.u.request_1_2.response_flags = response_expected ? 0x3 /* SYNC_WITH_TARGET */ : 0x0 /* SYNC_NONE */; giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long)); giop_send_buffer_append (buf, &buf->msg.u.request_1_2.request_id, sizeof(CORBA_unsigned_long)); giop_send_buffer_append (buf, &buf->msg.u.request_1_2.response_flags, sizeof(CORBA_octet)); giop_send_buffer_append (buf, giop_zero_buf, 3); giop_send_buffer_append (buf, &giop_1_2_target_type, 2); /* We always use GIOP::KeyAddr addressing - the only sane way */ giop_send_buffer_append_aligned (buf, &objkey->_length, sizeof(CORBA_unsigned_long)); giop_send_buffer_append (buf, objkey->_buffer, objkey->_length); giop_send_buffer_align (buf, sizeof(CORBA_unsigned_long)); giop_send_buffer_append (buf, operation_vec->iov_base, operation_vec->iov_len); giop_send_buffer_append (buf, (const guchar *)iop_service_context_data, sizeof(iop_service_context_data)); giop_send_buffer_align (buf, 8); /* alignment for the body */ default: break; } return buf; }
GIOPSendBuffer * giop_send_buffer_use_message_error (GIOPVersion giop_version) { GIOPSendBuffer *buf = giop_send_buffer_use (giop_version); buf->msg.header.message_type = GIOP_MESSAGEERROR; return buf; }
GIOPSendBuffer * giop_send_buffer_use_close_connection (GIOPVersion giop_version) { GIOPSendBuffer *buf = giop_send_buffer_use (giop_version); buf->msg.header.message_type = GIOP_CLOSECONNECTION; return buf; }
GIOPSendBuffer * giop_send_buffer_use_locate_reply(GIOPVersion giop_version, CORBA_unsigned_long request_id, CORBA_unsigned_long locate_status) { GIOPSendBuffer *buf = giop_send_buffer_use(giop_version); buf->msg.header.message_type = GIOP_LOCATEREPLY; buf->msg.u.locate_reply_1_0.request_id = request_id; giop_send_buffer_append(buf, &buf->msg.u.locate_reply_1_0.request_id, sizeof(CORBA_unsigned_long)); buf->msg.u.locate_reply_1_0.locate_status = locate_status; giop_send_buffer_append(buf, &buf->msg.u.locate_reply_1_0.locate_status, sizeof(CORBA_unsigned_long)); return buf; }
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 || MATECORBA_ROOT_OBJECT_TYPE (obj) != MATECORBA_ROT_OBJREF) { CORBA_exception_set_system ( ev, ex_CORBA_BAD_PARAM, CORBA_COMPLETED_NO); return NULL; } if (matecorba_use_corbaloc) { out = MateCORBA_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); MateCORBA_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; }