Notifications support
authorCryptoManiac <balthazar@yandex.ru>
Wed, 5 Aug 2015 17:42:54 +0000 (20:42 +0300)
committerCryptoManiac <balthazar@yandex.ru>
Wed, 5 Aug 2015 17:42:54 +0000 (20:42 +0300)
Stratum.sln
StratumLibrary/Stratum.cs
StratumLibrary/StratumNotification.cs [new file with mode: 0644]
StratumLibrary/StratumReadState.cs
StratumLibrary/StratumRequest.cs
StratumLibrary/StratumResponse.cs

index 362d3c4..95d9e47 100644 (file)
@@ -1,6 +1,6 @@
 \feff\r
 Microsoft Visual Studio Solution File, Format Version 12.00\r
-# Visual Studio 2012\r
+# Visual Studio Express 2012 for Windows Desktop\r
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stratum", "StratumLibrary\Stratum.csproj", "{27F0C6C3-DCD6-4588-AFBB-DCE22306F5F8}"\r
 EndProject\r
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StratumTest", "StratumTest\StratumTest.csproj", "{FB61065F-93BA-497B-A2D5-3574D23B0B62}"\r
@@ -20,9 +20,6 @@ Global
                {FB61065F-93BA-497B-A2D5-3574D23B0B62}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
                {FB61065F-93BA-497B-A2D5-3574D23B0B62}.Release|Any CPU.Build.0 = Release|Any CPU\r
        EndGlobalSection\r
-       GlobalSection(MonoDevelopProperties) = preSolution\r
-               StartupItem = StratumTest\StratumTest.csproj\r
-       EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
        EndGlobalSection\r
index 30ca0bc..d023f6a 100644 (file)
@@ -2,6 +2,7 @@
 using System.Net;\r
 using System.Threading;\r
 using System.Net.Sockets;\r
+using Newtonsoft.Json;\r
 using Newtonsoft.Json.Linq;\r
 \r
 using System.Text;\r
@@ -9,8 +10,6 @@ using System.Collections.Generic;
 \r
 namespace Stratum\r
 {\r
-    delegate void NotificationCallback(out object[] notificationData);\r
-\r
     public class Stratum\r
     {\r
         private Socket client;\r
@@ -146,11 +145,7 @@ namespace Stratum
         private StratumResponse<T> Invoke<T>(StratumRequest stratumReq)\r
         {\r
             // Serialize stratumReq into JSON string\r
-            var reqJSON = Newtonsoft.Json.JsonConvert.SerializeObject(stratumReq) + '\n';\r
-            var reqId = (string) stratumReq.Id;\r
-\r
-            string strResponse = "";\r
-            StratumResponse<T> responseObj = null;\r
+            var reqJSON = JsonConvert.SerializeObject(stratumReq) + '\n';\r
 \r
             // Send JSON data to the remote device.\r
             Send(client, reqJSON);\r
@@ -158,13 +153,16 @@ namespace Stratum
             // Wait for response\r
             gotResponse.WaitOne();\r
 \r
+            var strResponse = string.Empty;\r
             lock (responsesLock)\r
             {\r
                 // Deserialize the response\r
-                strResponse = responses[reqId];\r
-                responses.Remove(reqId);\r
+                strResponse = responses[stratumReq.Id];\r
+                responses.Remove(stratumReq.Id);\r
             }\r
-            responseObj = Newtonsoft.Json.JsonConvert.DeserializeObject<StratumResponse<T>>(strResponse);\r
+\r
+            // Deserialize response into new instance of StratumResponse<T> \r
+            StratumResponse<T> responseObj = JsonConvert.DeserializeObject<StratumResponse<T>>(strResponse);\r
 \r
             // Reset the state\r
             gotResponse.Reset();\r
@@ -173,10 +171,10 @@ namespace Stratum
             {\r
                 try\r
                 {\r
-                    JObject jo = Newtonsoft.Json.JsonConvert.DeserializeObject(strResponse) as JObject;\r
-                    throw new Exception(jo["Error"].ToString());\r
+                    JObject jResponseObj = JsonConvert.DeserializeObject(strResponse) as JObject;\r
+                    throw new Exception(jResponseObj["Error"].ToString());\r
                 }\r
-                catch (Newtonsoft.Json.JsonSerializationException)\r
+                catch (JsonSerializationException)\r
                 {\r
                     throw new Exception("Inconsistent or empty response");\r
                 }\r
@@ -211,30 +209,32 @@ namespace Stratum
 \r
                     if (arStatus.buffer[bytesRead - 1] == '\n')\r
                     {\r
-                        string strMessage = arStatus.sb.ToString();\r
+                        var strMessage = arStatus.sb.ToString();\r
                         arStatus.sb.Clear();\r
 \r
                         try\r
                         {\r
-                            JObject jo = Newtonsoft.Json.JsonConvert.DeserializeObject(strMessage) as JObject;\r
-                            string requestId = (string)jo["id"];\r
+                            JObject jResponse = JsonConvert.DeserializeObject(strMessage) as JObject;\r
+                            var reqId = (string)jResponse["id"];\r
 \r
-                            if (!String.IsNullOrEmpty(requestId))\r
+                            if (!String.IsNullOrEmpty(reqId))\r
                             {\r
                                 lock (responsesLock)\r
                                 {\r
-                                    responses.Add(requestId, strMessage);\r
+                                    responses.Add(reqId, strMessage);\r
                                 }\r
 \r
                                 gotResponse.Set();\r
                             }\r
                             else\r
                             {\r
-                                // TODO: notifications handling\r
-                                Console.WriteLine("Notification: {0}", strMessage);\r
+                                StratumNotification jNotification = JsonConvert.DeserializeObject<StratumNotification>(strMessage);\r
+\r
+                                var NotifyProcessThread = new Thread(() => NotificationHandler(jNotification.Method, jNotification.Params));\r
+                                NotifyProcessThread.Start();\r
                             }\r
                         }\r
-                        catch (Newtonsoft.Json.JsonSerializationException e)\r
+                        catch (JsonSerializationException e)\r
                         {\r
                             // TODO: handle parse error\r
                         }\r
@@ -246,6 +246,16 @@ namespace Stratum
 \r
             client.BeginReceive(state.buffer, 0, StratumReadState.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);\r
         }\r
+\r
+        /// <summary>\r
+        /// Notifications stub which is run in a separate thread. If you wish to implement real notification processing then just override this method in the derived class.\r
+        /// </summary>\r
+        /// <param name="NotificationMethod">Method name</param>\r
+        /// <param name="NotificationData">Array of values</param>\r
+        private static void NotificationHandler(string NotificationMethod, JArray NotificationData)\r
+        {\r
+            Console.WriteLine("\nNotification: Method={0}, data={1}", NotificationMethod, NotificationData.ToString());\r
+        }\r
     }\r
 \r
 }
\ No newline at end of file
diff --git a/StratumLibrary/StratumNotification.cs b/StratumLibrary/StratumNotification.cs
new file mode 100644 (file)
index 0000000..9be11f4
--- /dev/null
@@ -0,0 +1,31 @@
+\feffusing Newtonsoft.Json;\r
+using Newtonsoft.Json.Linq;\r
+\r
+\r
+namespace Stratum\r
+{\r
+    /// <summary>\r
+    /// Represents a Stratum notification\r
+    /// </summary>\r
+    [JsonObject(MemberSerialization.OptIn)]\r
+    public class StratumNotification\r
+    {\r
+        /// <summary>\r
+        /// Response id, should be null\r
+        /// </summary>\r
+        [JsonProperty(PropertyName = "id")]\r
+        public object Id { get; set; }\r
+\r
+        /// <summary>\r
+        /// Method name\r
+        /// </summary>\r
+        [JsonProperty(PropertyName = "method")]\r
+        public string Method { get; set; }\r
+\r
+        /// <summary>\r
+        /// Notification data\r
+        /// </summary>\r
+        [JsonProperty(PropertyName = "params")]\r
+        public JArray Params { get; set; }\r
+    }\r
+}\r
index 5d0ffa9..a53d61b 100644 (file)
@@ -1,5 +1,4 @@
 \feffusing System.Text;\r
-\r
 using System.Net.Sockets;\r
 \r
 namespace Stratum\r
index 1898096..ccb0cc9 100644 (file)
@@ -18,7 +18,7 @@ namespace Stratum
         /// Unique request id\r
         /// </summary>\r
         [JsonProperty("id")]\r
-        public object Id { get; private set; }\r
+        public string Id { get; private set; }\r
 \r
         /// <summary>\r
         /// Stratum method name\r
index 1e0df84..e5cb6ae 100644 (file)
@@ -12,7 +12,7 @@ namespace Stratum
         /// Response id, should be null or identical to request id\r
         /// </summary>\r
         [JsonProperty(PropertyName = "id")]\r
-        public object Id { get; set; }\r
+        public string Id { get; set; }\r
 \r
         /// <summary>\r
         /// Result object\r
@@ -37,7 +37,7 @@ namespace Stratum
         /// Response id, should be null or identical to request id\r
         /// </summary>\r
         [JsonProperty(PropertyName = "id")]\r
-        public object Id { get; set; }\r
+        public string Id { get; set; }\r
 \r
         /// <summary>\r
         /// Result object\r