2009-08-11 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 11 Aug 2009 08:14:30 +0000 (08:14 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 11 Aug 2009 08:14:30 +0000 (08:14 -0000)
* IOperationInvoker.cs : fix interface.
* DefaultOperationInvoker.cs : refresh implementation of the above.
* BaseMessagesFormatter.cs, OperationInvokerHandler.cs :
  dependent changes for above.

* ServiceHostBase.cs : use new IOperationInvoker implementation.

* System.ServiceModel.dll.sources: add DefaultOperationInvoker.cs.

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

mcs/class/System.ServiceModel/ChangeLog
mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/BaseMessagesFormatter.cs
mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChangeLog
mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/DefaultOperationInvoker.cs [new file with mode: 0644]
mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/IOperationInvoker.cs
mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/OperationInvokerHandler.cs
mcs/class/System.ServiceModel/System.ServiceModel.dll.sources
mcs/class/System.ServiceModel/System.ServiceModel/ChangeLog
mcs/class/System.ServiceModel/System.ServiceModel/ServiceHostBase.cs

index 324ec5828fcfed6d6c67775db681d535b4f63971..96c5a2b63c99aa4887509f330c0ced09664af853 100755 (executable)
@@ -1,3 +1,7 @@
+2009-08-11  Astushi Enomoto  <atsushi@ximian.com>
+
+       * System.ServiceModel.dll.sources: add DefaultOperationInvoker.cs.
+
 2009-08-07  Astushi Enomoto  <atsushi@ximian.com>
 
        * System.ServiceModel.dll.sources: add ServiceProxyGenerator.cs.
index dbe680b6e56c4a81486c81e2fad685d05b87cba2..572f79a0fa8184b859c4600cc2bcbe4406ba0575 100644 (file)
@@ -157,8 +157,10 @@ namespace System.ServiceModel.Dispatcher
                        {
                                int index = 0;
                                foreach (ParameterInfo pi in requestMethodParams)
-                                       if (!pi.IsOut)
-                                               parameters [pi.Position] = parts [index++];
+                                       if (!pi.IsOut) {
+                                               parameters [index] = parts [index];
+                                               index++;
+                                       }
                        }
                }
 
index b4f30d194bdf61cf747de48f9b2ac4720428ea24..9660ffee05ee142e4595975462f7e40c23209899 100644 (file)
@@ -1,3 +1,10 @@
+2009-08-11  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * IOperationInvoker.cs : fix interface.
+       * DefaultOperationInvoker.cs : refresh implementation of the above.
+       * BaseMessagesFormatter.cs, OperationInvokerHandler.cs :
+         dependent changes for above.
+
 2009-08-07  Atsushi Enomoto  <atsushi@ximian.com>
 
        * InputOrReplyRequestProcessor.cs : now it could return an instance
diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/DefaultOperationInvoker.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/DefaultOperationInvoker.cs
new file mode 100644 (file)
index 0000000..44912ba
--- /dev/null
@@ -0,0 +1,131 @@
+//
+// DefaultOperationInvoker.cs
+//
+// Author: Atsushi Enomoto (atsushi@ximian.com)
+//
+// Copyright (C) 2009 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+using System.ServiceModel.Description;
+using System.Reflection;
+using System.Threading;
+
+namespace System.ServiceModel.Dispatcher
+{
+       class DefaultOperationInvoker : IOperationInvoker
+       {
+               readonly OperationDescription od;
+               readonly ParameterInfo [] in_params, out_params;
+
+               public DefaultOperationInvoker (OperationDescription od)
+               {
+                       this.od = od;
+                       var mi = od.SyncMethod ?? od.BeginMethod;
+                       var il = new List<ParameterInfo> ();
+                       var ol = new List<ParameterInfo> ();
+                       var pl = mi.GetParameters ();
+                       int count = mi == od.BeginMethod ? pl.Length - 2 : pl.Length;
+                       for (int i = 0; i < count; i++) {
+                               var pi = pl [i];
+                               if (!pi.IsOut)
+                                       il.Add (pi);
+                               if (pi.IsOut)
+                                       ol.Add (pi);
+                       }
+                       in_params = il.ToArray ();
+                       out_params = ol.ToArray ();
+               }
+
+               public bool IsSynchronous {
+                       get { return true; }
+               }
+
+               public object [] AllocateInputs ()
+               {
+                       return new object [in_params.Length];
+               }
+
+               public object Invoke (object instance, object [] inputs, out object [] outputs)
+               {
+                       var arr = new object [in_params.Length + out_params.Length];
+                       for (int i = 0; i < in_params.Length; i++)
+                               arr [in_params [i].Position] = inputs [i];
+
+                       var ret = od.SyncMethod.Invoke (instance, arr);
+
+                       outputs = new object [out_params.Length];
+                       for (int i = 0; i < out_params.Length; i++)
+                               outputs [i] = arr [out_params [i].Position];
+
+                       return ret;
+               }
+
+               public IAsyncResult InvokeBegin (object instance, object [] inputs, AsyncCallback callback, object state)
+               {
+                       var arr = new object [in_params.Length + out_params.Length + 2];
+                       for (int i = 0; i < in_params.Length; i++)
+                               arr [in_params [i].Position] = inputs [i];
+                       arr [arr.Length - 2] = callback;
+                       arr [arr.Length - 1] = state;
+                       return new InvokeAsyncResult (arr, (IAsyncResult) od.BeginMethod.Invoke (instance, arr));
+               }
+
+               public object InvokeEnd (object instance, out object [] outputs, IAsyncResult result)
+               {
+                       var r = (InvokeAsyncResult) result;
+                       var ret = od.EndMethod.Invoke (instance, new object [] {r.Source});
+                       var arr = r.Parameters;
+                       outputs = new object [out_params.Length];
+                       for (int i = 0; i < out_params.Length; i++)
+                               outputs [i] = arr [out_params [i].Position];
+                       return ret;
+               }
+
+               class InvokeAsyncResult : IAsyncResult
+               {
+                       public InvokeAsyncResult (object [] parameters, IAsyncResult source)
+                       {
+                               Source = source;
+                               Parameters = parameters;
+                       }
+
+                       public IAsyncResult Source;
+                       public object [] Parameters;
+
+                       public WaitHandle AsyncWaitHandle {
+                               get { return Source.AsyncWaitHandle; }
+                       }
+                       public bool CompletedSynchronously {
+                               get { return Source.CompletedSynchronously; }
+                       }
+                       public bool IsCompleted {
+                               get { return Source.IsCompleted; }
+                       }
+                       public object AsyncState {
+                               get { return Source.AsyncState; }
+                       }
+               }
+       }
+}
index 048a47bb5cfcfe4489b7f2e900b2f658381a634e..077d0f0b7a5f9a82d7c0487f55a48960ca05eacc 100644 (file)
@@ -32,8 +32,8 @@ namespace System.ServiceModel.Dispatcher
        public interface IOperationInvoker
        {
                bool IsSynchronous { get; }
-               object [] AllocateParameters ();
-               object Invoke (object instance, object [] inputs);
+               object [] AllocateInputs ();
+               object Invoke (object instance, object [] inputs, out object [] outputs);
                IAsyncResult InvokeBegin (object instance, object [] inputs, 
                        AsyncCallback callback, object state);
                object InvokeEnd (object instance, out object [] outputs, IAsyncResult result);
index 6706a4d2da652c1825285c154315950670e3c393..ddd691610335b5ecb9552b55b3523401aecf72e1 100644 (file)
@@ -31,12 +31,12 @@ namespace System.ServiceModel.Dispatcher
                        DispatchOperation operation = mrc.Operation;
                        Message req = mrc.IncomingMessage;
                        object instance = mrc.InstanceContext.GetServiceInstance(req);
-                       object [] parameters;                   
+                       object [] parameters, outParams;
                        BuildInvokeParams (mrc, out parameters);
 
                        if (operation.Invoker.IsSynchronous) {
-                               object result = operation.Invoker.Invoke (instance, parameters);
-                               HandleInvokeResult (mrc, parameters, result);
+                               object result = operation.Invoker.Invoke (instance, parameters, out outParams);
+                               HandleInvokeResult (mrc, outParams, result);
                        } else {// asynchronous
                                InvokeAsynchronous (mrc, instance, parameters);
                        }                       
@@ -112,7 +112,7 @@ namespace System.ServiceModel.Dispatcher
                        EnsureValid (operation);
 
                        if (operation.DeserializeRequest) {
-                               parameters = operation.Invoker.AllocateParameters ();
+                               parameters = operation.Invoker.AllocateInputs ();
                                operation.Formatter.DeserializeRequest (mrc.IncomingMessage, parameters);
                        } else
                                parameters = new object [] { mrc.IncomingMessage };
index 1388bb1bc527b6b385787975f30eb7fc529d2714..0f2fbd4ef3d0f0f6edbca8933f496f0592cbd586 100755 (executable)
@@ -614,6 +614,7 @@ System.ServiceModel.Dispatcher/ClientOperation.cs
 System.ServiceModel.Dispatcher/ClientRuntime.cs
 System.ServiceModel.Dispatcher/DataContractSerializerServiceBehavior.cs
 System.ServiceModel.Dispatcher/DefaultInstanceContextProvider.cs
+System.ServiceModel.Dispatcher/DefaultOperationInvoker.cs
 System.ServiceModel.Dispatcher/DispatchOperation.cs
 System.ServiceModel.Dispatcher/DispatchRuntime.cs
 System.ServiceModel.Dispatcher/EndpointAddressMessageFilter.cs
index 7d9177c3ea858ad5ed8ea824999fe658df907d63..163aec3ce84900f81585393da65c145fc32fa75e 100755 (executable)
@@ -1,3 +1,7 @@
+2009-08-11  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * ServiceHostBase.cs : use new IOperationInvoker implementation.
+
 2009-08-07  Atsushi Enomoto  <atsushi@ximian.com>
 
        * ServiceRuntimeChannel.cs : change .ctor() args.
index 95c341806d87fa25796c695e93a06ff6191cc47a..37d48cb737a846170d5048393c5ab612a125f485 100644 (file)
@@ -479,11 +479,7 @@ namespace System.ServiceModel
                        }
 
                        // Setup Invoker
-                       // FIXME: support async method
-                       if (od.SyncMethod != null)
-                               o.Invoker = new SyncMethodInvoker (od.SyncMethod);
-                       else
-                               o.Invoker = new AsyncMethodInvoker (od.BeginMethod, od.EndMethod);
+                       o.Invoker = new DefaultOperationInvoker (od);
 
                        // Setup Formater
                        o.Formatter = BaseMessagesFormatter.Create (od);
@@ -612,6 +608,7 @@ namespace System.ServiceModel
                        Close ();
                }
 
+               /*
                class SyncMethodInvoker : IOperationInvoker
                {
                        readonly MethodInfo _methodInfo;
@@ -692,5 +689,7 @@ namespace System.ServiceModel
 
                        #endregion
                }
+               */
        }
+
 }