Report-Erzeugung auf neue Bedürfnisse aktualisiert
This commit is contained in:
parent
e93e065443
commit
dd453176e4
Binary file not shown.
@ -45,6 +45,9 @@
|
||||
<setting name="LogoPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="DeleteFileAfterSend" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</bsmd.ReportGenerator.Properties.Settings>
|
||||
</applicationSettings>
|
||||
</configuration>
|
||||
@ -51,6 +51,23 @@ namespace bsmd.ReportGenerator
|
||||
return document;
|
||||
}
|
||||
|
||||
internal static Document CreateSingleClassDocument(MessageCore reportCore, List<Message> reportMessages,
|
||||
Dictionary<string, string> coverInfos, string classes, ReportingParty rp)
|
||||
{
|
||||
|
||||
Document document = new Document();
|
||||
document.Info.Title = string.Format("{0} for {1}", classes, reportCore.DisplayId);
|
||||
document.Info.Subject = "Reporting class info";
|
||||
document.Info.Author = Properties.Settings.Default.ReportAuthor;
|
||||
|
||||
BSMDDocument.DefineSingleStyle(document);
|
||||
BSMDDocument.DefineSingleHeader(document, coverInfos, rp);
|
||||
BSMDDocument.DefineContentSectionInitial(document);
|
||||
|
||||
|
||||
return document;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// create the final output document
|
||||
/// </summary>
|
||||
@ -130,9 +147,43 @@ namespace bsmd.ReportGenerator
|
||||
style.ParagraphFormat.Font.Color = Colors.Blue;
|
||||
}
|
||||
|
||||
static void DefineSingleStyle(Document doc)
|
||||
{
|
||||
Style style = doc.Styles["Normal"];
|
||||
style.Font.Name = "Verdana";
|
||||
|
||||
Style tableStyle = doc.Styles.AddStyle("Table", "Normal");
|
||||
tableStyle.Font.Name = "Verdana";
|
||||
tableStyle.Font.Size = 9;
|
||||
|
||||
// usw
|
||||
Style tableHeaderStyle = doc.Styles.AddStyle("TableHeader", "Normal");
|
||||
//tableHeaderStyle.Font.Name = "Verdana";
|
||||
tableHeaderStyle.Font.Size = 10;
|
||||
tableHeaderStyle.Font.Bold = true;
|
||||
|
||||
Style tableValueStyle = doc.Styles.AddStyle("TableValue", "Normal");
|
||||
tableValueStyle.Font.Size = 9;
|
||||
tableValueStyle.Font.Bold = true;
|
||||
|
||||
style = doc.Styles["Heading2"];
|
||||
style.Font.Size = 12;
|
||||
style.Font.Bold = true;
|
||||
style.ParagraphFormat.SpaceBefore = 6;
|
||||
style.ParagraphFormat.SpaceAfter = 6;
|
||||
|
||||
style = doc.Styles["Heading3"];
|
||||
style.Font.Size = 10;
|
||||
style.Font.Bold = true;
|
||||
style.Font.Italic = true;
|
||||
style.ParagraphFormat.SpaceBefore = 6;
|
||||
style.ParagraphFormat.SpaceAfter = 3;
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Cover
|
||||
#region Cover (alt, EU-NOAD)
|
||||
|
||||
/// <summary>
|
||||
/// Defines the cover page.
|
||||
@ -177,6 +228,86 @@ namespace bsmd.ReportGenerator
|
||||
row.Cells[0].AddParagraph(key);
|
||||
row.Cells[1].AddParagraph(coverInfos[key] ?? string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region "Neuer" EUREPORT Header Block für Einzelnachrichten
|
||||
|
||||
internal static void DefineSingleHeader(Document document, Dictionary<string, string> coverInfos, ReportingParty rp)
|
||||
{
|
||||
Section section = document.AddSection();
|
||||
section.PageSetup.StartingNumber = 1;
|
||||
|
||||
Table table = document.LastSection.AddTable();
|
||||
table.Style = "Table";
|
||||
table.Borders.Color = Colors.LightGray;
|
||||
table.Borders.Width = 0.25;
|
||||
|
||||
// Define Colums
|
||||
Column col = table.AddColumn(80); // die Bildspalte
|
||||
col.Format.Alignment = ParagraphAlignment.Center;
|
||||
|
||||
col = table.AddColumn(70);
|
||||
col = table.AddColumn(140);
|
||||
col = table.AddColumn(60);
|
||||
col = table.AddColumn(140);
|
||||
|
||||
Row row = table.AddRow();
|
||||
Image logoImage = row.Cells[0].AddImage(Properties.Settings.Default.LogoPath);
|
||||
logoImage.Width = 80;
|
||||
row.Cells[0].MergeDown = 6;
|
||||
|
||||
Paragraph paragraph = row.Cells[1].AddParagraph("Visit Details");
|
||||
row.Cells[1].MergeRight = 3;
|
||||
row.Cells[1].Shading.Color = Colors.LightGray;
|
||||
paragraph.Style = "TableHeader";
|
||||
|
||||
row = table.AddRow();
|
||||
row.Cells[1].AddParagraph("Visit-ID");
|
||||
paragraph = row.Cells[2].AddParagraph(coverInfos["Visit-ID"]);
|
||||
paragraph.Style = "TableValue";
|
||||
row.Cells[3].AddParagraph("Name");
|
||||
paragraph = row.Cells[4].AddParagraph(coverInfos["Ship"]);
|
||||
paragraph.Style = "TableValue";
|
||||
|
||||
row = table.AddRow();
|
||||
row.Cells[1].AddParagraph("Port of call");
|
||||
paragraph = row.Cells[2].AddParagraph(coverInfos["Port of call"]);
|
||||
paragraph.Style = "TableValue";
|
||||
row.Cells[3].AddParagraph("ETA");
|
||||
paragraph = row.Cells[4].AddParagraph(coverInfos["ETA"]);
|
||||
paragraph.Style = "TableValue";
|
||||
|
||||
row = table.AddRow();
|
||||
row.Shading.Color = Colors.LightGray;
|
||||
paragraph = row.Cells[1].AddParagraph("Reporting Party");
|
||||
row.Cells[1].MergeRight = 3;
|
||||
paragraph.Style = "TableHeader";
|
||||
|
||||
row = table.AddRow();
|
||||
row.Cells[1].AddParagraph("Organization");
|
||||
paragraph = row.Cells[2].AddParagraph(rp.Name);
|
||||
paragraph.Style = "TableValue";
|
||||
row.Cells[2].MergeRight = 2;
|
||||
|
||||
row = table.AddRow();
|
||||
row.Cells[1].AddParagraph("Last name");
|
||||
paragraph = row.Cells[2].AddParagraph(rp.LastName);
|
||||
paragraph.Style = "TableValue";
|
||||
|
||||
row.Cells[3].AddParagraph("City");
|
||||
paragraph = row.Cells[4].AddParagraph(rp.City);
|
||||
paragraph.Style = "TableValue";
|
||||
|
||||
row = table.AddRow();
|
||||
row.Cells[1].AddParagraph("Phone");
|
||||
paragraph = row.Cells[2].AddParagraph(rp.Phone);
|
||||
paragraph.Style = "TableValue";
|
||||
|
||||
row.Cells[3].AddParagraph("Email");
|
||||
paragraph = row.Cells[4].AddParagraph(rp.EMail);
|
||||
paragraph.Style = "TableValue";
|
||||
|
||||
}
|
||||
|
||||
@ -184,6 +315,23 @@ namespace bsmd.ReportGenerator
|
||||
|
||||
#region setup, header and footers
|
||||
|
||||
public static void DefineContentSectionInitial(Document document)
|
||||
{
|
||||
Section section = document.LastSection;
|
||||
section.PageSetup.OddAndEvenPagesHeaderFooter = false;
|
||||
section.PageSetup.Orientation = Orientation.Portrait;
|
||||
HeaderFooter header = section.Headers.Primary;
|
||||
header.AddParagraph(string.Format("EUREPORT - created {0}", DateTime.Now.ToString()));
|
||||
|
||||
Paragraph paragraph = new Paragraph();
|
||||
paragraph.AddTab();
|
||||
paragraph.AddPageField();
|
||||
paragraph.AddText(" / ");
|
||||
paragraph.AddNumPagesField();
|
||||
section.Footers.Primary.Add(paragraph);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines page setup, headers, and footers.
|
||||
/// </summary>
|
||||
@ -778,16 +926,16 @@ namespace bsmd.ReportGenerator
|
||||
private static void AddActualTableParagraph(Document document, List<KeyValuePair<string, string>> messageText, bool isSubTable)
|
||||
{
|
||||
Table table = document.LastSection.AddTable();
|
||||
|
||||
table.Borders.Color = Colors.LightGray;
|
||||
|
||||
// table.LeftPadding = new Unit(0.5, UnitType.Centimeter);
|
||||
|
||||
|
||||
Column leadColumn = table.AddColumn(Unit.FromCentimeter(8));
|
||||
Column leadColumn = table.AddColumn(200);
|
||||
leadColumn.Format.Alignment = ParagraphAlignment.Left;
|
||||
|
||||
|
||||
Column mainColumn = table.AddColumn(Unit.FromCentimeter(8));
|
||||
Column mainColumn = table.AddColumn(290);
|
||||
mainColumn.Format.Alignment = ParagraphAlignment.Left;
|
||||
|
||||
for (int i = 0; i < messageText.Count; i++)
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.34209
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
@ -12,7 +12,7 @@ namespace bsmd.ReportGenerator.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
@ -114,5 +114,14 @@ namespace bsmd.ReportGenerator.Properties {
|
||||
return ((string)(this["LogoPath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool DeleteFileAfterSend {
|
||||
get {
|
||||
return ((bool)(this["DeleteFileAfterSend"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,5 +35,8 @@
|
||||
<Setting Name="LogoPath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="DeleteFileAfterSend" Type="System.Boolean" Scope="Application">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@ -1,4 +1,7 @@
|
||||
using System;
|
||||
// Copyright (c) 2015-2017 schick Informatik
|
||||
// Service entry point
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
@ -10,6 +13,7 @@ using MigraDoc.DocumentObjectModel;
|
||||
|
||||
using bsmd.database;
|
||||
using bsmd.email;
|
||||
using System.Text;
|
||||
|
||||
namespace bsmd.ReportGenerator
|
||||
{
|
||||
@ -27,6 +31,8 @@ namespace bsmd.ReportGenerator
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
#region windows service overrides
|
||||
|
||||
protected override void OnStart(string[] args)
|
||||
{
|
||||
this.EventLog.Source = this.ServiceName;
|
||||
@ -40,6 +46,15 @@ namespace bsmd.ReportGenerator
|
||||
this.DoOnce();
|
||||
}
|
||||
|
||||
protected override void OnStop()
|
||||
{
|
||||
_log.Info("Report Service stopping.");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region timer functions
|
||||
|
||||
private void Init(string[] args)
|
||||
{
|
||||
this._timer = new Timer();
|
||||
@ -98,17 +113,14 @@ namespace bsmd.ReportGenerator
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnStop()
|
||||
{
|
||||
_log.Info("Report Service stopping.");
|
||||
}
|
||||
|
||||
internal void DoOnce()
|
||||
{
|
||||
this._timer_Elapsed(null, null);
|
||||
}
|
||||
|
||||
#region create and send report
|
||||
#endregion
|
||||
|
||||
#region create and send "old" EU-NOAD report
|
||||
|
||||
private void CreateReport(MessageCore reportCore)
|
||||
{
|
||||
@ -213,19 +225,93 @@ namespace bsmd.ReportGenerator
|
||||
}
|
||||
}
|
||||
|
||||
#region create (and send) "single" report (a report per message class)
|
||||
|
||||
internal void CreateSingleReport(MessageCore reportCore)
|
||||
{
|
||||
List<Message> messages = DBManager.Instance.GetMessagesForCore(reportCore, DBManager.MessageLoad.ALL);
|
||||
List<Message> reportMessages = new List<Message>();
|
||||
messages.Sort(new ANSWMessageComparer());
|
||||
Dictionary<string, string> coverInfos = new Dictionary<string, string>();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
Guid reportingPartyId = Guid.Empty;
|
||||
|
||||
string subject = string.Format("NEW EU-NOAD message IMO {0}", reportCore.IMO);
|
||||
foreach (Message aMessage in messages)
|
||||
{
|
||||
if (aMessage.InternalStatus == Message.BSMDStatus.REPORT)
|
||||
{
|
||||
reportMessages.Add(aMessage);
|
||||
aMessage.InternalStatus = Message.BSMDStatus.PREPARE;
|
||||
DBManager.Instance.Save(aMessage);
|
||||
sb.Append(aMessage.MessageNotificationClassDisplay);
|
||||
sb.Append(" ");
|
||||
if (aMessage.ReportingPartyId.HasValue)
|
||||
reportingPartyId = aMessage.ReportingPartyId.Value;
|
||||
}
|
||||
}
|
||||
string classes = sb.ToString();
|
||||
if (!classes.IsNullOrEmpty())
|
||||
{
|
||||
ReportingParty rp = null;
|
||||
if (DBManager.Instance.GetReportingPartyDict().ContainsKey(reportingPartyId))
|
||||
{
|
||||
rp = DBManager.Instance.GetReportingPartyDict()[reportingPartyId];
|
||||
|
||||
Dictionary<string, string> coverInfos = new Dictionary<string, string>();
|
||||
coverInfos.Add("Ship", DBManager.Instance.GetShipNameFromCore(reportCore));
|
||||
coverInfos.Add("ETA", reportCore.ETADisplay.ToString());
|
||||
coverInfos.Add("Port of call", reportCore.PoC);
|
||||
coverInfos.Add("Visit-ID", reportCore.DisplayId);
|
||||
coverInfos.Add("Class", classes);
|
||||
|
||||
string subject = string.Format("PDF report IMO {0} class(es) {1}", reportCore.IMO, classes);
|
||||
|
||||
Document migraDocument = BSMDDocument.CreateSingleClassDocument(reportCore, reportMessages, coverInfos, classes, rp);
|
||||
|
||||
// print messages to document
|
||||
foreach (Message message in reportMessages)
|
||||
{
|
||||
BSMDDocument.AddNSWMessageParagraph(migraDocument, message);
|
||||
}
|
||||
|
||||
// prepare and send E-Mail with generated attachment
|
||||
string fullPath = string.Format("{0}\\{1}.pdf", Properties.Settings.Default.OutputDirectory, reportCore.Id);
|
||||
|
||||
BSMDDocument.RenderDocument(migraDocument, fullPath);
|
||||
_log.InfoFormat("Document created for MessageCoreId {0}, IMO {1}", reportCore.Id, reportCore.IMO);
|
||||
List<string> attachments = new List<string>();
|
||||
attachments.Add(fullPath);
|
||||
|
||||
BSMDMail.SendNSWReportWithAttachments(subject, attachments, rp.EMail);
|
||||
|
||||
// remove
|
||||
if (Properties.Settings.Default.DeleteFileAfterSend)
|
||||
{
|
||||
try
|
||||
{
|
||||
File.Delete(fullPath);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_log.ErrorFormat("Cannot delete {0}: {1}", fullPath, ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_log.WarnFormat("Default reporting party not set on core {0}", reportCore.Id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_log.WarnFormat("Core {0} set for report, but no message classes!", reportCore.Id);
|
||||
}
|
||||
|
||||
// reset report status
|
||||
reportCore.ReportStatus = MessageCore.ReportStatusEnum.NONE;
|
||||
DBManager.Instance.Save(reportCore);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@ -108,6 +108,7 @@
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
<None Include="..\bsmdKey.snk" />
|
||||
<None Include="bsmd.ReportGenerator.licenseheader" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
@ -132,6 +133,9 @@
|
||||
<Name>bsmd.email</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="readme.txt" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
||||
@ -0,0 +1,15 @@
|
||||
extensions: designer.cs generated.cs
|
||||
extensions: .cs .cpp .h
|
||||
// Copyright (c) 2015-2017 schick Informatik
|
||||
//
|
||||
|
||||
extensions: .aspx .ascx
|
||||
<%--
|
||||
Copyright (c) 2015-2017 schick Informatik
|
||||
--%>
|
||||
extensions: .vb
|
||||
' Copyright (c) 2015-2017 schick Informatik
|
||||
extensions: .xml .config .xsd
|
||||
<!--
|
||||
Copyright (c) 2015-2017 schick Informatik
|
||||
-->
|
||||
17
nsw/Source/bsmd.ReportGenerator/readme.txt
Normal file
17
nsw/Source/bsmd.ReportGenerator/readme.txt
Normal file
@ -0,0 +1,17 @@
|
||||
Es gibt zwei unterschiedliche Verfahren:
|
||||
|
||||
1) MigraDoc Document (MigraDoc.*.dll)
|
||||
Das erfolgt im HTML Style bei dem man einfach Paragrafen an ein Dokument anfügt und der
|
||||
Flow wird dann vom Renderer berechnet. Es gehen auch absolute Positionen aber keine
|
||||
grafischen Elemente außer Bildern und Tabellen
|
||||
|
||||
2) PdfDocument (PdfSharp.*.dll)
|
||||
Das ist der "Drawing" Style, hier können auch MigraDoc Dokumente eingebettet werden wenn
|
||||
man beides machen will. Es geht aber über eine graph. Context (XGraphics) und absolute
|
||||
Koordinaten. Man kann damit z.B. auch mehrere MigraDoc's in kleine Rectangles "reinrendern".
|
||||
|
||||
Auf dieser Seite wird das sehr gut an einem Beispiel gegenübergestellt:
|
||||
http://www.pdfsharp.net/wiki/MixMigraDocAndPdfSharp-sample.ashx
|
||||
|
||||
Koordinatensystem ist "Points" (72pt = 1 inch), es gibt Umrechnungsfunktionen für cm etc.
|
||||
In Points hat eine DIN-A4 Seite dann die Ausdehnung von 595 x 842.
|
||||
4
nsw/Source/bsmd.dbh.ResponseService/packages.config
Normal file
4
nsw/Source/bsmd.dbh.ResponseService/packages.config
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="log4net" version="2.0.8" targetFramework="net45" />
|
||||
</packages>
|
||||
@ -71,11 +71,13 @@ namespace bsmd.dbh
|
||||
// neue VISIT - ID
|
||||
aMessage.MessageCore.VisitId = VisitId;
|
||||
aMessage.MessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE;
|
||||
aMessage.SendSuccess = true;
|
||||
DBManager.Instance.Save(aMessage.MessageCore);
|
||||
break;
|
||||
case dbh.response.RootType.TRANSIT:
|
||||
aMessage.MessageCore.TransitId = TransitId;
|
||||
aMessage.MessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE;
|
||||
aMessage.SendSuccess = true;
|
||||
DBManager.Instance.Save(aMessage.MessageCore);
|
||||
break;
|
||||
case dbh.response.RootType.CANCEL:
|
||||
@ -99,6 +101,7 @@ namespace bsmd.dbh
|
||||
(int) ReportingClassesFull[0].ReportingClass[0] == (int)aMessage.MessageNotificationClass)
|
||||
{
|
||||
// this was successful, save status to MessageHeader
|
||||
aMessage.SendSuccess = true;
|
||||
aMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;
|
||||
aMessage.Status = Message.MessageStatus.ACCEPTED;
|
||||
}
|
||||
@ -125,7 +128,7 @@ namespace bsmd.dbh
|
||||
error.MessageHeaderId = aMessage.Id.Value;
|
||||
aMessage.InternalStatus = Message.BSMDStatus.ERROR;
|
||||
DBManager.Instance.Save(error);
|
||||
|
||||
aMessage.SendSuccess = false;
|
||||
break;
|
||||
|
||||
case dbh.response.RootMessageType.VIOLATION:
|
||||
|
||||
@ -45,7 +45,23 @@ namespace bsmd.hisnord
|
||||
{
|
||||
_log.WarnFormat("Transmitter process not exited within {0} minute", Properties.Settings.Default.BatchTimeoutMins);
|
||||
// kill Kill KILLLL!!!
|
||||
try
|
||||
{
|
||||
process.Kill();
|
||||
process.WaitForExit(500);
|
||||
if (process.HasExited)
|
||||
{
|
||||
_log.Info("Transmitter killed, process exited");
|
||||
}
|
||||
else
|
||||
{
|
||||
_log.Warn("Killing Transmitter failed, this thing hangs and we're in trouble now");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_log.WarnFormat("Killing Transmitter failed: {0}", e.Message);
|
||||
}
|
||||
}
|
||||
string errorString = process.StandardError.ReadToEnd();
|
||||
if(!errorString.IsNullOrEmpty())
|
||||
|
||||
Loading…
Reference in New Issue
Block a user