1. /*
  2. * @(#)CDRInputStream.java 1.30 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.corba.se.internal.iiop;
  8. import java.io.IOException;
  9. import java.io.Serializable;
  10. import java.math.BigDecimal;
  11. import org.omg.CORBA.TypeCode;
  12. import org.omg.CORBA.Principal;
  13. import org.omg.CORBA.Any;
  14. import com.sun.org.omg.SendingContext.CodeBase;
  15. import org.omg.CORBA.BAD_PARAM;
  16. import org.omg.CORBA.INTERNAL;
  17. import org.omg.CORBA.CompletionStatus;
  18. import com.sun.corba.se.internal.core.GIOPVersion;
  19. import com.sun.corba.se.internal.core.CodeSetConversion;
  20. import com.sun.corba.se.internal.core.OSFCodeSetRegistry;
  21. import com.sun.corba.se.internal.orbutil.MinorCodes;
  22. /**
  23. * This is delegates to the real implementation.
  24. *
  25. * NOTE:
  26. *
  27. * Before using the stream for valuetype unmarshaling, one must call
  28. * performORBVersionSpecificInit().
  29. */
  30. public abstract class CDRInputStream
  31. extends org.omg.CORBA_2_3.portable.InputStream
  32. implements com.sun.corba.se.internal.core.MarshalInputStream,
  33. org.omg.CORBA.DataInputStream
  34. {
  35. private CDRInputStreamBase impl;
  36. // We can move this out somewhere later. For now, it serves its purpose
  37. // to create a concrete CDR delegate based on the GIOP version.
  38. private static class InputStreamFactory {
  39. public static CDRInputStreamBase newInputStream(GIOPVersion version)
  40. {
  41. switch(version.intValue())
  42. {
  43. case GIOPVersion.VERSION_1_0:
  44. return new CDRInputStream_1_0();
  45. case GIOPVersion.VERSION_1_1:
  46. return new CDRInputStream_1_1();
  47. case GIOPVersion.VERSION_1_2:
  48. return new CDRInputStream_1_2();
  49. default:
  50. // REVISIT - what is appropriate? INTERNAL exceptions
  51. // are really hard to track later.
  52. throw new org.omg.CORBA.INTERNAL();
  53. }
  54. }
  55. }
  56. // Required for the case when a ClientResponseImpl is
  57. // created with a SystemException due to a dead server/closed
  58. // connection with no warning. Note that the stream will
  59. // not be initialized in this case.
  60. //
  61. // Probably also required by ServerRequestImpl.
  62. //
  63. // REVISIT.
  64. public CDRInputStream() {
  65. }
  66. public CDRInputStream(CDRInputStream is) {
  67. impl = is.impl.dup();
  68. impl.setParent(this);
  69. }
  70. public CDRInputStream(CDRInputStreamBase impl) {
  71. this.impl = impl;
  72. impl.setParent(this);
  73. }
  74. public CDRInputStream(org.omg.CORBA.ORB orb, byte[] data, int size, GIOPVersion version) {
  75. impl = InputStreamFactory.newInputStream(version);
  76. // A grow strategy is used for decoding encapsulations.
  77. // streaming behaviour is incorrect.
  78. BufferManagerRead bufMgr = new BufferManagerReadGrow();
  79. impl.init(orb, data, size, false, bufMgr);
  80. impl.setParent(this);
  81. }
  82. public CDRInputStream(org.omg.CORBA.ORB orb,
  83. byte[] data,
  84. int size,
  85. boolean littleEndian,
  86. GIOPVersion version)
  87. {
  88. impl = InputStreamFactory.newInputStream(version);
  89. BufferManagerRead bufMgr = BufferManagerFactory.newBufferManagerRead(version, orb);
  90. impl.init(orb, data, size, littleEndian, bufMgr);
  91. impl.setParent(this);
  92. }
  93. public CDRInputStream(org.omg.CORBA.ORB orb,
  94. byte[] data,
  95. int size,
  96. boolean littleEndian,
  97. GIOPVersion version,
  98. boolean allowFragmentation)
  99. {
  100. impl = InputStreamFactory.newInputStream(version);
  101. BufferManagerRead bufMgr;
  102. if (!allowFragmentation)
  103. bufMgr = new BufferManagerReadGrow();
  104. else
  105. bufMgr = BufferManagerFactory.newBufferManagerRead(version, orb);
  106. impl.init(orb, data, size, littleEndian, bufMgr);
  107. impl.setParent(this);
  108. }
  109. public CDRInputStream(org.omg.CORBA.ORB orb,
  110. boolean littleEndian,
  111. GIOPVersion version,
  112. boolean allowFragmentation)
  113. {
  114. impl = InputStreamFactory.newInputStream(version);
  115. BufferManagerRead bufMgr;
  116. if (!allowFragmentation)
  117. bufMgr = new BufferManagerReadGrow();
  118. else
  119. bufMgr = BufferManagerFactory.newBufferManagerRead(version, orb);
  120. impl.init(orb, bufMgr, littleEndian);
  121. impl.setParent(this);
  122. }
  123. // org.omg.CORBA.portable.InputStream
  124. public final boolean read_boolean() {
  125. return impl.read_boolean();
  126. }
  127. public final char read_char() {
  128. return impl.read_char();
  129. }
  130. public final char read_wchar() {
  131. return impl.read_wchar();
  132. }
  133. public final byte read_octet() {
  134. return impl.read_octet();
  135. }
  136. public final short read_short() {
  137. return impl.read_short();
  138. }
  139. public final short read_ushort() {
  140. return impl.read_ushort();
  141. }
  142. public final int read_long() {
  143. return impl.read_long();
  144. }
  145. public final int read_ulong() {
  146. return impl.read_ulong();
  147. }
  148. public final long read_longlong() {
  149. return impl.read_longlong();
  150. }
  151. public final long read_ulonglong() {
  152. return impl.read_ulonglong();
  153. }
  154. public final float read_float() {
  155. return impl.read_float();
  156. }
  157. public final double read_double() {
  158. return impl.read_double();
  159. }
  160. public final String read_string() {
  161. return impl.read_string();
  162. }
  163. public final String read_wstring() {
  164. return impl.read_wstring();
  165. }
  166. public final void read_boolean_array(boolean[] value, int offset, int length) {
  167. impl.read_boolean_array(value, offset, length);
  168. }
  169. public final void read_char_array(char[] value, int offset, int length) {
  170. impl.read_char_array(value, offset, length);
  171. }
  172. public final void read_wchar_array(char[] value, int offset, int length) {
  173. impl.read_wchar_array(value, offset, length);
  174. }
  175. public final void read_octet_array(byte[] value, int offset, int length) {
  176. impl.read_octet_array(value, offset, length);
  177. }
  178. public final void read_short_array(short[] value, int offset, int length) {
  179. impl.read_short_array(value, offset, length);
  180. }
  181. public final void read_ushort_array(short[] value, int offset, int length) {
  182. impl.read_ushort_array(value, offset, length);
  183. }
  184. public final void read_long_array(int[] value, int offset, int length) {
  185. impl.read_long_array(value, offset, length);
  186. }
  187. public final void read_ulong_array(int[] value, int offset, int length) {
  188. impl.read_ulong_array(value, offset, length);
  189. }
  190. public final void read_longlong_array(long[] value, int offset, int length) {
  191. impl.read_longlong_array(value, offset, length);
  192. }
  193. public final void read_ulonglong_array(long[] value, int offset, int length) {
  194. impl.read_ulonglong_array(value, offset, length);
  195. }
  196. public final void read_float_array(float[] value, int offset, int length) {
  197. impl.read_float_array(value, offset, length);
  198. }
  199. public final void read_double_array(double[] value, int offset, int length) {
  200. impl.read_double_array(value, offset, length);
  201. }
  202. public final org.omg.CORBA.Object read_Object() {
  203. return impl.read_Object();
  204. }
  205. public final TypeCode read_TypeCode() {
  206. return impl.read_TypeCode();
  207. }
  208. public final Any read_any() {
  209. return impl.read_any();
  210. }
  211. public final Principal read_Principal() {
  212. return impl.read_Principal();
  213. }
  214. public final int read() throws java.io.IOException {
  215. return impl.read();
  216. }
  217. public final java.math.BigDecimal read_fixed() {
  218. return impl.read_fixed();
  219. }
  220. public final org.omg.CORBA.Context read_Context() {
  221. return impl.read_Context();
  222. }
  223. public final org.omg.CORBA.Object read_Object(java.lang.Class clz) {
  224. return impl.read_Object(clz);
  225. }
  226. public final org.omg.CORBA.ORB orb() {
  227. return impl.orb();
  228. }
  229. // org.omg.CORBA_2_3.portable.InputStream
  230. public final java.io.Serializable read_value() {
  231. return impl.read_value();
  232. }
  233. public final java.io.Serializable read_value(java.lang.Class clz) {
  234. return impl.read_value(clz);
  235. }
  236. public final java.io.Serializable read_value(org.omg.CORBA.portable.BoxedValueHelper factory) {
  237. return impl.read_value(factory);
  238. }
  239. public final java.io.Serializable read_value(java.lang.String rep_id) {
  240. return impl.read_value(rep_id);
  241. }
  242. public final java.io.Serializable read_value(java.io.Serializable value) {
  243. return impl.read_value(value);
  244. }
  245. public final java.lang.Object read_abstract_interface() {
  246. return impl.read_abstract_interface();
  247. }
  248. public final java.lang.Object read_abstract_interface(java.lang.Class clz) {
  249. return impl.read_abstract_interface(clz);
  250. }
  251. // com.sun.corba.se.internal.core.MarshalInputStream
  252. public final void consumeEndian() {
  253. impl.consumeEndian();
  254. }
  255. public final int getPosition() {
  256. return impl.getPosition();
  257. }
  258. // org.omg.CORBA.DataInputStream
  259. public final java.lang.Object read_Abstract () {
  260. return impl.read_Abstract();
  261. }
  262. public final java.io.Serializable read_Value () {
  263. return impl.read_Value();
  264. }
  265. public final void read_any_array (org.omg.CORBA.AnySeqHolder seq, int offset, int length) {
  266. impl.read_any_array(seq, offset, length);
  267. }
  268. public final void read_boolean_array (org.omg.CORBA.BooleanSeqHolder seq, int offset, int length) {
  269. impl.read_boolean_array(seq, offset, length);
  270. }
  271. public final void read_char_array (org.omg.CORBA.CharSeqHolder seq, int offset, int length) {
  272. impl.read_char_array(seq, offset, length);
  273. }
  274. public final void read_wchar_array (org.omg.CORBA.WCharSeqHolder seq, int offset, int length) {
  275. impl.read_wchar_array(seq, offset, length);
  276. }
  277. public final void read_octet_array (org.omg.CORBA.OctetSeqHolder seq, int offset, int length) {
  278. impl.read_octet_array(seq, offset, length);
  279. }
  280. public final void read_short_array (org.omg.CORBA.ShortSeqHolder seq, int offset, int length) {
  281. impl.read_short_array(seq, offset, length);
  282. }
  283. public final void read_ushort_array (org.omg.CORBA.UShortSeqHolder seq, int offset, int length) {
  284. impl.read_ushort_array(seq, offset, length);
  285. }
  286. public final void read_long_array (org.omg.CORBA.LongSeqHolder seq, int offset, int length) {
  287. impl.read_long_array(seq, offset, length);
  288. }
  289. public final void read_ulong_array (org.omg.CORBA.ULongSeqHolder seq, int offset, int length) {
  290. impl.read_ulong_array(seq, offset, length);
  291. }
  292. public final void read_ulonglong_array (org.omg.CORBA.ULongLongSeqHolder seq, int offset, int length) {
  293. impl.read_ulonglong_array(seq, offset, length);
  294. }
  295. public final void read_longlong_array (org.omg.CORBA.LongLongSeqHolder seq, int offset, int length) {
  296. impl.read_longlong_array(seq, offset, length);
  297. }
  298. public final void read_float_array (org.omg.CORBA.FloatSeqHolder seq, int offset, int length) {
  299. impl.read_float_array(seq, offset, length);
  300. }
  301. public final void read_double_array (org.omg.CORBA.DoubleSeqHolder seq, int offset, int length) {
  302. impl.read_double_array(seq, offset, length);
  303. }
  304. // org.omg.CORBA.portable.ValueBase
  305. public final String[] _truncatable_ids() {
  306. return impl._truncatable_ids();
  307. }
  308. // java.io.InputStream
  309. public final int read(byte b[]) throws IOException {
  310. return impl.read(b);
  311. }
  312. public final int read(byte b[], int off, int len) throws IOException {
  313. return impl.read(b, off, len);
  314. }
  315. public final long skip(long n) throws IOException {
  316. return impl.skip(n);
  317. }
  318. public final int available() throws IOException {
  319. return impl.available();
  320. }
  321. public final void close() throws IOException {
  322. impl.close();
  323. }
  324. public final void mark(int readlimit) {
  325. impl.mark(readlimit);
  326. }
  327. public final void reset() {
  328. impl.reset();
  329. }
  330. public final boolean markSupported() {
  331. return impl.markSupported();
  332. }
  333. public abstract CDRInputStream dup();
  334. // Needed by TCUtility
  335. public final java.math.BigDecimal read_fixed(short digits, short scale) {
  336. return impl.read_fixed(digits, scale);
  337. }
  338. public final boolean isLittleEndian() {
  339. return impl.isLittleEndian();
  340. }
  341. protected final byte[] getByteBuffer() {
  342. return impl.getByteBuffer();
  343. }
  344. protected final void setByteBuffer(byte buffer[]) {
  345. impl.setByteBuffer(buffer);
  346. }
  347. public final int getBufferLength() {
  348. return impl.getBufferLength();
  349. }
  350. protected final void setBufferLength(int value) {
  351. impl.setBufferLength(value);
  352. }
  353. protected final int getIndex() {
  354. return impl.getIndex();
  355. }
  356. protected final void setIndex(int value) {
  357. impl.setIndex(value);
  358. }
  359. public final void orb(org.omg.CORBA.ORB orb) {
  360. impl.orb(orb);
  361. }
  362. public final GIOPVersion getGIOPVersion() {
  363. return impl.getGIOPVersion();
  364. }
  365. public final BufferManagerRead getBufferManager() {
  366. return impl.getBufferManager();
  367. }
  368. // This should be overridden by any stream (ex: IIOPInputStream)
  369. // which wants to read values. Thus, TypeCodeInputStream doesn't
  370. // have to do this.
  371. public CodeBase getCodeBase() {
  372. return null;
  373. }
  374. // Use Latin-1 for GIOP 1.0 or when code set negotiation was not
  375. // performed.
  376. protected CodeSetConversion.BTCConverter createCharBTCConverter() {
  377. return CodeSetConversion.impl().getBTCConverter(OSFCodeSetRegistry.ISO_8859_1,
  378. impl.isLittleEndian());
  379. }
  380. // Subclasses must decide what to do here. It's inconvenient to
  381. // make the class and this method abstract because of dup().
  382. protected abstract CodeSetConversion.BTCConverter createWCharBTCConverter();
  383. // Prints the current buffer in a human readable form
  384. void printBuffer() {
  385. impl.printBuffer();
  386. }
  387. /**
  388. * Aligns the current position on the given octet boundary
  389. * if there are enough bytes available to do so. Otherwise,
  390. * it just returns. This is used for some (but not all)
  391. * GIOP 1.2 message headers.
  392. */
  393. public void alignOnBoundary(int octetBoundary) {
  394. impl.alignOnBoundary(octetBoundary);
  395. }
  396. /**
  397. * This must be called after determining the proper ORB version,
  398. * and setting it on the stream's ORB instance. It can be called
  399. * after reading the service contexts, since that is the only place
  400. * we can get the ORB version info.
  401. *
  402. * Trying to unmarshal things requiring repository IDs before calling
  403. * this will result in NullPtrExceptions.
  404. */
  405. public void performORBVersionSpecificInit() {
  406. // In the case of SystemExceptions, a stream is created
  407. // with its default constructor (and thus no impl is set).
  408. if (impl != null)
  409. impl.performORBVersionSpecificInit();
  410. }
  411. /**
  412. * Resets any internal references to code set converters.
  413. * This is useful for forcing the CDR stream to reacquire
  414. * converters (probably from its subclasses) when state
  415. * has changed.
  416. */
  417. public void resetCodeSetConverters() {
  418. impl.resetCodeSetConverters();
  419. }
  420. }