//
// 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
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;
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"));
}
}
}