diff --git a/PluginHost/MS-12.PluginHost/Static/LinqExtension.cs b/PluginHost/MS-12.PluginHost/Static/LinqExtension.cs index f5c5751..5a3c050 100644 --- a/PluginHost/MS-12.PluginHost/Static/LinqExtension.cs +++ b/PluginHost/MS-12.PluginHost/Static/LinqExtension.cs @@ -30,5 +30,16 @@ public static void ForEach(this List source, Action selector) selector(source[i], i); } } + + public static List ConvertAll(this List source, Func selector) + { + int i = 0; + return source.ConvertAll(e => + { + TOutput result = selector(e, i); + i++; + return result; + }); + } } } diff --git a/PrinterPlugins/Epson/TML90/Program.cs b/PrinterPlugins/Epson/TML90/Program.cs index f36ffbb..d4aa8fe 100644 --- a/PrinterPlugins/Epson/TML90/Program.cs +++ b/PrinterPlugins/Epson/TML90/Program.cs @@ -28,14 +28,97 @@ public void Initialize(string printerName) posExplorer = new PosExplorer(); DeviceInfo deviceInfo = posExplorer.GetDevice(DeviceType.PosPrinter, printerName); - posPrinter = (PosPrinter)posExplorer.CreateInstance(deviceInfo); + if (deviceInfo is null) + { + PluginHost.ThrowWarning($"指定された論理デバイス名 \"{printerName}\" は不正です。OPOS ADK でこの名前のプリンターが登録されているか確認して下さい。", "プリンター GetDevice エラー"); + return; + } + + try + { + posPrinter = (PosPrinter)posExplorer.CreateInstance(deviceInfo); + } + catch (Exception ex) + { + PluginHost.ThrowWarning($"不明なエラーが発生しました: {ex.Message}", "プリンター CreateInstance エラー"); + } + + try + { + posPrinter.Open(); + } + catch (PosControlException ex) + { + switch (ex.ErrorCode) + { + case ErrorCode.Illegal: + if (ex.Message.Contains("invalid parameter value")) + { + PluginHost.ThrowWarning($"指定された論理デバイス名 \"{printerName}\" は不正です。OPOS ADK でこの名前のプリンターが登録されているか確認して下さい。", "プリンター Open エラー"); + } + else if (ex.Message.Contains("already open")) + { + PluginHost.ThrowWarning($"接続処理に失敗しました。プリンターが他のアプリケーションで使用されている可能性があります。", "プリンター Open エラー"); + } + else + { + PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: Illegal】 {ex.Message}", "プリンター Open エラー"); + } + break; + + case ErrorCode.NoService: + PluginHost.ThrowWarning($"接続処理に失敗しました。お使いのプリンターの不具合の可能性があります。", "プリンター Open エラー"); + break; + + default: + PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: {ex.ErrorCode}】 {ex.Message}", "プリンター Open エラー"); + break; + } + return; + } + + try + { + posPrinter.Claim(5000); + } + catch (PosControlException ex) + { + switch (ex.ErrorCode) + { + case ErrorCode.Closed: + PluginHost.ThrowWarning($"ソフトウェアの不具合です。お手数ですが開発者へご連絡下さい。ご連絡の際にはこちらのエラーコードをお伝え下さい:【CA-CO】", "プリンター Claim エラー"); + break; + + case ErrorCode.Illegal: + PluginHost.ThrowWarning($"ソフトウェアの不具合です。お手数ですが開発者へご連絡下さい。ご連絡の際にはこちらのエラーコードをお伝え下さい:【CA-IL】", "プリンター Claim エラー"); + break; + + case ErrorCode.Timeout: + PluginHost.ThrowWarning($"時間内に接続出来ませんでした。プリンターが他のアプリケーションで使用されている可能性があります。", "プリンター Claim エラー"); + break; + + case ErrorCode.Failure: + PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: Failure】 {ex.Message}", "プリンター Claim エラー"); + break; + + default: + PluginHost.ThrowWarning($"不明なエラーが発生しました:【ErrorCode: {ex.ErrorCode}】 {ex.Message}", "プリンター Claim エラー"); + break; + } + return; + } - posPrinter.Open(); - posPrinter.Claim(1000); - posPrinter.DeviceEnabled = true; + try + { + posPrinter.DeviceEnabled = true; - posPrinter.MapMode = MapMode.Dots; - posPrinter.RecLetterQuality = true; + posPrinter.MapMode = MapMode.Dots; + posPrinter.RecLetterQuality = true; + } + catch (Exception ex) + { + PluginHost.ThrowWarning($"不明なエラーが発生しました:【{ex.GetType().Name}】 {ex.Message}", "プリンターセットアップエラー"); + } } public void Dispose() @@ -45,19 +128,23 @@ public void Dispose() posPrinter.Close(); } - public void Print(List tickets, int issueingNumber, Action onPrint, Action onError) + public void Print(List tickets, int issuingNumber, Action onPrint, Action onError) { + string tempDirectoryPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + Directory.CreateDirectory(tempDirectoryPath); + try { - posPrinter.PrintNormal(PrinterStation.Receipt, $"{issueingNumber} {tickets.Count}枚"); + posPrinter.PrintNormal(PrinterStation.Receipt, $"{issuingNumber} {tickets.Count}枚"); } catch (Exception ex) { onError(ex, 0); + DeleteTempFiles(); return; } - List<(Bitmap, Bitmap)> bmps = tickets.ConvertAll(t => + List<(string, string)> bmpPaths = tickets.ConvertAll((t, i) => { Bitmap sourceBmp = (Bitmap)t.Bitmap.Clone(); sourceBmp.RotateFlip(RotateFlipType.Rotate270FlipNone); @@ -65,21 +152,28 @@ public void Print(List tickets, int issueingNumber, Action onPr Bitmap bmp1 = sourceBmp.Clone(new Rectangle((sourceBmp.Width - 364) / 2, 0, 364, 90), PixelFormat.Format1bppIndexed); Bitmap bmp2 = sourceBmp.Clone(new Rectangle((sourceBmp.Width - 364) / 2, 90, 364, sourceBmp.Height - 90), PixelFormat.Format1bppIndexed); - return (bmp1, bmp2); + string bmp1Path = Path.Combine(tempDirectoryPath, $"{i}-1.bmp"); + string bmp2Path = Path.Combine(tempDirectoryPath, $"{i}-2.bmp"); + + bmp1.Save(bmp1Path, ImageFormat.Bmp); + bmp2.Save(bmp2Path, ImageFormat.Bmp); + + return (bmp1Path, bmp2Path); }); - bmps.ForEach((b, i) => + bmpPaths.ForEach((b, i) => { try { posPrinter.PrintNormal(PrinterStation.Receipt, "\u001b|45uF"); - posPrinter.PrintMemoryBitmap(PrinterStation.Receipt, b.Item1, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2); + posPrinter.PrintBitmap(PrinterStation.Receipt, b.Item1, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2); posPrinter.PrintNormal(PrinterStation.Receipt, "\u001b|P"); - posPrinter.PrintMemoryBitmap(PrinterStation.Receipt, b.Item2, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2); + posPrinter.PrintBitmap(PrinterStation.Receipt, b.Item2, PosPrinter.PrinterBitmapAsIs, (420 - 364) / 2); } catch (Exception ex) { onError(ex, i); + DeleteTempFiles(); return; } @@ -94,8 +188,17 @@ public void Print(List tickets, int issueingNumber, Action onPr catch (Exception ex) { onError(ex, tickets.Count - 1); + DeleteTempFiles(); return; } + + DeleteTempFiles(); + + + void DeleteTempFiles() + { + Task.Run(() => Directory.Delete(tempDirectoryPath, true)); + } } } }