private static void TestMessageSerialization() { CallRequest msg1 = new CallRequest(); msg1.MethodInfoId = Guid.NewGuid(); msg1.Target = Guid.NewGuid(); msg1.ParameterValues = new object[] { 1, 2, 3 }; byte[] data = msg1.ToBytes(); CallRequest msg2 = (CallRequest)MessageManager.Create(msg1.Id, data); Debug.Assert(msg2.Id == msg1.Id); Debug.Assert(object.Equals(msg1.Target, msg2.Target)); Debug.Assert(msg1.ParameterValues.Length == msg2.ParameterValues.Length); CallRequest msg3; using (MemoryStream ms = new MemoryStream()) { msg1.BeginWrite(ms); Thread.Sleep(100); ms.Position = 0; var ar = AMessage.BeginRead(ms); Thread.Sleep(100); msg3 = ar.GetMessage() as CallRequest; } Debug.Assert(msg1.Id == msg3.Id); Debug.Assert(object.Equals(msg1.Target, msg3.Target)); Debug.Assert(msg1.ParameterValues.Length == msg3.ParameterValues.Length); var mainMethodInfo = typeof(Program).GetMethod("Main", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic); MethodInfoAnswer miAnswer1 = new MethodInfoAnswer(); miAnswer1.MethodInfoId = Guid.NewGuid(); miAnswer1.MethodInfo = mainMethodInfo; byte[] miAnswerBytes = miAnswer1.ToBytes(); MethodInfoAnswer miAnswer2 = (MethodInfoAnswer)AMessage.Create(miAnswer1.Id, miAnswerBytes); Debug.Assert(miAnswer1.MethodInfo == miAnswer2.MethodInfo); }
public AMessage GetResponse(AMessage message) { if (message == null) { return(null); } AMessage result = null; switch (message.Id) { // ---- Call ---- case MessageId.CallRequest: CallRequest callRequest = (CallRequest)message; result = callHandler.HandleCallRequest(callRequest); if (result == null) { lock (sync) { // Add the call request to the queue pendingRequests.Add(callRequest); } // Send a method info request MethodInfoRequest methodInfoRequest = new MethodInfoRequest(); methodInfoRequest.MethodInfoId = callRequest.MethodInfoId; result = methodInfoRequest; } break; case MessageId.CallAnswer: callHandler.HandleCallAnswer((CallAnswer)message); break; // ---- MethodInfo ---- case MessageId.MethodInfoRequest: result = callHandler.HandleMethodInfoRequest((MethodInfoRequest)message); break; case MessageId.MethodInfoAnswer: MethodInfoAnswer methodInfoAnswer = (MethodInfoAnswer)message; callHandler.HandleMethodInfoAnswer(methodInfoAnswer); CallRequest pendingCallRequest = null; lock (sync) { for (int i = 0; i < pendingRequests.Count; i++) { if (pendingRequests[i].MethodInfoId == methodInfoAnswer.MethodInfoId) { // We got the answer for a method info pendingCallRequest = pendingRequests[i]; pendingRequests.RemoveAt(i); } } } if (pendingCallRequest != null) { result = callHandler.HandleCallRequest(pendingCallRequest); } break; // ---- ConnectionInfo ---- case MessageId.ConnectionInfoRequest: result = HandleConnectionInfoRequest((ConnectionInfoRequest)message); break; case MessageId.ConnectionInfoAnswer: HandleConnectionInfoAnswer((ConnectionInfoAnswer)message); break; default: string errorMsg = string.Format("Messages of Id={0} and type={1} are not supported", message.Id, message.GetType()); throw new NotSupportedException(errorMsg); } return(result); }
public void HandleMethodInfoAnswer(MethodInfoAnswer methodInfoAnswer) { throw new NotImplementedException(); }