1. /*
  2. * @(#)CDROutputStream.java 1.24 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 org.omg.CORBA.INTERNAL;
  15. import org.omg.CORBA.BAD_PARAM;
  16. import org.omg.CORBA.CompletionStatus;
  17. import com.sun.corba.se.internal.core.GIOPVersion;
  18. import com.sun.corba.se.internal.core.CodeSetConversion;
  19. import com.sun.corba.se.internal.core.OSFCodeSetRegistry;
  20. import com.sun.corba.se.internal.orbutil.ORBConstants;
  21. import com.sun.corba.se.internal.orbutil.MinorCodes;
  22. /**
  23. * This is delegates to the real implementation.
  24. */
  25. public abstract class CDROutputStream
  26. extends org.omg.CORBA_2_3.portable.OutputStream
  27. implements com.sun.corba.se.internal.core.MarshalOutputStream,
  28. org.omg.CORBA.DataOutputStream
  29. {
  30. private CDROutputStreamBase impl;
  31. // We can move this out somewhere later. For now, it serves its purpose
  32. // to create a concrete CDR delegate based on the GIOP version.
  33. private static class OutputStreamFactory {
  34. public static CDROutputStreamBase newOutputStream(GIOPVersion version)
  35. {
  36. switch(version.intValue())
  37. {
  38. case GIOPVersion.VERSION_1_0:
  39. return new CDROutputStream_1_0();
  40. case GIOPVersion.VERSION_1_1:
  41. return new CDROutputStream_1_1();
  42. case GIOPVersion.VERSION_1_2:
  43. return new CDROutputStream_1_2();
  44. default:
  45. // REVISIT - what is appropriate? INTERNAL exceptions
  46. // are really hard to track later.
  47. throw new org.omg.CORBA.INTERNAL();
  48. }
  49. }
  50. }
  51. // Called by IIOPOutputStream
  52. public CDROutputStream(org.omg.CORBA.ORB orb,
  53. GIOPVersion version)
  54. {
  55. impl = OutputStreamFactory.newOutputStream(version);
  56. BufferManagerWrite bufMgr
  57. = BufferManagerFactory.newBufferManagerWrite(version, orb);
  58. impl.init(orb, bufMgr);
  59. impl.setParent(this);
  60. }
  61. // Required by EncapsOutputStream
  62. public CDROutputStream(org.omg.CORBA.ORB orb,
  63. GIOPVersion version,
  64. boolean allowFragmentation,
  65. boolean littleEndian) {
  66. int size;
  67. if (orb != null)
  68. size = ((com.sun.corba.se.internal.corba.ORB)orb).getGIOPBufferSize();
  69. else
  70. size = ORBConstants.GIOP_DEFAULT_BUFFER_SIZE;
  71. BufferManagerWrite bufMgr;
  72. if (!allowFragmentation)
  73. bufMgr = new BufferManagerWriteGrow(size);
  74. else
  75. bufMgr = BufferManagerFactory.newBufferManagerWrite(version, orb, size);
  76. impl = OutputStreamFactory.newOutputStream(version);
  77. impl.init(orb, littleEndian, bufMgr.getInitialBufferSize(), bufMgr);
  78. impl.setParent(this);
  79. }
  80. public CDROutputStream(org.omg.CORBA.ORB orb,
  81. GIOPVersion version,
  82. int size,
  83. boolean allowFragmentation) {
  84. BufferManagerWrite bufMgr;
  85. if (!allowFragmentation)
  86. bufMgr = new BufferManagerWriteGrow(size);
  87. else
  88. bufMgr = BufferManagerFactory.newBufferManagerWrite(version, orb, size);
  89. impl = OutputStreamFactory.newOutputStream(version);
  90. impl.init(orb, bufMgr);
  91. impl.setParent(this);
  92. }
  93. // This is used by
  94. // ServiceContext for creating encapsulations of correct version encoding.
  95. // ADDED (Ram J) (05/20/2000)
  96. public CDROutputStream(org.omg.CORBA.ORB orb, GIOPVersion version,
  97. boolean allowFragmentation) {
  98. if (allowFragmentation == false) {
  99. impl = OutputStreamFactory.newOutputStream(version);
  100. // A grow strategy is used for encoding encapsulations.
  101. // streaming behaviour is incorrect.
  102. BufferManagerWrite bufMgr = null;
  103. if (orb == null || !(orb instanceof com.sun.corba.se.internal.corba.ORB)) {
  104. bufMgr = new BufferManagerWriteGrow(ORBConstants.GIOP_DEFAULT_BUFFER_SIZE);
  105. } else {
  106. int defaultBufSize = ((com.sun.corba.se.internal.corba.ORB) orb).getGIOPBufferSize();
  107. bufMgr = new BufferManagerWriteGrow(defaultBufSize);
  108. }
  109. impl.init(orb, bufMgr);
  110. impl.setParent(this);
  111. } else {
  112. impl = OutputStreamFactory.newOutputStream(version);
  113. BufferManagerWrite bufMgr
  114. = BufferManagerFactory.newBufferManagerWrite(version, orb);
  115. impl.init(orb, bufMgr);
  116. impl.setParent(this);
  117. }
  118. }
  119. // org.omg.CORBA.portable.OutputStream
  120. // Provided by IIOPOutputStream and EncapsOutputStream
  121. public abstract org.omg.CORBA.portable.InputStream create_input_stream();
  122. public final void write_boolean(boolean value) {
  123. impl.write_boolean(value);
  124. }
  125. public final void write_char(char value) {
  126. impl.write_char(value);
  127. }
  128. public final void write_wchar(char value) {
  129. impl.write_wchar(value);
  130. }
  131. public final void write_octet(byte value) {
  132. impl.write_octet(value);
  133. }
  134. public final void write_short(short value) {
  135. impl.write_short(value);
  136. }
  137. public final void write_ushort(short value) {
  138. impl.write_ushort(value);
  139. }
  140. public final void write_long(int value) {
  141. impl.write_long(value);
  142. }
  143. public final void write_ulong(int value) {
  144. impl.write_ulong(value);
  145. }
  146. public final void write_longlong(long value) {
  147. impl.write_longlong(value);
  148. }
  149. public final void write_ulonglong(long value) {
  150. impl.write_ulonglong(value);
  151. }
  152. public final void write_float(float value) {
  153. impl.write_float(value);
  154. }
  155. public final void write_double(double value) {
  156. impl.write_double(value);
  157. }
  158. public final void write_string(String value) {
  159. impl.write_string(value);
  160. }
  161. public final void write_wstring(String value) {
  162. impl.write_wstring(value);
  163. }
  164. public final void write_boolean_array(boolean[] value, int offset, int length) {
  165. impl.write_boolean_array(value, offset, length);
  166. }
  167. public final void write_char_array(char[] value, int offset, int length) {
  168. impl.write_char_array(value, offset, length);
  169. }
  170. public final void write_wchar_array(char[] value, int offset, int length) {
  171. impl.write_wchar_array(value, offset, length);
  172. }
  173. public final void write_octet_array(byte[] value, int offset, int length) {
  174. impl.write_octet_array(value, offset, length);
  175. }
  176. public final void write_short_array(short[] value, int offset, int length) {
  177. impl.write_short_array(value, offset, length);
  178. }
  179. public final void write_ushort_array(short[] value, int offset, int length) {
  180. impl.write_ushort_array(value, offset, length);
  181. }
  182. public final void write_long_array(int[] value, int offset, int length) {
  183. impl.write_long_array(value, offset, length);
  184. }
  185. public final void write_ulong_array(int[] value, int offset, int length) {
  186. impl.write_ulong_array(value, offset, length);
  187. }
  188. public final void write_longlong_array(long[] value, int offset, int length) {
  189. impl.write_longlong_array(value, offset, length);
  190. }
  191. public final void write_ulonglong_array(long[] value, int offset, int length) {
  192. impl.write_ulonglong_array(value, offset, length);
  193. }
  194. public final void write_float_array(float[] value, int offset, int length) {
  195. impl.write_float_array(value, offset, length);
  196. }
  197. public final void write_double_array(double[] value, int offset, int length) {
  198. impl.write_double_array(value, offset, length);
  199. }
  200. public final void write_Object(org.omg.CORBA.Object value) {
  201. impl.write_Object(value);
  202. }
  203. public final void write_TypeCode(TypeCode value) {
  204. impl.write_TypeCode(value);
  205. }
  206. public final void write_any(Any value) {
  207. impl.write_any(value);
  208. }
  209. public final void write_Principal(Principal value) {
  210. impl.write_Principal(value);
  211. }
  212. public final void write(int b) throws java.io.IOException {
  213. impl.write(b);
  214. }
  215. public final void write_fixed(java.math.BigDecimal value) {
  216. impl.write_fixed(value);
  217. }
  218. public final void write_Context(org.omg.CORBA.Context ctx,
  219. org.omg.CORBA.ContextList contexts) {
  220. impl.write_Context(ctx, contexts);
  221. }
  222. public final org.omg.CORBA.ORB orb() {
  223. return impl.orb();
  224. }
  225. // org.omg.CORBA_2_3.portable.OutputStream
  226. public final void write_value(java.io.Serializable value) {
  227. impl.write_value(value);
  228. }
  229. public final void write_value(java.io.Serializable value, java.lang.Class clz) {
  230. impl.write_value(value, clz);
  231. }
  232. public final void write_value(java.io.Serializable value, String repository_id) {
  233. impl.write_value(value, repository_id);
  234. }
  235. public final void write_value(java.io.Serializable value,
  236. org.omg.CORBA.portable.BoxedValueHelper factory) {
  237. impl.write_value(value, factory);
  238. }
  239. public final void write_abstract_interface(java.lang.Object obj) {
  240. impl.write_abstract_interface(obj);
  241. }
  242. // java.io.OutputStream
  243. public final void write(byte b[]) throws IOException {
  244. impl.write(b);
  245. }
  246. public final void write(byte b[], int off, int len) throws IOException {
  247. impl.write(b, off, len);
  248. }
  249. public final void flush() throws IOException {
  250. impl.flush();
  251. }
  252. public final void close() throws IOException {
  253. impl.close();
  254. }
  255. // com.sun.corba.se.internal.core.MarshalOutputStream
  256. public final void start_block() {
  257. impl.start_block();
  258. }
  259. public final void end_block() {
  260. impl.end_block();
  261. }
  262. public final void putEndian() {
  263. impl.putEndian();
  264. }
  265. // Overridden by IIOPOutputStream
  266. public void writeTo(java.io.OutputStream stream) throws IOException {
  267. impl.writeTo(stream);
  268. }
  269. public final byte[] toByteArray() {
  270. return impl.toByteArray();
  271. }
  272. // org.omg.CORBA.DataOutputStream
  273. public final void write_Abstract (java.lang.Object value) {
  274. impl.write_Abstract(value);
  275. }
  276. public final void write_Value (java.io.Serializable value) {
  277. impl.write_Value(value);
  278. }
  279. public final void write_any_array(org.omg.CORBA.Any[] seq, int offset, int length) {
  280. impl.write_any_array(seq, offset, length);
  281. }
  282. // org.omg.CORBA.portable.ValueBase
  283. public final String[] _truncatable_ids() {
  284. return impl._truncatable_ids();
  285. }
  286. // Other
  287. protected final int getSize() {
  288. return impl.getSize();
  289. }
  290. protected final int getIndex() {
  291. return impl.getIndex();
  292. }
  293. protected int getRealIndex(int index) {
  294. // Used in indirections. Overridden by TypeCodeOutputStream.
  295. return index;
  296. }
  297. protected final void setIndex(int value) {
  298. impl.setIndex(value);
  299. }
  300. protected final byte[] getByteBuffer() {
  301. return impl.getByteBuffer();
  302. }
  303. protected final void setByteBuffer(byte value[]) {
  304. impl.setByteBuffer(value);
  305. }
  306. public final boolean isLittleEndian() {
  307. return impl.isLittleEndian();
  308. }
  309. protected final ByteBufferWithInfo getByteBufferWithInfo() {
  310. return impl.getByteBufferWithInfo();
  311. }
  312. protected final void setByteBufferWithInfo(ByteBufferWithInfo bbwi) {
  313. impl.setByteBufferWithInfo(bbwi);
  314. }
  315. protected final BufferManagerWrite getBufferManager() {
  316. return impl.getBufferManager();
  317. }
  318. public final void write_fixed(java.math.BigDecimal bigDecimal, short digits, short scale) {
  319. impl.write_fixed(bigDecimal, digits, scale);
  320. }
  321. public final void writeOctetSequenceTo(org.omg.CORBA.portable.OutputStream s) {
  322. impl.writeOctetSequenceTo(s);
  323. }
  324. public final GIOPVersion getGIOPVersion() {
  325. return impl.getGIOPVersion();
  326. }
  327. public final void writeIndirection(int tag, int posIndirectedTo) {
  328. impl.writeIndirection(tag, posIndirectedTo);
  329. }
  330. // Use Latin-1 for GIOP 1.0 or when code set negotiation was not
  331. // performed.
  332. protected CodeSetConversion.CTBConverter createCharCTBConverter() {
  333. return CodeSetConversion.impl().getCTBConverter(OSFCodeSetRegistry.ISO_8859_1);
  334. }
  335. // Subclasses must decide what to do here. It's inconvenient to
  336. // make the class and this method abstract because of dup().
  337. protected abstract CodeSetConversion.CTBConverter createWCharCTBConverter();
  338. protected final void freeInternalCaches() {
  339. impl.freeInternalCaches();
  340. }
  341. void printBuffer() {
  342. impl.printBuffer();
  343. }
  344. public void alignOnBoundary(int octetBoundary) {
  345. impl.alignOnBoundary(octetBoundary);
  346. }
  347. }