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