* MetaDataExporter.cs: Several fixes.
authorLluis Sanchez <lluis@novell.com>
Wed, 10 Dec 2003 16:00:34 +0000 (16:00 -0000)
committerLluis Sanchez <lluis@novell.com>
Wed, 10 Dec 2003 16:00:34 +0000 (16:00 -0000)
* SdlChannelSink.cs: Implemented.
* SdlChannelSinkProvider.cs: Implemented.

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

mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.MetadataServices/ChangeLog
mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.MetadataServices/MetaDataExporter.cs
mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.MetadataServices/SdlChannelSink.cs
mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.MetadataServices/SdlChannelSinkProvider.cs

index 5544aac3557592a54ac51da8aa612a0cb559ce04..a729be9d7fac468d782a9f032f469d2f20c1139f 100644 (file)
@@ -1,3 +1,9 @@
+2003-12-10  Lluis Sanchez Gual  <lluis@ximian.com>
+
+       * MetaDataExporter.cs: Several fixes.
+       * SdlChannelSink.cs: Implemented.
+       * SdlChannelSinkProvider.cs: Implemented.
+
 2003-12-05  Lluis Sanchez Gual  <lluis@ximian.com>
 
        * MetaData.cs: Added check of compilation results in 
index 3296bbc77ee1844e260d365d9dbdacd78af0defe..2d7dc80d29d8c4fc9300fb81fe9c5591c51aaa02 100644 (file)
@@ -29,7 +29,10 @@ namespace System.Runtime.Remoting.MetadataServices
                        if (servicetypes.Length == 0) return;
                        Type maint = servicetypes [0].ObjectType;
                        
-                       ArrayList services = FindServices (servicetypes);
+                       Hashtable dataTypes = new Hashtable (); 
+                       ArrayList services = new ArrayList ();
+                       FindTypes (servicetypes, dataTypes, services);
+                       
                        if (services.Count > 0)
                                maint = ((ServiceType) services[0]).ObjectType;
                        
@@ -49,7 +52,6 @@ namespace System.Runtime.Remoting.MetadataServices
                        tw.WriteAttributeString ("xmlns", "soap", MetaData.XmlnsNamespace, MetaData.SoapNamespace);
                        
                        int nums = 0;
-                       Hashtable dataTypes = FindDataTypes (servicetypes);
                        foreach (DictionaryEntry entry in dataTypes)
                        {
                                string ns = (string) entry.Key;
@@ -107,7 +109,6 @@ namespace System.Runtime.Remoting.MetadataServices
 
                        foreach (ServiceType st in services)
                        {
-//                             if (st.Url == null) continue;
                                WriteServiceType (tw, st);
                        }
                        tw.WriteEndElement ();
@@ -123,9 +124,14 @@ namespace System.Runtime.Remoting.MetadataServices
                        tw.WriteStartElement ("port", MetaData.WsdlNamespace);
                        tw.WriteAttributeString ("name", GetPortName (st.ObjectType));
                        tw.WriteAttributeString ("binding", "tns:" + GetBindingName (st.ObjectType));
-                       tw.WriteStartElement ("soap","address", MetaData.SoapNamespace);
-                       tw.WriteAttributeString ("location", st.Url);
-                       tw.WriteEndElement ();
+                       
+                       if (st.Url != null)
+                       {
+                               tw.WriteStartElement ("soap","address", MetaData.SoapNamespace);
+                               tw.WriteAttributeString ("location", st.Url);
+                               tw.WriteEndElement ();
+                       }
+                       
                        tw.WriteEndElement ();
                }
                
@@ -221,7 +227,7 @@ namespace System.Runtime.Remoting.MetadataServices
                        WriteTypeSuds (tw, type);
                        
                        SchemaInfo sinfo = (SchemaInfo) dataTypes [GetXmlNamespace (type,null)];
-                       if (!sinfo.SudsGenerated)
+                       if (sinfo != null && !sinfo.SudsGenerated)
                        {
                                foreach (Type dt in sinfo.Types)
                                        WriteTypeSuds (tw, dt);
@@ -530,15 +536,26 @@ namespace System.Runtime.Remoting.MetadataServices
                        return t.Name + "Binding";
                }
                
-               Hashtable FindDataTypes (ServiceType[] servicetypes)
+               void FindTypes (ServiceType[] servicetypes, Hashtable dataTypes, ArrayList services)
                {
                        Hashtable types = new Hashtable ();
+                       ArrayList mbrTypes = new ArrayList();
+                       
                        foreach (ServiceType st in servicetypes)
-                               FindDataTypes (st.ObjectType, null, types);
-                       return types;
+                               FindDataTypes (st.ObjectType, null, dataTypes, mbrTypes);
+                               
+                       foreach (Type mbrType in mbrTypes)
+                       {
+                               ServiceType stFound = null;
+                               foreach (ServiceType st in servicetypes)
+                                       if (mbrType == st.ObjectType) stFound = st;
+                                       
+                               if (stFound != null) services.Add (stFound);
+                               else services.Add (new ServiceType (mbrType));
+                       }
                }
                
-               void FindDataTypes (Type t, Type containerType, Hashtable types)
+               void FindDataTypes (Type t, Type containerType, Hashtable types, ArrayList services)
                {
                        if (IsSystemType (t))
                        {
@@ -569,20 +586,21 @@ namespace System.Runtime.Remoting.MetadataServices
                                {
                                        string fns = GetXmlNamespace (fi.FieldType, t);
                                        if (!sinfo.Imports.Contains (fns)) sinfo.Imports.Add (fns);
-                                       FindDataTypes (fi.FieldType, t, types);
+                                       FindDataTypes (fi.FieldType, t, types, services);
                                }
                        }
                        else
                        {
+                               if (services.Contains (t)) return;
+                               services.Add (t);
+                               
                                foreach (MethodInfo met in t.GetMethods (BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
                                {
                                        ParameterInfo[] pars = met.GetParameters ();
                                        foreach (ParameterInfo par in pars)
-                                               if (!par.ParameterType.IsMarshalByRef)
-                                                       FindDataTypes (par.ParameterType, t, types);
+                                               FindDataTypes (par.ParameterType, t, types, services);
                                                        
-                                       if (!met.ReturnType.IsMarshalByRef)
-                                               FindDataTypes (met.ReturnType, t, types);
+                                       FindDataTypes (met.ReturnType, t, types, services);
                                }
                        }
                }
index 6138cae26a69fc67f9ea426fd0662ba83dba4bc1..f84e2ff02f9e6ae3b1cc12fc948365bf13fb1d75 100644 (file)
@@ -11,46 +11,52 @@ using System.Runtime.Remoting.Channels;
 using System.Runtime.Remoting.Messaging;
 using System.IO;
 using System.Collections;
+using System.Text;
 
 namespace System.Runtime.Remoting.MetadataServices
 {
-        public class SdlChannelSink : IServerChannelSink, IChannelSinkBase
+       public class SdlChannelSink : IServerChannelSink, IChannelSinkBase
        {
-               [MonoTODO]
+               IServerChannelSink _next;
+               IChannelReceiver _channel;
+               
                public SdlChannelSink()
                {
                }
 
-               public IServerChannelSink NextChannelSink {
-                       [MonoTODO]
-                       get { throw new NotImplementedException(); }
+               internal SdlChannelSink (IChannelReceiver channel, IServerChannelSink next)
+               {
+                       _next = next;
+                       _channel = channel;
                }
 
-               public IDictionary Properties {
-                       [MonoTODO]
-                       get { throw new NotImplementedException(); }
+               public IServerChannelSink NextChannelSink 
+               {
+                       get { return _next; }
+               }
+
+               public IDictionary Properties 
+               {
+                       get { return null; }
                }
                
-               [MonoTODO]
                public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack,
                                                  object state,
                                                  IMessage msg,
                                                  ITransportHeaders headers,
                                                  Stream stream)
                {
-                       throw new NotImplementedException(); 
+                       throw new NotSupportedException ();     // Never called
                }
 
-               [MonoTODO]
                public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack,
                                                 object state,
                                                 IMessage msg,
                                                 ITransportHeaders headers)
                {
-                       throw new NotImplementedException(); 
+                       return null;
                }
 
-               [MonoTODO]
                public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
                                                        IMessage requestMsg,
                                                        ITransportHeaders requestHeaders,
@@ -59,12 +65,36 @@ namespace System.Runtime.Remoting.MetadataServices
                                                        out ITransportHeaders responseHeaders,
                                                        out Stream responseStream)
                {
-                       throw new NotImplementedException(); 
-               }
-
-               [MonoTODO]
-               ~SdlChannelSink()
-               {
+                       string verb = requestHeaders [CommonTransportKeys.RequestVerb] as string;
+                       string uri = (string) requestHeaders [CommonTransportKeys.RequestUri];
+                       
+                       if (verb == "GET" && uri.EndsWith ("?wsdl"))
+                       {
+                               try
+                               {
+                                       uri = uri.Substring (0, uri.Length - 5);
+                                       Type type = RemotingServices.GetServerTypeForUri (uri);
+                                       
+                                       string url = _channel.GetUrlsForUri (uri)[0];
+                                       ServiceType st = new ServiceType (type, url);
+                                       
+                                       responseStream = new MemoryStream ();
+                                       MetaData.ConvertTypesToSchemaToStream (new ServiceType[] {st}, SdlType.Wsdl, responseStream);
+                                       responseStream.Position = 0;
+                                       responseMsg = null;
+                                       responseHeaders = new TransportHeaders ();
+                                       responseHeaders [CommonTransportKeys.ContentType] = "text/xml";
+                               }
+                               catch (Exception ex)
+                               {
+                                       responseHeaders = new TransportHeaders ();
+                                       responseHeaders [CommonTransportKeys.HttpStatusCode] = "500";
+                                       responseStream = new MemoryStream (Encoding.UTF8.GetBytes (ex.ToString ()));
+                               }
+                               return ServerProcessing.Complete;
+                       }
+                       else
+                               return _next.ProcessMessage (sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
                }
        }
 }
index dab67763b9a66b1e7082a638e3edffe8b34b792f..f8a3b8329e5ba08a67c23ef429a94fcefce30d78 100644 (file)
@@ -13,34 +13,26 @@ namespace System.Runtime.Remoting.MetadataServices
 {
        public class SdlChannelSinkProvider : IServerChannelSinkProvider
        {
-               [MonoTODO]
+               IServerChannelSinkProvider _next;
+               
                public SdlChannelSinkProvider()
                {
                }
 
-               public IServerChannelSinkProvider Next {
-                       [MonoTODO]
-                       get { throw new NotImplementedException(); } 
-                       [MonoTODO]
-                       set { throw new NotImplementedException(); }
+               public IServerChannelSinkProvider Next 
+               {
+                       get { return _next; } 
+                       set { _next = value; }
                }
 
-               [MonoTODO]
                public IServerChannelSink CreateSink (IChannelReceiver channel)
                {
-                       throw new NotImplementedException();
+                       IServerChannelSink next = (_next != null) ? _next.CreateSink (channel) : null;
+                       return new SdlChannelSink (channel, next);
                }
 
-               [MonoTODO]
                public void GetChannelData (IChannelDataStore localChannelData)
                {
-                       throw new NotImplementedException();
                }
-
-               [MonoTODO]
-               ~SdlChannelSinkProvider()
-               {
-               }
-
        }
 }