public void write_InputStream()

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