Merge pull request #1874 from saper/bug_29679
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / ConnectionOrientedTransportBindingElement.cs
index cfded02c54dfec3052e5e02ad9c338d1e5bb6b15..4a22c093813b6bed844487fc386ae53b40257042 100644 (file)
@@ -1,10 +1,12 @@
 //
 // ConnectionOrientedTransportBindingElement.cs
 //
-// Author:
+// Authors:
 //     Atsushi Enomoto <atsushi@ximian.com>
+//     Martin Baulig <martin.baulig@xamarin.com>
 //
 // Copyright (C) 2005 Novell, Inc.  http://www.novell.com
+// Copyright (c) 2012 Xamarin Inc. (http://www.xamarin.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -30,12 +32,14 @@ using System.Collections.Generic;
 using System.Net;
 using System.ServiceModel.Channels;
 using System.ServiceModel.Description;
+using System.Xml;
+using WS = System.Web.Services.Description;
 
 namespace System.ServiceModel.Channels
 {
        [MonoTODO]
        public abstract class ConnectionOrientedTransportBindingElement
-               : TransportBindingElement
+               : TransportBindingElement, IPolicyExportExtension, IWsdlExportExtension
        {
                int connection_buf_size = 0x2000, max_buf_size = 0x10000,
                        max_pending_conn = 10, max_pending_accepts = 1;
@@ -101,18 +105,92 @@ namespace System.ServiceModel.Channels
                        set { transfer_mode = value; }
                }
                
-               [MonoTODO]
                public override bool CanBuildChannelFactory<TChannel> (
                        BindingContext context)
                {
-                       return typeof (TChannel) == typeof (IDuplexSessionChannel);
+                       switch (TransferMode) {
+                       case TransferMode.Buffered:
+                       case TransferMode.StreamedResponse:
+                               return typeof (TChannel) == typeof (IDuplexSessionChannel);
+                       case TransferMode.Streamed:
+                       case TransferMode.StreamedRequest:
+                               return typeof (TChannel) == typeof (IRequestChannel);
+                       }
+                       return false;
                }
 
-               [MonoTODO]
                public override bool CanBuildChannelListener<TChannel> (
                        BindingContext context)
                {
-                       return typeof (TChannel) == typeof (IDuplexSessionChannel);
+                       switch (TransferMode) {
+                       case TransferMode.Buffered:
+                       case TransferMode.StreamedRequest:
+                               return typeof (TChannel) == typeof (IDuplexSessionChannel);
+                       case TransferMode.Streamed:
+                       case TransferMode.StreamedResponse:
+                               return typeof (TChannel) == typeof (IReplyChannel);
+                       }
+                       return false;
+               }
+
+               public override T GetProperty<T> (BindingContext context)
+               {
+                       // since this class cannot be derived (internal .ctor
+                       // only), we cannot examine what this should do.
+                       // So, handle all properties in the derived types.
+                       return base.GetProperty<T> (context);
+               }
+
+               void IWsdlExportExtension.ExportContract (WsdlExporter exporter,
+                                                         WsdlContractConversionContext context)
+               {
+                       ;
+               }
+               
+               void IWsdlExportExtension.ExportEndpoint (WsdlExporter exporter,
+                                                         WsdlEndpointConversionContext context)
+               {
+                       var soap_binding = new WS.Soap12Binding ();
+                       soap_binding.Transport = "http://schemas.microsoft.com/soap/tcp";
+                       soap_binding.Style = WS.SoapBindingStyle.Document;
+                       context.WsdlBinding.Extensions.Add (soap_binding);
+
+                       var address = context.Endpoint.Address;
+                       var uri = address.Uri.AbsoluteUri;
+
+                       var soap_address = new WS.Soap12AddressBinding ();
+                       soap_address.Location = uri;
+                       context.WsdlPort.Extensions.Add (soap_address);
+
+                       var doc = new XmlDocument ();
+                       var endpoint_ref = doc.CreateElement (
+                               "EndpointReference", AddressingVersion.WSAddressing10.Namespace);
+                       var endpoint_addr = doc.CreateElement (
+                               "Address", AddressingVersion.WSAddressing10.Namespace);
+                       endpoint_addr.InnerText = uri;
+                       endpoint_ref.AppendChild (endpoint_addr);
+                       context.WsdlPort.Extensions.Add (endpoint_ref);
+               }
+
+               void IPolicyExportExtension.ExportPolicy (MetadataExporter exporter, PolicyConversionContext context)
+               {
+                       if (exporter == null)
+                               throw new ArgumentNullException ("exporter");
+                       if (context == null)
+                               throw new ArgumentNullException ("context");
+
+                       PolicyAssertionCollection assertions = context.GetBindingAssertions ();
+                       XmlDocument doc = new XmlDocument ();
+
+                       var messageEncodingElement = ExportAddressingPolicy (context);
+                       if (messageEncodingElement == null)
+                               assertions.Add (doc.CreateElement (
+                                       "msb", "BinaryEncoding",
+                                       "http://schemas.microsoft.com/ws/06/2004/mspolicy/netbinary1"));
+
+                       if (transfer_mode == TransferMode.Streamed || transfer_mode == TransferMode.StreamedRequest ||
+                               transfer_mode == TransferMode.StreamedResponse)
+                               assertions.Add (doc.CreateElement ("msf", "Streamed", "http://schemas.microsoft.com/ws/2006/05/framing/policy"));
                }
        }
 }