IFSFMessages.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Threading;
  5. using System.Xml.Serialization;
  6. using System.IO;
  7. using Wayne.Lib;
  8. using Wayne.ForecourtControl.OptBridge;
  9. using Wayne.FDCPOSLibrary;
  10. namespace Wayne.ForecourtControl.Fusion
  11. {
  12. public class IFSFMessages
  13. {
  14. private Queue<BasePOSRequest> _serviceRequestChannelA = null;
  15. public Queue<BasePOSRequest> serviceRequestChannelA
  16. {
  17. get { return _serviceRequestChannelA; }
  18. }
  19. private IFSFSockets _ifsfSockets;
  20. public IFSFSockets ifsfSockets
  21. {
  22. get { return _ifsfSockets; }
  23. }
  24. public event EventHandler OnIFSFSMessageEnqueued;
  25. public event EventHandler<MessageEnqueuedEventArgs> OnIFSFSMessageEnqueuing;
  26. public event EventHandler OnResponseTimeout;
  27. public IFSFMessages(IFSFSockets myifsfSockets)
  28. {
  29. _ifsfSockets = myifsfSockets;
  30. _serviceRequestChannelA = new Queue<BasePOSRequest>();
  31. serializers = new Hashtable();
  32. this._asyncResponseManager = new AsyncResponseManager();
  33. this._asyncResponseManager.OnResponseTimeout += new EventHandler(asyncResponseManager_OnResponseTimeout);
  34. OnIFSFSMessageEnqueuing += new EventHandler<MessageEnqueuedEventArgs>(this.asyncResponseManager.OnMessageEnqueuing);
  35. }
  36. private Hashtable serializers;
  37. public XmlSerializer GetXmlSerializer(Type T)
  38. {
  39. XmlSerializer ser = (XmlSerializer)serializers[T];
  40. if (ser == null)
  41. {
  42. ser = new XmlSerializer(T);
  43. serializers[T] = ser;
  44. /* If the XML document has been altered with unknown nodes or attributes, handle them with the UnknownNode and UnknownAttribute events.*/
  45. ser.UnknownNode += serializer_UnknownNode;
  46. ser.UnknownAttribute += serializer_UnknownAttribute;
  47. }
  48. return ser;
  49. }
  50. private AsyncResponseManager _asyncResponseManager;
  51. public AsyncResponseManager asyncResponseManager
  52. {
  53. get
  54. {
  55. return this._asyncResponseManager;
  56. }
  57. }
  58. private void asyncResponseManager_OnResponseTimeout(object sender, EventArgs e)
  59. {
  60. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("init OnResponseTimeout"));
  61. if (OnResponseTimeout != null)
  62. OnResponseTimeout.Invoke(this, e);
  63. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("end OnResponseTimeout"));
  64. }
  65. #if !(_TEVENTARGS)
  66. public void EnqueueMessage(ServiceRequest sr, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken, object src, bool responseRequired)
  67. {
  68. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage init: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  69. // invoke enqueuing event
  70. if (this.OnIFSFSMessageEnqueuing != null)
  71. {
  72. int requestId = 0;
  73. try
  74. {
  75. requestId = (sr.RequestID != null && sr.RequestID != "") ? Convert.ToInt32(sr.RequestID) : 0;
  76. }
  77. catch(Exception ex)
  78. {
  79. Trace.WriteLine(ex.Message + " - " + ex.StackTrace);
  80. }
  81. if (requestId > 0)
  82. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, sr.RequestType, requestCompleted, userToken, src, responseRequired));
  83. }
  84. // enqueue the object in the socket elaboration queue
  85. Monitor.Enter(serviceRequestChannelA);
  86. serviceRequestChannelA.Enqueue(sr);
  87. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("enqueued: count='{0}'", serviceRequestChannelA.Count));
  88. if (this.OnIFSFSMessageEnqueued != null)
  89. {
  90. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  91. }
  92. Monitor.Exit(serviceRequestChannelA);
  93. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage end: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  94. }
  95. public void EnqueueMessage(ServiceRequest sr, EventHandler<AsyncCompletedEventArgs<long>> requestCompleted, object userToken, object src, bool responseRequired, long resultLong)
  96. {
  97. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(long) init: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  98. // invoke enqueuing event
  99. if (this.OnIFSFSMessageEnqueuing != null)
  100. {
  101. int requestId = 0;
  102. try
  103. {
  104. requestId = (sr.RequestID != null && sr.RequestID != "") ? Convert.ToInt32(sr.RequestID) : 0;
  105. }
  106. catch (Exception ex)
  107. {
  108. Trace.WriteLine("Exception EnqueueMessage(long)! " + ex.Message + " - " + ex.StackTrace);
  109. }
  110. if (requestId > 0)
  111. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, sr.RequestType, requestCompleted, userToken, src, responseRequired, resultLong));
  112. }
  113. // enqueue the object in the socket elaboration queue
  114. Monitor.Enter(serviceRequestChannelA);
  115. serviceRequestChannelA.Enqueue(sr);
  116. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("enqueued(long): count='{0}'", serviceRequestChannelA.Count));
  117. if (this.OnIFSFSMessageEnqueued != null)
  118. {
  119. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  120. }
  121. Monitor.Exit(serviceRequestChannelA);
  122. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(long) end: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  123. }
  124. public void EnqueueMessage(ServiceRequest sr, EventHandler<AsyncCompletedEventArgs<ITankReadingEx>> requestCompleted, object userToken, object src, bool responseRequired, ITankReadingEx resultITankreading)
  125. {
  126. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(ITankReadingEx) init: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  127. // invoke enqueuing event
  128. if (this.OnIFSFSMessageEnqueuing != null)
  129. {
  130. int requestId = 0;
  131. try
  132. {
  133. requestId = (sr.RequestID != null && sr.RequestID != "") ? Convert.ToInt32(sr.RequestID) : 0;
  134. }
  135. catch (Exception ex)
  136. {
  137. Trace.WriteLine("Exception EnqueueMessage(ITankReadingEx)! " + ex.Message + " - " + ex.StackTrace);
  138. }
  139. if (requestId > 0)
  140. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, sr.RequestType, requestCompleted, userToken, src, responseRequired, resultITankreading));
  141. }
  142. // enqueue the object in the socket elaboration queue
  143. Monitor.Enter(serviceRequestChannelA);
  144. serviceRequestChannelA.Enqueue(sr);
  145. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("enqueued(ITankReadingEx): count='{0}'", serviceRequestChannelA.Count));
  146. if (this.OnIFSFSMessageEnqueued != null)
  147. {
  148. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  149. }
  150. Monitor.Exit(serviceRequestChannelA);
  151. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(ITankReadingEx) end: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  152. }
  153. public void EnqueueMessage(ServiceRequest sr, EventHandler<AsyncCompletedEventArgs<PumpAccumulatorReading>> requestCompleted, object userToken, object src, bool responseRequired, PumpAccumulatorReading resultPumpAccumulatorReading)
  154. {
  155. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(PumpAccumulatorReading) init: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  156. // invoke enqueuing event
  157. if (this.OnIFSFSMessageEnqueuing != null)
  158. {
  159. int requestId = 0;
  160. try
  161. {
  162. requestId = (sr.RequestID != null && sr.RequestID != "") ? Convert.ToInt32(sr.RequestID) : 0;
  163. }
  164. catch (Exception ex)
  165. {
  166. Trace.WriteLine("Exception EnqueueMessage(PumpAccumulatorReading)! " + ex.Message + " - " + ex.StackTrace);
  167. }
  168. if (requestId > 0)
  169. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, sr.RequestType, requestCompleted, userToken, src, responseRequired, resultPumpAccumulatorReading));
  170. }
  171. // enqueue the object in the socket elaboration queue
  172. Monitor.Enter(serviceRequestChannelA);
  173. serviceRequestChannelA.Enqueue(sr);
  174. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("enqueued(PumpAccumulatorReading): count='{0}'", serviceRequestChannelA.Count));
  175. if (this.OnIFSFSMessageEnqueued != null)
  176. {
  177. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  178. }
  179. Monitor.Exit(serviceRequestChannelA);
  180. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(PumpAccumulatorReading) end: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  181. }
  182. public void EnqueueMessage(ServiceRequest sr, EventHandler<OptWriteCompletedEventArgs> requestCompleted, object userToken, object src, bool responseRequired, OptWriteCompletedEventArgs resultOptWrite)
  183. {
  184. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(opt) init: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  185. // invoke enqueuing event
  186. if (this.OnIFSFSMessageEnqueuing != null)
  187. {
  188. int requestId = 0;
  189. try
  190. {
  191. requestId = (sr.RequestID != null && sr.RequestID != "") ? Convert.ToInt32(sr.RequestID) : 0;
  192. }
  193. catch (Exception ex)
  194. {
  195. Trace.WriteLine("Exception EnqueueMessage(opt)! " + ex.Message + " - " + ex.StackTrace);
  196. }
  197. if (requestId > 0)
  198. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, sr.RequestType, requestCompleted, userToken, src, responseRequired, resultOptWrite));
  199. }
  200. // enqueue the object in the socket elaboration queue
  201. Monitor.Enter(serviceRequestChannelA);
  202. serviceRequestChannelA.Enqueue(sr);
  203. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("enqueued(opt): count='{0}'", serviceRequestChannelA.Count));
  204. if (this.OnIFSFSMessageEnqueued != null)
  205. {
  206. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  207. }
  208. Monitor.Exit(serviceRequestChannelA);
  209. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(opt) end: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  210. }
  211. public void EnqueueMessage(FDCMessage msg, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken, object src, bool responseRequired)
  212. {
  213. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage init: MessageType='{0}', MessageId={1}", msg.MessageType, msg.MessageID));
  214. // invoke enqueuing event
  215. if (this.OnIFSFSMessageEnqueuing != null)
  216. {
  217. int requestId = 0;
  218. try
  219. {
  220. requestId = (msg.MessageID != null && msg.MessageID != "") ? Convert.ToInt32(msg.MessageID) : 0;
  221. }
  222. catch (Exception ex)
  223. {
  224. Trace.WriteLine(ex.Message + " - " + ex.StackTrace);
  225. }
  226. if (requestId > 0)
  227. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, msg.MessageType, requestCompleted, userToken, src, responseRequired));
  228. }
  229. // enqueue the object in the socket elaboration queue
  230. Monitor.Enter(serviceRequestChannelA);
  231. serviceRequestChannelA.Enqueue(msg);
  232. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("enqueued: count='{0}'", serviceRequestChannelA.Count));
  233. if (this.OnIFSFSMessageEnqueued != null)
  234. {
  235. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  236. }
  237. Monitor.Exit(serviceRequestChannelA);
  238. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage end: MessageType='{0}', MessageId={1}", msg.MessageType, msg.MessageID));
  239. }
  240. #else
  241. public void EnqueueMessage<TEventArgs, TResult>(ServiceRequest sr, EventHandler<TEventArgs> requestCompleted, object userToken, object src, bool responseRequired, TResult result) where TEventArgs : EventArgs
  242. {
  243. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(opt) init: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  244. // invoke enqueuing event
  245. if (this.OnIFSFSMessageEnqueuing != null)
  246. {
  247. int requestId = 0;
  248. try
  249. {
  250. requestId = (sr.RequestID != null && sr.RequestID != "") ? Convert.ToInt32(sr.RequestID) : 0;
  251. }
  252. catch (Exception ex)
  253. {
  254. Trace.WriteLine("Exception EnqueueMessage(opt)! " + ex.Message + " - " + ex.StackTrace);
  255. }
  256. if (requestId > 0)
  257. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs<TEventArgs, TResult>(requestId, sr.RequestType, requestCompleted, userToken, src, responseRequired, result));
  258. }
  259. // enqueue the object in the socket elaboration queue
  260. Monitor.Enter(serviceRequestChannelA);
  261. serviceRequestChannelA.Enqueue(sr);
  262. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("enqueued(opt): count='{0}'", serviceRequestChannelA.Count));
  263. if (this.OnIFSFSMessageEnqueued != null)
  264. {
  265. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  266. }
  267. Monitor.Exit(serviceRequestChannelA);
  268. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("EnqueueMessage(opt) end: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  269. }
  270. #endif
  271. public T Deserialize<T>(string myString, ref OverallResult result)
  272. {
  273. T sr = default(T);
  274. try
  275. {
  276. // Create an instance of the XmlSerializer class;
  277. // specify the type of object to be deserialized.
  278. XmlSerializer serializer = new XmlSerializer(typeof(T));
  279. /* If the XML document has been altered with unknown nodes or attributes, handle them with the UnknownNode and UnknownAttribute events.*/
  280. serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
  281. serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
  282. // Declare an object variable of the type to be deserialized.
  283. using (var tempStream = new System.IO.StringReader(myString))
  284. {
  285. /* Use the Deserialize method to restore the object's state with data from the XML document. */
  286. sr = (T)serializer.Deserialize(tempStream);
  287. }
  288. }
  289. catch (Exception Exception)
  290. {
  291. result = OverallResult.ParsingError;
  292. }
  293. return sr;
  294. }
  295. private void serializer_UnknownNode (object sender, XmlNodeEventArgs e)
  296. {
  297. Trace.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text);
  298. }
  299. private void serializer_UnknownAttribute (object sender, XmlAttributeEventArgs e)
  300. {
  301. System.Xml.XmlAttribute attr = e.Attr;
  302. Trace.WriteLine("Unknown attribute " +
  303. attr.Name + "='" + attr.Value + "'");
  304. }
  305. private void TraceInXml(string msg)
  306. {
  307. if (_ifsfSockets.configParam.TraceXML)
  308. {
  309. var path = string.Format("{0}{1:00}-{2:00}-xmlClientMsg.xml", ConfigurationParams.tracePath,
  310. DateTime.Now.Day, DateTime.Now.Month);
  311. using (var testwriter = new StreamWriter(path, true))
  312. {
  313. testwriter.Write(msg);
  314. }
  315. }
  316. }
  317. }
  318. }