Hessian2StreamingInput.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * Copyright (c) 2001-2008 Caucho Technology, Inc. All rights reserved.
  3. *
  4. * The Apache Software License, Version 1.1
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. *
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in
  15. * the documentation and/or other materials provided with the
  16. * distribution.
  17. *
  18. * 3. The end-user documentation included with the redistribution, if
  19. * any, must include the following acknowlegement:
  20. * "This product includes software developed by the
  21. * Caucho Technology (http://www.caucho.com/)."
  22. * Alternately, this acknowlegement may appear in the software itself,
  23. * if and wherever such third-party acknowlegements normally appear.
  24. *
  25. * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
  26. * endorse or promote products derived from this software without prior
  27. * written permission. For written permission, please contact
  28. * info@caucho.com.
  29. *
  30. * 5. Products derived from this software may not be called "Resin"
  31. * nor may "Resin" appear in their names without prior written
  32. * permission of Caucho Technology.
  33. *
  34. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  35. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  36. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  37. * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
  38. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
  39. * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
  40. * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  41. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  42. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  43. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  44. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  45. *
  46. * @author Scott Ferguson
  47. */
  48. package com.hmsoft.remote.caucho.hessian.io;
  49. import java.io.IOException;
  50. import java.io.InputStream;
  51. /**
  52. * Output stream for Hessian 2 streaming requests.
  53. */
  54. public class Hessian2StreamingInput
  55. {
  56. private Hessian2Input _in;
  57. /**
  58. * Creates a new Hessian input stream, initialized with an
  59. * underlying input stream.
  60. *
  61. * @param is the underlying output stream.
  62. */
  63. public Hessian2StreamingInput(InputStream is)
  64. {
  65. _in = new Hessian2Input(new StreamingInputStream(is));
  66. }
  67. /**
  68. * Read the next object
  69. */
  70. public Object readObject()
  71. throws IOException
  72. {
  73. return _in.readStreamingObject();
  74. }
  75. /**
  76. * Close the output.
  77. */
  78. public void close()
  79. throws IOException
  80. {
  81. _in.close();
  82. }
  83. static class StreamingInputStream extends InputStream {
  84. private InputStream _is;
  85. private int _length;
  86. StreamingInputStream(InputStream is)
  87. {
  88. _is = is;
  89. }
  90. public int read()
  91. throws IOException
  92. {
  93. InputStream is = _is;
  94. while (_length == 0) {
  95. int code = is.read();
  96. if (code < 0)
  97. return -1;
  98. else if (code != 'p' && code != 'P')
  99. throw new HessianProtocolException("expected streaming packet at 0x"
  100. + Integer.toHexString(code & 0xff));
  101. int d1 = is.read();
  102. int d2 = is.read();
  103. if (d2 < 0)
  104. return -1;
  105. _length = (d1 << 8) + d2;
  106. }
  107. _length--;
  108. return is.read();
  109. }
  110. public int read(byte []buffer, int offset, int length)
  111. throws IOException
  112. {
  113. InputStream is = _is;
  114. while (_length == 0) {
  115. int code = is.read();
  116. if (code < 0)
  117. return -1;
  118. else if (code != 'p' && code != 'P') {
  119. throw new HessianProtocolException("expected streaming packet at 0x"
  120. + Integer.toHexString(code & 0xff)
  121. + " (" + (char) code + ")");
  122. }
  123. int d1 = is.read();
  124. int d2 = is.read();
  125. if (d2 < 0)
  126. return -1;
  127. _length = (d1 << 8) + d2;
  128. }
  129. int sublen = _length;
  130. if (length < sublen)
  131. sublen = length;
  132. sublen = is.read(buffer, offset, sublen);
  133. if (sublen < 0)
  134. return -1;
  135. _length -= sublen;
  136. return sublen;
  137. }
  138. }
  139. }