1 /* HeadlessInput.java --
2    Copyright (C) 2005 Free Software Foundation, Inc.
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 
39 package gnu.CORBA.CDR;
40 
41 import gnu.CORBA.Minor;
42 
43 import org.omg.CORBA.Any;
44 import org.omg.CORBA.AnySeqHolder;
45 import org.omg.CORBA.BooleanSeqHolder;
46 import org.omg.CORBA.CharSeqHolder;
47 import org.omg.CORBA.Context;
48 import org.omg.CORBA.DataInputStream;
49 import org.omg.CORBA.DoubleSeqHolder;
50 import org.omg.CORBA.FloatSeqHolder;
51 import org.omg.CORBA.LongLongSeqHolder;
52 import org.omg.CORBA.LongSeqHolder;
53 import org.omg.CORBA.MARSHAL;
54 import org.omg.CORBA.ORB;
55 import org.omg.CORBA.OctetSeqHolder;
56 import org.omg.CORBA.Principal;
57 import org.omg.CORBA.ShortSeqHolder;
58 import org.omg.CORBA.TypeCode;
59 import org.omg.CORBA.ULongLongSeqHolder;
60 import org.omg.CORBA.ULongSeqHolder;
61 import org.omg.CORBA.UShortSeqHolder;
62 import org.omg.CORBA.WCharSeqHolder;
63 import org.omg.CORBA.portable.BoxedValueHelper;
64 import org.omg.CORBA.portable.InputStream;
65 
66 import java.io.IOException;
67 import java.io.Serializable;
68 import java.math.BigDecimal;
69 
70 /**
71  * Substitutes the main stream in factories when the header is already behind.
72  * Overrides methods that may be invoked from the factory, forcing not to read
73  * the header if called first time on this stream.
74  *
75  * This stream reverts to default behavior if one or more call are made (reading
76  * value types that are nested fields of the value type).
77  *
78  * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
79  */
80 public class HeadlessInput
81   extends org.omg.CORBA_2_3.portable.InputStream
82   implements DataInputStream, gnuValueStream
83 {
84   /**
85    * Use serialVersionUID for interoperability.
86    */
87   private static final long serialVersionUID = 1;
88 
89   /**
90    * Indicates that no positional information is available.
91    */
92   static final int NONE = -1;
93 
94   /**
95    * If true, this is not the first call.
96    */
97   public boolean subsequentCalls;
98 
99   /**
100    * The enclosed stream.
101    */
102   final BufferredCdrInput stream;
103 
104   /**
105    * Create an instance, reading from the given buffer.
106    *
107    * @param a_stram a stream from where the data will be read.
108    * @param inheritSettings a stream from that endian and other settings are
109    * inherited.
110    */
HeadlessInput(BufferredCdrInput a_stream, InputStream inheritSettings)111   public HeadlessInput(BufferredCdrInput a_stream, InputStream inheritSettings)
112   {
113     stream = a_stream;
114 
115     if (inheritSettings instanceof AbstractCdrInput)
116       {
117         AbstractCdrInput t = (AbstractCdrInput) inheritSettings;
118         t.cloneSettings(stream);
119       }
120     else if (stream.orb() == null)
121       stream.setOrb(inheritSettings.orb());
122 
123     if (inheritSettings instanceof gnuValueStream
124       && stream.getRunTime() == null)
125       {
126         stream.setRunTime(((gnuValueStream) inheritSettings).getRunTime());
127       }
128   }
129 
130   /**
131    * Tries to read using boxed value helper.
132    */
read_value(BoxedValueHelper helper)133   public Serializable read_value(BoxedValueHelper helper)
134   {
135     if (subsequentCalls)
136       return stream.read_value(helper);
137     else
138       {
139         subsequentCalls = true;
140         return helper.read_value(this);
141       }
142   }
143 
144   /**
145    * Tries to locate a factory using repository id.
146    */
read_value(String repository_id)147   public Serializable read_value(String repository_id)
148   {
149     if (subsequentCalls)
150       return stream.read_value(repository_id);
151     else
152       {
153         subsequentCalls = true;
154         Serializable value = (Serializable) Vio.readValue(this, NONE, null,
155           null, repository_id, null, null);
156         return value;
157       }
158   }
159 
160   /**
161    * Try to read when having an unitialised value.
162    */
read_value(Serializable value)163   public Serializable read_value(Serializable value)
164   {
165     if (subsequentCalls)
166       return stream.read_value(value);
167     else
168       {
169         subsequentCalls = true;
170         value = (Serializable) Vio.readValue(this, NONE, value, null, null,
171           null, null);
172         return value;
173       }
174   }
175 
176   /**
177    * Try to read when having an unitialised value.
178    */
read_value(Class clz)179   public Serializable read_value(Class clz)
180   {
181     if (subsequentCalls)
182       return stream.read_value(clz);
183     else
184       {
185         try
186           {
187             subsequentCalls = true;
188             Serializable value = (Serializable) Vio.instantiateAnyWay(clz);
189             value = (Serializable) Vio.readValue(this, NONE, value, null, null,
190               null, null);
191             return value;
192           }
193         catch (Exception ex)
194           {
195             MARSHAL m = new MARSHAL("Can't read an instance of "
196               + clz.getName());
197             m.minor = Minor.Value;
198             m.initCause(ex);
199             throw m;
200           }
201       }
202   }
203 
204   /**
205    * Delegates functionality to the underlying stream.
206    */
available()207   public int available()
208     throws IOException
209   {
210     return stream.available();
211   }
212 
213   /**
214    * Delegates functionality to the underlying stream.
215    */
close()216   public void close()
217     throws IOException
218   {
219     stream.close();
220   }
221 
222   /**
223    * Delegates functionality to the underlying stream.
224    */
mark(int readlimit)225   public void mark(int readlimit)
226   {
227     stream.mark(readlimit);
228   }
229 
230   /**
231    * Delegates functionality to the underlying stream.
232    */
markSupported()233   public boolean markSupported()
234   {
235     return stream.markSupported();
236   }
237 
238   /**
239    * Delegates functionality to the underlying stream.
240    */
orb()241   public ORB orb()
242   {
243     return stream.orb();
244   }
245 
246   /**
247    * Delegates functionality to the underlying stream.
248    */
read_abstract_interface()249   public Object read_abstract_interface()
250   {
251     return stream.read_abstract_interface();
252   }
253 
254   /**
255    * Delegates functionality to the underlying stream.
256    */
read_abstract_interface(Class clz)257   public Object read_abstract_interface(Class clz)
258   {
259     return stream.read_abstract_interface(clz);
260   }
261 
262   /**
263    * Delegates functionality to the underlying stream.
264    */
read_any()265   public Any read_any()
266   {
267     return stream.read_any();
268   }
269 
270   /**
271    * Delegates functionality to the underlying stream.
272    */
read_boolean_array(boolean[] value, int offset, int length)273   public void read_boolean_array(boolean[] value, int offset, int length)
274   {
275     stream.read_boolean_array(value, offset, length);
276   }
277 
278   /**
279    * Delegates functionality to the underlying stream.
280    */
read_boolean()281   public boolean read_boolean()
282   {
283     return stream.read_boolean();
284   }
285 
286   /**
287    * Delegates functionality to the underlying stream.
288    */
read_char_array(char[] value, int offset, int length)289   public void read_char_array(char[] value, int offset, int length)
290   {
291     stream.read_char_array(value, offset, length);
292   }
293 
294   /**
295    * Delegates functionality to the underlying stream.
296    */
read_char()297   public char read_char()
298   {
299     return stream.read_char();
300   }
301 
302   /**
303    * Delegates functionality to the underlying stream.
304    */
read_Context()305   public Context read_Context()
306   {
307     return stream.read_Context();
308   }
309 
310   /**
311    * Delegates functionality to the underlying stream.
312    */
read_double_array(double[] value, int offset, int length)313   public void read_double_array(double[] value, int offset, int length)
314   {
315     stream.read_double_array(value, offset, length);
316   }
317 
318   /**
319    * Delegates functionality to the underlying stream.
320    */
read_double()321   public double read_double()
322   {
323     return stream.read_double();
324   }
325 
326   /**
327    * Delegates functionality to the underlying stream.
328    */
read_fixed()329   public BigDecimal read_fixed()
330   {
331     return stream.read_fixed();
332   }
333 
334   /**
335    * Delegates functionality to the underlying stream.
336    */
read_float_array(float[] value, int offset, int length)337   public void read_float_array(float[] value, int offset, int length)
338   {
339     stream.read_float_array(value, offset, length);
340   }
341 
342   /**
343    * Delegates functionality to the underlying stream.
344    */
read_float()345   public float read_float()
346   {
347     return stream.read_float();
348   }
349 
350   /**
351    * Delegates functionality to the underlying stream.
352    */
read_long_array(int[] value, int offset, int length)353   public void read_long_array(int[] value, int offset, int length)
354   {
355     stream.read_long_array(value, offset, length);
356   }
357 
358   /**
359    * Delegates functionality to the underlying stream.
360    */
read_long()361   public int read_long()
362   {
363     return stream.read_long();
364   }
365 
366   /**
367    * Delegates functionality to the underlying stream.
368    */
read_longlong_array(long[] value, int offset, int length)369   public void read_longlong_array(long[] value, int offset, int length)
370   {
371     stream.read_longlong_array(value, offset, length);
372   }
373 
374   /**
375    * Delegates functionality to the underlying stream.
376    */
read_longlong()377   public long read_longlong()
378   {
379     return stream.read_longlong();
380   }
381 
382   /**
383    * Delegates functionality to the underlying stream.
384    */
read_Object()385   public org.omg.CORBA.Object read_Object()
386   {
387     return stream.read_Object();
388   }
389 
390   /**
391    * Delegates functionality to the underlying stream.
392    */
read_Object(Class klass)393   public org.omg.CORBA.Object read_Object(Class klass)
394   {
395     return stream.read_Object(klass);
396   }
397 
398   /**
399    * Delegates functionality to the underlying stream.
400    */
read_octet_array(byte[] value, int offset, int length)401   public void read_octet_array(byte[] value, int offset, int length)
402   {
403     stream.read_octet_array(value, offset, length);
404   }
405 
406   /**
407    * Delegates functionality to the underlying stream.
408    */
read_octet()409   public byte read_octet()
410   {
411     return stream.read_octet();
412   }
413 
414   /**
415    * Delegates functionality to the underlying stream.
416    */
read_Principal()417   public Principal read_Principal()
418   {
419     return stream.read_Principal();
420   }
421 
422   /**
423    * Delegates functionality to the underlying stream.
424    */
read_short_array(short[] value, int offset, int length)425   public void read_short_array(short[] value, int offset, int length)
426   {
427     stream.read_short_array(value, offset, length);
428   }
429 
430   /**
431    * Delegates functionality to the underlying stream.
432    */
read_short()433   public short read_short()
434   {
435     return stream.read_short();
436   }
437 
438   /**
439    * Delegates functionality to the underlying stream.
440    */
read_string()441   public String read_string()
442   {
443     return stream.read_string();
444   }
445 
446   /**
447    * Delegates functionality to the underlying stream.
448    */
read_TypeCode()449   public TypeCode read_TypeCode()
450   {
451     return stream.read_TypeCode();
452   }
453 
454   /**
455    * Delegates functionality to the underlying stream.
456    */
read_ulong_array(int[] value, int offset, int length)457   public void read_ulong_array(int[] value, int offset, int length)
458   {
459     stream.read_ulong_array(value, offset, length);
460   }
461 
462   /**
463    * Delegates functionality to the underlying stream.
464    */
read_ulong()465   public int read_ulong()
466   {
467     return stream.read_ulong();
468   }
469 
470   /**
471    * Delegates functionality to the underlying stream.
472    */
read_ulonglong_array(long[] value, int offset, int length)473   public void read_ulonglong_array(long[] value, int offset, int length)
474   {
475     stream.read_ulonglong_array(value, offset, length);
476   }
477 
478   /**
479    * Delegates functionality to the underlying stream.
480    */
read_ulonglong()481   public long read_ulonglong()
482   {
483     return stream.read_ulonglong();
484   }
485 
486   /**
487    * Delegates functionality to the underlying stream.
488    */
read_ushort_array(short[] value, int offset, int length)489   public void read_ushort_array(short[] value, int offset, int length)
490   {
491     stream.read_ushort_array(value, offset, length);
492   }
493 
494   /**
495    * Delegates functionality to the underlying stream.
496    */
read_ushort()497   public short read_ushort()
498   {
499     return stream.read_ushort();
500   }
501 
502   /**
503    * Delegates functionality to the underlying stream.
504    */
read_value()505   public Serializable read_value()
506   {
507     return read_value((Serializable) null);
508   }
509 
510   /**
511    * Delegates functionality to the underlying stream.
512    */
read_wchar_array(char[] value, int offset, int length)513   public void read_wchar_array(char[] value, int offset, int length)
514   {
515     stream.read_wchar_array(value, offset, length);
516   }
517 
518   /**
519    * Delegates functionality to the underlying stream.
520    */
read_wchar()521   public char read_wchar()
522   {
523     return stream.read_wchar();
524   }
525 
526   /**
527    * Delegates functionality to the underlying stream.
528    */
read_wstring()529   public String read_wstring()
530   {
531     return stream.read_wstring();
532   }
533 
534   /**
535    * Delegates functionality to the underlying stream.
536    */
read()537   public int read()
538     throws IOException
539   {
540     return stream.read();
541   }
542 
543   /**
544    * Delegates functionality to the underlying stream.
545    */
read(byte[] b, int off, int len)546   public int read(byte[] b, int off, int len)
547     throws IOException
548   {
549     return stream.read(b, off, len);
550   }
551 
552   /**
553    * Delegates functionality to the underlying stream.
554    */
read(byte[] b)555   public int read(byte[] b)
556     throws IOException
557   {
558     return stream.read(b);
559   }
560 
561   /**
562    * Delegates functionality to the underlying stream.
563    */
reset()564   public void reset()
565     throws IOException
566   {
567     stream.reset();
568   }
569 
570   /**
571    * Delegates functionality to the underlying stream.
572    */
skip(long n)573   public long skip(long n)
574     throws IOException
575   {
576     return stream.skip(n);
577   }
578 
579   /**
580    * Get a string representation.
581    */
toString()582   public String toString()
583   {
584     return "HeadlessInput+" + stream.toString();
585   }
586 
587   /**
588    * Delegates functionality to the underlying stream.
589    */
_truncatable_ids()590   public String[] _truncatable_ids()
591   {
592     return stream._truncatable_ids();
593   }
594 
595   /**
596    * Delegates functionality to the underlying stream.
597    */
read_Abstract()598   public Object read_Abstract()
599   {
600     return stream.read_Abstract();
601   }
602 
603   /**
604    * Delegates functionality to the underlying stream.
605    */
read_any_array(AnySeqHolder holder, int offset, int length)606   public void read_any_array(AnySeqHolder holder, int offset, int length)
607   {
608     stream.read_any_array(holder, offset, length);
609   }
610 
611   /**
612    * Delegates functionality to the underlying stream.
613    */
read_boolean_array(BooleanSeqHolder holder, int offset, int length)614   public void read_boolean_array(BooleanSeqHolder holder, int offset, int length)
615   {
616     stream.read_boolean_array(holder, offset, length);
617   }
618 
619   /**
620    * Delegates functionality to the underlying stream.
621    */
read_char_array(CharSeqHolder holder, int offset, int length)622   public void read_char_array(CharSeqHolder holder, int offset, int length)
623   {
624     stream.read_char_array(holder, offset, length);
625   }
626 
627   /**
628    * Delegates functionality to the underlying stream.
629    */
read_double_array(DoubleSeqHolder holder, int offset, int length)630   public void read_double_array(DoubleSeqHolder holder, int offset, int length)
631   {
632     stream.read_double_array(holder, offset, length);
633   }
634 
635   /**
636    * Delegates functionality to the underlying stream.
637    */
read_float_array(FloatSeqHolder holder, int offset, int length)638   public void read_float_array(FloatSeqHolder holder, int offset, int length)
639   {
640     stream.read_float_array(holder, offset, length);
641   }
642 
643   /**
644    * Delegates functionality to the underlying stream.
645    */
read_long_array(LongSeqHolder holder, int offset, int length)646   public void read_long_array(LongSeqHolder holder, int offset, int length)
647   {
648     stream.read_long_array(holder, offset, length);
649   }
650 
651   /**
652    * Delegates functionality to the underlying stream.
653    */
read_longlong_array(LongLongSeqHolder holder, int offset, int length)654   public void read_longlong_array(LongLongSeqHolder holder, int offset,
655     int length)
656   {
657     stream.read_longlong_array(holder, offset, length);
658   }
659 
660   /**
661    * Delegates functionality to the underlying stream.
662    */
read_octet_array(OctetSeqHolder holder, int offset, int length)663   public void read_octet_array(OctetSeqHolder holder, int offset, int length)
664   {
665     stream.read_octet_array(holder, offset, length);
666   }
667 
668   /**
669    * Delegates functionality to the underlying stream.
670    */
read_short_array(ShortSeqHolder holder, int offset, int length)671   public void read_short_array(ShortSeqHolder holder, int offset, int length)
672   {
673     stream.read_short_array(holder, offset, length);
674   }
675 
676   /**
677    * Delegates functionality to the underlying stream.
678    */
read_ulong_array(ULongSeqHolder holder, int offset, int length)679   public void read_ulong_array(ULongSeqHolder holder, int offset, int length)
680   {
681     stream.read_ulong_array(holder, offset, length);
682   }
683 
684   /**
685    * Delegates functionality to the underlying stream.
686    */
read_ulonglong_array(ULongLongSeqHolder holder, int offset, int length)687   public void read_ulonglong_array(ULongLongSeqHolder holder, int offset,
688     int length)
689   {
690     stream.read_ulonglong_array(holder, offset, length);
691   }
692 
693   /**
694    * Delegates functionality to the underlying stream.
695    */
read_ushort_array(UShortSeqHolder holder, int offset, int length)696   public void read_ushort_array(UShortSeqHolder holder, int offset, int length)
697   {
698     stream.read_ushort_array(holder, offset, length);
699   }
700 
701   /**
702    * Delegates functionality to read_value.
703    */
read_Value()704   public Serializable read_Value()
705   {
706     return read_value();
707   }
708 
709   /**
710    * Delegates functionality to the underlying stream.
711    */
read_wchar_array(WCharSeqHolder holder, int offset, int length)712   public void read_wchar_array(WCharSeqHolder holder, int offset, int length)
713   {
714     stream.read_wchar_array(holder, offset, length);
715   }
716 
717   /**
718    * Delegates functionality to the underlying stream.
719    */
getPosition()720   public int getPosition()
721   {
722     return stream.getPosition();
723   }
724 
725   /**
726    * Delegates functionality to the underlying stream.
727    */
getRunTime()728   public gnuRuntime getRunTime()
729   {
730     return stream.runtime;
731   }
732 
733   /**
734    * Replace the instance of RunTime.
735    */
setRunTime(gnuRuntime a_runtime)736   public void setRunTime(gnuRuntime a_runtime)
737   {
738     stream.runtime = a_runtime;
739   }
740 
741   /**
742    * Delegates functionality to the underlying stream.
743    */
seek(int position)744   public void seek(int position)
745   {
746     stream.seek(position);
747   }
748 
749 }