public void writeTypeCodeImpl()

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);
            }
        }
    }