in yoko-core/src/main/java/org/apache/yoko/orb/CORBA/OutputStream.java [1337:1855]
public void write_InputStream(org.omg.CORBA.portable.InputStream in,
org.omg.CORBA.TypeCode tc) {
InputStream obin = null;
try {
obin = (InputStream) in;
} catch (ClassCastException ex) {
// InputStream may have been created by a different ORB
}
try {
LOGGER.fine("writing a value of type " + tc.kind().value());
switch (tc.kind().value()) {
case org.omg.CORBA.TCKind._tk_null:
case org.omg.CORBA.TCKind._tk_void:
break;
case org.omg.CORBA.TCKind._tk_short:
case org.omg.CORBA.TCKind._tk_ushort:
write_short(in.read_short());
break;
case org.omg.CORBA.TCKind._tk_long:
case org.omg.CORBA.TCKind._tk_ulong:
case org.omg.CORBA.TCKind._tk_float:
case org.omg.CORBA.TCKind._tk_enum:
write_long(in.read_long());
break;
case org.omg.CORBA.TCKind._tk_double:
case org.omg.CORBA.TCKind._tk_longlong:
case org.omg.CORBA.TCKind._tk_ulonglong:
write_longlong(in.read_longlong());
break;
case org.omg.CORBA.TCKind._tk_boolean:
case org.omg.CORBA.TCKind._tk_octet:
write_octet(in.read_octet());
break;
case org.omg.CORBA.TCKind._tk_char:
write_char(in.read_char());
break;
case org.omg.CORBA.TCKind._tk_wchar:
write_wchar(in.read_wchar());
break;
case org.omg.CORBA.TCKind._tk_fixed:
write_fixed(in.read_fixed());
break;
case org.omg.CORBA.TCKind._tk_any: {
// Don't do this: write_any(in.read_any())
// This is faster:
org.omg.CORBA.TypeCode p = in.read_TypeCode();
write_TypeCode(p);
write_InputStream(in, p);
break;
}
case org.omg.CORBA.TCKind._tk_TypeCode: {
// Don't do this: write_TypeCode(in.read_TypeCode())
// This is faster:
int kind = in.read_ulong();
//
// An indirection is not permitted at this level
//
if (kind == -1) {
throw new org.omg.CORBA.MARSHAL(
org.apache.yoko.orb.OB.MinorCodes
.describeMarshal(org.apache.yoko.orb.OB.MinorCodes.MinorReadInvTypeCodeIndirection),
org.apache.yoko.orb.OB.MinorCodes.MinorReadInvTypeCodeIndirection,
org.omg.CORBA.CompletionStatus.COMPLETED_NO);
}
write_ulong(kind);
switch (kind) {
case org.omg.CORBA.TCKind._tk_null:
case org.omg.CORBA.TCKind._tk_void:
case org.omg.CORBA.TCKind._tk_short:
case org.omg.CORBA.TCKind._tk_long:
case org.omg.CORBA.TCKind._tk_ushort:
case org.omg.CORBA.TCKind._tk_ulong:
case org.omg.CORBA.TCKind._tk_float:
case org.omg.CORBA.TCKind._tk_double:
case org.omg.CORBA.TCKind._tk_boolean:
case org.omg.CORBA.TCKind._tk_char:
case org.omg.CORBA.TCKind._tk_octet:
case org.omg.CORBA.TCKind._tk_any:
case org.omg.CORBA.TCKind._tk_TypeCode:
case org.omg.CORBA.TCKind._tk_Principal:
case org.omg.CORBA.TCKind._tk_longlong:
case org.omg.CORBA.TCKind._tk_ulonglong:
case org.omg.CORBA.TCKind._tk_longdouble:
case org.omg.CORBA.TCKind._tk_wchar:
break;
case org.omg.CORBA.TCKind._tk_fixed:
write_ushort(in.read_ushort());
write_short(in.read_short());
break;
case org.omg.CORBA.TCKind._tk_objref:
case org.omg.CORBA.TCKind._tk_struct:
case org.omg.CORBA.TCKind._tk_union:
case org.omg.CORBA.TCKind._tk_enum:
case org.omg.CORBA.TCKind._tk_sequence:
case org.omg.CORBA.TCKind._tk_array:
case org.omg.CORBA.TCKind._tk_alias:
case org.omg.CORBA.TCKind._tk_except:
case org.omg.CORBA.TCKind._tk_value:
case org.omg.CORBA.TCKind._tk_value_box:
case org.omg.CORBA.TCKind._tk_abstract_interface:
case org.omg.CORBA.TCKind._tk_native:
case org.omg.CORBA_2_4.TCKind._tk_local_interface: {
final int len = in.read_ulong();
write_ulong(len);
addCapacity(len);
in.read_octet_array(buf_.data_, buf_.pos_, len);
buf_.pos_ += len;
break;
}
case org.omg.CORBA.TCKind._tk_string:
case org.omg.CORBA.TCKind._tk_wstring: {
int bound = in.read_ulong();
write_ulong(bound);
break;
}
default:
throw new InternalError();
}
break;
}
case org.omg.CORBA.TCKind._tk_Principal:
write_Principal(in.read_Principal());
break;
case org.omg.CORBA.TCKind._tk_objref: {
// Don't do this: write_Object(in.read_Object())
// This is faster:
org.omg.IOP.IOR ior = org.omg.IOP.IORHelper.read(in);
org.omg.IOP.IORHelper.write(this, ior);
break;
}
case org.omg.CORBA.TCKind._tk_struct:
for (int i = 0; i < tc.member_count(); i++)
write_InputStream(in, tc.member_type(i));
break;
case org.omg.CORBA.TCKind._tk_except:
write_string(in.read_string());
for (int i = 0; i < tc.member_count(); i++)
write_InputStream(in, tc.member_type(i));
break;
case org.omg.CORBA.TCKind._tk_union: {
int defaultIndex = tc.default_index();
int memberIndex = -1;
org.omg.CORBA.TypeCode origDiscType = TypeCode
._OB_getOrigType(tc.discriminator_type());
switch (origDiscType.kind().value()) {
case org.omg.CORBA.TCKind._tk_short: {
short val = in.read_short();
write_short(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_short()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_ushort: {
short val = in.read_ushort();
write_ushort(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_ushort()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_long: {
int val = in.read_long();
write_long(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_long()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_ulong: {
int val = in.read_ulong();
write_ulong(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_ulong()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_longlong: {
long val = in.read_longlong();
write_longlong(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_longlong()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_ulonglong: {
long val = in.read_ulonglong();
write_ulonglong(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_ulonglong()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_char: {
char val = in.read_char();
write_char(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_char()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_boolean: {
boolean val = in.read_boolean();
write_boolean(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).extract_boolean()) {
memberIndex = i;
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_enum: {
int val = in.read_long();
write_long(val);
for (int i = 0; i < tc.member_count(); i++)
if (i != defaultIndex) {
if (val == tc.member_label(i).create_input_stream()
.read_long()) {
memberIndex = i;
break;
}
}
break;
}
default:
org.apache.yoko.orb.OB.Assert._OB_assert("Invalid typecode in tk_union");
}
if (memberIndex >= 0)
write_InputStream(in, tc.member_type(memberIndex));
else if (defaultIndex >= 0)
write_InputStream(in, tc.member_type(defaultIndex));
break;
}
case org.omg.CORBA.TCKind._tk_string:
write_string(in.read_string());
break;
case org.omg.CORBA.TCKind._tk_wstring:
write_wstring(in.read_wstring());
break;
case org.omg.CORBA.TCKind._tk_sequence:
case org.omg.CORBA.TCKind._tk_array: {
int len;
if (tc.kind().value() == org.omg.CORBA.TCKind._tk_sequence) {
len = in.read_ulong();
write_ulong(len);
} else
len = tc.length();
if (len > 0) {
org.omg.CORBA.TypeCode origContentType = TypeCode
._OB_getOrigType(tc.content_type());
switch (origContentType.kind().value()) {
case org.omg.CORBA.TCKind._tk_null:
case org.omg.CORBA.TCKind._tk_void:
break;
case org.omg.CORBA.TCKind._tk_short:
case org.omg.CORBA.TCKind._tk_ushort: {
if (obin == null || obin.swap_) {
short[] s = new short[len];
in.read_short_array(s, 0, len);
write_short_array(s, 0, len);
} else {
// Read one value for the alignment
write_short(obin.read_short());
final int n = 2 * (len - 1);
if (n > 0) {
// Copy the rest
addCapacity(n);
org.apache.yoko.orb.OCI.Buffer buf = obin
._OB_buffer();
System.arraycopy(buf.data_, buf.pos_,
buf_.data_, buf_.pos_, n);
buf.pos_ += n;
buf_.pos_ += n;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_long:
case org.omg.CORBA.TCKind._tk_ulong:
case org.omg.CORBA.TCKind._tk_float: {
if (obin == null || obin.swap_) {
int[] i = new int[len];
in.read_long_array(i, 0, len);
write_long_array(i, 0, len);
} else {
// Read one value for the alignment
write_long(obin.read_long());
final int n = 4 * (len - 1);
if (n > 0) {
// Copy the rest
addCapacity(n);
org.apache.yoko.orb.OCI.Buffer buf = obin
._OB_buffer();
System.arraycopy(buf.data_, buf.pos_,
buf_.data_, buf_.pos_, n);
buf.pos_ += n;
buf_.pos_ += n;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_double:
case org.omg.CORBA.TCKind._tk_longlong:
case org.omg.CORBA.TCKind._tk_ulonglong: {
if (obin == null || obin.swap_) {
long[] l = new long[len];
in.read_longlong_array(l, 0, len);
write_longlong_array(l, 0, len);
} else {
// Read one value for the alignment
write_longlong(obin.read_longlong());
final int n = 8 * (len - 1);
if (n > 0) {
// Copy the rest
addCapacity(n);
org.apache.yoko.orb.OCI.Buffer buf = obin
._OB_buffer();
System.arraycopy(buf.data_, buf.pos_,
buf_.data_, buf_.pos_, n);
buf.pos_ += n;
buf_.pos_ += n;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_boolean:
case org.omg.CORBA.TCKind._tk_octet:
if (obin == null) {
addCapacity(len);
in.read_octet_array(buf_.data_, buf_.pos_, len);
buf_.pos_ += len;
} else {
addCapacity(len);
org.apache.yoko.orb.OCI.Buffer buf = obin
._OB_buffer();
System.arraycopy(buf.data_, buf.pos_, buf_.data_,
buf_.pos_, len);
buf.pos_ += len;
buf_.pos_ += len;
}
break;
case org.omg.CORBA.TCKind._tk_char:
if (charWriterRequired_ || charConversionRequired_) {
char[] ch = new char[len];
in.read_char_array(ch, 0, len);
write_char_array(ch, 0, len);
} else {
addCapacity(len);
in.read_octet_array(buf_.data_, buf_.pos_, len);
buf_.pos_ += len;
}
break;
case org.omg.CORBA.TCKind._tk_wchar: {
char[] wch = new char[len];
in.read_wchar_array(wch, 0, len);
write_wchar_array(wch, 0, len);
break;
}
case org.omg.CORBA.TCKind._tk_alias:
org.apache.yoko.orb.OB.Assert._OB_assert("tk_alias not supported in tk_array or tk_sequence");
break;
default:
for (int i = 0; i < len; i++)
write_InputStream(in, tc.content_type());
break;
}
}
break;
}
case org.omg.CORBA.TCKind._tk_alias:
write_InputStream(in, tc.content_type());
break;
case org.omg.CORBA.TCKind._tk_value:
case org.omg.CORBA.TCKind._tk_value_box:
if (obin == null) {
org.omg.CORBA_2_3.portable.InputStream i = (org.omg.CORBA_2_3.portable.InputStream) in;
write_value(i.read_value());
} else
obin._OB_remarshalValue(tc, this);
break;
case org.omg.CORBA.TCKind._tk_abstract_interface: {
boolean b = in.read_boolean();
write_boolean(b);
if (b) {
write_Object(in.read_Object());
} else {
if (obin == null) {
org.omg.CORBA_2_3.portable.InputStream i = (org.omg.CORBA_2_3.portable.InputStream) in;
write_value(i.read_value());
} else {
//
// We have no TypeCode information about the
// valuetype, so we must use _tc_ValueBase and
// rely on the type information sent on the wire
//
obin._OB_remarshalValue(org.omg.CORBA.ValueBaseHelper
.type(), this);
}
}
break;
}
case org.omg.CORBA_2_4.TCKind._tk_local_interface:
case org.omg.CORBA.TCKind._tk_native:
default:
org.apache.yoko.orb.OB.Assert._OB_assert("unsupported types");
}
} catch (org.omg.CORBA.TypeCodePackage.BadKind ex) {
org.apache.yoko.orb.OB.Assert._OB_assert(ex);
} catch (org.omg.CORBA.TypeCodePackage.Bounds ex) {
org.apache.yoko.orb.OB.Assert._OB_assert(ex);
}
}