summaryrefslogtreecommitdiff
path: root/Ivy/IvyPPC/IvyUDPStreamV3.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ivy/IvyPPC/IvyUDPStreamV3.cs')
-rw-r--r--Ivy/IvyPPC/IvyUDPStreamV3.cs104
1 files changed, 104 insertions, 0 deletions
diff --git a/Ivy/IvyPPC/IvyUDPStreamV3.cs b/Ivy/IvyPPC/IvyUDPStreamV3.cs
new file mode 100644
index 0000000..63a8679
--- /dev/null
+++ b/Ivy/IvyPPC/IvyUDPStreamV3.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Net;
+using System.Net.Sockets;
+using System.IO;
+
+namespace IvyBus
+{
+ class IvyUDPStreamV3 : IvyUDPStream
+ {
+ StreamReader input;
+ StreamWriter output;
+
+ /// the protocol version number
+ internal const int PROCOCOLVERSION = 3;
+
+ public IvyUDPStreamV3(Socket _socket) : base( _socket , PROCOCOLVERSION )
+ {
+ input = new StreamReader(in_stream, Encoding.ASCII);
+ output = new StreamWriter(out_stream, Encoding.ASCII);
+ }
+ /*
+ * message Syntax:
+ * this is a text formated message
+ *
+ * message Format:
+ protocol_version, TCP server port , appId, appName
+ */
+ private ushort DeserializeShort()
+ {
+ int read;
+ ushort ret = 0;
+ char digit;
+ // this will eat next non digit car ie space
+ do
+ {
+ read = input.Read();
+ if (read < 0)
+ throw new EndOfStreamException();
+ digit = (char)read;
+ if ( Char.IsDigit(digit) )
+ ret = (ushort)(ret * 10 + (digit-0x30));
+ } while (Char.IsDigit(digit));
+ return ret;
+ }
+ private string DeserializeString(char sep)
+ {
+ int read;
+ char car;
+ StringBuilder str = new StringBuilder();
+ // this will eat next non digit car ie space
+ do
+ {
+ read = input.Read();
+ if (read < 0)
+ throw new EndOfStreamException();
+ if (read == 0) break;
+ car = (char)read;
+ if (car != sep)
+ str.Append(car);
+ } while (car != sep);
+ return str.ToString();
+ }
+
+ internal override void Deserialize(out ushort version, out ushort port, out string appId, out string appName)
+ {
+ version = 0;
+ port = 0;
+ appId = "";
+ appName = "";
+ try {
+ version = DeserializeShort();
+ port = DeserializeShort();
+ //Optionel in V3 protocol depend on client version
+ appId = DeserializeString(' ');
+ appName = DeserializeString('\n');
+ }
+ catch( EndOfStreamException )
+ {
+ // Bad protocol message receive or without appId and appName
+ }
+ input.DiscardBufferedData();
+ }
+ private void Serialize(ushort arg, char sep)
+ {
+ output.Write(arg);
+ output.Write(sep);
+ }
+ private void Serialize(string arg, char sep)
+ {
+ output.Write(arg);
+ output.Write(sep);
+ }
+ internal override void Serialize(ushort port, string appId, string appName)
+ {
+ Serialize(PROCOCOLVERSION, ' ');
+ Serialize(port,' ');
+ Serialize(appId,' '); //No AppId in V3
+ Serialize(appName, '\n'); //No Appname in V3
+ output.Flush();
+ }
+ }
+}