diff --git a/src/Portalum.Zvt.ControlPanel/MainWindow.xaml.cs b/src/Portalum.Zvt.ControlPanel/MainWindow.xaml.cs index dab6de2..ed89a7a 100644 --- a/src/Portalum.Zvt.ControlPanel/MainWindow.xaml.cs +++ b/src/Portalum.Zvt.ControlPanel/MainWindow.xaml.cs @@ -1,18 +1,20 @@ using Microsoft.Extensions.Logging; -using Portalum.Zvt.Models; using Portalum.Zvt.ControlPanel.Dialogs; using Portalum.Zvt.ControlPanel.Models; +using Portalum.Zvt.Helpers; +using Portalum.Zvt.Models; +using Portalum.Zvt.Repositories; using System; using System.Collections.Generic; using System.Globalization; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Media; using System.Windows.Media.Effects; -using System.Threading; namespace Portalum.Zvt.ControlPanel { @@ -44,7 +46,16 @@ public MainWindow(DeviceConfiguration deviceConfiguration) this.TextBoxAmount.Text = $"{this.CreateRandomAmount()}"; - _ = Task.Run(async () => await this.ConnectAsync()); + CodePagesEncodingProvider.Instance.GetEncoding(437); + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + + _ = Task.Run(async () => await this.ConnectAsync()).ContinueWith(task => + { + if (task.IsFaulted) + { + throw task.Exception; + } + }); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) @@ -126,13 +137,38 @@ private async Task ConnectAsync() this.ButtonDisconnect.IsEnabled = true; }); + #region Default ZVT + var zvtClientConfig = new ZvtClientConfig { Encoding = this._deviceConfiguration.Encoding, Language = this._deviceConfiguration.Language }; - this._zvtClient = new ZvtClient(this._deviceCommunication, logger: loggerZvtClient, zvtClientConfig); + this._zvtClient = new ZvtClient( + deviceCommunication: this._deviceCommunication, + logger: loggerZvtClient, + clientConfig: zvtClientConfig); + + #endregion + + #region Ingenico ZVT + + //var receiveHandler = new ReceiveHandler( + // logger: loggerZvtClient, + // encoding: EncodingHelper.GetEncoding(this._deviceConfiguration.Encoding), + // errorMessageRepository: new EnglishErrorMessageRepository(), + // intermediateStatusRepository: new IngenicoEnglishIntermediateStatusRepository() + // ); + + //this._zvtClient = new ZvtClient( + // deviceCommunication: this._deviceCommunication, + // logger: loggerZvtClient, + // receiveHandler: receiveHandler); + + #endregion + + this._zvtClient.LineReceived += this.LineReceived; this._zvtClient.ReceiptReceived += this.ReceiptReceived; this._zvtClient.StatusInformationReceived += this.StatusInformationReceived; @@ -162,10 +198,13 @@ private async Task DisconnectAsync() disposable.Dispose(); } - this._zvtClient.LineReceived -= this.LineReceived; - this._zvtClient.ReceiptReceived -= this.ReceiptReceived; - this._zvtClient.StatusInformationReceived -= this.StatusInformationReceived; - this._zvtClient.IntermediateStatusInformationReceived -= this.IntermediateStatusInformationReceived; + if (this._zvtClient != null) + { + this._zvtClient.LineReceived -= this.LineReceived; + this._zvtClient.ReceiptReceived -= this.ReceiptReceived; + this._zvtClient.StatusInformationReceived -= this.StatusInformationReceived; + this._zvtClient.IntermediateStatusInformationReceived -= this.IntermediateStatusInformationReceived; + } this._zvtClient?.Dispose(); this.ButtonDisconnect.Dispatcher.Invoke(() => diff --git a/src/Portalum.Zvt/Helpers/EncodingHelper.cs b/src/Portalum.Zvt/Helpers/EncodingHelper.cs new file mode 100644 index 0000000..ba27aa7 --- /dev/null +++ b/src/Portalum.Zvt/Helpers/EncodingHelper.cs @@ -0,0 +1,33 @@ +using System.Text; + +namespace Portalum.Zvt.Helpers +{ + /// + /// EncodingHelper + /// + public static class EncodingHelper + { + /// + /// GetEncoding from ZvtEncoding + /// + /// + /// + public static Encoding GetEncoding(ZvtEncoding zvtEncoding) + { + switch (zvtEncoding) + { + case ZvtEncoding.UTF8: + return Encoding.UTF8; + case ZvtEncoding.ISO_8859_1: + return Encoding.GetEncoding("iso-8859-1"); + case ZvtEncoding.ISO_8859_2: + return Encoding.GetEncoding("iso-8859-2"); + case ZvtEncoding.ISO_8859_15: + return Encoding.GetEncoding("iso-8859-15"); + case ZvtEncoding.CodePage437: + default: + return Encoding.GetEncoding(437); + } + } + } +} diff --git a/src/Portalum.Zvt/Portalum.Zvt.csproj b/src/Portalum.Zvt/Portalum.Zvt.csproj index eeb1d08..0205606 100644 --- a/src/Portalum.Zvt/Portalum.Zvt.csproj +++ b/src/Portalum.Zvt/Portalum.Zvt.csproj @@ -23,7 +23,7 @@ - + diff --git a/src/Portalum.Zvt/Repositories/EnglishIntermediateStatusRepository.cs b/src/Portalum.Zvt/Repositories/EnglishIntermediateStatusRepository.cs index 813f1ce..f7aab69 100644 --- a/src/Portalum.Zvt/Repositories/EnglishIntermediateStatusRepository.cs +++ b/src/Portalum.Zvt/Repositories/EnglishIntermediateStatusRepository.cs @@ -12,7 +12,8 @@ public class EnglishIntermediateStatusRepository : IIntermediateStatusRepository /// /// English IntermediateStatusRepository /// - public EnglishIntermediateStatusRepository() + /// + public EnglishIntermediateStatusRepository(Dictionary additionalStatusCodes = null) { this._statusCodes = new Dictionary { @@ -102,6 +103,14 @@ public EnglishIntermediateStatusRepository() { 0xF3, "Offline transaction" }, { 0xFF, "no appropriate ZVT status code matches the status. See TLV tags 24 and 07" } }; + + if (additionalStatusCodes != null) + { + foreach (var additionalStatusCode in additionalStatusCodes) + { + this._statusCodes.Add(additionalStatusCode.Key, additionalStatusCode.Value); + } + } } /// diff --git a/src/Portalum.Zvt/Repositories/GermanIntermediateStatusRepository.cs b/src/Portalum.Zvt/Repositories/GermanIntermediateStatusRepository.cs index 203e89b..cc07ac7 100644 --- a/src/Portalum.Zvt/Repositories/GermanIntermediateStatusRepository.cs +++ b/src/Portalum.Zvt/Repositories/GermanIntermediateStatusRepository.cs @@ -12,7 +12,8 @@ public class GermanIntermediateStatusRepository : IIntermediateStatusRepository /// /// German IntermediateStatusRepository /// - public GermanIntermediateStatusRepository() + /// + public GermanIntermediateStatusRepository(Dictionary additionalStatusCodes = null) { this._statusCodes = new Dictionary { @@ -102,6 +103,14 @@ public GermanIntermediateStatusRepository() { 0xF3, "Offline-Transaktion" }, { 0xFF, "kein geeigneter ZVT-Statuscode zu demdem Status. Siehe TLV-Tags 24 und 07" } }; + + if (additionalStatusCodes != null) + { + foreach (var additionalStatusCode in additionalStatusCodes) + { + this._statusCodes.Add(additionalStatusCode.Key, additionalStatusCode.Value); + } + } } /// diff --git a/src/Portalum.Zvt/Repositories/IngenicoEnglishIntermediateStatusRepository.cs b/src/Portalum.Zvt/Repositories/IngenicoEnglishIntermediateStatusRepository.cs new file mode 100644 index 0000000..95e2da9 --- /dev/null +++ b/src/Portalum.Zvt/Repositories/IngenicoEnglishIntermediateStatusRepository.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace Portalum.Zvt.Repositories +{ + /// + /// Ingenico English IntermediateStatusRepository + /// + public class IngenicoEnglishIntermediateStatusRepository : EnglishIntermediateStatusRepository + { + /// + public IngenicoEnglishIntermediateStatusRepository() : base(new Dictionary + { + { 0xA0, "Payment processed" }, + { 0xA1, "Payment processed\nPlease remove card!" }, + { 0xA2, "Cancellation successful" }, + { 0xA3, "Cancellation successful\nPlease remove card!" }, + { 0xA4, "Cancellation not possible" }, + { 0xA5, "Cancellation not possible\nPlease remove card!" } + }) + { } + } +} diff --git a/src/Portalum.Zvt/Repositories/IngenicoGermanIntermediateStatusRepository.cs b/src/Portalum.Zvt/Repositories/IngenicoGermanIntermediateStatusRepository.cs new file mode 100644 index 0000000..0310b68 --- /dev/null +++ b/src/Portalum.Zvt/Repositories/IngenicoGermanIntermediateStatusRepository.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace Portalum.Zvt.Repositories +{ + /// + /// Ingenico German IntermediateStatusRepository + /// + public class IngenicoGermanIntermediateStatusRepository : EnglishIntermediateStatusRepository + { + /// + public IngenicoGermanIntermediateStatusRepository() : base(new Dictionary + { + { 0xA0, "Zahlung erfolgt" }, + { 0xA1, "Zahlung erfolgt\nBitte Karte entnehmen!" }, + { 0xA2, "Storno erfolgt" }, + { 0xA3, "Storno erfolgt\nBitte Karte entnehmen!" }, + { 0xA4, "Storno nicht möglich" }, + { 0xA5, "Storno nicht möglich\nBitte Karte entnehmen!" } + }) + { } + } +} diff --git a/src/Portalum.Zvt/ZvtClient.cs b/src/Portalum.Zvt/ZvtClient.cs index 85c9ee5..53283a7 100644 --- a/src/Portalum.Zvt/ZvtClient.cs +++ b/src/Portalum.Zvt/ZvtClient.cs @@ -108,7 +108,7 @@ public ZvtClient( if (receiveHandler == default) { - this.InitializeReceiveHandler(clientConfig.Language, this.GetEncoding(clientConfig.Encoding)); + this.InitializeReceiveHandler(clientConfig.Language, EncodingHelper.GetEncoding(clientConfig.Encoding)); } else { @@ -161,24 +161,6 @@ private CompletionInfo GetCompletionInfo() return this.CompletionDecisionRequested?.Invoke(); } - private Encoding GetEncoding(ZvtEncoding zvtEncoding) - { - switch (zvtEncoding) - { - case ZvtEncoding.UTF8: - return Encoding.UTF8; - case ZvtEncoding.ISO_8859_1: - return Encoding.GetEncoding("iso-8859-1"); - case ZvtEncoding.ISO_8859_2: - return Encoding.GetEncoding("iso-8859-2"); - case ZvtEncoding.ISO_8859_15: - return Encoding.GetEncoding("iso-8859-15"); - case ZvtEncoding.CodePage437: - default: - return Encoding.GetEncoding(437); - } - } - private void InitializeReceiveHandler( Language language, Encoding encoding) @@ -218,7 +200,8 @@ private void UnregisterReceiveHandlerEvents() private IErrorMessageRepository GetErrorMessageRepository(Language language) { - //No German translation available + //TODO: No German translation available + return new EnglishErrorMessageRepository(); } diff --git a/src/Portalum.Zvt/ZvtCommunication.cs b/src/Portalum.Zvt/ZvtCommunication.cs index cce69ee..ce7a5ef 100644 --- a/src/Portalum.Zvt/ZvtCommunication.cs +++ b/src/Portalum.Zvt/ZvtCommunication.cs @@ -197,7 +197,7 @@ protected virtual void ProcessData(byte[] data) } else if (dataProcessed.Response is StatusInformation statusInformation) { - this._logger.LogError($"{nameof(ProcessData)} - {statusInformation.ErrorCode}"); + this._logger.LogInformation($"{nameof(ProcessData)} - StatusInformation with ErrorCode:{statusInformation.ErrorCode:X2} {statusInformation.ErrorMessage} received"); this._deviceCommunication.SendAsync(this._negativeIssueGoodsData); } else if (dataProcessed.Response is Completion completion)