IFSFMessages.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Threading;
  6. using System.Xml.Serialization;
  7. using Wayne.FDCPOSLibrary;
  8. using Wayne.ForecourtControl.OptBridge;
  9. using Wayne.Lib;
  10. using Wayne.Lib.Log;
  11. namespace Wayne.ForecourtControl.Fusion
  12. {
  13. public class IFSFMessages
  14. {
  15. private Queue<BasePOSRequest> _serviceRequestChannelA = null;
  16. public Queue<BasePOSRequest> serviceRequestChannelA
  17. {
  18. get { return _serviceRequestChannelA; }
  19. }
  20. private IFSFSockets _ifsfSockets;
  21. public IFSFSockets ifsfSockets
  22. {
  23. get { return _ifsfSockets; }
  24. }
  25. public event EventHandler OnIFSFSMessageEnqueued;
  26. public event EventHandler<MessageEnqueuedEventArgs> OnIFSFSMessageEnqueuing;
  27. public event EventHandler OnResponseTimeout;
  28. private readonly DebugLogger debugLogger;
  29. public IFSFMessages(IFSFSockets myifsfSockets, DebugLogger debugLogger)
  30. {
  31. _ifsfSockets = myifsfSockets;
  32. _serviceRequestChannelA = new Queue<BasePOSRequest>();
  33. serializers = new Hashtable();
  34. this.debugLogger = debugLogger;
  35. this._asyncResponseManager = new AsyncResponseManager(debugLogger);
  36. this._asyncResponseManager.OnResponseTimeout += new EventHandler(asyncResponseManager_OnResponseTimeout);
  37. OnIFSFSMessageEnqueuing += new EventHandler<MessageEnqueuedEventArgs>(this.asyncResponseManager.OnMessageEnqueuing);
  38. }
  39. private void DebugLog(string s)
  40. {
  41. if (debugLogger.IsActive())
  42. debugLogger.Add(s);
  43. }
  44. private Hashtable serializers;
  45. public XmlSerializer GetXmlSerializer(Type T)
  46. {
  47. XmlSerializer ser = (XmlSerializer)serializers[T];
  48. if (ser == null)
  49. {
  50. ser = new XmlSerializer(T);
  51. serializers[T] = ser;
  52. /* If the XML document has been altered with unknown nodes or attributes, handle them with the UnknownNode and UnknownAttribute events.*/
  53. ser.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
  54. ser.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
  55. }
  56. return ser;
  57. }
  58. private AsyncResponseManager _asyncResponseManager;
  59. public AsyncResponseManager asyncResponseManager
  60. {
  61. get
  62. {
  63. return this._asyncResponseManager;
  64. }
  65. }
  66. private void asyncResponseManager_OnResponseTimeout(object sender, EventArgs e)
  67. {
  68. DebugLog("OnResponseTimeout init");
  69. if (OnResponseTimeout != null)
  70. OnResponseTimeout.Invoke(this, null);
  71. DebugLog("OnResponseTimeout end");
  72. }
  73. public void EnqueueMessage(ServiceRequest sr, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken, object src, bool responseRequired, int responseTimeout)
  74. {
  75. DebugLog(string.Format("EnqueueMessage init: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  76. // invoke enqueuing event
  77. if (this.OnIFSFSMessageEnqueuing != null)
  78. {
  79. int requestId = 0;
  80. try
  81. {
  82. requestId = (sr.RequestID != null && sr.RequestID != "") ? Convert.ToInt32(sr.RequestID) : 0;
  83. }
  84. catch (Exception ex)
  85. {
  86. DebugLog("EnqueueMessage Exception! " + ex.ToString());
  87. }
  88. if (requestId > 0)
  89. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, sr.RequestType, responseTimeout, requestCompleted, userToken, src, responseRequired));
  90. }
  91. // enqueue the object in the socket elaboration queue
  92. lock (serviceRequestChannelA)
  93. {
  94. serviceRequestChannelA.Enqueue(sr);
  95. DebugLog(string.Format("enqueued: count='{0}'", serviceRequestChannelA.Count));
  96. if (this.OnIFSFSMessageEnqueued != null)
  97. {
  98. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  99. }
  100. }
  101. DebugLog(string.Format("EnqueueMessage end: RequestType='{0}', requestId={1}", sr.RequestType, sr.RequestID));
  102. }
  103. public void EnqueueMessage(FDCMessage msg, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken, object src, bool responseRequired, int responseTimeout)
  104. {
  105. DebugLog(string.Format("EnqueueMessage init: MessageType='{0}', MessageId={1}", msg.MessageType, msg.MessageID));
  106. // invoke enqueuing event
  107. if (this.OnIFSFSMessageEnqueuing != null)
  108. {
  109. int requestId = 0;
  110. try
  111. {
  112. requestId = (msg.MessageID != null && msg.MessageID != "") ? Convert.ToInt32(msg.MessageID) : 0;
  113. }
  114. catch (Exception ex)
  115. {
  116. DebugLog("Exception EnqueueMessage " + ex.ToString());
  117. }
  118. if (requestId > 0)
  119. this.OnIFSFSMessageEnqueuing.Invoke(this, new MessageEnqueuedEventArgs(requestId, msg.MessageType, responseTimeout, requestCompleted, userToken, src, responseRequired));
  120. }
  121. // enqueue the object in the socket elaboration queue
  122. lock (serviceRequestChannelA)
  123. {
  124. serviceRequestChannelA.Enqueue(msg);
  125. DebugLog(string.Format("enqueued: count='{0}'", serviceRequestChannelA.Count));
  126. if (this.OnIFSFSMessageEnqueued != null)
  127. {
  128. this.OnIFSFSMessageEnqueued.Invoke(this, null);
  129. }
  130. }
  131. DebugLog(string.Format("EnqueueMessage end: MessageType='{0}', MessageId={1}", msg.MessageType, msg.MessageID));
  132. }
  133. public T Deserialize<T>(string myString, ref OverallResult result)
  134. {
  135. T sr = default(T);
  136. try
  137. {
  138. // get the instance of the XmlSerializer class;
  139. // specify the type of object to be deserialized.
  140. var serializer = this.GetXmlSerializer(typeof(T));
  141. // Declare an object variable of the type to be deserialized.
  142. using (var tempStream = System.Xml.XmlReader.Create(new StringReader(myString)))
  143. {
  144. /* Use the Deserialize method to restore the object's state with data from the XML document. */
  145. sr = (T)serializer.Deserialize(tempStream);
  146. }
  147. }
  148. catch (Exception ex)
  149. {
  150. result = OverallResult.ParsingError;
  151. DebugLog("Exception Deserialize: " + ex.ToString());
  152. }
  153. return sr;
  154. }
  155. private void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
  156. {
  157. DebugLog("Unknown Node:" + e.Name + "\t" + e.Text);
  158. }
  159. private void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
  160. {
  161. System.Xml.XmlAttribute attr = e.Attr;
  162. DebugLog("Unknown attribute " + attr.Name + "='" + attr.Value + "'");
  163. }
  164. }
  165. }