2003-02-03 Patrik Torstensson
authorPatrik Torstensson <totte@mono-cvs.ximian.com>
Mon, 3 Feb 2003 11:37:44 +0000 (11:37 -0000)
committerPatrik Torstensson <totte@mono-cvs.ximian.com>
Mon, 3 Feb 2003 11:37:44 +0000 (11:37 -0000)
* CrossAppDomainChannel.cs: Implemented cross appdomain marshalling via cross
app domain messages (smuggling objects between domains)

svn path=/trunk/mcs/; revision=11162

mcs/class/corlib/System.Runtime.Remoting.Channels/ChangeLog
mcs/class/corlib/System.Runtime.Remoting.Channels/CrossAppDomainChannel.cs

index 96f4533d202dfec2c598b812f72cd2fb976fc8cf..a663c2141e2bea35e8771eb8b46c322df44a1656 100644 (file)
@@ -1,3 +1,8 @@
+2003-02-03 Patrik Torstensson
+
+       * CrossAppDomainChannel.cs: Implemented cross appdomain marshalling via cross 
+       app domain messages (smuggling objects between domains)
+
 2002-12-29  Lluis Sanchez Gual  <lluis@ideary.com>
 
        * ChannelServices.cs: corrected generation of exception in SyncDispatchMessage.
index fa19e647ae64b789fdbbd8aea1382b6da0029f32..ed91317343a2bc71fd1bf2957369c1e1bb47fcf1 100755 (executable)
@@ -153,47 +153,64 @@ namespace System.Runtime.Remoting.Channels
 \r
                        try \r
                        {\r
-                               // Serialize the request message\r
-                               MemoryStream reqMsgStream = CADSerializer.SerializeMessage(msgRequest);\r
-\r
                                // Time to transit into the "our" domain\r
                                byte [] arrResponse = null;\r
-                               byte [] arrRequest = reqMsgStream.GetBuffer();\r
-                               
-                               // TODO: Enable again when we have support in the runtime
-                               //AppDomain currentDomain = AppDomain.EnterDomain ( _domainID );
+                               byte [] arrRequest = null; \r
+                               \r
+                               CADMethodReturnMessage cadMrm = null;\r
+                               CADMethodCallMessage cadMsg;\r
+                               \r
+                               cadMsg = CADMethodCallMessage.Create (msgRequest);\r
+                               if (null == cadMsg) {\r
+                                       // Serialize the request message\r
+                                       MemoryStream reqMsgStream = CADSerializer.SerializeMessage(msgRequest);\r
+                                       arrRequest = reqMsgStream.GetBuffer();\r
+                               }\r
+\r
+                               // TODO: Use Contexts instead of domain id only\r
+                               AppDomain currentDomain = AppDomain.InternalSetDomainByID ( _domainID );
                                try 
                                {
-                                       IMessage reqDomMsg = CADSerializer.DeserializeMessage (new MemoryStream(arrRequest), null);
+                                       IMessage reqDomMsg;
+
+                                       if (null != arrRequest)
+                                               reqDomMsg = CADSerializer.DeserializeMessage (new MemoryStream(arrRequest), null);
+                                       else
+                                               reqDomMsg = new MethodCall (cadMsg);
 
                                        IMessage retDomMsg = ChannelServices.SyncDispatchMessage (reqDomMsg);
+
+                                       cadMrm = CADMethodReturnMessage.Create (retDomMsg);
+                                       if (null == cadMrm) {
+                                               arrResponse = CADSerializer.SerializeMessage (retDomMsg).GetBuffer();
+                                       } else
+                                               arrResponse = null;
 \r
-                                       arrResponse = CADSerializer.SerializeMessage (retDomMsg).GetBuffer();
                                }
                                catch (Exception e) 
                                {
-                                       IMessage errorMsg = new ReturnMessage (e, new ErrorMessage());
+                                       IMessage errorMsg = new MethodResponse (e, new ErrorMessage());
                                        arrResponse = CADSerializer.SerializeMessage (errorMsg).GetBuffer(); \r
                                }   
                                finally 
                                {
-                                       // TODO: Enable again when we have support in the runtime
-                                       // AppDomain.EnterDomain (AppDomain.getIDFromDomain (currentDomain));
+                                       AppDomain.InternalSetDomain (currentDomain);
                                }\r
-\r
-                               if (null != arrResponse) \r
-                               {\r
+                               \r
+                               if (null != arrResponse) {\r
                                        // Time to deserialize the message\r
                                        MemoryStream respMsgStream = new MemoryStream(arrResponse);\r
 \r
                                        // Deserialize the response message\r
                                        retMessage = CADSerializer.DeserializeMessage(respMsgStream, msgRequest as IMethodCallMessage);\r
-                               }\r
+                               } else\r
+                                       retMessage = new MethodResponse (msgRequest as IMethodCallMessage, cadMrm);\r
                        }\r
                        catch (Exception e) \r
                        {\r
                                try\r
                                {\r
+                                       Console.WriteLine("Exception in base domain");
                                        retMessage = new ReturnMessage (e, msgRequest as IMethodCallMessage);
                                }\r
                                catch (Exception)\r
@@ -202,7 +219,7 @@ namespace System.Runtime.Remoting.Channels
                                }\r
                        }\r
 \r
-                       return retMessage;\r
+                       return retMessage;\r
                }
 
                public virtual IMessageCtrl AsyncProcessMessage(IMessage reqMsg, IMessageSink replySink) \r
@@ -222,20 +239,43 @@ namespace System.Runtime.Remoting.Channels
                        serializer.SurrogateSelector = null;\r
                        mem.Position = 0;\r
 \r
-                       return (IMessage) serializer.Deserialize(mem);\r
+                       return (IMessage) serializer.Deserialize(mem, null);\r
                }\r
                \r
                internal static MemoryStream SerializeMessage(IMessage msg)\r
                {\r
-                       MemoryStream mem = new MemoryStream();\r
-                       BinaryFormatter serializer = new BinaryFormatter();                \r
+                       MemoryStream mem = new MemoryStream ();\r
+                       BinaryFormatter serializer = new BinaryFormatter ();                \r
 \r
-                       serializer.SurrogateSelector = new RemotingSurrogateSelector();\r
-                       serializer.Serialize(mem, msg);\r
+                       serializer.SurrogateSelector = new RemotingSurrogateSelector ();\r
+                       serializer.Serialize (mem, msg);\r
 \r
                        mem.Position = 0;\r
 \r
                        return mem;\r
                }
+
+               internal static MemoryStream SerializeObject(object obj)\r
+               {\r
+                       MemoryStream mem = new MemoryStream ();\r
+                       BinaryFormatter serializer = new BinaryFormatter ();                \r
+\r
+                       serializer.SurrogateSelector = new RemotingSurrogateSelector ();\r
+                       serializer.Serialize (mem, obj);\r
+\r
+                       mem.Position = 0;\r
+\r
+                       return mem;\r
+               }
+\r
+               internal static object DeserializeObject(MemoryStream mem)\r
+               {\r
+                       BinaryFormatter serializer = new BinaryFormatter();                \r
+\r
+                       serializer.SurrogateSelector = null;\r
+                       mem.Position = 0;\r
+\r
+                       return serializer.Deserialize (mem);\r
+               }
        }
 }