//
// Class: transmitter
// Current CLR: 4.0.30319.34209
// System: Microsoft Visual Studio 10.0
// Author: dani
// Created: 7/14/2015 7:39:29 AM
//
// Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved.
using System;
using System.Diagnostics;
using System.IO;
using System.Xml.Serialization;
using bsmd.database;
using log4net;
namespace bsmd.hisnord
{
public class transmitter
{
private static readonly ILog _log = LogManager.GetLogger(typeof(transmitter));
private static int? processId; // Achtung, das müsste getrennt behandelt werden Test <-> Livesystem!
private static int? processTestId;
public static void CallTransmitter(bool useTest)
{
string rootDir = useTest ? Properties.Settings.Default.TestTransmitterRoot : Properties.Settings.Default.LiveTransmitterRoot;
if(!useTest && processId.HasValue)
{
_log.InfoFormat("Transmitter process {0} still running, aborting call", processId);
return;
}
if(useTest && processTestId.HasValue)
{
_log.InfoFormat("Transmitter process (Test system) {0} still running, aborting call", processId);
return;
}
ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(rootDir, Properties.Settings.Default.Transmitter));
startInfo.WorkingDirectory = rootDir;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = false;
startInfo.UseShellExecute = false;
// der Transmitter schickt alles was im Ausgabe-Verzeichnis ist
// damit das gut geht schicken wir die Nachrichten einzeln und arbeiten jeweils das
// Ergebnis ab
using (Process transmitterProcess = new Process())
{
if (useTest)
{
transmitterProcess.Exited += TransmitterTestProcess_Exited;
}
else
{
transmitterProcess.Exited += TransmitterProcess_Exited;
}
transmitterProcess.ErrorDataReceived += TransmitterProcess_ErrorDataReceived;
transmitterProcess.OutputDataReceived += TransmitterProcess_OutputDataReceived;
transmitterProcess.StartInfo = startInfo;
transmitterProcess.EnableRaisingEvents = true;
transmitterProcess.Start();
transmitterProcess.BeginErrorReadLine();
transmitterProcess.BeginOutputReadLine();
int aProcessId = transmitterProcess.Id;
if (useTest)
{
processTestId = aProcessId;
}
else
{
processId = aProcessId;
}
// _log.DebugFormat("started {0}", transmitterProcess.ProcessName);
int timeout = Properties.Settings.Default.BatchTimeoutMins * 1000 * 60; // convert to ms
if (!transmitterProcess.WaitForExit((timeout == 0) ? int.MaxValue : timeout))
{
_log.WarnFormat("Transmitter process not exited within {0} minute", Properties.Settings.Default.BatchTimeoutMins);
// dauert zu lang, beende Prozess..
try
{
transmitterProcess.Kill();
_log.Info("Transmitter killed");
if (useTest) processTestId = null;
else processId = null;
}
catch (Exception e)
{
_log.WarnFormat("Killing Transmitter failed: {0}", e.Message);
}
}
}
}
private static void TransmitterProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if(!e.Data.IsNullOrEmpty())
_log.Debug(e.Data);
}
private static void TransmitterProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if(!e.Data.IsNullOrEmpty())
_log.Error(e.Data);
}
private static void TransmitterTestProcess_Exited(object sender, EventArgs e)
{
_log.Debug("Transmitter process (test) exited");
processTestId = null;
}
private static void TransmitterProcess_Exited(object sender, EventArgs e)
{
_log.Debug("Transmitter process exited");
processId = null;
}
public static result GetResult(string filenameFullPath, bool useTest)
{
// now we should read the response message...
string resultFilename = string.Format("{0}.result.xml", Path.GetFileName(filenameFullPath));
string resultDir = Path.Combine(useTest ? Properties.Settings.Default.TestTransmitterRoot : Properties.Settings.Default.LiveTransmitterRoot,
Properties.Settings.Default.ResultDir);
string resultFullPath = Path.Combine(resultDir, resultFilename);
return result.ReadResult(resultFullPath);
}
///
/// class to read transmitter result xml files
///
[Serializable]
public class result
{
public result() { }
public int code { get; set; }
public string message { get; set; }
public string detail { get; set; }
///
/// create result items from file
///
public static result ReadResult(string filename)
{
result aResult = null;
try
{
XmlSerializer serializer = new XmlSerializer(typeof(result));
if (!File.Exists(filename))
{
_log.WarnFormat("Expected file {0} does not exist!", filename);
}
else
{
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
aResult = (result)serializer.Deserialize(fs);
}
}
}
catch (Exception ex)
{
_log.ErrorFormat("Exception deserializing transmitter result: {0}", ex.Message);
}
return aResult;
}
}
}
}