Initial commit
authorCryptoManiac <balthazar@yandex.ru>
Mon, 3 Aug 2015 20:20:23 +0000 (23:20 +0300)
committerCryptoManiac <balthazar@yandex.ru>
Mon, 3 Aug 2015 20:20:23 +0000 (23:20 +0300)
15 files changed:
Stratum.sln [new file with mode: 0644]
StratumLibrary/Attributes.cs [new file with mode: 0644]
StratumLibrary/Properties/AssemblyInfo.cs [new file with mode: 0644]
StratumLibrary/Stratum.cs [new file with mode: 0644]
StratumLibrary/Stratum.csproj [new file with mode: 0644]
StratumLibrary/StratumException.cs [new file with mode: 0644]
StratumLibrary/StratumReadState.cs [new file with mode: 0644]
StratumLibrary/StratumRequest.cs [new file with mode: 0644]
StratumLibrary/StratumResponse.cs [new file with mode: 0644]
StratumLibrary/packages.config [new file with mode: 0644]
StratumTest/App.config [new file with mode: 0644]
StratumTest/Program.cs [new file with mode: 0644]
StratumTest/Properties/AssemblyInfo.cs [new file with mode: 0644]
StratumTest/StratumTest.csproj [new file with mode: 0644]
StratumTest/packages.config [new file with mode: 0644]

diff --git a/Stratum.sln b/Stratum.sln
new file mode 100644 (file)
index 0000000..95d9e47
--- /dev/null
@@ -0,0 +1,26 @@
+\feff\r
+Microsoft Visual Studio Solution File, Format Version 12.00\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
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Any CPU = Debug|Any CPU\r
+               Release|Any CPU = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {27F0C6C3-DCD6-4588-AFBB-DCE22306F5F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {27F0C6C3-DCD6-4588-AFBB-DCE22306F5F8}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {27F0C6C3-DCD6-4588-AFBB-DCE22306F5F8}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {27F0C6C3-DCD6-4588-AFBB-DCE22306F5F8}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {FB61065F-93BA-497B-A2D5-3574D23B0B62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {FB61065F-93BA-497B-A2D5-3574D23B0B62}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {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(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/StratumLibrary/Attributes.cs b/StratumLibrary/Attributes.cs
new file mode 100644 (file)
index 0000000..664aaa3
--- /dev/null
@@ -0,0 +1,27 @@
+\feffusing System;\r
+\r
+namespace Stratum\r
+{\r
+    /// <summary>\r
+    /// Required to expose a method to the Stratum service.\r
+    /// </summary>\r
+    [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]\r
+    public sealed class StratumMethodAttribute : Attribute\r
+    {\r
+        readonly string stratumMethodName;\r
+\r
+        /// <summary>\r
+        /// Required to expose a method to the Stratum service.\r
+        /// </summary>\r
+        /// <param name="stratumMethodName">Lets you specify the method name as it will be referred to by JsonRpc.</param>\r
+        public StratumMethodAttribute(string MethodName = "")\r
+        {\r
+            this.stratumMethodName = MethodName;\r
+        }\r
+\r
+        public string StratumMethodName\r
+        {\r
+            get { return stratumMethodName; }\r
+        }\r
+    }\r
+}\r
diff --git a/StratumLibrary/Properties/AssemblyInfo.cs b/StratumLibrary/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..56f8b19
--- /dev/null
@@ -0,0 +1,36 @@
+\feffusing System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+// Управление общими сведениями о сборке осуществляется с помощью \r
+// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,\r
+// связанные со сборкой.\r
+[assembly: AssemblyTitle("ClassLibrary1")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("")]\r
+[assembly: AssemblyProduct("ClassLibrary1")]\r
+[assembly: AssemblyCopyright("Copyright ©  2015")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми \r
+// для COM-компонентов.  Если требуется обратиться к типу в этой сборке через \r
+// COM, задайте атрибуту ComVisible значение TRUE для этого типа.\r
+[assembly: ComVisible(false)]\r
+\r
+// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM\r
+[assembly: Guid("75774b8a-8cf8-44ce-bd6b-6a1254d0cbb5")]\r
+\r
+// Сведения о версии сборки состоят из следующих четырех значений:\r
+//\r
+//      Основной номер версии\r
+//      Дополнительный номер версии \r
+//      Номер построения\r
+//      Редакция\r
+//\r
+// Можно задать все значения или принять номер построения и номер редакции по умолчанию, \r
+// используя "*", как показано ниже:\r
+// [assembly: AssemblyVersion("1.0.*")]\r
+[assembly: AssemblyVersion("1.0.0.0")]\r
+[assembly: AssemblyFileVersion("1.0.0.0")]\r
diff --git a/StratumLibrary/Stratum.cs b/StratumLibrary/Stratum.cs
new file mode 100644 (file)
index 0000000..56520ed
--- /dev/null
@@ -0,0 +1,193 @@
+\feffusing System;\r
+using System.Net;\r
+using Newtonsoft.Json.Linq;\r
+\r
+using System.Text;\r
+using System.Threading;\r
+using System.Net.Sockets;\r
+\r
+namespace Stratum\r
+{\r
+    public class Stratum\r
+    {\r
+        private Socket client;\r
+\r
+        /// <summary>\r
+        /// Constructor of Stratum interface class\r
+        /// </summary>\r
+        /// <param name="ipAddress">IPv4 address</param>\r
+        /// <param name="port">Port number</param>\r
+        public Stratum(string ipAddress, int port)\r
+        {\r
+            // End point for the remote device\r
+            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ipAddress), port);\r
+\r
+            // Create TCP socket\r
+            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);\r
+\r
+            // Connect done event\r
+            ManualResetEvent connectDone = new ManualResetEvent(false);\r
+\r
+            Action<IAsyncResult> ConnectCallback = null;\r
+            ConnectCallback = (IAsyncResult ar) =>\r
+            {\r
+                // Retrieve socket from the state object\r
+                Socket cli = (Socket)ar.AsyncState;\r
+\r
+                // Complete the connection\r
+                cli.EndConnect(ar);\r
+\r
+                // Signal that connection has been established\r
+                connectDone.Set();\r
+            };\r
+\r
+            // Connect to the remote device\r
+            client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);\r
+\r
+            // Wait for signal\r
+            connectDone.WaitOne();\r
+        }\r
+\r
+        ~Stratum()\r
+        {\r
+            // Release the socket\r
+            client.Shutdown(SocketShutdown.Both);\r
+            client.Close();\r
+        }\r
+\r
+        private void Send(Socket client, String data)\r
+        {\r
+            // Send done event\r
+            ManualResetEvent sendDone = new ManualResetEvent(false);\r
+\r
+            Action<IAsyncResult> SendCallback = null;\r
+            SendCallback = (IAsyncResult ar) =>\r
+            {\r
+                // Retrieve the socket from the state object\r
+                Socket cli = (Socket)ar.AsyncState;\r
+\r
+                // Complete sending the data to the remote device\r
+                int bytesSent = cli.EndSend(ar);\r
+\r
+                // Signal that all bytes have been sent\r
+                sendDone.Set();\r
+            };\r
+\r
+            // Convert the string data to byte data using ASCII encoding.\r
+            byte[] byteData = Encoding.ASCII.GetBytes(data);\r
+\r
+            // Begin sending the data to the remote device.\r
+            client.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(SendCallback), client);\r
+\r
+            // Wait for signal\r
+            sendDone.WaitOne();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Invoke remote method\r
+        /// </summary>\r
+        /// <typeparam name="T">Return type</typeparam>\r
+        /// <param name="method">Method name</param>\r
+        /// <param name="arg">Argument</param>\r
+        /// <returns>StratumResponse object</returns>\r
+        public StratumResponse<T> Invoke<T>(string method, object arg)\r
+        {\r
+            var req = new StratumRequest()\r
+            {\r
+                Method = method,\r
+                Params = new object[] { arg }\r
+            };\r
+            return Invoke<T>(req);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Invoke remote method\r
+        /// </summary>\r
+        /// <typeparam name="T">Return type</typeparam>\r
+        /// <param name="method">Method name</param>\r
+        /// <param name="args">Arguments array</param>\r
+        /// <returns>StratumResponse object</returns>\r
+        public StratumResponse<T> Invoke<T>(string method, object[] args)\r
+        {\r
+            var req = new StratumRequest()\r
+            {\r
+                Method = method,\r
+                Params = args\r
+            };\r
+            return Invoke<T>(req);\r
+        }\r
+\r
+        private StratumResponse<T> Invoke<T>(StratumRequest stratumReq)\r
+        {\r
+            StratumResponse<T> rjson = null;\r
+\r
+            // Serialize stratumReq into JSON string\r
+            var reqJSON = Newtonsoft.Json.JsonConvert.SerializeObject(stratumReq) + '\n';\r
+\r
+            // Send JSON data to the remote device.\r
+            Send(client, reqJSON);\r
+\r
+            // Create the reading state object.\r
+            StratumReadState state = new StratumReadState(client);\r
+\r
+            // Receive event\r
+            ManualResetEvent receiveDone = new ManualResetEvent(false);\r
+\r
+            Action<IAsyncResult> ReceiveCallback = null;\r
+            ReceiveCallback = (IAsyncResult ar) =>\r
+            {\r
+                // Retrieve the state object and the client socket \r
+                // from the asynchronous state object.\r
+                StratumReadState st = (StratumReadState)ar.AsyncState;\r
+                Socket ci = st.workSocket;\r
+\r
+                // Read data from the remote device.\r
+                int bytesRead = ci.EndReceive(ar);\r
+\r
+                if (bytesRead <= 0)\r
+                    return;\r
+\r
+                lock (st.sb)\r
+                {\r
+                    // There might be more data, so store the data received so far.\r
+                    st.sb.Append(Encoding.ASCII.GetString(st.buffer, 0, bytesRead));\r
+\r
+                    if (st.buffer[bytesRead - 1] != '\n')\r
+                    {\r
+                        //  No EOL at the end of buffer, going to get the rest of data\r
+                        ci.BeginReceive(st.buffer, 0, StratumReadState.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), st);\r
+                    }\r
+                    else\r
+                    {\r
+                        string strResponse = st.sb.ToString();\r
+\r
+                        // Deserialize the response\r
+                        rjson = Newtonsoft.Json.JsonConvert.DeserializeObject<StratumResponse<T>>(strResponse);\r
+\r
+                        if (rjson == null)\r
+                        {\r
+                            try\r
+                            {\r
+                                JObject jo = Newtonsoft.Json.JsonConvert.DeserializeObject(strResponse) as JObject;\r
+                                throw new Exception(jo["Error"].ToString());\r
+                            }\r
+                            catch (Newtonsoft.Json.JsonSerializationException)\r
+                            {\r
+                                throw new Exception("Inconsistent or empty response");\r
+                            }\r
+                        }\r
+\r
+                        // Signal that all bytes have been received.\r
+                        receiveDone.Set();\r
+                    }\r
+                }\r
+            };\r
+\r
+            // Begin receiving the data from the remote device.\r
+            client.BeginReceive(state.buffer, 0, StratumReadState.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);\r
+            receiveDone.WaitOne();\r
+\r
+            return rjson;\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/StratumLibrary/Stratum.csproj b/StratumLibrary/Stratum.csproj
new file mode 100644 (file)
index 0000000..455ee9a
--- /dev/null
@@ -0,0 +1,61 @@
+\feff<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />\r
+  <PropertyGroup>\r
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+    <ProjectGuid>{27F0C6C3-DCD6-4588-AFBB-DCE22306F5F8}</ProjectGuid>\r
+    <OutputType>Library</OutputType>\r
+    <AppDesignerFolder>Properties</AppDesignerFolder>\r
+    <RootNamespace>Stratum</RootNamespace>\r
+    <AssemblyName>Stratum</AssemblyName>\r
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\r
+    <FileAlignment>512</FileAlignment>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <DebugSymbols>true</DebugSymbols>\r
+    <DebugType>full</DebugType>\r
+    <Optimize>false</Optimize>\r
+    <OutputPath>bin\Debug\</OutputPath>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <DebugType>pdbonly</DebugType>\r
+    <Optimize>true</Optimize>\r
+    <OutputPath>bin\Release\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <ItemGroup>\r
+    <Reference Include="Newtonsoft.Json">\r
+      <HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="System" />\r
+    <Reference Include="System.Core" />\r
+    <Reference Include="System.Net" />\r
+    <Reference Include="Microsoft.CSharp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Compile Include="Attributes.cs" />\r
+    <Compile Include="Stratum.cs" />\r
+    <Compile Include="Properties\AssemblyInfo.cs" />\r
+    <Compile Include="StratumException.cs" />\r
+    <Compile Include="StratumRequest.cs" />\r
+    <Compile Include="StratumResponse.cs" />\r
+    <Compile Include="StratumReadState.cs" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="packages.config" />\r
+  </ItemGroup>\r
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
+       Other similar extension points exist, see Microsoft.Common.targets.\r
+  <Target Name="BeforeBuild">\r
+  </Target>\r
+  <Target Name="AfterBuild">\r
+  </Target>\r
+  -->\r
+</Project>
\ No newline at end of file
diff --git a/StratumLibrary/StratumException.cs b/StratumLibrary/StratumException.cs
new file mode 100644 (file)
index 0000000..9a26c84
--- /dev/null
@@ -0,0 +1,32 @@
+\feffusing System;\r
+using Newtonsoft.Json;\r
+\r
+namespace Stratum\r
+{\r
+    [Serializable]\r
+    [JsonObject(MemberSerialization.OptIn)]\r
+    public class StratumException : System.ApplicationException\r
+    {\r
+        /// <summary>\r
+        /// Error code\r
+        /// </summary>\r
+        [JsonProperty]\r
+        public int code { get; set; }\r
+\r
+        /// <summary>\r
+        /// Human readable error message\r
+        /// </summary>\r
+        [JsonProperty]\r
+        public string message { get; set; }\r
+\r
+        [JsonProperty]\r
+        public object data { get; set; }\r
+\r
+        public StratumException(int code, string message, object data)\r
+        {\r
+            this.code = code;\r
+            this.message = message;\r
+            this.data = data;\r
+        }\r
+    }\r
+}\r
diff --git a/StratumLibrary/StratumReadState.cs b/StratumLibrary/StratumReadState.cs
new file mode 100644 (file)
index 0000000..78898ae
--- /dev/null
@@ -0,0 +1,34 @@
+\feffusing System.Text;\r
+\r
+using System.Net.Sockets;\r
+\r
+namespace Stratum\r
+{\r
+    /// <summary>\r
+    /// Represents internal state of Stratum interface\r
+    /// </summary>\r
+    class StratumReadState\r
+    {\r
+        public StratumReadState(Socket client)\r
+        {\r
+            workSocket = client;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Client socket\r
+        /// </summary>\r
+        public Socket workSocket = null;\r
+        /// <summary>\r
+        /// Receive buffer size\r
+        /// </summary>\r
+        public const int BufferSize = 8;\r
+        /// <summary>\r
+        /// Receive buffer\r
+        /// </summary>\r
+        public byte[] buffer = new byte[BufferSize];\r
+        /// <summary>\r
+        /// Received data string\r
+        /// </summary>\r
+        public StringBuilder sb = new StringBuilder();\r
+    }\r
+}\r
diff --git a/StratumLibrary/StratumRequest.cs b/StratumLibrary/StratumRequest.cs
new file mode 100644 (file)
index 0000000..1898096
--- /dev/null
@@ -0,0 +1,36 @@
+\feffusing System;\r
+using Newtonsoft.Json;\r
+\r
+namespace Stratum\r
+{\r
+    /// <summary>\r
+    /// Represents a JsonRpc request\r
+    /// </summary>\r
+    [JsonObject(MemberSerialization.OptIn)]\r
+    public class StratumRequest\r
+    {\r
+        public StratumRequest()\r
+        {\r
+            Id = Guid.NewGuid().ToString();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Unique request id\r
+        /// </summary>\r
+        [JsonProperty("id")]\r
+        public object Id { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Stratum method name\r
+        /// </summary>\r
+        [JsonProperty("method")]\r
+        public string Method { get; set; }\r
+\r
+        /// <summary>\r
+        /// Method params\r
+        /// </summary>\r
+        [JsonProperty("params")]\r
+        public object Params { get; set; }\r
+\r
+    }\r
+}\r
diff --git a/StratumLibrary/StratumResponse.cs b/StratumLibrary/StratumResponse.cs
new file mode 100644 (file)
index 0000000..1e0df84
--- /dev/null
@@ -0,0 +1,54 @@
+\feffusing Newtonsoft.Json;\r
+\r
+namespace Stratum\r
+{\r
+    /// <summary>\r
+    /// Represents a Stratum Response\r
+    /// </summary>\r
+    [JsonObject(MemberSerialization.OptIn)]\r
+    public class StratumResponse\r
+    {\r
+        /// <summary>\r
+        /// Response id, should be null or identical to request id\r
+        /// </summary>\r
+        [JsonProperty(PropertyName = "id")]\r
+        public object Id { get; set; }\r
+\r
+        /// <summary>\r
+        /// Result object\r
+        /// </summary>\r
+        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "result")]\r
+        public object Result { get; set; }\r
+\r
+        /// <summary>\r
+        /// Error object\r
+        /// </summary>\r
+        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "error")]\r
+        public StratumException Error { get; set; }\r
+    }\r
+\r
+    /// <summary>\r
+    /// Represents a Stratum Response\r
+    /// </summary>\r
+    [JsonObject(MemberSerialization.OptIn)]\r
+    public class StratumResponse<T>\r
+    {\r
+        /// <summary>\r
+        /// Response id, should be null or identical to request id\r
+        /// </summary>\r
+        [JsonProperty(PropertyName = "id")]\r
+        public object Id { get; set; }\r
+\r
+        /// <summary>\r
+        /// Result object\r
+        /// </summary>\r
+        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "result")]\r
+        public T Result { get; set; }\r
+\r
+        /// <summary>\r
+        /// Error object\r
+        /// </summary>\r
+        [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "error")]\r
+        public StratumException Error { get; set; }\r
+    }\r
+}\r
diff --git a/StratumLibrary/packages.config b/StratumLibrary/packages.config
new file mode 100644 (file)
index 0000000..e8ad218
--- /dev/null
@@ -0,0 +1,9 @@
+\feff<?xml version="1.0" encoding="utf-8"?>\r
+<packages>\r
+  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />\r
+  <package id="Rx-Core" version="2.2.5" targetFramework="net45" />\r
+  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />\r
+  <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />\r
+  <package id="Rx-Main" version="2.2.5" targetFramework="net45" />\r
+  <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />\r
+</packages>
\ No newline at end of file
diff --git a/StratumTest/App.config b/StratumTest/App.config
new file mode 100644 (file)
index 0000000..fad249e
--- /dev/null
@@ -0,0 +1,6 @@
+\feff<?xml version="1.0" encoding="utf-8" ?>\r
+<configuration>\r
+    <startup> \r
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />\r
+    </startup>\r
+</configuration>
\ No newline at end of file
diff --git a/StratumTest/Program.cs b/StratumTest/Program.cs
new file mode 100644 (file)
index 0000000..b8ddf8f
--- /dev/null
@@ -0,0 +1,27 @@
+\feffusing System;\r
+\r
+\r
+namespace StratumTest\r
+{\r
+    using Stratum;\r
+\r
+    class StratumTest\r
+    {\r
+        static void Main(string[] args)\r
+        {\r
+            Stratum s = new Stratum("192.168.1.100", 40001);\r
+\r
+            while (true)\r
+            {\r
+                var res = s.Invoke<string>("blockchain.transaction.get", "101379cb55ac431c435db40b4325f858568b0de3d8bd652a23a19e5d62521a72");\r
+\r
+                //                var res = s.Invoke<Newtonsoft.Json.Linq.JObject>("blockchain.address.get_balance", "4PQtUNZ2aBYpZpVMPV2Qgz1PitCqgoT388");\r
+                //                var res = s.Invoke<Newtonsoft.Json.Linq.JArray>("blockchain.address.get_history", "4PQtUNZ2aBYpZpVMPV2Qgz1PitCqgoT388");\r
+                //                var res = s.Invoke<Newtonsoft.Json.Linq.JArray>("blockchain.address.listunspent", "4PQtUNZ2aBYpZpVMPV2Qgz1PitCqgoT388");\r
+\r
+                Console.Write(res.Result.ToString());\r
+                Console.ReadLine();\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/StratumTest/Properties/AssemblyInfo.cs b/StratumTest/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..5b43a28
--- /dev/null
@@ -0,0 +1,36 @@
+\feffusing System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+// Управление общими сведениями о сборке осуществляется с помощью \r
+// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,\r
+// связанные со сборкой.\r
+[assembly: AssemblyTitle("StratumTest")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("")]\r
+[assembly: AssemblyProduct("StratumTest")]\r
+[assembly: AssemblyCopyright("Copyright ©  2015")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми \r
+// для COM-компонентов.  Если требуется обратиться к типу в этой сборке через \r
+// COM, задайте атрибуту ComVisible значение TRUE для этого типа.\r
+[assembly: ComVisible(false)]\r
+\r
+// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM\r
+[assembly: Guid("61645f69-d823-495a-ab80-3957c430db6f")]\r
+\r
+// Сведения о версии сборки состоят из следующих четырех значений:\r
+//\r
+//      Основной номер версии\r
+//      Дополнительный номер версии \r
+//      Номер построения\r
+//      Редакция\r
+//\r
+// Можно задать все значения или принять номер построения и номер редакции по умолчанию, \r
+// используя "*", как показано ниже:\r
+// [assembly: AssemblyVersion("1.0.*")]\r
+[assembly: AssemblyVersion("1.0.0.0")]\r
+[assembly: AssemblyFileVersion("1.0.0.0")]\r
diff --git a/StratumTest/StratumTest.csproj b/StratumTest/StratumTest.csproj
new file mode 100644 (file)
index 0000000..47832c1
--- /dev/null
@@ -0,0 +1,65 @@
+\feff<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />\r
+  <PropertyGroup>\r
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+    <ProjectGuid>{FB61065F-93BA-497B-A2D5-3574D23B0B62}</ProjectGuid>\r
+    <OutputType>Exe</OutputType>\r
+    <AppDesignerFolder>Properties</AppDesignerFolder>\r
+    <RootNamespace>StratumTest</RootNamespace>\r
+    <AssemblyName>StratumTest</AssemblyName>\r
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\r
+    <FileAlignment>512</FileAlignment>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <PlatformTarget>AnyCPU</PlatformTarget>\r
+    <DebugSymbols>true</DebugSymbols>\r
+    <DebugType>full</DebugType>\r
+    <Optimize>false</Optimize>\r
+    <OutputPath>bin\Debug\</OutputPath>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <PlatformTarget>AnyCPU</PlatformTarget>\r
+    <DebugType>pdbonly</DebugType>\r
+    <Optimize>true</Optimize>\r
+    <OutputPath>bin\Release\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <ItemGroup>\r
+    <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">\r
+      <SpecificVersion>False</SpecificVersion>\r
+      <HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="System" />\r
+    <Reference Include="System.Core" />\r
+    <Reference Include="Microsoft.CSharp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Compile Include="Program.cs" />\r
+    <Compile Include="Properties\AssemblyInfo.cs" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="App.config" />\r
+    <None Include="packages.config" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ProjectReference Include="..\StratumLibrary\Stratum.csproj">\r
+      <Project>{27f0c6c3-dcd6-4588-afbb-dce22306f5f8}</Project>\r
+      <Name>Stratum</Name>\r
+    </ProjectReference>\r
+  </ItemGroup>\r
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
+       Other similar extension points exist, see Microsoft.Common.targets.\r
+  <Target Name="BeforeBuild">\r
+  </Target>\r
+  <Target Name="AfterBuild">\r
+  </Target>\r
+  -->\r
+</Project>
\ No newline at end of file
diff --git a/StratumTest/packages.config b/StratumTest/packages.config
new file mode 100644 (file)
index 0000000..284ec0a
--- /dev/null
@@ -0,0 +1,4 @@
+\feff<?xml version="1.0" encoding="utf-8"?>\r
+<packages>\r
+  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />\r
+</packages>
\ No newline at end of file