diff --git a/ChipDnaClient.csproj b/ChipDnaClient.csproj index e7148ba..78e719f 100644 --- a/ChipDnaClient.csproj +++ b/ChipDnaClient.csproj @@ -218,6 +218,7 @@ packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll + packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll @@ -247,6 +248,7 @@ + diff --git a/Client.cs b/Client.cs index 858d7c7..6636235 100644 --- a/Client.cs +++ b/Client.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; +using Newtonsoft.Json.Serialization; namespace Creditcall.ChipDna.Client { @@ -470,14 +471,14 @@ namespace Creditcall.ChipDna.Client } } - private void GetStatus() + public Dictionary GetStatus() { - Console.WriteLine(ParameterKeys.VersionInformation + "\n" + ParameterKeys.ChipDnaStatus + "\n" + ParameterKeys.PaymentDeviceStatus + "\n" + ParameterKeys.RequestQueueStatus + "\n" + ParameterKeys.TmsStatus + "\n" + ParameterKeys.PaymentPlatformStatus); - + var transactionResult = new Dictionary(); var parameterSet = new ParameterSet(); + var responseParameter = new List(); parameterSet.Add(GetExtraParams("GetStatus")); - Response response = chipDnaClientLib.GetStatus(GetRequestedParameterSet(parameterSet)); + Response response = chipDnaClientLib.GetStatus(parameterSet); string errors; var serverStatus = (ChipDnaStatus) null; @@ -494,6 +495,13 @@ namespace Creditcall.ChipDna.Client { Console.WriteLine(serverStatus); } + + responseParameter = response.ToList(); + responseParameter.ForEach(parameter => + { + transactionResult.Add(parameter.Key, parameter.Value); + }); + return transactionResult; } private void GetMerchantData() @@ -1451,6 +1459,7 @@ namespace Creditcall.ChipDna.Client private void ChipDnaClientLibOnPaymentDeviceAvailabilityChangeEvent(object sender, EventParameters connectionEventArgs) { + var transactionResult = new Dictionary(); var stringBuilder = new StringBuilder(); connectionEventArgs.ToList().ForEach(param => { @@ -1467,8 +1476,10 @@ namespace Creditcall.ChipDna.Client else { stringBuilder.Append(string.Format("[{0}]", param.ToString())); - } + } + transactionResult.Add(param.Key, param.Value); }); + _ = ErrorLogger.SendLogErrorAsync(transactionResult); Console.WriteLine("{0}: {1}", "Payment Device Availability Change Event", stringBuilder); } @@ -1494,6 +1505,11 @@ namespace Creditcall.ChipDna.Client private void ChipDnaClientLibOnErrorEvent(object sender, ClientHelperErrorEventArgs errorEventArgs) { + var result = new Dictionary + { + { ParameterKeys.Errors, errorEventArgs.RaisedException.Message} + }; + _ = ErrorLogger.SendLogErrorAsync(result); PrintErrorEvent(errorEventArgs.RaisedException); } diff --git a/ClientApp.cs b/ClientApp.cs index 8d6b00f..26578ee 100644 --- a/ClientApp.cs +++ b/ClientApp.cs @@ -76,6 +76,7 @@ namespace Creditcall.ChipDna.Client listener.Prefixes.Add("http://127.0.0.1:18181/start-and-confirm-transaction/"); listener.Prefixes.Add("http://127.0.0.1:18181/transaction-information/"); listener.Prefixes.Add("http://127.0.0.1:18181/void-transaction/"); + listener.Prefixes.Add("http://127.0.0.1:18181/chipdna-status/"); listener.Start(); Console.WriteLine("Listening on:"); @@ -83,6 +84,7 @@ namespace Creditcall.ChipDna.Client Console.WriteLine(" http://127.0.0.1:18181/start-and-confirm-transaction/"); Console.WriteLine(" http://127.0.0.1:18181/transaction-information/"); Console.WriteLine(" http://127.0.0.1:18181/void-transaction/"); + Console.WriteLine(" http://127.0.0.1:18181/chipdna-status/"); while (true) { @@ -115,7 +117,10 @@ namespace Creditcall.ChipDna.Client { HandleVoidTransaction(context); } - else + else if (rawUrl.StartsWith("/chipdna-status", StringComparison.OrdinalIgnoreCase)) + { + HandleGetStatus(context); + } { context.Response.StatusCode = 404; context.Response.Close(); @@ -134,6 +139,27 @@ namespace Creditcall.ChipDna.Client } } + private static void HandleGetStatus(HttpListenerContext context) + { + try + { + var statusResult = client.GetStatus(); + var responseSerializer = new XmlSerializer(typeof(SerializableKeyValueList)); + context.Response.ContentType = "application/xml"; + var wrappedResult = new SerializableKeyValueList(statusResult); + responseSerializer.Serialize(context.Response.OutputStream, wrappedResult); + } + catch (Exception ex) + { + Console.WriteLine("Error in -status: " + ex.Message); + context.Response.StatusCode = 500; + } + finally + { + context.Response.OutputStream.Close(); + } + } + private static void HandleTransactionInformation(HttpListenerContext context) { try @@ -359,10 +385,6 @@ namespace Creditcall.ChipDna.Client } } - - - - private static string GetAbsolutePath(string fileName) { diff --git a/ErrorLogger.cs b/ErrorLogger.cs new file mode 100644 index 0000000..6cbd6ea --- /dev/null +++ b/ErrorLogger.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Serialization; + +namespace Creditcall.ChipDna.Client +{ + public static class ErrorLogger + { + private static readonly HttpClient httpClient = new HttpClient + { + Timeout = TimeSpan.FromSeconds(10) + }; + + public static async Task SendLogErrorAsync(Dictionary statusResult) + { + try + { + if (statusResult == null || statusResult.Count == 0) + return; + + var url = "http://127.0.0.1:9091/logerror"; + + var wrappedResult = new SerializableKeyValueList(statusResult); + var serializer = new XmlSerializer(typeof(SerializableKeyValueList)); + + var ns = new XmlSerializerNamespaces(); + ns.Add(string.Empty, string.Empty); + var settings = new XmlWriterSettings + { + OmitXmlDeclaration = false, + Indent = false, + Encoding = new UTF8Encoding(false) + }; + + using (var ms = new MemoryStream()) + { + using (var xw = XmlWriter.Create(ms, settings)) + { + serializer.Serialize(xw, wrappedResult, ns); + } + + var content = new ByteArrayContent(ms.ToArray()); + content.Headers.ContentType = + new MediaTypeHeaderValue("application/xml"); + + await httpClient.PostAsync(url, content); + } + } + catch (Exception ex) + { + Console.WriteLine("SendLogErrorAsync failed: " + ex.Message); + } + } + } +} \ No newline at end of file