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; }
void giop_send_buffer_append_string (GIOPSendBuffer *buf, const char *str) { CORBA_unsigned_long len; len = strlen (str) + 1; /* FIXME: inline me ? */ giop_send_buffer_align (buf, 4); /* be cleverer for short strings */ if (buf->indirect_left >= 4 + len) { guchar *indirect = buf->indirect; memcpy (indirect, &len, 4); memcpy (indirect + 4, str, len); giop_send_buffer_append_real (buf, indirect, 4 + len); buf->indirect += 4 + len; buf->indirect_left -= 4 + len; } else { giop_send_buffer_append_copy (buf, &len, 4); giop_send_buffer_append (buf, str, len); } }
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; }
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; }
void ORBit_Context_marshal (CORBA_Context ctx, const ORBit_ContextMarshalItem *mlist, CORBA_unsigned_long nitems, GIOPSendBuffer *buf) { CORBA_unsigned_long real_nitems, ltmp; guchar *marker; int i; marker = giop_send_buffer_append_aligned (buf, &nitems, 4); if (!ctx->mappings) { real_nitems = 0; memcpy (marker, &real_nitems, 4); return; } for (real_nitems = i = 0; i < nitems; i++) { char *value; value = g_hash_table_lookup (ctx->mappings, mlist[i].str); if (!value) continue; /* Key */ giop_send_buffer_append_aligned (buf, &mlist[i].len, sizeof(mlist[i].len)); giop_send_buffer_append (buf, mlist[i].str, mlist[i].len); real_nitems++; /* Value */ ltmp = strlen (value) + 1; giop_send_buffer_append_aligned (buf, <mp, 4); giop_send_buffer_append (buf, value, ltmp); real_nitems++; } memcpy (marker, &real_nitems, 4); }
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; }
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; }