001/* TaggedProfileHelper.java --
002   Copyright (C) 2005 Free Software Foundation, Inc.
003
004This file is part of GNU Classpath.
005
006GNU Classpath is free software; you can redistribute it and/or modify
007it under the terms of the GNU General Public License as published by
008the Free Software Foundation; either version 2, or (at your option)
009any later version.
010
011GNU Classpath is distributed in the hope that it will be useful, but
012WITHOUT ANY WARRANTY; without even the implied warranty of
013MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014General Public License for more details.
015
016You should have received a copy of the GNU General Public License
017along with GNU Classpath; see the file COPYING.  If not, write to the
018Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
01902110-1301 USA.
020
021Linking this library statically or dynamically with other modules is
022making a combined work based on this library.  Thus, the terms and
023conditions of the GNU General Public License cover the whole
024combination.
025
026As a special exception, the copyright holders of this library give you
027permission to link this library with independent modules to produce an
028executable, regardless of the license terms of these independent
029modules, and to copy and distribute the resulting executable under
030terms of your choice, provided that you also meet, for each linked
031independent module, the terms and conditions of the license of that
032module.  An independent module is a module which is not derived from
033or based on this library.  If you modify this library, you may extend
034this exception to your version of the library, but you are not
035obligated to do so.  If you do not wish to do so, delete this
036exception statement from your version. */
037
038
039package org.omg.IOP;
040
041import gnu.CORBA.Minor;
042import gnu.CORBA.OrbRestricted;
043import gnu.CORBA.CDR.BufferredCdrInput;
044import gnu.CORBA.CDR.BufferedCdrOutput;
045
046import org.omg.CORBA.Any;
047import org.omg.CORBA.BAD_OPERATION;
048import org.omg.CORBA.MARSHAL;
049import org.omg.CORBA.ORB;
050import org.omg.CORBA.StructMember;
051import org.omg.CORBA.TCKind;
052import org.omg.CORBA.TypeCode;
053import org.omg.CORBA.portable.InputStream;
054import org.omg.CORBA.portable.OutputStream;
055
056import java.io.IOException;
057
058/**
059 * A helper operations for the structure {@link TaggedProfile}.
060 *
061 * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
062 */
063public abstract class TaggedProfileHelper
064{
065  /**
066   * Create the TaggedProfile typecode (structure, named "TaggedProfile"). The
067   * typecode states that the structure contains the following fields: tag,
068   * profile_data.
069   */
070  public static TypeCode type()
071  {
072    ORB orb = OrbRestricted.Singleton;
073    StructMember[] members = new StructMember[2];
074
075    TypeCode field;
076
077    field = orb.create_alias_tc("IDL:omg.org/IOP/ProfileId:1.0", "ProfileId",
078                                orb.get_primitive_tc(TCKind.tk_ulong));
079    members[0] = new StructMember("tag", field, null);
080
081    field = orb.create_sequence_tc(0, orb.get_primitive_tc(TCKind.tk_octet));
082    members[1] = new StructMember("profile_data", field, null);
083    return orb.create_struct_tc(id(), "TaggedProfile", members);
084  }
085
086  /**
087   * Insert the TaggedProfile into the given Any. This method uses the
088   * TaggedProfileHolder.
089   *
090   * @param any the Any to insert into.
091   * @param that the TaggedProfile to insert.
092   */
093  public static void insert(Any any, TaggedProfile that)
094  {
095    any.insert_Streamable(new TaggedProfileHolder(that));
096  }
097
098  /**
099   * Extract the TaggedProfile from given Any. This method uses the
100   * TaggedProfileHolder.
101   *
102   * @throws BAD_OPERATION if the passed Any does not contain TaggedProfile.
103   */
104  public static TaggedProfile extract(Any any)
105  {
106    try
107      {
108        return ((TaggedProfileHolder) any.extract_Streamable()).value;
109      }
110    catch (ClassCastException cex)
111      {
112        BAD_OPERATION bad = new BAD_OPERATION("TaggedProfile expected");
113        bad.minor = Minor.Any;
114        bad.initCause(cex);
115        throw bad;
116      }
117  }
118
119  /**
120   * Get the TaggedProfile repository id.
121   *
122   * @return "IDL:omg.org/IOP/TaggedProfile:1.0", always.
123   */
124  public static String id()
125  {
126    return "IDL:omg.org/IOP/TaggedProfile:1.0";
127  }
128
129  /**
130   * Read the structure from the CDR intput stream.
131   *
132   * @param input a org.omg.CORBA.portable stream to read from.
133   */
134  public static TaggedProfile read(InputStream input)
135  {
136    TaggedProfile value = new TaggedProfile();
137    value.tag = input.read_long();
138
139    if (input instanceof BufferredCdrInput)
140      {
141        // Highly probable.
142        value.profile_data = ((BufferredCdrInput) input).read_sequence();
143      }
144    else
145      {
146        value.profile_data = new byte[input.read_long()];
147        for (int i0 = 0; i0 < value.profile_data.length; i0++)
148          value.profile_data[i0] = input.read_octet();
149      }
150    return value;
151  }
152
153  /**
154   * Write the structure to the CDR output stream.
155   *
156   * @param output a org.omg.CORBA.portable stream stream to write into.
157   * @param value a value to write.
158   */
159  public static void write(OutputStream output, TaggedProfile value)
160  {
161    output.write_long(value.tag);
162
163    if (output instanceof BufferedCdrOutput)
164      {
165        // Highly probable.
166        output.write_long(value.profile_data.length);
167        try
168          {
169            output.write(value.profile_data);
170          }
171        catch (IOException e)
172          {
173            MARSHAL m = new MARSHAL();
174            m.minor = Minor.Encapsulation;
175            m.initCause(e);
176            throw m;
177          }
178      }
179    else
180      {
181        output.write_long(value.profile_data.length);
182        for (int i0 = 0; i0 < value.profile_data.length; i0++)
183          output.write_octet(value.profile_data[i0]);
184      }
185  }
186}