예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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, &ltmp, 4);
		giop_send_buffer_append (buf, value, ltmp);
		real_nitems++;
	}

	memcpy (marker, &real_nitems, 4);
}