in yoko-core/src/main/java/org/apache/yoko/orb/CORBA/OutputStream.java [83:388]
public void writeTypeCodeImpl(org.omg.CORBA.TypeCode tc,
java.util.Hashtable history) {
//
// Try casting the TypeCode to org.apache.yoko.orb.CORBA.TypeCode. This
// could
// fail if the TypeCode was created by a foreign singleton ORB.
//
TypeCode obTC = null;
try {
obTC = (TypeCode) tc;
} catch (ClassCastException ex) {
}
if (obTC != null) {
if (obTC.recId_ != null) {
if (obTC.recType_ == null)
throw new org.omg.CORBA.BAD_TYPECODE(
org.apache.yoko.orb.OB.MinorCodes
.describeBadTypecode(org.apache.yoko.orb.OB.MinorCodes.MinorIncompleteTypeCode),
org.apache.yoko.orb.OB.MinorCodes.MinorIncompleteTypeCode,
org.omg.CORBA.CompletionStatus.COMPLETED_NO);
writeTypeCodeImpl(obTC.recType_, history);
return;
}
}
LOGGER.finest("Writing a type code of type " + tc.kind().value());
//
// For performance reasons, handle the primitive TypeCodes first
//
switch (tc.kind().value()) {
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_longlong:
case org.omg.CORBA.TCKind._tk_ushort:
case org.omg.CORBA.TCKind._tk_ulong:
case org.omg.CORBA.TCKind._tk_ulonglong:
case org.omg.CORBA.TCKind._tk_float:
case org.omg.CORBA.TCKind._tk_double:
case org.omg.CORBA.TCKind._tk_longdouble:
case org.omg.CORBA.TCKind._tk_boolean:
case org.omg.CORBA.TCKind._tk_char:
case org.omg.CORBA.TCKind._tk_wchar:
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:
write_ulong(tc.kind().value());
return;
default:
break;
}
Integer indirectionPos = (Integer) history.get(tc);
if (indirectionPos != null) {
write_long(-1);
int offs = indirectionPos.intValue() - buf_.pos_;
LOGGER.finest("Writing an indirect type code for offset " + offs);
write_long(offs);
} else {
write_ulong(tc.kind().value());
Integer oldPos = new Integer(buf_.pos_ - 4);
try {
switch (tc.kind().value()) {
case org.omg.CORBA.TCKind._tk_fixed: {
history.put(tc, oldPos);
write_ushort(tc.fixed_digits());
write_short(tc.fixed_scale());
break;
}
case org.omg.CORBA.TCKind._tk_objref: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_struct:
case org.omg.CORBA.TCKind._tk_except: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
write_ulong(tc.member_count());
for (int i = 0; i < tc.member_count(); i++) {
write_string(tc.member_name(i));
writeTypeCodeImpl(tc.member_type(i), history);
}
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_union: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
org.omg.CORBA.TypeCode discType = tc.discriminator_type();
writeTypeCodeImpl(discType, history);
int defaultIndex = tc.default_index();
write_long(defaultIndex);
write_ulong(tc.member_count());
for (int i = 0; i < tc.member_count(); i++) {
//
// Check for default label value
//
if (i == defaultIndex) {
//
// Marshal a dummy value of the appropriate size
// for the discriminator type
//
org.omg.CORBA.TypeCode origDiscType = TypeCode
._OB_getOrigType(discType);
switch (origDiscType.kind().value()) {
case org.omg.CORBA.TCKind._tk_short:
write_short((short) 0);
break;
case org.omg.CORBA.TCKind._tk_ushort:
write_ushort((short) 0);
break;
case org.omg.CORBA.TCKind._tk_long:
write_long(0);
break;
case org.omg.CORBA.TCKind._tk_ulong:
write_ulong(0);
break;
case org.omg.CORBA.TCKind._tk_longlong:
write_longlong(0);
break;
case org.omg.CORBA.TCKind._tk_ulonglong:
write_ulonglong(0);
break;
case org.omg.CORBA.TCKind._tk_boolean:
write_boolean(false);
break;
case org.omg.CORBA.TCKind._tk_char:
write_char((char) 0);
break;
case org.omg.CORBA.TCKind._tk_enum:
write_ulong(0);
break;
default:
org.apache.yoko.orb.OB.Assert._OB_assert("Invalid sub-type in tk_union");
}
} else {
tc.member_label(i).write_value(this);
}
write_string(tc.member_name(i));
writeTypeCodeImpl(tc.member_type(i), history);
}
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_enum: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
write_ulong(tc.member_count());
for (int i = 0; i < tc.member_count(); i++)
write_string(tc.member_name(i));
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_string:
case org.omg.CORBA.TCKind._tk_wstring:
write_ulong(tc.length());
break;
case org.omg.CORBA.TCKind._tk_sequence:
case org.omg.CORBA.TCKind._tk_array: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
writeTypeCodeImpl(tc.content_type(), history);
write_ulong(tc.length());
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_alias: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
writeTypeCodeImpl(tc.content_type(), history);
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_value: {
history.put(tc, oldPos);
org.omg.CORBA.TypeCode concreteBase = tc
.concrete_base_type();
if (concreteBase == null) {
concreteBase = org.apache.yoko.orb.OB.TypeCodeFactory
.createPrimitiveTC(org.omg.CORBA.TCKind.tk_null);
}
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
write_short(tc.type_modifier());
writeTypeCodeImpl(concreteBase, history);
write_ulong(tc.member_count());
for (int i = 0; i < tc.member_count(); i++) {
write_string(tc.member_name(i));
writeTypeCodeImpl(tc.member_type(i), history);
write_short(tc.member_visibility(i));
}
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_value_box: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
writeTypeCodeImpl(tc.content_type(), history);
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_abstract_interface: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
writeLength(start);
break;
}
case org.omg.CORBA.TCKind._tk_native: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
writeLength(start);
break;
}
case org.omg.CORBA_2_4.TCKind._tk_local_interface: {
history.put(tc, oldPos);
int start = writeGap();
_OB_writeEndian();
write_string(tc.id());
write_string(tc.name());
writeLength(start);
break;
}
default:
org.apache.yoko.orb.OB.Assert._OB_assert("Invalid typecode");
}
} 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);
}
}
}