socketmgr.cs 128 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading;
  5. using System.Xml;
  6. using System.Xml.Serialization;
  7. using System.IO;
  8. using System.Diagnostics;
  9. using System.Reflection;
  10. using System.Runtime.InteropServices;
  11. using System.Net;
  12. using System.Net.Sockets;
  13. using Wayne.FDCPOSLibrary;
  14. using Wayne.FDCPOSLibrary.Configuration;
  15. using Wayne.OptInterface;
  16. using Wayne.FDCPOSInterface.Configuration;
  17. namespace Wayne.FDCPOSInterface
  18. {
  19. using Microsoft.Extensions.DependencyInjection;
  20. using Microsoft.Extensions.Logging;
  21. using System.Linq;
  22. using System.Xml.Schema;
  23. public sealed class SchemasSG
  24. {
  25. private static readonly object instLock = new object();
  26. private static Dictionary<string, XmlSchemaSet> schemasSG;
  27. private static SchemasSG _instance;
  28. public static SchemasSG Instance
  29. {
  30. get
  31. {
  32. if (_instance == null)
  33. {
  34. lock (instLock) // make it multithread safe
  35. {
  36. if (_instance == null)
  37. {
  38. _instance = new SchemasSG();
  39. }
  40. }
  41. }
  42. return _instance;
  43. }
  44. }
  45. public Dictionary<string, XmlSchemaSet> GetSchemas
  46. {
  47. get { return schemasSG; }
  48. }
  49. private SchemasSG()
  50. {
  51. schemasSG = new Dictionary<string, XmlSchemaSet>();
  52. // read schemas from resource files
  53. Assembly a = Assembly.GetExecutingAssembly();
  54. string name = a.GetName().Name;
  55. string sBasicTypeName = "SchemasSG.FDC_Basic_Types.xsd";
  56. Stream sBasicTypes = a.GetManifestResourceStream(name + "." + sBasicTypeName);
  57. XmlSchema sBasicTypesSchema = XmlSchema.Read(sBasicTypes, ValidationCallback);
  58. //FDCPOSManager.tracer.WriteLine("BasicTypes Name: " + name + "." + sBasicTypeName);
  59. foreach (string resource in a.GetManifestResourceNames())
  60. {
  61. if (resource.EndsWith(".xsd"))
  62. {
  63. try
  64. {
  65. //FDCPOSManager.tracer.WriteLine("Schema Name: " + resource);
  66. string shortName = resource.Substring(name.Length + 1); // get rid of Assembly name
  67. if (!sBasicTypeName.Equals(shortName))
  68. {
  69. shortName = shortName.Substring(shortName.IndexOf(".") + 1); // get rid of the folder name SchemasSG
  70. shortName = shortName.Substring(0, shortName.Length - 4); // get rid of ".xsd"
  71. //FDCPOSManager.tracer.WriteLine("schema name: " + shortName);
  72. Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);
  73. {
  74. schemasSG[shortName] = new XmlSchemaSet();
  75. schemasSG[shortName].Add(XmlSchema.Read(s, ValidationCallback));
  76. schemasSG[shortName].Add(sBasicTypesSchema); // add this basic type to every node
  77. }
  78. }
  79. }
  80. catch (Exception ex)
  81. {
  82. //FDCPOSManager.tracer.WriteLine("Exception in Schemas! " + ex.Message);
  83. }
  84. }
  85. }
  86. }
  87. static void ValidationCallback(object sender, ValidationEventArgs args)
  88. {
  89. //if (args.Severity == XmlSeverityType.Warning)
  90. // FDCPOSManager.tracer.Write("WARNING: ");
  91. //else if (args.Severity == XmlSeverityType.Error)
  92. // FDCPOSManager.tracer.Write("ERROR: ");
  93. //FDCPOSManager.tracer.WriteLine(args.Message);
  94. }
  95. }
  96. public class FdcClientTcpHandler : IDisposable
  97. {
  98. private bool disposed = false;
  99. //static NLog.Logger fdcSocketLogger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("FdcServerSocket");
  100. private ILogger fdcSocketLogger;
  101. //= ServiceBuilder.Provider
  102. //.GetRequiredService<ILoggerFactory>().CreateLogger("FdcServerSocket");
  103. private MD5Crypter crypter = new MD5Crypter();
  104. /// <summary>
  105. /// ip:port, used for logging
  106. /// </summary>
  107. public string TcpClientEndPointString { get; private set; }
  108. private TcpClient tcpClient;
  109. public TcpClient TcpClient { get { return this.tcpClient; } }
  110. private FDCPOSManager fdcposManager;
  111. private FdcServerTcpHandler fdcServerTcpHandler;
  112. public string workstationID = "";
  113. public string applicationSender = "";
  114. /// <summary>
  115. /// fired on get tcp level error, mostly likely the tcp is broken
  116. /// </summary>
  117. public event EventHandler OnCommunicatingError;
  118. public FdcClientTcpHandler(FDCPOSManager _fdcposManager, FdcServerTcpHandler _fdcServerTcpHandler,
  119. TcpClient tcpClient, ILogger logger)
  120. {
  121. this.fdcposManager = _fdcposManager;
  122. this.fdcServerTcpHandler = _fdcServerTcpHandler;
  123. this.tcpClient = tcpClient;
  124. this.fdcSocketLogger = logger;
  125. }
  126. private void OnTcpClientDataRead(IAsyncResult ar)
  127. {
  128. NetworkStream networkStream;
  129. byte[] buffer = null;
  130. int readCount = 0;
  131. int previousReadCount = 0;
  132. Action<byte[], NetworkStream> callback = null;
  133. int expectingMsgLength = 0;
  134. try
  135. {
  136. //tuple is: ns, readBuffer, offset, readFullMsgCallback, expectingLengthToRead
  137. var parameter = (ar.AsyncState as Tuple<NetworkStream, byte[], int, Action<byte[], NetworkStream>, int>);
  138. networkStream = parameter.Item1;
  139. buffer = parameter.Item2;
  140. previousReadCount = parameter.Item3;
  141. callback = parameter.Item4;
  142. expectingMsgLength = parameter.Item5;
  143. readCount = networkStream.EndRead(ar);
  144. if (readCount == 0)
  145. throw new Exception("tcp client received 0 count data which indicates the connection is broken, trigger disconnection");
  146. }
  147. catch (Exception eee)
  148. {
  149. fdcSocketLogger.LogError("EndRead Fdc client tcpClient NetworkStream exceptioned: " + eee
  150. + "\r\n will treat as OnCommunicatingError, this client with its Ip and port: " + this.TcpClientEndPointString);
  151. this.OnCommunicatingError?.Invoke(this, null);
  152. return;
  153. }
  154. if ((readCount + previousReadCount) < expectingMsgLength)
  155. {
  156. try
  157. {
  158. var _ = networkStream.BeginRead(buffer, (readCount + previousReadCount),
  159. (expectingMsgLength - (readCount + previousReadCount)),
  160. this.OnTcpClientDataRead,
  161. new Tuple<NetworkStream, byte[], int, Action<byte[], NetworkStream>, int>(
  162. networkStream, buffer, readCount + previousReadCount, callback, expectingMsgLength));
  163. }
  164. catch (Exception eee)
  165. {
  166. fdcSocketLogger.LogError("Continue BeginRead Fdc client tcpClient NetworkStream exceptioned: " + eee
  167. + "\r\n will treat as OnCommunicatingError, this client with its Ip and port: " + this.TcpClientEndPointString);
  168. this.OnCommunicatingError?.Invoke(this, null);
  169. return;
  170. }
  171. }
  172. else
  173. {
  174. try
  175. {
  176. callback(buffer, networkStream);
  177. }
  178. catch (Exception xxx)
  179. {
  180. fdcSocketLogger.LogError("Callback in OnTcpClientDataRead exceptioned: " + xxx
  181. + "\r\n will ignore the error");
  182. }
  183. }
  184. }
  185. private void ProcessMessageHeader(byte[] headerBuffer, NetworkStream networkStream)
  186. {
  187. try
  188. {
  189. int msgBodyLength = FdcClientTcpHandler.getMsgLength(headerBuffer);
  190. if (this.fdcSocketLogger.IsEnabled(LogLevel.Debug))
  191. this.fdcSocketLogger.LogDebug($"Received a msg with BodyLength: {msgBodyLength}, will further parsing...");
  192. if (msgBodyLength >= 19999) throw new ArgumentOutOfRangeException("MsgBodyLength: " + msgBodyLength + " is too big and unlikely a valid message");
  193. byte[] bodyBuffer = new byte[msgBodyLength];
  194. var r = networkStream.BeginRead(bodyBuffer, 0, msgBodyLength,
  195. this.OnTcpClientDataRead,
  196. //ns, readBuffer, offset, readFullMsgCallback, expectingLengthToRead
  197. new Tuple<NetworkStream, byte[], int, Action<byte[], NetworkStream>, int>(
  198. networkStream, bodyBuffer, 0,
  199. (bodyBuffer, __) =>
  200. {
  201. this.ParseServiceRequestOrFdcMessageFromRaw(bodyBuffer, __, msgBodyLength, headerBuffer);
  202. this.StartReadingDataFromClient();
  203. },
  204. msgBodyLength));
  205. }
  206. catch (Exception exxx)
  207. {
  208. fdcSocketLogger.LogError("BeginRead Fdc client tcpClient NetworkStream(ProcessMessageHeader) exceptioned: " + exxx
  209. + "\r\n will treat as OnCommunicatingError, this client with its Ip and port: " + this.TcpClientEndPointString);
  210. this.OnCommunicatingError?.Invoke(this, null);
  211. return;
  212. }
  213. }
  214. private void ParseServiceRequestOrFdcMessageFromRaw(byte[] bodyBuffer, NetworkStream networkStream, int msgLength, byte[] headerBytes)
  215. {
  216. var message = Encoding.UTF8.GetString(bodyBuffer);
  217. if (fdcSocketLogger.IsEnabled(LogLevel.Trace))
  218. {
  219. // set a trace since the heartbeat msg is so frenquency and causing too much logging
  220. fdcSocketLogger.LogTrace($"Parsing ServiceRequest Or FdcMessage from raw incoming message: {message ?? ""}");
  221. }
  222. var result = OverallResult.Success;
  223. string sEndmsg = "";
  224. //no trailing spaces xml message
  225. string exactXmlMsgStr = "";
  226. int indexEndMsgSR = -1, indexEndFDCMsg = -1, indexEnd = -1;
  227. indexEndMsgSR = message.IndexOf("</ServiceRequest>");
  228. indexEndFDCMsg = message.IndexOf("</FDCMessage>");
  229. #region parse
  230. if (indexEndMsgSR >= 0 && indexEndFDCMsg >= 0)
  231. {
  232. indexEnd = System.Math.Min(indexEndMsgSR, indexEndFDCMsg);
  233. if (indexEndMsgSR < indexEndFDCMsg)
  234. {
  235. sEndmsg = "</ServiceRequest>";
  236. indexEndFDCMsg = -1;
  237. }
  238. else
  239. {
  240. sEndmsg = "</FDCMessage>";
  241. indexEndMsgSR = -1;
  242. }
  243. }
  244. else if (indexEndMsgSR >= 0 && indexEndFDCMsg < 0)
  245. {
  246. indexEnd = indexEndMsgSR;
  247. sEndmsg = "</ServiceRequest>";
  248. }
  249. else if (indexEndMsgSR < 0 && indexEndFDCMsg >= 0)
  250. {
  251. indexEnd = indexEndFDCMsg;
  252. sEndmsg = "</FDCMessage>";
  253. }
  254. else
  255. this.fdcSocketLogger.LogError("how a full MessageBody neither contains </ServiceRequest> nor </FDCMessage>, not a valid Fdc msg, will ignore it");
  256. #endregion
  257. if (indexEnd >= 0)
  258. {
  259. exactXmlMsgStr = message.Substring(0, indexEnd + sEndmsg.Length);
  260. message = message.Substring(indexEnd + sEndmsg.Length);
  261. if (fdcposManager.encryptedHeader)
  262. {
  263. var hashingTarget = exactXmlMsgStr + MD5Crypter.passphrase;
  264. if (!crypter.verifyMD5Hash(hashingTarget,
  265. headerBytes.Skip(Define.HeaderLength).Take(Define.EncriptionLength).Select(h => h.ToString("x2")).Aggregate((acc, n) => acc + n)))
  266. {
  267. if (fdcSocketLogger.IsEnabled(LogLevel.Information))
  268. fdcSocketLogger.LogInformation("verifyMD5Hash failed for msg from " + this.TcpClientEndPointString +
  269. ", the computed&expecting hash string: " + crypter.getMD5Hash(hashingTarget) +
  270. ", the hashing target(incomingMsg+passcode): \r\n" +
  271. hashingTarget);
  272. result = OverallResult.ValidationError;
  273. }
  274. }
  275. if (exactXmlMsgStr.Length > 0)
  276. {
  277. this.fdcServerTcpHandler.ReadRequest(this, exactXmlMsgStr, msgLength, (indexEndMsgSR > 0) ? true : false, ref result);
  278. }
  279. }
  280. }
  281. public void StartReadingDataFromClient()
  282. {
  283. if (this.tcpClient == null || !this.tcpClient.Connected) return;
  284. try
  285. {
  286. this.TcpClientEndPointString = ((IPEndPoint)(tcpClient.Client.RemoteEndPoint)).ToString();
  287. }
  288. catch { }
  289. try
  290. {
  291. NetworkStream networkStream = this.tcpClient.GetStream();
  292. var headerBuffer = new byte[Define.HeaderLength + Define.EncriptionLength];
  293. var _ = networkStream.BeginRead(headerBuffer, 0, (Define.HeaderLength + Define.EncriptionLength),
  294. this.OnTcpClientDataRead,
  295. //ns, readBuffer, offset, readFullMsgCallback, expectingLengthToRead
  296. new Tuple<NetworkStream, byte[], int, Action<byte[], NetworkStream>, int>(
  297. networkStream, headerBuffer, 0, this.ProcessMessageHeader, (Define.HeaderLength + Define.EncriptionLength)));
  298. }
  299. catch (Exception exxx)
  300. {
  301. fdcSocketLogger.LogError("Get or BeginRead Fdc client tcpClient NetworkStream exceptioned: " + exxx
  302. + "\r\n will ignore this client");
  303. this.OnCommunicatingError?.Invoke(this, null);
  304. return;
  305. }
  306. }
  307. static public int getMsgLength(byte[] header)
  308. {
  309. int length = 0;
  310. for (int pos = 1; pos <= Define.HeaderLength; pos++)
  311. {
  312. length |= ((int)(header[pos - 1] << (Define.HeaderLength - pos) * 8));
  313. }
  314. return length;
  315. }
  316. public void Dispose()
  317. {
  318. try
  319. {
  320. this.disposed = true;
  321. this.tcpClient.Close();
  322. }
  323. catch { }
  324. finally { }
  325. }
  326. }
  327. public class FdcServerTcpHandler : IDisposable
  328. {
  329. private List<FdcClientTcpHandler> fdcClientTcpHandlers = new List<FdcClientTcpHandler>();
  330. //protected static NLog.Logger fdcSocketLogger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("FdcServerSocket");
  331. protected ILogger fdcSocketLogger;// = ServiceBuilder.Provider.GetRequiredService<ILoggerFactory>().CreateLogger("FdcServerSocket");
  332. private bool disposed = false;
  333. protected FDCPOSManager fdcPosManager;
  334. protected TcpListener tcpListener;
  335. protected int iIPPort;
  336. private bool traceXML = false;
  337. public FDCPOSInterfaceServer FdcPosInterface { get; set; }
  338. public int IPPort
  339. {
  340. get { return iIPPort; }
  341. set { iIPPort = value; }
  342. }
  343. public FdcServerTcpHandler(FDCPOSManager _fdcPosManager, int _iIPPort, ILogger logger)
  344. {
  345. this.fdcSocketLogger = logger;
  346. fdcPosManager = _fdcPosManager;
  347. iIPPort = _iIPPort;
  348. }
  349. public bool StartListening()
  350. {
  351. try
  352. {
  353. this.tcpListener = new TcpListener(IPAddress.Any, iIPPort);
  354. this.tcpListener.Start();
  355. var _ = this.tcpListener.BeginAcceptTcpClient(this.OnTcpClientAccepted, null);
  356. this.fdcSocketLogger.LogInformation("FdcServerTcpHandler is listening on port: " + iIPPort);
  357. return true;
  358. }
  359. catch (Exception exxx)
  360. {
  361. fdcSocketLogger.LogError("Listening port: " + iIPPort + " exceptioned: " + exxx
  362. + "\r\n will QUIT listening");
  363. throw;
  364. }
  365. }
  366. private void OnTcpClientAccepted(IAsyncResult ar)
  367. {
  368. TcpClient tcpClient = null;
  369. try
  370. {
  371. tcpClient = this.tcpListener.EndAcceptTcpClient(ar);
  372. this.fdcSocketLogger.LogDebug("A Tcp client: " + ((IPEndPoint)(tcpClient.Client.RemoteEndPoint)).ToString() + " has connected in...");
  373. }
  374. catch (Exception exxx)
  375. {
  376. fdcSocketLogger.LogError($"TcpListener EndAcceptTcpClient exceptioned: {exxx.ToString() + Environment.NewLine}will continue listening(depends on is app shuting down)");
  377. return;
  378. }
  379. finally
  380. {
  381. if (!this.disposed)
  382. tcpListener.BeginAcceptTcpClient(this.OnTcpClientAccepted, null);
  383. }
  384. var fdcClientTcpHandler = new FdcClientTcpHandler(fdcPosManager, this, tcpClient, this.fdcSocketLogger);
  385. fdcClientTcpHandler.OnCommunicatingError += (s, e) =>
  386. {
  387. #region clean up
  388. fdcClientTcpHandler.Dispose();
  389. string fdcClientId = FDCPOSClient.getClientID(fdcClientTcpHandler.workstationID, fdcClientTcpHandler.applicationSender);
  390. try
  391. {
  392. if (this.fdcPosManager.fdcClientList.ContainsKey(fdcClientId))
  393. {
  394. fdcSocketLogger.LogInformation(string.Format("Cleaning up existed FdcClient '{0}' which from remote: {1}",
  395. fdcClientId,
  396. fdcClientTcpHandler.TcpClientEndPointString));
  397. this.fdcPosManager.DisconnectClient(this.fdcPosManager.fdcClientList[fdcClientId]);
  398. }
  399. }
  400. catch (Exception eeee)
  401. {
  402. fdcSocketLogger.LogInformation(string.Format("Cleaning up existed FdcClient '{0}', from remote: {1} exceptioned: \r\n {2}",
  403. fdcClientId,
  404. fdcClientTcpHandler.TcpClientEndPointString,
  405. eeee));
  406. }
  407. #endregion
  408. };
  409. fdcClientTcpHandler.StartReadingDataFromClient();
  410. this.fdcClientTcpHandlers.Add(fdcClientTcpHandler);
  411. }
  412. public string ReadRequest(FdcClientTcpHandler fdcClientTcpHandler, string message, int msglength,
  413. bool isServiceRequest, ref OverallResult result)
  414. {
  415. OverallResult extresult = result;
  416. ErrorCode iFDCStatus = (int)ErrorCode.ERRCD_OK;
  417. int requestId = -1;
  418. string requestType = (isServiceRequest) ? GetRequestType(message) : GetMessageType(message);
  419. string applicationSender = GetApplicationSender(message);
  420. string workstationId = GetWorkstationID(message);
  421. if (string.IsNullOrEmpty(requestType))
  422. {
  423. fdcSocketLogger.LogInformation(string.Format("Client with applicationSender={0}, workstationId={1} is " +
  424. "sending in a message that Fcc resolved an empty or null requestType from it, unlikely an valid format message:{2}{3}",
  425. applicationSender, workstationId, Environment.NewLine, (message ?? "")));
  426. result = OverallResult.NoData;
  427. iFDCStatus = ErrorCode.ERRCD_BADVAL;
  428. ((FDCPOSInterfaceServerManager)this.fdcPosManager).fdcPosInterface.messages.SendErrorResponse(requestType, workstationId, applicationSender, requestId, iFDCStatus, result.ToString());
  429. return requestType;
  430. }
  431. try
  432. {
  433. //FDCPOSManager.tracer.WriteLine(string.Format("init requestType='{0}'", requestType));
  434. if (fdcSocketLogger.IsEnabled(LogLevel.Trace))
  435. fdcSocketLogger.LogTrace($"Parsed the incoming Request, requestType: {requestType ?? ""}, applicationSender: {applicationSender ?? ""}, workstationId: {workstationId ?? ""}, message: {Environment.NewLine} {message ?? ""}");
  436. if (fdcSocketLogger.IsEnabled(LogLevel.Debug))
  437. if (requestType != "POSHeartBeat")
  438. fdcSocketLogger.LogTrace($"Parsed the incoming Request, requestType: {requestType ?? ""}, applicationSender: {applicationSender ?? ""}, workstationId: {workstationId ?? ""}, message: {Environment.NewLine} {message ?? ""}");
  439. if (requestType != "LogOn")
  440. {
  441. if (!this.fdcPosManager.fdcClientList.ContainsKey(FDCPOSClient.getClientID(workstationId, applicationSender)))
  442. {
  443. FDCPOSClient fdcposClient = new FDCPOSClient(fdcPosManager, null, this.fdcSocketLogger);
  444. fdcposClient.workstationID = workstationId;
  445. fdcposClient.applicationSender = applicationSender;
  446. IPEndPoint endpoint = (IPEndPoint)(fdcClientTcpHandler.TcpClient.Client.RemoteEndPoint);
  447. string sIPAddress = endpoint.Address.ToString();
  448. fdcposClient.sIPAddress = sIPAddress;
  449. fdcposClient.FdcClientTcpHandler = fdcClientTcpHandler;
  450. fdcposClient.connected = true;
  451. fdcposClient.socketChannelResponse = fdcClientTcpHandler.TcpClient;
  452. fdcClientTcpHandler.workstationID = workstationId;
  453. fdcClientTcpHandler.applicationSender = applicationSender;
  454. fdcPosManager.fdcClientList.Add(FDCPOSClient.getClientID(workstationId, applicationSender), fdcposClient);
  455. if (this.fdcSocketLogger.IsEnabled(LogLevel.Debug))
  456. this.fdcSocketLogger.LogDebug(string.Format("Unknown Client with appSender={0}, wId={1} is " +
  457. "sending Request(type={2}) in without log on, Will response: AuthentificationError",
  458. applicationSender, workstationId, requestType));
  459. result = OverallResult.AuthentificationError;
  460. iFDCStatus = ErrorCode.ERRCD_COMMERR;
  461. ((FDCPOSInterfaceServerManager)this.fdcPosManager).fdcPosInterface.messages.SendErrorResponse(requestType, workstationId, applicationSender, requestId, iFDCStatus, result.ToString());
  462. fdcPosManager.fdcClientList.Remove(FDCPOSClient.getClientID(workstationId, applicationSender));
  463. return requestType;
  464. }
  465. if (result == OverallResult.Success && extresult == OverallResult.Success)
  466. {
  467. fdcPosManager.fdcClientList[FDCPOSClient.getClientID(workstationId, applicationSender)].heartbeat.StopClientDisconnectionTimer();
  468. }
  469. }
  470. if (requestType == "POSHeartBeat")
  471. {
  472. if (fdcSocketLogger.IsEnabled(LogLevel.Debug))
  473. this.fdcSocketLogger.LogDebug(string.Format("Received a POSHeartBeat from applicationSender: {0}, workstationId: {1}", (applicationSender ?? ""), (workstationId ?? "")));
  474. // if (isServiceRequest)
  475. // {
  476. // ServiceRequestHeartbeat sr = Deserialize<ServiceRequestHeartbeat>(myString, ref result);
  477. // if (!this.fdcposManager.tcpClientList.ContainsKey(FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)))
  478. // result = OverallResult.AuthentificationError;
  479. // if (sr != null && result == OverallResult.Success && extresult == OverallResult.Success)
  480. // {
  481. // fdcposManager.tcpClientList[FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)].heartbeat.ResetDisconnectionTimeout();
  482. // }
  483. // }
  484. // else
  485. // {
  486. // FDCMessageFDCHeartbeat sr = Deserialize<FDCMessageFDCHeartbeat>(myString, ref result);
  487. // if (!this.fdcposManager.tcpClientList.ContainsKey(FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)))
  488. // result = OverallResult.AuthentificationError;
  489. // if (sr != null && result == OverallResult.Success && extresult == OverallResult.Success)
  490. // {
  491. // fdcposManager.tcpClientList[FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)].heartbeat.ResetDisconnectionTimeout();
  492. // }
  493. // }
  494. }
  495. else if (requestType == "LogOn")
  496. {
  497. ServiceRequestLogOn sr = Deserialize<ServiceRequestLogOn>(message, ref result);
  498. if (sr != null)
  499. {
  500. requestId = sr.RequestIDNumber;
  501. if (sr.POSdata.GetLength(0) == 0)
  502. result = OverallResult.MissingMandatoryData;
  503. else
  504. {
  505. int iResponsePort = Convert.ToInt32(sr.POSdata[0].ResponsePort);
  506. if (iResponsePort == 0)
  507. iResponsePort = this.IPPort;
  508. int iUnsolicitedPort = Convert.ToInt32(sr.POSdata[0].UnsolicitedPort);
  509. if (iUnsolicitedPort == 0)
  510. iUnsolicitedPort = this.IPPort;
  511. fdcSocketLogger.LogInformation(string.Format("Client with WorkstationId: {0}, ApplicationSender: {1}, InterfaceVersion: {2} from {3} is logging on",
  512. sr.WorkstationID,
  513. sr.ApplicationSender,
  514. (sr.POSdata?.FirstOrDefault()?.interfaceVersion ?? ""),
  515. ((IPEndPoint)(fdcClientTcpHandler.TcpClient.Client.RemoteEndPoint)).ToString()
  516. ));
  517. if (sr.POSdata[0].interfaceVersion != null)
  518. {
  519. //FDCPOSManager.tracer.WriteLine(string.Format("sr.POSdata[0].interfaceVersion='{0}'", sr.POSdata[0].interfaceVersion));
  520. if (sr.POSdata[0].interfaceVersion == "00.07")
  521. FDCGlobal.ProtocolVersion = FDCVersion.V0007;
  522. else if (sr.POSdata[0].interfaceVersion == "00.05")
  523. FDCGlobal.ProtocolVersion = FDCVersion.V0005;
  524. else if (sr.POSdata[0].interfaceVersion == "00.03")
  525. FDCGlobal.ProtocolVersion = FDCVersion.V0003;
  526. //FDCPOSManager.tracer.WriteLine(string.Format("interfaceVersion set"));
  527. }
  528. //FDCPOSManager.tracer.WriteLine(string.Format("this.fdcposManager.forecourtConfiguration={0}", this.fdcposManager.forecourtConfiguration));
  529. //FDCPOSManager.tracer.WriteLine(string.Format("test={0}", sr.POSdata[0].ValidationInfo != null && (this.fdcposManager.forecourtConfiguration != "Q8-DENMARK" && this.fdcposManager.forecourtConfiguration != "WINCOR")));
  530. if (sr.POSdata[0].ValidationInfo != null && (this.fdcPosManager.forecourtConfiguration != "Q8-DENMARK" && this.fdcPosManager.forecourtConfiguration != "WINCOR"))
  531. {
  532. string filename = "", version = "", ssigncheck = "", CRC = "", binaryCRC = "", versionCRC = "", addInfo = "";
  533. string softsealfilename = "", softsealversion = "", binarysoftsealCRC = "", versionsoftsealCRC = "";
  534. bool signaturecheck = false, softsealadded = false;
  535. DESCrypter crypter = new DESCrypter();
  536. try
  537. {
  538. Monitor.Enter(fdcPosManager);
  539. foreach (byte[] validationInfoElem in sr.POSdata[0].ValidationInfo)
  540. {
  541. byte[] data = crypter.Decrypt(validationInfoElem);
  542. if (data != null && data.Length > 0)
  543. {
  544. signaturecheck = false;
  545. string s = System.Text.Encoding.UTF8.GetString(data, 0, data.GetLength(0));
  546. //FDCPOSManager.tracer.WriteLine(string.Format("validation string='{0}'", s));
  547. filename = s.Substring(0, s.IndexOf("###"));
  548. //FDCPOSManager.tracer.WriteLine(string.Format("filename='{0}'", filename));
  549. s = s.Substring(s.IndexOf("###") + 3);
  550. version = s.Substring(0, s.IndexOf("###"));
  551. //FDCPOSManager.tracer.WriteLine(string.Format("version='{0}'", version));
  552. s = s.Substring(s.IndexOf("###") + 3);
  553. ssigncheck = s.Substring(0, s.IndexOf("###"));
  554. //FDCPOSManager.tracer.WriteLine(string.Format("ssigncheck='{0}'", ssigncheck));
  555. signaturecheck = (ssigncheck == "1") ? true : false;
  556. s = s.Substring(s.IndexOf("###") + 3);
  557. CRC = s.Substring(0, s.IndexOf("###"));
  558. if (CRC.IndexOf("-") >= 0)
  559. {
  560. binaryCRC = CRC.Substring(0, CRC.IndexOf("-"));
  561. versionCRC = CRC.Substring(CRC.IndexOf("-") + 1);
  562. }
  563. else
  564. versionCRC = CRC;
  565. //FDCPOSManager.tracer.WriteLine(string.Format("binaryCRC='{0}', versionCRC'{1}'", binaryCRC, versionCRC));
  566. s = s.Substring(s.IndexOf("###") + 3);
  567. softsealfilename = s.Substring(0, s.IndexOf("###"));
  568. //FDCPOSManager.tracer.WriteLine(string.Format("softsealfilename='{0}'", softsealfilename));
  569. s = s.Substring(s.IndexOf("###") + 3);
  570. softsealversion = s.Substring(0, s.IndexOf("###"));
  571. //FDCPOSManager.tracer.WriteLine(string.Format("softsealversion='{0}'", softsealversion));
  572. s = s.Substring(s.IndexOf("###") + 3);
  573. if (s.IndexOf("###") == -1)
  574. CRC = s;
  575. else
  576. {
  577. CRC = s.Substring(0, s.IndexOf("###"));
  578. s = s.Substring(s.IndexOf("###") + 3);
  579. addInfo = s;
  580. }
  581. if (CRC.IndexOf("-") >= 0)
  582. {
  583. binarysoftsealCRC = CRC.Substring(0, CRC.IndexOf("-"));
  584. versionsoftsealCRC = CRC.Substring(CRC.IndexOf("-") + 1);
  585. }
  586. else
  587. versionsoftsealCRC = CRC;
  588. //FDCPOSManager.tracer.WriteLine(string.Format("binarysoftsealCRC='{0}', versionsoftsealCRC'{1}'", binarysoftsealCRC, versionsoftsealCRC));
  589. if (softsealfilename != "" && !softsealadded)
  590. {
  591. //FDCPOSManager.tracer.WriteLine(string.Format("validate add file='{0}', version={1}", softsealfilename, softsealversion));
  592. this.FdcPosInterface.ValidateSealAddReq(softsealfilename.Substring(softsealfilename.LastIndexOf('\\') + 1), softsealversion, (((FDCPOSInterfaceServerManager)this.fdcPosManager).certificate == certificateType.MID) ? binarysoftsealCRC : versionsoftsealCRC, "");
  593. softsealadded = true;
  594. }
  595. if (signaturecheck)
  596. {
  597. //FDCPOSManager.tracer.WriteLine(string.Format("validate add file='{0}', version={1}", filename, version));
  598. this.FdcPosInterface.ValidateSealAddReq(filename.Substring(filename.LastIndexOf('\\') + 1), version, (((FDCPOSInterfaceServerManager)this.fdcPosManager).certificate == certificateType.MID) ? binaryCRC : versionCRC, addInfo);
  599. }
  600. else
  601. {
  602. //FDCPOSManager.tracer.WriteLine(string.Format("signature failed file='{0}', version={1}", filename, version));
  603. result = OverallResult.AuthentificationError;
  604. break;
  605. }
  606. }
  607. else
  608. {
  609. //FDCPOSManager.tracer.WriteLine(string.Format("error decrypting"));
  610. result = OverallResult.AuthentificationError;
  611. break;
  612. }
  613. }
  614. if (result == OverallResult.Success)
  615. {
  616. if (!this.FdcPosInterface.ValidateSealEndReq(true))
  617. {
  618. //FDCPOSManager.tracer.WriteLine(string.Format("error on seal validation"));
  619. result = OverallResult.AuthentificationError;
  620. }
  621. }
  622. else
  623. {
  624. //FDCPOSManager.tracer.WriteLine(string.Format("reset seal validation info"));
  625. this.FdcPosInterface.ValidateSealEndReq(false);
  626. }
  627. }
  628. catch (Exception ex)
  629. {
  630. //FDCPOSManager.tracer.WriteLine(string.Format("LogOn Validation Info Exception! " + ex.Message));
  631. result = OverallResult.AuthentificationError;
  632. }
  633. finally
  634. {
  635. Monitor.Exit(fdcPosManager);
  636. }
  637. }
  638. else
  639. {
  640. if (this.fdcPosManager.forecourtConfiguration != "Q8-DENMARK" && this.fdcPosManager.forecourtConfiguration != "WINCOR")
  641. {
  642. fdcSocketLogger.LogInformation("configuration is not Q8 and is not WINCOR - AuthorizationInfo must not be null - AuthentificationError !");
  643. //FDCPOSManager.tracer.WriteLine(string.Format("configuration is not Q8 and is not WINCOR - AuthorizationInfo must not be null - AuthentificationError !"));
  644. result = OverallResult.AuthentificationError;
  645. }
  646. }
  647. IPEndPoint endpoint = (IPEndPoint)(fdcClientTcpHandler.TcpClient.Client.RemoteEndPoint);
  648. string sIPAddress = endpoint.Address.ToString();
  649. if (result == OverallResult.Success && extresult == OverallResult.Success)
  650. {
  651. //FDCPOSManager.tracer.WriteLine(string.Format("PortA='{0}', PortB='{1}', PortC='{2}'",
  652. //this.IPPort, iResponsePort, iUnsolicitedPort));
  653. //fdcSocketLogger.LogInformation(string.Format("PortA='{0}', PortB='{1}', PortC='{2}', in Logon", this.IPPort, iResponsePort, iUnsolicitedPort));
  654. Messages.HeartbeatCallback heartbeatCallback = new Messages.HeartbeatCallback(this.FdcPosInterface.messages.Heartbeat);
  655. bool enteredmonitor = false;
  656. try
  657. {
  658. Monitor.Enter(fdcPosManager.fdcClientList);
  659. enteredmonitor = true;
  660. if (!fdcPosManager.fdcClientList.ContainsKey(FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)))
  661. {
  662. //FDCPOSManager.tracer.WriteLine(string.Format("Client not found - adding"));
  663. fdcSocketLogger.LogInformation("Client: " + FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)
  664. + " not found in TcpClientList("
  665. + (fdcPosManager.fdcClientList.Keys.Any() ?
  666. fdcPosManager.fdcClientList.Keys.Select(k => k ?? "null").Aggregate((n, acc) => n + ", " + acc)
  667. : "Empty yet")
  668. + ") - will adding in, in LogOn");
  669. FDCPOSClient fdcposClient = null;
  670. string posInfo;
  671. if (sr.POSdata[0].posInfo != null) // && sr.POSdata[0].posInfo != "")
  672. {
  673. posInfo = UTF8Encoding.UTF8.GetString(sr.POSdata[0].posInfo, 0, sr.POSdata[0].posInfo.GetLength(0));
  674. POSType posType = FDCPOSClient.GetType(posInfo);
  675. if (posType == POSType.IXTerminal)
  676. {
  677. fdcposClient = new FDCPOSClientIX(fdcPosManager, heartbeatCallback, posInfo);
  678. }
  679. else if (posType == POSType.Generic)
  680. {
  681. fdcposClient = new FDCPOSClient(fdcPosManager, heartbeatCallback, this.fdcSocketLogger);
  682. }
  683. }
  684. else
  685. fdcposClient = new FDCPOSClient(fdcPosManager, heartbeatCallback, this.fdcSocketLogger);
  686. fdcposClient.workstationID = sr.WorkstationID;
  687. fdcposClient.applicationSender = sr.ApplicationSender;
  688. fdcposClient.sIPAddress = sIPAddress;
  689. fdcposClient.FdcClientTcpHandler = fdcClientTcpHandler;
  690. fdcClientTcpHandler.workstationID = sr.WorkstationID;
  691. fdcClientTcpHandler.applicationSender = sr.ApplicationSender;
  692. fdcPosManager.fdcClientList.Add(FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender), fdcposClient);
  693. fdcSocketLogger.LogInformation(" Client: " + FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender) + " is added in TcpClientList");
  694. Monitor.Exit(fdcPosManager.fdcClientList);
  695. enteredmonitor = false;
  696. this.FdcPosInterface.LogOnReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, iResponsePort, iUnsolicitedPort, (int)(FDCGlobal.ProtocolVersion));
  697. }
  698. else if (!fdcPosManager.fdcClientList[FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)].logon &&
  699. fdcPosManager.fdcClientList[FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)].sIPAddress == sIPAddress)
  700. {
  701. //FDCPOSManager.tracer.WriteLine(string.Format("Client found but not logged - logging"));
  702. fdcSocketLogger.LogInformation("Client: " + FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender) + " is found in TcpClientList but not logged on - will set to LoggedOn, in LogOn");
  703. FDCPOSClient fdcposClient = fdcPosManager.fdcClientList[FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender)];
  704. fdcposClient.logon = true;
  705. fdcposClient.FdcClientTcpHandler = fdcClientTcpHandler;
  706. Monitor.Exit(fdcPosManager.fdcClientList);
  707. enteredmonitor = false;
  708. this.FdcPosInterface.LogOnReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, iResponsePort, iUnsolicitedPort, (int)(FDCGlobal.ProtocolVersion));
  709. }
  710. else
  711. {
  712. //FDCPOSManager.tracer.WriteLine(string.Format("Client already logged (!?)"));
  713. fdcSocketLogger.LogInformation("Client: " + FDCPOSClient.getClientID(sr.WorkstationID, sr.ApplicationSender) + " already logged on, why log on again (!?), give it an Error, in LogOn");
  714. Monitor.Exit(fdcPosManager.fdcClientList);
  715. enteredmonitor = false;
  716. FDCPOSClient tempTCPClient = new FDCPOSClient(fdcPosManager, heartbeatCallback, this.fdcSocketLogger);
  717. tempTCPClient.sIPAddress = sIPAddress;
  718. tempTCPClient.FdcClientTcpHandler = fdcClientTcpHandler;
  719. this.FdcPosInterface.messages.LogOn(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, iResponsePort, iUnsolicitedPort, (int)(FDCPOSLibrary.ErrorCode.ERRCD_NOPERM), Convert.ToString(FDCPOSLibrary.OverallResult.AuthentificationError), tempTCPClient);
  720. }
  721. }
  722. catch (Exception ex)
  723. {
  724. fdcSocketLogger.LogError("LogOn Exceptioned: " + ex);
  725. if (enteredmonitor)
  726. {
  727. Monitor.Exit(fdcPosManager.fdcClientList);
  728. }
  729. //FDCPOSManager.tracer.WriteLine(string.Format("LogOn Exception! " + ex.Message));
  730. FDCPOSClient tempTCPClient = new FDCPOSClient(fdcPosManager, heartbeatCallback, this.fdcSocketLogger);
  731. tempTCPClient.sIPAddress = sIPAddress;
  732. tempTCPClient.FdcClientTcpHandler = fdcClientTcpHandler;
  733. this.FdcPosInterface.messages.LogOn(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, iResponsePort, iUnsolicitedPort, (int)FDCPOSLibrary.ErrorCode.ERRCD_NOPERM, Convert.ToString(FDCPOSLibrary.OverallResult.AuthentificationError), tempTCPClient);
  734. return requestType;
  735. }
  736. }
  737. else
  738. {
  739. //FDCPOSManager.tracer.WriteLine(string.Format("LogOn extresult={0}, result={1} ", extresult, result));
  740. FDCPOSClient tempTCPClient = new FDCPOSClient(fdcPosManager, null, this.fdcSocketLogger);
  741. tempTCPClient.sIPAddress = sIPAddress;
  742. tempTCPClient.FdcClientTcpHandler = fdcClientTcpHandler;
  743. this.FdcPosInterface.messages.LogOn(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, iResponsePort, iUnsolicitedPort, (int)FDCPOSLibrary.ErrorCode.ERRCD_COMMERR, (result != OverallResult.Success) ? Convert.ToString(result) : Convert.ToString(extresult), tempTCPClient);
  744. return requestType;
  745. }
  746. }
  747. }
  748. }
  749. else if (requestType == "LogOff")
  750. {
  751. ServiceRequestLogOff sr = Deserialize<ServiceRequestLogOff>(message, ref result);
  752. if (sr != null)
  753. {
  754. requestId = sr.RequestIDNumber;
  755. if (result == OverallResult.Success && extresult == OverallResult.Success)
  756. {
  757. FdcPosInterface.LogOffReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  758. }
  759. }
  760. }
  761. else if (requestType == "VersionInfo")
  762. {
  763. ServiceRequestVersionInfo sr = Deserialize<ServiceRequestVersionInfo>(message, ref result);
  764. if (sr != null)
  765. {
  766. requestId = sr.RequestIDNumber;
  767. if (result == OverallResult.Success && extresult == OverallResult.Success)
  768. {
  769. this.FdcPosInterface.VersionInfoReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  770. }
  771. }
  772. }
  773. else if (requestType == "StartForecourt")
  774. {
  775. ServiceRequestStartForecourt sr = Deserialize<ServiceRequestStartForecourt>(message, ref result);
  776. if (sr != null)
  777. {
  778. requestId = sr.RequestIDNumber;
  779. if (result == OverallResult.Success && extresult == OverallResult.Success)
  780. {
  781. this.FdcPosInterface.StartForecourtReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  782. }
  783. }
  784. }
  785. else if (requestType == "StopForecourt")
  786. {
  787. ServiceRequestStopForecourt sr = Deserialize<ServiceRequestStopForecourt>(message, ref result);
  788. if (sr != null)
  789. {
  790. requestId = sr.RequestIDNumber;
  791. if (result == OverallResult.Success && extresult == OverallResult.Success)
  792. {
  793. bool emergencyStop = (sr.POSdata[0].EmergencyStop != null && sr.POSdata[0].EmergencyStop.ToUpper() == "NO") ? emergencyStop = false : emergencyStop = true;
  794. this.FdcPosInterface.StopForecourtReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, emergencyStop);
  795. }
  796. }
  797. }
  798. else if (requestType == "GetCurrentFuellingStatus")
  799. {
  800. ServiceRequestGetCurrentFuellingStatus sr = Deserialize<ServiceRequestGetCurrentFuellingStatus>(message, ref result);
  801. if (sr != null)
  802. {
  803. requestId = sr.RequestIDNumber;
  804. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  805. result = OverallResult.MissingMandatoryData;
  806. if (result == OverallResult.Success && extresult == OverallResult.Success)
  807. {
  808. this.FdcPosInterface.GetCurrentFuellingStatusReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  809. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  810. }
  811. }
  812. }
  813. else if (requestType == "GetFuelPointTotals")
  814. {
  815. ServiceRequestGetFuelPointTotals sr = Deserialize<ServiceRequestGetFuelPointTotals>(message, ref result);
  816. if (sr != null)
  817. {
  818. requestId = sr.RequestIDNumber;
  819. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" || sr.POSdata[0].DeviceClass.NozzleNo == "")
  820. result = OverallResult.MissingMandatoryData;
  821. if (result == OverallResult.Success && extresult == OverallResult.Success)
  822. {
  823. this.FdcPosInterface.GetFuelPointTotalsReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  824. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  825. (sr.POSdata[0].DeviceClass.NozzleNo == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.NozzleNo));
  826. }
  827. }
  828. }
  829. else if (requestType == "GetTotals")
  830. {
  831. ServiceRequestGetTotals sr = Deserialize<ServiceRequestGetTotals>(message, ref result);
  832. if (sr != null)
  833. {
  834. requestId = sr.RequestIDNumber;
  835. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" || sr.POSdata[0].DeviceClass.NozzleNo == "")
  836. result = OverallResult.MissingMandatoryData;
  837. if (result == OverallResult.Success && extresult == OverallResult.Success)
  838. {
  839. this.FdcPosInterface.GetFuelPointTotalsReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  840. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  841. (sr.POSdata[0].DeviceClass.NozzleNo == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.NozzleNo));
  842. }
  843. }
  844. }
  845. else if (requestType == "GetDeviceState")
  846. {
  847. ServiceRequestGetDeviceState sr = Deserialize<ServiceRequestGetDeviceState>(message, ref result);
  848. if (sr != null)
  849. {
  850. requestId = sr.RequestIDNumber;
  851. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  852. result = OverallResult.MissingMandatoryData;
  853. if (result == OverallResult.Success && extresult == OverallResult.Success)
  854. {
  855. this.FdcPosInterface.GetDeviceStateReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  856. sr.POSdata[0].DeviceClass.Type,
  857. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  858. }
  859. }
  860. }
  861. else if (requestType == "GetFPState")
  862. {
  863. ServiceRequestGetFPState sr = Deserialize<ServiceRequestGetFPState>(message, ref result);
  864. if (sr != null)
  865. {
  866. requestId = sr.RequestIDNumber;
  867. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  868. result = OverallResult.MissingMandatoryData;
  869. if (result == OverallResult.Success && extresult == OverallResult.Success)
  870. {
  871. this.FdcPosInterface.GetDeviceStateReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  872. sr.POSdata[0].DeviceClass.Type,
  873. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  874. }
  875. }
  876. }
  877. else if (requestType == "TerminateFuelling")
  878. {
  879. ServiceRequestTerminateFuelling sr = Deserialize<ServiceRequestTerminateFuelling>(message, ref result);
  880. if (sr != null)
  881. {
  882. requestId = sr.RequestIDNumber;
  883. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  884. result = OverallResult.MissingMandatoryData;
  885. if (result == OverallResult.Success && extresult == OverallResult.Success)
  886. {
  887. this.FdcPosInterface.TerminateFuellingReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  888. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  889. }
  890. }
  891. }
  892. else if (requestType == "AuthoriseFuelPoint")
  893. {
  894. ServiceRequestAuthoriseFuelPoint sr = Deserialize<ServiceRequestAuthoriseFuelPoint>(message, ref result);
  895. if (sr != null)
  896. {
  897. requestId = sr.RequestIDNumber;
  898. if (sr.POSdata.GetLength(0) == 0)
  899. result = OverallResult.MissingMandatoryData;
  900. if (result == OverallResult.Success && extresult == OverallResult.Success)
  901. {
  902. string products = "";
  903. int mode = -1;
  904. if (sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  905. {
  906. //FDCPOSManager.tracer.WriteLine("'device' missing");
  907. result = OverallResult.MissingMandatoryData;
  908. }
  909. else
  910. {
  911. //Decimal MaxTrxVolume = 0, MaxTrxAmount = 0;
  912. ////FDCPOSManager.tracer.WriteLine(string.Format("products.GetLength={0}", sr.POSdata[0].DeviceClass.products.GetLength(0)));
  913. //FDCPOSManager.tracer.WriteLine(string.Format("fuelmode={0}, mode={1}", sr.POSdata[0].DeviceClass.FuelMode, (sr.POSdata[0].DeviceClass.FuelMode != null) ? sr.POSdata[0].DeviceClass.FuelMode.ModeNo : null));
  914. if (sr.POSdata[0].DeviceClass.FuelMode != null && sr.POSdata[0].DeviceClass.FuelMode.ModeNo != null && sr.POSdata[0].DeviceClass.FuelMode.ModeNo != "")
  915. mode = Convert.ToInt32(sr.POSdata[0].DeviceClass.FuelMode.ModeNo);
  916. if (FDCGlobal.ProtocolVersion == FDCVersion.V0003)
  917. {
  918. if (sr.POSdata[0].DeviceClass.Products != null && sr.POSdata[0].DeviceClass.Products.ProductNo != null &&
  919. sr.POSdata[0].DeviceClass.Products.ProductNo.GetLength(0) > 0)
  920. {
  921. foreach (string product in sr.POSdata[0].DeviceClass.Products.ProductNo)
  922. {
  923. //FDCPOSManager.tracer.WriteLine(string.Format("ProductNo='{0}', products='{0}'", product, products));
  924. ////FDCPOSManager.tracer.WriteLine(string.Format("ProductNo='{0}', products='{0}'", product.ProductNo, products));
  925. products += product + ";";
  926. }
  927. }
  928. }
  929. else if (FDCGlobal.ProtocolVersion == FDCVersion.V0005)
  930. {
  931. if (sr.POSdata[0].DeviceClass.ReleasedProducts != null && sr.POSdata[0].DeviceClass.ReleasedProducts.ProductNo != null &&
  932. sr.POSdata[0].DeviceClass.ReleasedProducts.ProductNo.GetLength(0) > 0)
  933. {
  934. foreach (string product in sr.POSdata[0].DeviceClass.ReleasedProducts.ProductNo)
  935. {
  936. //FDCPOSManager.tracer.WriteLine(string.Format("ProductNo='{0}'", product));
  937. products += product + ";";
  938. }
  939. }
  940. }
  941. else
  942. {
  943. if (sr.POSdata[0].DeviceClass.ReleasedProducts != null && sr.POSdata[0].DeviceClass.ReleasedProducts.Product != null &&
  944. sr.POSdata[0].DeviceClass.ReleasedProducts.Product.GetLength(0) > 0)
  945. {
  946. foreach (ProductElementClass product in sr.POSdata[0].DeviceClass.ReleasedProducts.Product)
  947. {
  948. //FDCPOSManager.tracer.WriteLine(string.Format("ProductNo='{0}'", product.ProductNo, products));
  949. products += product.ProductNo + ";";
  950. }
  951. }
  952. }
  953. this.FdcPosInterface.AuthoriseFuelPointReq(sr.WorkstationID,
  954. sr.ApplicationSender,
  955. sr.RequestIDNumber,
  956. (sr.POSdata[0].DeviceClass.ReleaseToken != null) ? sr.POSdata[0].DeviceClass.ReleaseToken : "",
  957. (sr.POSdata[0].DeviceClass.FuellingType == "") ? 0 : Convert.ToInt32(sr.POSdata[0].DeviceClass.FuellingType),
  958. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  959. (sr.POSdata[0].DeviceClass.ReservingDeviceId == "") ? 0 : Convert.ToInt32(sr.POSdata[0].DeviceClass.ReservingDeviceId),
  960. FDCConvert.ToDecimal(sr.POSdata[0].DeviceClass.MaxTrxAmount), FDCConvert.ToDecimal(sr.POSdata[0].DeviceClass.MaxTrxVolume),
  961. products, mode,
  962. (sr.POSdata[0].DeviceClass.LockFuelSaleTrx != null && sr.POSdata[0].DeviceClass.LockFuelSaleTrx.ToUpper() == "TRUE") ? true : false, sr.POSdata[0].DeviceClass.PayType);
  963. }
  964. }
  965. }
  966. }
  967. else if (requestType == "ChangeFuelMode")
  968. {
  969. ServiceRequestChangeFuelMode sr = Deserialize<ServiceRequestChangeFuelMode>(message, ref result);
  970. string mode = "";
  971. if (sr != null)
  972. {
  973. requestId = sr.RequestIDNumber;
  974. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null)
  975. result = OverallResult.MissingMandatoryData;
  976. if (result == OverallResult.Success && extresult == OverallResult.Success)
  977. {
  978. if (sr.POSdata[0].DeviceClass.Length > 1)
  979. {
  980. foreach (ServiceRequestDeviceClassChangeFuelMode deviceClass in sr.POSdata[0].DeviceClass)
  981. {
  982. mode = "";
  983. if (deviceClass != null)
  984. {
  985. if (FDCGlobal.ProtocolVersion == FDCVersion.V0003)
  986. {
  987. if (deviceClass.ModeNo != null) mode = deviceClass.ModeNo;
  988. }
  989. else
  990. {
  991. if (deviceClass.FuelMode != null && deviceClass.FuelMode.ModeNo != null) mode = deviceClass.FuelMode.ModeNo;
  992. }
  993. //FDCPOSManager.tracer.WriteLine(string.Format("DeviceID={0}, ModeNo={1}", deviceClass.DeviceID, mode));
  994. if (mode != "")
  995. this.FdcPosInterface.ChangeFuelModeAddReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, deviceClass.Type,
  996. (deviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(deviceClass.DeviceID), Convert.ToInt32(mode));
  997. }
  998. }
  999. this.FdcPosInterface.ChangeFuelModeEndReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  1000. }
  1001. else
  1002. {
  1003. if (FDCGlobal.ProtocolVersion == FDCVersion.V0003)
  1004. {
  1005. if (sr.POSdata[0].DeviceClass[0].ModeNo != null) mode = sr.POSdata[0].DeviceClass[0].ModeNo;
  1006. }
  1007. else
  1008. {
  1009. if (sr.POSdata[0].DeviceClass[0].FuelMode != null && sr.POSdata[0].DeviceClass[0].FuelMode.ModeNo != null) mode = sr.POSdata[0].DeviceClass[0].FuelMode.ModeNo;
  1010. }
  1011. if (mode == "")
  1012. result = OverallResult.MissingMandatoryData;
  1013. this.FdcPosInterface.ChangeFuelModeReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, sr.POSdata[0].DeviceClass[0].Type,
  1014. (sr.POSdata[0].DeviceClass[0].DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass[0].DeviceID),
  1015. Convert.ToInt32(mode));
  1016. }
  1017. }
  1018. }
  1019. }
  1020. else if (requestType == "ChangeFuelPrice")
  1021. {
  1022. ServiceRequestChangeFuelPrice sr = Deserialize<ServiceRequestChangeFuelPrice>(message, ref result);
  1023. if (sr != null)
  1024. {
  1025. requestId = sr.RequestIDNumber;
  1026. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].Product == null)
  1027. result = OverallResult.MissingMandatoryData;
  1028. //FDCPOSManager.tracer.WriteLineIf(FDCPOSManager.tracer.CheckTraceLevel(3), string.Format("result=" + result));
  1029. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1030. {
  1031. string overallRes = OverallResult.Success.ToString();
  1032. if (sr.POSdata[0].Product != null)
  1033. {
  1034. string formattedString = "";
  1035. //double oldPrice;
  1036. string sModeNo = "", sPriceNew = "", effectiveDateTime = "";
  1037. foreach (ServiceRequestProductChangeFuelPrice product in sr.POSdata[0].Product)
  1038. {
  1039. if (product == null) continue;
  1040. sModeNo = "";
  1041. sPriceNew = "";
  1042. effectiveDateTime = "";
  1043. if (FDCGlobal.ProtocolVersion == FDCVersion.V0003)
  1044. {
  1045. sModeNo = (product.ModeNo != null) ? product.ModeNo : "";
  1046. sPriceNew = (product.PriceNew != null) ? product.PriceNew : "";
  1047. effectiveDateTime = (product.EffectiveDateTime != null) ? product.EffectiveDateTime : "";
  1048. string localresult = OverallResult.Success.ToString();
  1049. if (product.ProductNo != null && product.ProductNo != "" && sPriceNew != "" && sModeNo != "")
  1050. {
  1051. //localresult = this.FdcPosInterface.ChangeFuelPriceAddReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, Convert.ToInt32(product.ProductNo), FDCConvert.ToDecimal(product.PriceNew), Convert.ToInt32(product.ModeNo), out oldPrice);
  1052. formattedString = formattedString + product.ProductNo + ";" + sPriceNew + ";" + sModeNo + ";" + effectiveDateTime + "!";
  1053. }
  1054. else
  1055. {
  1056. localresult = OverallResult.Failure.ToString();
  1057. }
  1058. if (localresult != OverallResult.Success.ToString() && overallRes == OverallResult.Success.ToString())
  1059. overallRes = OverallResult.Failure.ToString();
  1060. else if (localresult == OverallResult.Success.ToString() && overallRes == OverallResult.Failure.ToString())
  1061. overallRes = OverallResult.PartialFailure.ToString();
  1062. //FDCPOSManager.tracer.WriteLine(string.Format("localresult={0}, overallRes={1}", localresult, overallRes));
  1063. //this.FdcPosInterface.messages.ChangeFuelPriceAdd(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, Convert.ToInt32(product.ProductNo), FDCConvert.ToDecimal(product.PriceNew), Convert.ToInt32(product.ModeNo), Convert.ToDecimal(oldPrice));
  1064. }
  1065. else
  1066. {
  1067. if (product.FuelMode != null)
  1068. {
  1069. /* the Schema said the FuleMode only can contain a single fule price change item!!!!!!!!!*/
  1070. foreach (ServiceRequestFuelModeChangeFuelPrice fuelMode in product.FuelMode)
  1071. {
  1072. if (fuelMode == null) continue;
  1073. sModeNo = (fuelMode.ModeNo != null) ? fuelMode.ModeNo : "";
  1074. sPriceNew = (fuelMode.PriceNew != null) ? fuelMode.PriceNew : "";
  1075. effectiveDateTime = (fuelMode.EffectiveDateTime != null) ? fuelMode.EffectiveDateTime : "";
  1076. string localresult = OverallResult.Success.ToString();
  1077. if (product.ProductNo != null && product.ProductNo != "" && sPriceNew != "" && sModeNo != "")
  1078. {
  1079. //localresult = this.FdcPosInterface.ChangeFuelPriceAddReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, Convert.ToInt32(product.ProductNo), FDCConvert.ToDecimal(product.PriceNew), Convert.ToInt32(product.ModeNo), out oldPrice);
  1080. formattedString = formattedString + product.ProductNo + ";" + sPriceNew + ";" + sModeNo + ";" + effectiveDateTime + "!";
  1081. }
  1082. else
  1083. {
  1084. localresult = OverallResult.Failure.ToString();
  1085. }
  1086. if (localresult != OverallResult.Success.ToString() && overallRes == OverallResult.Success.ToString())
  1087. overallRes = OverallResult.Failure.ToString();
  1088. else if (localresult == OverallResult.Success.ToString() && overallRes == OverallResult.Failure.ToString())
  1089. overallRes = OverallResult.PartialFailure.ToString();
  1090. //FDCPOSManager.tracer.WriteLine(string.Format("localresult={0}, overallRes={1}, product.ProductNo={2}, fuelMode.PriceNew={3}, fuelMode.ModeNo={4}", localresult, overallRes, product.ProductNo, fuelMode.PriceNew, fuelMode.ModeNo));
  1091. //this.FdcPosInterface.messages.ChangeFuelPriceAdd(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, Convert.ToInt32(product.ProductNo), FDCConvert.ToDecimal(product.PriceNew), Convert.ToInt32(product.ModeNo), Convert.ToDecimal(oldPrice));
  1092. }
  1093. }
  1094. }
  1095. }
  1096. //this.FdcPosInterface.ChangeFuelPriceEndReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  1097. string outresult = this.FdcPosInterface.ChangeFuelPriceInStringReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, formattedString);
  1098. if (string.IsNullOrEmpty(outresult)) overallRes = OverallResult.Failure.ToString();
  1099. string item, sProd, sPriceOld;
  1100. while (outresult != "")
  1101. {
  1102. if (outresult.IndexOf('!') >= 0)
  1103. {
  1104. item = outresult.Substring(0, outresult.IndexOf('!'));
  1105. sProd = item.Substring(0, item.IndexOf(';'));
  1106. item = item.Substring(item.IndexOf(';') + 1);
  1107. sPriceNew = item.Substring(0, item.IndexOf(';'));
  1108. item = item.Substring(item.IndexOf(';') + 1);
  1109. sModeNo = item.Substring(0, item.IndexOf(';'));
  1110. item = item.Substring(item.IndexOf(';') + 1);
  1111. sPriceOld = item.Substring(0, item.IndexOf(';'));
  1112. effectiveDateTime = item.Substring(item.IndexOf(';') + 1);
  1113. outresult = outresult.Substring(outresult.IndexOf('!') + 1);
  1114. // pricenew and priceold always is formatted with '.' as decimal separator
  1115. sPriceNew = sPriceNew.Replace(".", FDCConvert.DecimalSeparator);
  1116. sPriceOld = sPriceOld.Replace(".", FDCConvert.DecimalSeparator);
  1117. Decimal pricenew = FDCConvert.ToDecimal(sPriceNew), priceold = FDCConvert.ToDecimal(sPriceOld);
  1118. //FDCPOSManager.tracer.WriteLine(string.Format("prod={0}, mode={1}, newprice={2}, effectiveDateTime={3}, oldprice={4}", sProd, sModeNo, sPriceNew, effectiveDateTime, sPriceOld));
  1119. this.FdcPosInterface.messages.ChangeFuelPriceAdd(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, Convert.ToInt32(sProd), pricenew, Convert.ToInt32(sModeNo), effectiveDateTime, priceold);
  1120. }
  1121. }
  1122. }
  1123. else
  1124. overallRes = OverallResult.MissingMandatoryData.ToString();
  1125. this.FdcPosInterface.messages.ChangeFuelPriceSend(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, (int)ErrorCode.ERRCD_OK, overallRes);
  1126. }
  1127. }
  1128. }
  1129. else if (requestType == "LockFuelSaleTrx")
  1130. {
  1131. ServiceRequestLockFuelSaleTrx sr = Deserialize<ServiceRequestLockFuelSaleTrx>(message, ref result);
  1132. if (sr != null)
  1133. {
  1134. string transactionNo = (sr.POSdata[0].DeviceClass.TransactionNo != null) ? sr.POSdata[0].DeviceClass.TransactionNo : ((sr.POSdata[0].DeviceClass.TransactionSeqNo != null) ? sr.POSdata[0].DeviceClass.TransactionSeqNo : "");
  1135. string releaseToken = (sr.POSdata[0].DeviceClass.ReleaseToken != null) ? sr.POSdata[0].DeviceClass.ReleaseToken : "";
  1136. requestId = sr.RequestIDNumber;
  1137. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" || transactionNo == "")
  1138. result = OverallResult.MissingMandatoryData;
  1139. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1140. {
  1141. this.FdcPosInterface.LockFuelSaleTrxReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1142. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1143. Convert.ToInt32(transactionNo), releaseToken);
  1144. }
  1145. }
  1146. }
  1147. else if (requestType == "UnlockFuelSaleTrx")
  1148. {
  1149. ServiceRequestUnlockFuelSaleTrx sr = Deserialize<ServiceRequestUnlockFuelSaleTrx>(message, ref result);
  1150. if (sr != null)
  1151. {
  1152. string transactionNo = (sr.POSdata[0].DeviceClass.TransactionNo != null) ? sr.POSdata[0].DeviceClass.TransactionNo : ((sr.POSdata[0].DeviceClass.TransactionSeqNo != null) ? sr.POSdata[0].DeviceClass.TransactionSeqNo : "");
  1153. string releaseToken = (sr.POSdata[0].DeviceClass.ReleaseToken != null) ? sr.POSdata[0].DeviceClass.ReleaseToken : "";
  1154. requestId = sr.RequestIDNumber;
  1155. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" || transactionNo == "")
  1156. result = OverallResult.MissingMandatoryData;
  1157. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1158. {
  1159. this.FdcPosInterface.UnlockFuelSaleTrxReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1160. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1161. Convert.ToInt32(transactionNo), releaseToken);
  1162. }
  1163. }
  1164. }
  1165. else if (requestType == "ClearFuelSaleTrx")
  1166. {
  1167. ServiceRequestClearFuelSaleTrx sr = Deserialize<ServiceRequestClearFuelSaleTrx>(message, ref result);
  1168. if (sr != null)
  1169. {
  1170. string transactionNo = (sr.POSdata[0].DeviceClass.TransactionNo != null) ? sr.POSdata[0].DeviceClass.TransactionNo : ((sr.POSdata[0].DeviceClass.TransactionSeqNo != null) ? sr.POSdata[0].DeviceClass.TransactionSeqNo : "");
  1171. string releaseToken = (sr.POSdata[0].DeviceClass.ReleaseToken != null) ? sr.POSdata[0].DeviceClass.ReleaseToken : "";
  1172. requestId = sr.RequestIDNumber;
  1173. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" || transactionNo == "")
  1174. result = OverallResult.MissingMandatoryData;
  1175. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1176. {
  1177. this.FdcPosInterface.ClearFuelSaleTrxReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1178. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1179. Convert.ToInt32(transactionNo), releaseToken);
  1180. }
  1181. }
  1182. }
  1183. else if (requestType == "GetAvailableFuelSaleTrxs")
  1184. {
  1185. ServiceRequestGetAvailableFuelSaleTrxs sr = Deserialize<ServiceRequestGetAvailableFuelSaleTrxs>(message, ref result);
  1186. if (sr != null)
  1187. {
  1188. requestId = sr.RequestIDNumber;
  1189. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1190. result = OverallResult.MissingMandatoryData;
  1191. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1192. {
  1193. this.FdcPosInterface.GetAvailableFuelSaleTrxsReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1194. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1195. }
  1196. }
  1197. }
  1198. else if (requestType == "GetFuelSaleTrxDetails")
  1199. {
  1200. ServiceRequestGetFuelSaleTrxDetails sr = Deserialize<ServiceRequestGetFuelSaleTrxDetails>(message, ref result);
  1201. if (sr != null)
  1202. {
  1203. string transactionNo = (sr.POSdata[0].DeviceClass.TransactionNo != null) ? sr.POSdata[0].DeviceClass.TransactionNo : ((sr.POSdata[0].DeviceClass.TransactionSeqNo != null) ? sr.POSdata[0].DeviceClass.TransactionSeqNo : "");
  1204. string releaseToken = (sr.POSdata[0].DeviceClass.ReleaseToken != null) ? sr.POSdata[0].DeviceClass.ReleaseToken : "";
  1205. requestId = sr.RequestIDNumber;
  1206. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" || (transactionNo == "" && releaseToken == ""))
  1207. result = OverallResult.MissingMandatoryData;
  1208. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1209. {
  1210. this.FdcPosInterface.GetFuelSaleTrxDetailsReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1211. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1212. (transactionNo == "*") ? -1 : Convert.ToInt32(transactionNo),
  1213. releaseToken);
  1214. }
  1215. }
  1216. }
  1217. else if (requestType == "GetProductTable")
  1218. {
  1219. ServiceRequestGetProductTable sr = Deserialize<ServiceRequestGetProductTable>(message, ref result);
  1220. if (sr != null)
  1221. {
  1222. requestId = sr.RequestIDNumber;
  1223. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1224. {
  1225. this.FdcPosInterface.GetProductTableReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  1226. }
  1227. }
  1228. }
  1229. else if (requestType == "GetModeTable")
  1230. {
  1231. ServiceRequestGetModeTable sr = Deserialize<ServiceRequestGetModeTable>(message, ref result);
  1232. if (sr != null)
  1233. {
  1234. requestId = sr.RequestIDNumber;
  1235. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1236. {
  1237. this.FdcPosInterface.GetModeTableReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  1238. }
  1239. }
  1240. }
  1241. else if (requestType == "GetFuelMode")
  1242. {
  1243. ServiceRequestGetFuelMode sr = Deserialize<ServiceRequestGetFuelMode>(message, ref result);
  1244. if (sr != null)
  1245. {
  1246. requestId = sr.RequestIDNumber;
  1247. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1248. result = OverallResult.MissingMandatoryData;
  1249. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1250. {
  1251. this.FdcPosInterface.GetFuelModeReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, sr.POSdata[0].DeviceClass.Type,
  1252. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1253. }
  1254. }
  1255. }
  1256. else if (requestType == "GetConfiguration")
  1257. {
  1258. Messages.bWholeConfiguration = true;
  1259. ServiceRequestGetConfiguration sr = Deserialize<ServiceRequestGetConfiguration>(message, ref result);
  1260. if (sr != null)
  1261. {
  1262. requestId = sr.RequestIDNumber;
  1263. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1264. {
  1265. this.FdcPosInterface.GetConfigurationReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, "");
  1266. }
  1267. }
  1268. }
  1269. else if (requestType == "GetDSPConfiguration")
  1270. {
  1271. Messages.bWholeConfiguration = false;
  1272. ServiceRequestGetDSPConfiguration sr = Deserialize<ServiceRequestGetDSPConfiguration>(message, ref result);
  1273. if (sr != null)
  1274. {
  1275. requestId = sr.RequestIDNumber;
  1276. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1277. {
  1278. this.FdcPosInterface.GetConfigurationReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, DeviceType.DT_FuelDispenser);
  1279. }
  1280. }
  1281. }
  1282. else if (requestType == "GetTLGConfiguration")
  1283. {
  1284. Messages.bWholeConfiguration = false;
  1285. ServiceRequestGetTLGConfiguration sr = Deserialize<ServiceRequestGetTLGConfiguration>(message, ref result);
  1286. if (sr != null)
  1287. {
  1288. requestId = sr.RequestIDNumber;
  1289. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1290. {
  1291. this.FdcPosInterface.GetConfigurationReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, DeviceType.DT_TankLevelGauge);
  1292. }
  1293. }
  1294. }
  1295. else if (requestType == "GetPPConfiguration")
  1296. {
  1297. Messages.bWholeConfiguration = false;
  1298. ServiceRequestGetPPConfiguration sr = Deserialize<ServiceRequestGetPPConfiguration>(message, ref result);
  1299. if (sr != null)
  1300. {
  1301. requestId = sr.RequestIDNumber;
  1302. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1303. {
  1304. this.FdcPosInterface.GetConfigurationReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, DeviceType.DT_PricePole);
  1305. }
  1306. }
  1307. }
  1308. else if (requestType == "SetConfiguration")
  1309. {
  1310. ServiceRequestSetConfiguration sr = Deserialize<ServiceRequestSetConfiguration>(message, ref result);
  1311. if (sr != null)
  1312. {
  1313. requestId = sr.RequestIDNumber;
  1314. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1315. {
  1316. this.FdcPosInterface.SetConfigurationReq(sr);
  1317. }
  1318. }
  1319. }
  1320. else if (requestType == "LockNozzle")
  1321. {
  1322. ServiceRequestLockNozzle sr = Deserialize<ServiceRequestLockNozzle>(message, ref result);
  1323. if (sr != null)
  1324. {
  1325. requestId = sr.RequestIDNumber;
  1326. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" ||
  1327. sr.POSdata[0].DeviceClass.NozzleNo == "")
  1328. result = OverallResult.MissingMandatoryData;
  1329. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1330. {
  1331. this.FdcPosInterface.LockNozzleReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1332. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1333. (sr.POSdata[0].DeviceClass.NozzleNo == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.NozzleNo));
  1334. }
  1335. }
  1336. }
  1337. else if (requestType == "UnlockNozzle")
  1338. {
  1339. ServiceRequestUnlockNozzle sr = Deserialize<ServiceRequestUnlockNozzle>(message, ref result);
  1340. if (sr != null)
  1341. {
  1342. requestId = sr.RequestIDNumber;
  1343. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" ||
  1344. sr.POSdata[0].DeviceClass.NozzleNo == "")
  1345. result = OverallResult.MissingMandatoryData;
  1346. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1347. {
  1348. this.FdcPosInterface.UnlockNozzleReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1349. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1350. (sr.POSdata[0].DeviceClass.NozzleNo == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.NozzleNo));
  1351. }
  1352. }
  1353. }
  1354. else if (requestType == "GetCountrySettings")
  1355. {
  1356. ServiceRequestGetCountrySettings sr = Deserialize<ServiceRequestGetCountrySettings>(message, ref result);
  1357. if (sr != null)
  1358. {
  1359. requestId = sr.RequestIDNumber;
  1360. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1361. {
  1362. this.FdcPosInterface.GetCountrySettingsReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber);
  1363. }
  1364. }
  1365. }
  1366. else if (requestType == "GetDSPLimits")
  1367. {
  1368. ServiceRequestGetDSPLimits sr = Deserialize<ServiceRequestGetDSPLimits>(message, ref result);
  1369. if (sr != null)
  1370. {
  1371. requestId = sr.RequestIDNumber;
  1372. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1373. result = OverallResult.MissingMandatoryData;
  1374. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1375. {
  1376. this.FdcPosInterface.GetDSPLimitsReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1377. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1378. }
  1379. }
  1380. }
  1381. else if (requestType == "ChangeDSPLimits")
  1382. {
  1383. ServiceRequestChangeDSPLimits sr = Deserialize<ServiceRequestChangeDSPLimits>(message, ref result);
  1384. if (sr != null)
  1385. {
  1386. requestId = sr.RequestIDNumber;
  1387. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" ||
  1388. (FDCGlobal.ProtocolVersion > FDCVersion.V0003 && (sr.POSdata[0].DeviceClass.Product == null || sr.POSdata[0].DeviceClass.Product.FuelMode == null)))
  1389. result = OverallResult.MissingMandatoryData;
  1390. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1391. {
  1392. int mode = 0, productNo = 0;
  1393. Decimal maxTrxAmount = -1, maxTrxVolume = -1;
  1394. if (FDCGlobal.ProtocolVersion == FDCVersion.V0003)
  1395. {
  1396. productNo = Convert.ToInt32(sr.POSdata[0].DeviceClass.ProductNo);
  1397. mode = Convert.ToInt32(sr.POSdata[0].DeviceClass.ModeNo);
  1398. maxTrxAmount = FDCConvert.ToDecimal(sr.POSdata[0].DeviceClass.MaxTrxAmount);
  1399. maxTrxVolume = FDCConvert.ToDecimal(sr.POSdata[0].DeviceClass.MaxTrxVolume);
  1400. }
  1401. else
  1402. {
  1403. productNo = Convert.ToInt32(sr.POSdata[0].DeviceClass.Product.ProductNo);
  1404. mode = Convert.ToInt32(sr.POSdata[0].DeviceClass.Product.FuelMode.ModeNo);
  1405. maxTrxAmount = FDCConvert.ToDecimal(sr.POSdata[0].DeviceClass.Product.FuelMode.MaxTrxAmount);
  1406. maxTrxVolume = FDCConvert.ToDecimal(sr.POSdata[0].DeviceClass.Product.FuelMode.MaxTrxVolume);
  1407. }
  1408. this.FdcPosInterface.ChangeDSPLimitsReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1409. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1410. productNo,
  1411. mode, maxTrxAmount, maxTrxVolume);
  1412. }
  1413. }
  1414. }
  1415. else if (requestType == "SuspendFuelling")
  1416. {
  1417. ServiceRequestSuspendFuelling sr = Deserialize<ServiceRequestSuspendFuelling>(message, ref result);
  1418. if (sr != null)
  1419. {
  1420. requestId = sr.RequestIDNumber;
  1421. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1422. result = OverallResult.MissingMandatoryData;
  1423. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1424. {
  1425. this.FdcPosInterface.SuspendFuellingReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1426. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1427. }
  1428. }
  1429. }
  1430. else if (requestType == "ResumeFuelling")
  1431. {
  1432. ServiceRequestResumeFuelling sr = Deserialize<ServiceRequestResumeFuelling>(message, ref result);
  1433. if (sr != null)
  1434. {
  1435. requestId = sr.RequestIDNumber;
  1436. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1437. result = OverallResult.MissingMandatoryData;
  1438. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1439. {
  1440. this.FdcPosInterface.ResumeFuellingReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1441. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1442. }
  1443. }
  1444. }
  1445. else if (requestType == "LockTank")
  1446. {
  1447. ServiceRequestLockTank sr = Deserialize<ServiceRequestLockTank>(message, ref result);
  1448. if (sr != null)
  1449. {
  1450. requestId = sr.RequestIDNumber;
  1451. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" ||
  1452. sr.POSdata[0].DeviceClass.TankNo == "")
  1453. result = OverallResult.MissingMandatoryData;
  1454. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1455. {
  1456. this.FdcPosInterface.LockTankReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1457. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1458. Convert.ToInt32(sr.POSdata[0].DeviceClass.TankNo));
  1459. }
  1460. }
  1461. }
  1462. else if (requestType == "UnlockTank")
  1463. {
  1464. ServiceRequestUnlockTank sr = Deserialize<ServiceRequestUnlockTank>(message, ref result);
  1465. if (sr != null)
  1466. {
  1467. requestId = sr.RequestIDNumber;
  1468. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" ||
  1469. sr.POSdata[0].DeviceClass.TankNo == "")
  1470. result = OverallResult.MissingMandatoryData;
  1471. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1472. {
  1473. this.FdcPosInterface.UnlockTankReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1474. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1475. Convert.ToInt32(sr.POSdata[0].DeviceClass.TankNo));
  1476. }
  1477. }
  1478. }
  1479. else if (requestType == "GetTankData")
  1480. {
  1481. ServiceRequestGetTankData sr = Deserialize<ServiceRequestGetTankData>(message, ref result);
  1482. if (sr != null)
  1483. {
  1484. requestId = sr.RequestIDNumber;
  1485. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "" ||
  1486. sr.POSdata[0].DeviceClass.TankNo == "")
  1487. result = OverallResult.MissingMandatoryData;
  1488. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1489. {
  1490. this.FdcPosInterface.GetTankDataReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1491. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1492. (sr.POSdata[0].DeviceClass.TankNo == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.TankNo));
  1493. }
  1494. }
  1495. }
  1496. else if (requestType == "ReserveFuelPoint")
  1497. {
  1498. ServiceRequestReserveFuelPoint sr = Deserialize<ServiceRequestReserveFuelPoint>(message, ref result);
  1499. if (sr != null)
  1500. {
  1501. requestId = sr.RequestIDNumber;
  1502. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1503. result = OverallResult.MissingMandatoryData;
  1504. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1505. {
  1506. this.FdcPosInterface.ReserveFuelPointReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1507. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1508. }
  1509. }
  1510. }
  1511. else if (requestType == "FreeFuelPoint")
  1512. {
  1513. ServiceRequestFreeFuelPoint sr = Deserialize<ServiceRequestFreeFuelPoint>(message, ref result);
  1514. if (sr != null)
  1515. {
  1516. requestId = sr.RequestIDNumber;
  1517. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1518. result = OverallResult.MissingMandatoryData;
  1519. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1520. {
  1521. this.FdcPosInterface.FreeFuelPointReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1522. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1523. }
  1524. }
  1525. }
  1526. else if (requestType == "StartFuelPointTest")
  1527. {
  1528. ServiceRequestStartFuelPointTest sr = Deserialize<ServiceRequestStartFuelPointTest>(message, ref result);
  1529. if (sr != null)
  1530. {
  1531. requestId = sr.RequestIDNumber;
  1532. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1533. result = OverallResult.MissingMandatoryData;
  1534. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1535. {
  1536. this.FdcPosInterface.StartFuelPointTestReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1537. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1538. }
  1539. }
  1540. }
  1541. else if (requestType == "EndFuelPointTest")
  1542. {
  1543. ServiceRequestEndFuelPointTest sr = Deserialize<ServiceRequestEndFuelPointTest>(message, ref result);
  1544. if (sr != null)
  1545. {
  1546. requestId = sr.RequestIDNumber;
  1547. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1548. result = OverallResult.MissingMandatoryData;
  1549. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1550. {
  1551. this.FdcPosInterface.EndFuelPointTestReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1552. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1553. }
  1554. }
  1555. }
  1556. else if (requestType == "SetDeviceAlarm")
  1557. {
  1558. ServiceRequestSetDeviceAlarm sr = Deserialize<ServiceRequestSetDeviceAlarm>(message, ref result);
  1559. if (sr != null)
  1560. {
  1561. requestId = sr.RequestIDNumber;
  1562. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1563. result = OverallResult.MissingMandatoryData;
  1564. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1565. {
  1566. this.FdcPosInterface.SetDeviceAlarmReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1567. sr.POSdata[0].DeviceClass.Type,
  1568. Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1569. Convert.ToInt32(sr.POSdata[0].DeviceClass.AlarmMsg[0].Number),
  1570. sr.POSdata[0].DeviceClass.AlarmMsg[0].Text);
  1571. }
  1572. }
  1573. }
  1574. else if (requestType == "OpenFuelPoint")
  1575. {
  1576. ServiceRequestOpenFuelPoint sr = Deserialize<ServiceRequestOpenFuelPoint>(message, ref result);
  1577. if (sr != null)
  1578. {
  1579. requestId = sr.RequestIDNumber;
  1580. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1581. result = OverallResult.MissingMandatoryData;
  1582. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1583. {
  1584. this.FdcPosInterface.OpenFuelPointReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1585. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1586. }
  1587. }
  1588. }
  1589. else if (requestType == "OpenDevice")
  1590. {
  1591. ServiceRequestOpenDevice sr = Deserialize<ServiceRequestOpenDevice>(message, ref result);
  1592. if (sr != null)
  1593. {
  1594. requestId = sr.RequestIDNumber;
  1595. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1596. result = OverallResult.MissingMandatoryData;
  1597. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1598. {
  1599. this.FdcPosInterface.OpenFuelPointReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1600. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1601. }
  1602. }
  1603. }
  1604. else if (requestType == "CloseFuelPoint")
  1605. {
  1606. ServiceRequestCloseFuelPoint sr = Deserialize<ServiceRequestCloseFuelPoint>(message, ref result);
  1607. if (sr != null)
  1608. {
  1609. requestId = sr.RequestIDNumber;
  1610. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1611. result = OverallResult.MissingMandatoryData;
  1612. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1613. {
  1614. this.FdcPosInterface.CloseFuelPointReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1615. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1616. }
  1617. }
  1618. }
  1619. else if (requestType == "CloseDevice")
  1620. {
  1621. ServiceRequestCloseDevice sr = Deserialize<ServiceRequestCloseDevice>(message, ref result);
  1622. if (sr != null)
  1623. {
  1624. requestId = sr.RequestIDNumber;
  1625. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1626. result = OverallResult.MissingMandatoryData;
  1627. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1628. {
  1629. this.FdcPosInterface.CloseFuelPointReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1630. (sr.POSdata[0].DeviceClass.DeviceID == "*") ? -1 : Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1631. }
  1632. }
  1633. }
  1634. else if (requestType == "OPTAdd")
  1635. {
  1636. ServiceRequestOPTAdd sr = Deserialize<ServiceRequestOPTAdd>(message, ref result);
  1637. if (sr != null)
  1638. {
  1639. requestId = sr.RequestIDNumber;
  1640. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1641. result = OverallResult.MissingMandatoryData;
  1642. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1643. {
  1644. if (sr.POSdata[0].DeviceClass.serialPort != null && sr.POSdata[0].DeviceClass.serialPort.Port.Length > 0)
  1645. //OptInterfaceServer.optInterfaceServer.
  1646. this.FdcPosInterface.AddSerialPortReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1647. sr.POSdata[0].DeviceClass.Type, Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID), Convert.ToInt32(sr.POSdata[0].DeviceClass.serialPort.Port),
  1648. Convert.ToInt32(sr.POSdata[0].DeviceClass.serialPort.BaudRate), Convert.ToInt32(sr.POSdata[0].DeviceClass.serialPort.DataBit), Convert.ToInt32(sr.POSdata[0].DeviceClass.serialPort.StopBit), Convert.ToInt32(sr.POSdata[0].DeviceClass.serialPort.Parity));
  1649. else if (sr.POSdata[0].DeviceClass.tcp != null && sr.POSdata[0].DeviceClass.tcp.Port.Length > 0)
  1650. //OptInterfaceServer.optInterfaceServer.
  1651. this.FdcPosInterface.AddTCPReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1652. sr.POSdata[0].DeviceClass.Type, Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1653. sr.POSdata[0].DeviceClass.tcp.Address, Convert.ToInt32(sr.POSdata[0].DeviceClass.tcp.Port));
  1654. }
  1655. }
  1656. }
  1657. else if (requestType == "OPTRemove")
  1658. {
  1659. ServiceRequestOPTRemove sr = Deserialize<ServiceRequestOPTRemove>(message, ref result);
  1660. if (sr != null)
  1661. {
  1662. requestId = sr.RequestIDNumber;
  1663. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1664. result = OverallResult.MissingMandatoryData;
  1665. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1666. {
  1667. this.FdcPosInterface.RemoveReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1668. sr.POSdata[0].DeviceClass.Type, Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID));
  1669. }
  1670. }
  1671. }
  1672. else if (requestType == "OPTWrite")
  1673. {
  1674. ServiceRequestOPTWrite sr = Deserialize<ServiceRequestOPTWrite>(message, ref result);
  1675. if (sr != null)
  1676. {
  1677. requestId = sr.RequestIDNumber;
  1678. if (sr.POSdata.GetLength(0) == 0 || sr.POSdata[0].DeviceClass == null || sr.POSdata[0].DeviceClass.DeviceID == "")
  1679. result = OverallResult.MissingMandatoryData;
  1680. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1681. {
  1682. this.FdcPosInterface.WriteReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber,
  1683. sr.POSdata[0].DeviceClass.Type, Convert.ToInt32(sr.POSdata[0].DeviceClass.DeviceID),
  1684. sr.POSdata[0].DeviceClass.Message);
  1685. }
  1686. }
  1687. }
  1688. else if (requestType == "GenericTypelessMessage")
  1689. {
  1690. ServiceRequestGenericTypelessMessage sr = Deserialize<ServiceRequestGenericTypelessMessage>(message, ref result);
  1691. if (sr != null)
  1692. {
  1693. requestId = sr.RequestIDNumber;
  1694. if (result == OverallResult.Success && extresult == OverallResult.Success)
  1695. {
  1696. this.FdcPosInterface.GenericTypelessMessageReq(sr.WorkstationID, sr.ApplicationSender, sr.RequestIDNumber, sr.POSdata[0].Message);
  1697. }
  1698. }
  1699. }
  1700. else
  1701. {
  1702. fdcSocketLogger.LogInformation(string.Format("Client with applicationSender={0}, workstationId={1} is " +
  1703. "sending in an unknown requestType: {2} message, Will response: ParsingError",
  1704. applicationSender, workstationId, requestType));
  1705. result = OverallResult.ParsingError;
  1706. }
  1707. }
  1708. catch (Exception ex)
  1709. {
  1710. result = OverallResult.Failure;
  1711. fdcSocketLogger.LogError("ReadRequest(requestType: " + (requestType ?? "") + ") from Fdc client(wId: "
  1712. + (workstationId ?? "") + ",appSender: " + (applicationSender ?? "") + ") exceptioned: \r\n" + ex);
  1713. //FDCPOSManager.tracer.WriteLine(string.Format("Exception! requestType='{0}': {1}", requestType, ex.Message));
  1714. }
  1715. if (result != OverallResult.Success || extresult != OverallResult.Success)
  1716. {
  1717. ((FDCPOSInterfaceServerManager)this.fdcPosManager).fdcPosInterface.messages
  1718. .SendErrorResponse(requestType, workstationId, applicationSender, requestId,
  1719. (extresult != OverallResult.Success) ? ErrorCode.ERRCD_COMMERR : ErrorCode.ERRCD_BADVAL,
  1720. result.ToString());
  1721. }
  1722. else
  1723. {
  1724. if (fdcPosManager.fdcClientList.TryGetValue(FDCPOSClient.getClientID(workstationId, applicationSender), out FDCPOSClient cachedFdcPosClient))
  1725. cachedFdcPosClient.heartbeat.StartClientDisconnectionTimer();
  1726. }
  1727. //FDCPOSManager.tracer.WriteLine(string.Format("end requestType='{0}'", requestType));
  1728. return requestType;
  1729. }
  1730. #region misc
  1731. protected string GetRequestType(string myString)
  1732. {
  1733. return GetElemValue("RequestType", myString);
  1734. }
  1735. protected string GetMessageType(string myString)
  1736. {
  1737. return GetElemValue("MessageType", myString);
  1738. }
  1739. protected string GetApplicationSender(string myString)
  1740. {
  1741. return GetElemValue("ApplicationSender", myString); ;
  1742. }
  1743. protected string GetWorkstationID(string myString)
  1744. {
  1745. return GetElemValue("WorkstationID", myString); ;
  1746. }
  1747. protected string GetElemValue(string field, string myString)
  1748. {
  1749. // TODO
  1750. string value = "";
  1751. try
  1752. {
  1753. if (myString.IndexOf(field) >= 0)
  1754. {
  1755. myString = myString.Substring(myString.IndexOf(field));
  1756. myString = myString.Substring(myString.IndexOf('\"') + 1);
  1757. value = myString.Substring(0, myString.IndexOf('\"'));
  1758. }
  1759. }
  1760. catch (Exception ex)
  1761. {
  1762. fdcSocketLogger.LogError("GetElemValue exceptioned: " + ex.ToString());
  1763. //FDCPOSManager.tracer.WriteLine("Exception!" + ex.Message);
  1764. }
  1765. return value;
  1766. }
  1767. #endregion
  1768. #region Deserialize
  1769. public T Deserialize<T>(string xmlString, ref OverallResult result)
  1770. {
  1771. if (string.IsNullOrEmpty(xmlString))
  1772. throw new ArgumentNullException("Target string for Deserialize must not null or empty");
  1773. // Create an instance of the XmlSerializer class;
  1774. // specify the type of object to be deserialized.
  1775. result = OverallResult.Success;
  1776. //===========================
  1777. Exception firstException = null;
  1778. System.Xml.Schema.XmlSchemaSet smSet;
  1779. SchemasSG sgmInst = SchemasSG.Instance;
  1780. if (sgmInst.GetSchemas.ContainsKey((typeof(T).Name)))
  1781. {
  1782. smSet = sgmInst.GetSchemas[typeof(T).Name];
  1783. }
  1784. else
  1785. {
  1786. smSet = null;
  1787. }
  1788. if (smSet != null)
  1789. {
  1790. var settings = new XmlReaderSettings
  1791. {
  1792. Schemas = smSet,
  1793. CheckCharacters = true,
  1794. IgnoreComments = true,
  1795. IgnoreProcessingInstructions = true,
  1796. IgnoreWhitespace = true,
  1797. MaxCharactersInDocument = 999999, // most xml files have 450 characters, if this increases, we need to enlarge the number
  1798. ValidationType = ValidationType.Schema,
  1799. ValidationFlags =
  1800. XmlSchemaValidationFlags.ProcessIdentityConstraints |
  1801. XmlSchemaValidationFlags.ReportValidationWarnings
  1802. };
  1803. settings.ValidationEventHandler +=
  1804. delegate (object sender, ValidationEventArgs args)
  1805. {
  1806. if (args.Severity == XmlSeverityType.Warning)
  1807. {
  1808. //Console.WriteLine("Warning: " + args.Message);
  1809. fdcSocketLogger.LogInformation("XmlSchema Validation has a Warning : " + (args.Message ?? "")
  1810. + Environment.NewLine + (args.Exception?.ToString() ?? "")
  1811. + Environment.NewLine + xmlString);
  1812. }
  1813. else
  1814. {
  1815. if (firstException == null)
  1816. {
  1817. firstException = args.Exception;
  1818. }
  1819. fdcSocketLogger.LogError("XmlSchema Validation has an ERROR: " + (args.Message ?? "")
  1820. + Environment.NewLine + (args.Exception?.ToString() ?? "")
  1821. + Environment.NewLine + xmlString);
  1822. //Console.WriteLine("Exception: " + args.Exception.ToString());
  1823. //FDCPOSManager.tracer.WriteLine("Exception: " + args.Exception.ToString());
  1824. }
  1825. };
  1826. //======================================
  1827. T sr = default(T);
  1828. try
  1829. {
  1830. using (var tempStream = new System.IO.StringReader(xmlString))
  1831. {
  1832. using (var reader = XmlReader.Create(tempStream, settings))
  1833. {
  1834. XmlSerializer serializer = new XmlSerializer(typeof(T));
  1835. serializer.UnknownNode += new XmlNodeEventHandler((_, n) =>
  1836. {
  1837. //the target object may miss to defined a Property?
  1838. fdcSocketLogger.LogInformation("XmlSerializer read an Unknown Node with Name: " + (n.Name ?? "") + ", text: " + (n.Text ?? "")
  1839. + System.Environment.NewLine + xmlString);
  1840. });
  1841. serializer.UnknownAttribute += new XmlAttributeEventHandler((_, e) =>
  1842. {
  1843. //the target object may miss to defined a Property?
  1844. System.Xml.XmlAttribute attr = e.Attr;
  1845. fdcSocketLogger.LogInformation("XmlSerializer read an Unknown Attr with Name: " + (attr.Name ?? "") + ", value: " + (attr.Value ?? "")
  1846. + System.Environment.NewLine + xmlString);
  1847. });
  1848. sr = (T)serializer.Deserialize(reader);
  1849. }
  1850. }
  1851. if (firstException != null)
  1852. throw firstException;
  1853. }
  1854. catch (Exception ex)
  1855. {
  1856. result = OverallResult.ParsingError;
  1857. //FDCPOSManager.tracer.WriteLine("Exception! " + ex.Message);
  1858. fdcSocketLogger.LogError("Deserialize<T>(string ,ref OverallResult) exceptioned for string: " + Environment.NewLine + xmlString
  1859. + Environment.NewLine + "exception detail: " + ex);
  1860. }
  1861. return sr;
  1862. }
  1863. else
  1864. {
  1865. result = OverallResult.ParsingError;
  1866. return default(T);
  1867. }
  1868. } // end of Deserialize
  1869. #endregion
  1870. /// <summary>
  1871. /// 4 bytes Length(16 bytes hash excluded) + 16 bytes hash + UTF8 encoded xml content
  1872. /// </summary>
  1873. /// <typeparam name="T"></typeparam>
  1874. /// <param name="sr"></param>
  1875. /// <param name="enableHashHeader">if false, will set 0 for all 16 bytes</param>
  1876. /// <returns>string is the serialized Message xml string</returns>
  1877. public static Tuple<byte[], string> SerializeFdcMessageToNetworkBytes<T>(T sr, bool enableHashHeader)
  1878. {
  1879. var xmlMsgBodyMemStream = new MemoryStream();
  1880. XmlSerializer serializer = new XmlSerializer(typeof(T));
  1881. serializer.Serialize(xmlMsgBodyMemStream, (T)sr);
  1882. xmlMsgBodyMemStream.Position = 0;
  1883. string xmlBodyStr = "";
  1884. byte[] xmlBodyBytes = null;
  1885. using (StreamReader _ = new StreamReader(xmlMsgBodyMemStream, Encoding.UTF8))
  1886. {
  1887. xmlBodyStr = _.ReadToEnd();
  1888. xmlBodyBytes = Encoding.UTF8.GetBytes(xmlBodyStr);
  1889. }
  1890. #region msg header, 4 bytes of msg body length
  1891. byte[] lengthBytes = new byte[Define.HeaderLength];
  1892. lengthBytes[3] = (byte)(xmlBodyBytes.Length & 0x000000FF);
  1893. lengthBytes[2] = (byte)((xmlBodyBytes.Length & 0x0000FF00) / Math.Pow(2, 8));
  1894. lengthBytes[1] = (byte)((xmlBodyBytes.Length & 0x00FF0000) / Math.Pow(2, 16));
  1895. lengthBytes[0] = (byte)((xmlBodyBytes.Length & 0xFF000000) / Math.Pow(2, 24));
  1896. #endregion
  1897. #region msg encription Bytes, 16 bytes
  1898. var hashBytes = new byte[Define.EncriptionLength];
  1899. if (enableHashHeader)
  1900. {
  1901. MD5Crypter crypter = new MD5Crypter();
  1902. byte[] hashingbytes = new byte[xmlBodyBytes.Length + crypter.getPassphrase().Length];
  1903. Array.Copy(xmlBodyBytes, hashingbytes, xmlBodyBytes.Length);
  1904. Array.Copy(crypter.getPassphrase(), 0, hashingbytes, xmlBodyBytes.Length, crypter.getPassphrase().Length);
  1905. hashBytes = crypter.ComputeHash(hashingbytes);
  1906. }
  1907. else
  1908. {
  1909. for (int i = 0; i < Define.EncriptionLength; i++)
  1910. hashBytes[i] = 0;
  1911. }
  1912. #endregion
  1913. // 3 parts concat.
  1914. var finalBytes = lengthBytes.Concat(hashBytes).Concat(xmlBodyBytes).ToArray();
  1915. return new Tuple<byte[], string>(finalBytes, xmlBodyStr);
  1916. }
  1917. public bool SendResponse<T>(FDCPOSClient fdcPosClient, T sr)
  1918. {
  1919. try
  1920. {
  1921. if (fdcPosClient == null)
  1922. {
  1923. fdcSocketLogger.LogInformation("SendResponse, client is NULL!");
  1924. //FDCPOSManager.tracer.WriteLine(string.Format("client is NULL!"));
  1925. return false;
  1926. }
  1927. if (!fdcPosClient.connected)
  1928. {
  1929. fdcSocketLogger.LogInformation(string.Format("client '{0}' NOT connected, will skip send this response", fdcPosClient.sID));
  1930. //FDCPOSManager.tracer.WriteLine(string.Format("client '{0}' NOT connected", fdcposClient.sID));
  1931. return false;
  1932. }
  1933. Interlocked.Increment(ref FDCPOSManager.messageIdCounter);
  1934. var result = SerializeFdcMessageToNetworkBytes(sr, this.fdcPosManager.encryptedHeader);
  1935. if (result.Item1.Length >= 19999999)
  1936. fdcSocketLogger.LogInformation("SendResponse " + typeof(T).Name
  1937. + ", rawBytes Length: " + result.Item1.Length + " excceed normal value, will send anyway");
  1938. lock (fdcPosClient)
  1939. {
  1940. if (fdcSocketLogger.IsEnabled(LogLevel.Debug))
  1941. fdcSocketLogger.LogDebug("Will Send Fdc Response(full message include header bytes count: " + result.Item1.Length + "): "
  1942. + sr.GetType().Name + ", content:\r\n"
  1943. + result.Item2
  1944. + "\r\n to client(wId: " + (fdcPosClient.workstationID ?? "")
  1945. + ", appSender: " + (fdcPosClient.applicationSender ?? "") + ")");
  1946. var networkStream = fdcPosClient.socketChannelResponse.GetStream();
  1947. networkStream.Write(result.Item1);
  1948. if (fdcSocketLogger.IsEnabled(LogLevel.Debug))
  1949. {
  1950. fdcSocketLogger.LogDebug(" done send Fdc Response: " + sr.GetType().Name);
  1951. }
  1952. }
  1953. try
  1954. {
  1955. if (false && traceXML)
  1956. {
  1957. //DateTime now = DateTime.Now;
  1958. //string sdate = now.Day.ToString() + "-" + now.Month.ToString() + "-";
  1959. //System.IO.StreamWriter testwriter = new StreamWriter(SINPConfigurazione.TracePath + sdate + "xmlServerResponse.xml", true);
  1960. //serializer.Serialize(testwriter, sr);
  1961. //testwriter.Close();
  1962. }
  1963. }
  1964. catch (Exception Ex)
  1965. {
  1966. fdcSocketLogger.LogError(string.Format("Exception tracing xml file: {0}", Ex.Message));
  1967. //FDCPOSManager.tracer.WriteLine(string.Format("Exception tracing xml file: {0}", Ex.Message));
  1968. }
  1969. }
  1970. catch (Exception ex)
  1971. {
  1972. fdcSocketLogger.LogError("SendResponse " + typeof(T).Name + " to client: " + fdcPosClient.sID
  1973. + " Exceptioned: " + ex
  1974. + System.Environment.NewLine + "Will disconect this client");
  1975. fdcPosClient.Dispose();
  1976. this.fdcPosManager.DisconnectClient(fdcPosClient);
  1977. return false;
  1978. }
  1979. return true;
  1980. }
  1981. public void Dispose()
  1982. {
  1983. try
  1984. {
  1985. this.disposed = true;
  1986. this.fdcSocketLogger.LogError($"FdcServerTcpHandler is on stopping, and will Dispose all fdcClientTcpHandlers(total: {this.fdcClientTcpHandlers.Count}) as well... ");
  1987. this.tcpListener.Stop();
  1988. this.fdcClientTcpHandlers.ForEach(c => { try { c.Dispose(); } catch { } });
  1989. this.fdcClientTcpHandlers.Clear();
  1990. }
  1991. finally
  1992. {
  1993. }
  1994. }
  1995. }
  1996. }