blob: 0e0df7bc57a6d9ef3b9ff27697d838df410a375b [file] [log] [blame]
/* GiopIo.java -- Generates GIOP input/output statements.
Copyright (C) 2006 Free Software Foundation
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
package gnu.classpath.tools.giop.grmic;
import java.rmi.Remote;
import org.omg.CORBA.portable.ObjectImpl;
/**
* Generates the code for reading and writing data over GIOP stream.
*
* @author Audrius Meskauskas, Lithuania (audriusa@Bioinformatics.org)
*/
public class GiopIo
{
/**
* Get the statement for writing the variable of the given type to the GIOP ({@link org.omg.CORBA_2_3.portable.OutputStream) stream. The
* stream is always named "out".
*
* @param c
* the class of the object being written
* @param variable
* the variable, where the object value is stored
* @param r
* the parent generator, used to name the class
* @return the write statement.
*/
public static String getWriteStatement(Class c, String variable, GiopRmicCompiler r)
{
if (c.equals(boolean.class))
return "out.write_boolean(" + variable + ");";
if (c.equals(byte.class))
return "out.write_octet(" + variable + ");";
else if (c.equals(short.class))
return "out.write_int(" + variable + ");";
else if (c.equals(int.class))
return "out.write_long(" + variable + ");";
else if (c.equals(long.class))
return "out.write_long_long(" + variable + ");";
else if (c.equals(double.class))
return "out.write_double(" + variable + ");";
else if (c.equals(float.class))
return "out.write_float(" + variable + ");";
else if (c.equals(char.class))
return "out.write_char(" + variable + ");";
else if (Remote.class.isAssignableFrom(c))
return "Util.writeRemoteObject(out, " + variable + ");";
else if (ObjectImpl.class.isAssignableFrom(c))
return "out.write_Object(" + variable + ");";
else
return "out.write_value(" + variable + ", " + r.name(c) + ".class);";
}
/**
* Get the statement for reading the value of the given type from to the GIOP ({@link org.omg.CORBA_2_3.portable.InputStream) stream. The
* stream is always named "in".
*
* @param c
* the class of the object being written
* @param r
* the parent generator, used to name the class
* @return the right side of the read statement.
*/
public static String getReadStatement(Class c, GiopRmicCompiler r)
{
if (c.equals(boolean.class))
return "in.read_boolean();";
else if (c.equals(byte.class))
return "in.read_octet();";
else if (c.equals(short.class))
return "in.read_int();";
else if (c.equals(int.class))
return "in.read_long();";
else if (c.equals(long.class))
return "in.read_long_long();";
else if (c.equals(double.class))
return "in.read_double();";
else if (c.equals(float.class))
return "in.read_float();";
else if (c.equals(char.class))
return "in.read_char();";
else if (Remote.class.isAssignableFrom(c))
return "(" + r.name(c)
+ ") PortableRemoteObject.narrow(in.read_Object()," + r.name(c)
+ ".class);";
else if (ObjectImpl.class.isAssignableFrom(c))
return "in.read_Object();";
else
return "(" + r.name(c)
+ ") in.read_value(" + r.name(c) + ".class);";
}
}