Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 public void HandleMethodInfoAnswer(MethodInfoAnswer methodInfoAnswer)
 {
     throw new NotImplementedException();
 }