예제 #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
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);
	}
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
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);
}
예제 #6
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;
}
예제 #7
0
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;
}