SimpleMessageFormat.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // System.Runtime.Remoting.Channels.Simple.SimpleMessageFormat.cs
  2. //
  3. // Author:
  4. // DietmarMaurer ([email protected])
  5. //
  6. // (C) 2002 Ximian, Inc. http://www.ximian.com
  7. using System.Runtime.Serialization.Formatters;
  8. using System.Runtime.Serialization;
  9. using System.Reflection;
  10. using System.Collections;
  11. using System.IO;
  12. using System.Runtime.Remoting.Messaging;
  13. namespace System.Runtime.Remoting.Channels.Simple {
  14. public sealed class SimpleMessageFormat
  15. {
  16. public enum MessageType : byte {
  17. Request = 0,
  18. Response = 1,
  19. Exception = 2,
  20. Unknown = 3
  21. }
  22. public SimpleMessageFormat ()
  23. {
  24. }
  25. public static void SendExceptionMessage (Stream network_stream, string message)
  26. {
  27. // we use the uri field to encode the message text
  28. SendMessageStream (network_stream, null, MessageType.Exception, message);
  29. }
  30. public static void SendMessageStream (Stream network_stream, MemoryStream data,
  31. MessageType msg_type, string uri)
  32. {
  33. int data_len = 0;
  34. if (data != null)
  35. data_len = (int)data.Length;
  36. int uri_len = 0;
  37. if (uri != null)
  38. uri_len = uri.Length;
  39. int header_len = 12 + uri_len * 2;
  40. int msg_len = data_len + header_len;
  41. byte [] buffer = new byte [msg_len];
  42. // magic header signature
  43. buffer [0] = 255;
  44. buffer [1] = 0;
  45. buffer [2] = 255;
  46. buffer [3] = (byte) msg_type;
  47. // data length
  48. buffer [4] = (byte) data_len;
  49. buffer [5] = (byte) (data_len >> 8);
  50. buffer [6] = (byte) (data_len >> 16);
  51. buffer [7] = (byte) (data_len >> 24);
  52. // uri length
  53. buffer [8] = (byte) uri_len;
  54. buffer [9] = (byte) (uri_len >> 8);
  55. buffer [10] = (byte) (uri_len >> 16);
  56. buffer [11] = (byte) (uri_len >> 24);
  57. // uri
  58. for (int i = 0; i < uri_len; i++) {
  59. buffer [12 + i*2] = (byte) uri [i];
  60. buffer [13 + i*2] = (byte) (uri [i] >> 8);
  61. }
  62. if (data_len > 0) {
  63. byte [] data_buffer = data.GetBuffer ();
  64. for (int i = 0; i < data_len; i++)
  65. buffer [i + header_len] = data_buffer [i];
  66. }
  67. network_stream.Write (buffer, 0, msg_len);
  68. }
  69. public static MemoryStream ReceiveMessageStream (Stream network_stream,
  70. out MessageType msg_type,
  71. out string uri)
  72. {
  73. int data_len = 0;
  74. int uri_len = 0;
  75. msg_type = MessageType.Unknown;
  76. uri = null;
  77. // search for message header (255, 0, 255, msg_type, msg_len)
  78. while (true) {
  79. while (true) {
  80. int x = network_stream.ReadByte ();
  81. if (x != 255)
  82. continue;
  83. x = network_stream.ReadByte ();
  84. if (x != 0)
  85. continue;
  86. x = network_stream.ReadByte ();
  87. if (x != 255)
  88. continue;
  89. break;
  90. }
  91. msg_type = (MessageType)network_stream.ReadByte ();
  92. byte [] buffer = new byte [8];
  93. int bytes_read = network_stream.Read (buffer, 0, 8);
  94. if (bytes_read != 8)
  95. continue;
  96. data_len = (buffer [0] | (buffer [1] << 8) |
  97. (buffer [2] << 16) | (buffer [3] << 24));
  98. uri_len = (buffer [4] | (buffer [5] << 8) |
  99. (buffer [6] << 16) | (buffer [7] << 24));
  100. if (uri_len > 0) {
  101. byte [] uri_buffer = new byte [uri_len * 2];
  102. bytes_read = network_stream.Read (uri_buffer, 0, uri_len * 2);
  103. if (bytes_read != (uri_len * 2))
  104. continue;
  105. char [] uri_array = new char [uri_len];
  106. for (int i = 0; i < uri_len; i++) {
  107. uri_array [i] = (char) (uri_buffer [i * 2] | (uri_buffer [(i * 2) + 1] << 8));
  108. }
  109. uri = new string (uri_array);
  110. }
  111. break;
  112. }
  113. if (msg_type == MessageType.Exception)
  114. throw new RemotingException ("\n" + uri + "\n" + "Rethrown at:\n");
  115. byte [] stream_buffer = new byte [data_len];
  116. if ((network_stream.Read (stream_buffer, 0, data_len)) != data_len)
  117. throw new Exception ("packet size error");
  118. return new MemoryStream (stream_buffer, false);
  119. }
  120. }
  121. }