Added: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsInputChannel.cs URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsInputChannel.cs?rev=709503&view=auto ============================================================================== --- activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsInputChannel.cs (added) +++ activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsInputChannel.cs Fri Oct 31 10:43:10 2008 @@ -0,0 +1,342 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.Text; +using Apache.NMS; +using ISession = Apache.NMS.ISession; + +namespace Apache.NMS.WCF +{ + /// <summary> + /// Channel for receiving messages. + /// </summary> + public class NmsInputChannel : NmsChannelBase, IInputChannel + { + #region Constructors + + /// <summary> + /// Initializes a new instance of the <see cref="NmsInputChannel"/> class. + /// </summary> + /// <param name="bufferManager">The buffer manager.</param> + /// <param name="encoderFactory">The encoder factory.</param> + /// <param name="address">The address.</param> + /// <param name="parent">The parent.</param> + /// <exception cref="T:System.ArgumentNullException"> + /// <paramref name="channelManager"/> is null.</exception> + public NmsInputChannel(BufferManager bufferManager, MessageEncoderFactory encoderFactory, EndpointAddress address, NmsChannelListener parent) + : base(bufferManager, encoderFactory, address, parent, parent.Destination, parent.DestinationType) + { + _localAddress = address; + _messages = new InputQueue<Message>(); + } + + #endregion + + //Hands the message off to other components higher up the + //channel stack that have previously called BeginReceive() + //and are waiting for messages to arrive on this channel. + internal void Dispatch(Message message) + { + _messages.EnqueueAndDispatch(message); + } + + /// <summary> + /// Gets the property. + /// </summary> + /// <typeparam name="T">The type of the property to attempt to retrieve.</typeparam> + public override T GetProperty<T>() + { + if (typeof(T) == typeof(IInputChannel)) + { + return (T)(object)this; + } + + T messageEncoderProperty = Encoder.GetProperty<T>(); + if (messageEncoderProperty != null) + { + return messageEncoderProperty; + } + + return base.GetProperty<T>(); + } + + #region IInputChannel Members + + /// <summary> + /// Returns the message received, if one is available. If a message is not available, blocks for a default interval of time. + /// </summary> + /// <returns> + /// The <see cref="T:System.ServiceModel.Channels.Message" /> received. + /// </returns> + public Message Receive() + { + return Receive(DefaultReceiveTimeout); + } + + /// <summary> + /// Returns the message received, if one is available. If a message is not available, blocks for a specified interval of time. + /// </summary> + /// <returns> + /// The <see cref="T:System.ServiceModel.Channels.Message" /> received. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the receive operation has to complete before timing out and throwing a <see cref="T:System.TimeoutException" />.</param> + /// <exception cref="T:System.TimeoutException">The specified <paramref name="timeout" /> is exceeded before the operation is completed.</exception> + /// <exception cref="T:System.ArgumentOutOfRangeException">The timeout specified is less than zero.</exception> + public Message Receive(TimeSpan timeout) + { + Message message; + if (TryReceive(timeout, out message)) + { + return message; + } + throw new TimeoutException(String.Format("Receive timed out after {0}. The time allotted to this operation may have been a portion of a longer timeout.", timeout)); + } + + /// <summary> + /// Tries to receive a message within a specified interval of time. + /// </summary> + /// <returns> + /// true if a message is received before the <paramref name="timeout" /> has been exceeded; otherwise false. + /// </returns> + /// <param name="timeout">The <see cref="T:System.IAsyncResult" /> returned by a call to one of the <see cref="System.ServiceModel.Channels.IInputChannel.BeginReceive" /> methods.</param> + /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message" /> received. </param> + /// <exception cref="T:System.TimeoutException">The specified <paramref name="timeout" /> is exceeded before the operation is completed.</exception> + /// <exception cref="T:System.ArgumentOutOfRangeException">The timeout specified is less than zero.</exception> + public bool TryReceive(TimeSpan timeout, out Message message) + { + NmsChannelHelper.ValidateTimeout(timeout); + return _messages.Dequeue(timeout, out message); + } + + /// <summary> + /// Begins an asynchronous operation to receive a message that has a state object associated with it. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous message reception. + /// </returns> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives the notification of the asynchronous operation completion.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous operation.</param> + public IAsyncResult BeginReceive(AsyncCallback callback, object state) + { + return BeginReceive(DefaultReceiveTimeout, callback, state); + } + + /// <summary> + /// Begins an asynchronous operation to receive a message that has a specified time out and state object associated with it. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous receive operation. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies the interval of time to wait for a message to become available.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives the notification of the asynchronous operation completion.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous operation.</param> + /// <exception cref="T:System.TimeoutException">The specified <paramref name="timeout" /> is exceeded before the operation is completed.</exception> + /// <exception cref="T:System.ArgumentOutOfRangeException">The timeout specified is less than zero.</exception> + public IAsyncResult BeginReceive(TimeSpan timeout, AsyncCallback callback, object state) + { + return BeginTryReceive(timeout, callback, state); + } + + /// <summary> + /// Completes an asynchronous operation to receive a message. + /// </summary> + /// <returns> + /// The <see cref="T:System.ServiceModel.Channels.Message" /> received. + /// </returns> + /// <param name="result">The <see cref="T:System.IAsyncResult" /> returned by a call to one of the <see cref="System.ServiceModel.Channels.IInputChannel.BeginReceive" /> methods.</param> + public Message EndReceive(IAsyncResult result) + { + return _messages.EndDequeue(result); + } + + /// <summary> + /// Begins an asynchronous operation to receive a message that has a specified time out and state object associated with it. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous receive operation. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies the interval of time to wait for a message to become available.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives the notification of the asynchronous operation completion.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous operation.</param> + /// <exception cref="T:System.TimeoutException">The specified <paramref name="timeout" /> is exceeded before the operation is completed.</exception> + /// <exception cref="T:System.ArgumentOutOfRangeException">The timeout specified is less than zero.</exception> + public IAsyncResult BeginTryReceive(TimeSpan timeout, AsyncCallback callback, object state) + { + NmsChannelHelper.ValidateTimeout(timeout); + return _messages.BeginDequeue(timeout, callback, state); + } + + /// <summary> + /// Completes the specified asynchronous operation to receive a message. + /// </summary> + /// <returns> + /// true if a message is received before the specified interval of time elapses; otherwise false. + /// </returns> + /// <param name="result">The <see cref="T:System.IAsyncResult" /> returned by a call to the <see cref="M:System.ServiceModel.Channels.IInputChannel.BeginTryReceive(System.TimeSpan,System.AsyncCallback,System.Object)" /> method.</param> + /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message" /> received. </param> + public bool EndTryReceive(IAsyncResult result, out Message message) + { + return _messages.EndDequeue(result, out message); + } + + /// <summary> + /// Returns a value that indicates whether a message has arrived within a specified interval of time. + /// </summary> + /// <returns> + /// true if a message has arrived before the <paramref name="timeout" /> has been exceeded; otherwise false. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> specifies the maximum interval of time to wait for a message to arrive before timing out.</param> + /// <exception cref="T:System.TimeoutException">The specified <paramref name="timeout" /> is exceeded before the operation is completed.</exception> + /// <exception cref="T:System.ArgumentOutOfRangeException">The timeout specified is less than zero.</exception> + public bool WaitForMessage(TimeSpan timeout) + { + NmsChannelHelper.ValidateTimeout(timeout); + return _messages.WaitForItem(timeout); + } + + /// <summary> + /// Begins an asynchronous wait-for-a-message-to-arrive operation that has a specified time out and state object associated with it. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous operation to wait for a message to arrive. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies the interval of time to wait for a message to become available.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives the notification of the asynchronous operation completion.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous operation.</param> + /// <exception cref="T:System.TimeoutException">The specified <paramref name="timeout" /> is exceeded before the operation is completed.</exception> + /// <exception cref="T:System.ArgumentOutOfRangeException">The timeout specified is less than zero.</exception> + public IAsyncResult BeginWaitForMessage(TimeSpan timeout, AsyncCallback callback, object state) + { + NmsChannelHelper.ValidateTimeout(timeout); + return _messages.BeginWaitForItem(timeout, callback, state); + } + + /// <summary> + /// Completes the specified asynchronous wait-for-a-message operation. + /// </summary> + /// <returns> + /// true if a message has arrived before the timeout has been exceeded; otherwise false. + /// </returns> + /// <param name="result">The <see cref="T:System.IAsyncResult" /> that identifies the <see cref="M:System.ServiceModel.Channels.IInputChannel.BeginWaitForMessage(System.TimeSpan,System.AsyncCallback,System.Object)" /> operation to finish, and from which to retrieve an end result.</param> + public bool EndWaitForMessage(IAsyncResult result) + { + return _messages.EndWaitForItem(result); + } + + /// <summary> + /// Gets the address on which the input channel receives messages. + /// </summary> + /// <returns> + /// The <see cref="T:System.ServiceModel.EndpointAddress" /> on which the input channel receives messages. + /// </returns> + public EndpointAddress LocalAddress + { + get { return _localAddress; } + } + + #endregion + + /// <summary> + /// Inserts processing on a communication object after it transitions to the closing state due to the invocation of a synchronous abort operation. + /// </summary> + protected override void OnAbort() + { + OnClose(TimeSpan.Zero); + } + + /// <summary> + /// Inserts processing on a communication object after it transitions to the closing state due to the invocation of a synchronous close operation. + /// </summary> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on close operation has to complete before timing out.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + protected override void OnClose(TimeSpan timeout) + { + NmsChannelHelper.ValidateTimeout(timeout); + _messages.Close(); + } + + /// <summary> + /// Completes an asynchronous operation on the close of a communication object. + /// </summary> + /// <param name="result">The <see cref="T:System.IAsyncResult" /> that is returned by a call to the <see cref="M:System.ServiceModel.Channels.CommunicationObject.OnEndClose(System.IAsyncResult)" /> method.</param> + protected override void OnEndClose(IAsyncResult result) + { + CompletedAsyncResult.End(result); + } + + /// <summary> + /// Inserts processing after a communication object transitions to the closing state due to the invocation of an asynchronous close operation. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous on close operation. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on close operation has to complete before timing out.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives notification of the completion of the asynchronous on close operation.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous on close operation.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) + { + OnClose(timeout); + return new CompletedAsyncResult(callback, state); + } + + /// <summary> + /// Inserts processing on a communication object after it transitions into the opening state which must complete within a specified interval of time. + /// </summary> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on open operation has to complete before timing out.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + /// <exception cref="T:System.TimeoutException">The interval of time specified by <paramref name="timeout" /> that was allotted for the operation was exceeded before the operation was completed.</exception> + protected override void OnOpen(TimeSpan timeout) + { + } + + /// <summary> + /// Inserts processing on a communication object after it transitions to the opening state due to the invocation of an asynchronous open operation. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous on open operation. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on open operation has to complete before timing out.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives notification of the completion of the asynchronous on open operation.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous on open operation.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state) + { + return new CompletedAsyncResult(callback, state); + } + + /// <summary> + /// Completes an asynchronous operation on the open of a communication object. + /// </summary> + /// <param name="result">The <see cref="T:System.IAsyncResult" /> that is returned by a call to the <see cref="M:System.ServiceModel.Channels.CommunicationObject.OnEndOpen(System.IAsyncResult)" /> method.</param> + /// <exception cref="T:System.TimeoutException">The interval of time specified by the timeout that was allotted for the operation was exceeded before the operation was completed.</exception> + protected override void OnEndOpen(IAsyncResult result) + { + CompletedAsyncResult.End(result); + } + + #region Private members + + private readonly InputQueue<Message> _messages; + private EndpointAddress _localAddress; + + #endregion + } +} \ No newline at end of file
Added: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsOutputChannel.cs URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsOutputChannel.cs?rev=709503&view=auto ============================================================================== --- activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsOutputChannel.cs (added) +++ activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/csharp/NmsOutputChannel.cs Fri Oct 31 10:43:10 2008 @@ -0,0 +1,316 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.Text; +using System.Xml; +using Apache.NMS; + +namespace Apache.NMS.WCF +{ + /// <summary> + /// Channel for sending messages. + /// </summary> + public class NmsOutputChannel : NmsChannelBase, IOutputChannel + { + #region Constructors + + /// <summary> + /// Initializes a new instance of the <see cref="NmsOutputChannel"/> class. + /// </summary> + /// <param name="bufferManager">The buffer manager.</param> + /// <param name="encoderFactory">The encoder factory.</param> + /// <param name="address">The address.</param> + /// <param name="parent">The parent.</param> + /// <param name="via">The via.</param> + public NmsOutputChannel(BufferManager bufferManager, MessageEncoderFactory encoderFactory, EndpointAddress address, NmsChannelFactory parent, Uri via) + : base(bufferManager, encoderFactory, address, parent, parent.Destination, parent.DestinationType) + { + _via = via; + _connection = ConnectionFactoryManager.GetInstance().CreateConnection(via); + _connection.Start(); + } + + #endregion + + #region Implementation of IOutputChannel + + /// <summary> + /// Transmits a message to the destination of the output channel. + /// </summary> + /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message" /> being sent on the output channel.</param> + public void Send(Message message) + { + Send(message, DefaultSendTimeout); + } + + /// <summary> + /// Sends a message on the current output channel within a specified interval of time. + /// </summary> + /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message" /> being sent on the output channel.</param> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the send operation has to complete before timing out.</param> + public void Send(Message message, TimeSpan timeout) + { + ThrowIfDisposedOrNotOpen(); + + using (NMS.ISession session = _connection.CreateSession()) + { + IDestination destination = NmsChannelHelper.GetDestination(session, Destination, DestinationType); + using (IMessageProducer producer = session.CreateProducer(destination)) + { + producer.Persistent = true; + message.Headers.To = RemoteAddress.Uri; + //TODO: check if this is synonymous with the above operation + //RemoteAddress.ApplyTo(message); + + ITextMessage request = session.CreateTextMessage(TranslateMessage(message)); + producer.Send(request); + producer.Close(); + + Console.WriteLine("Sending message:"); + Console.WriteLine(request.Text); + } + } + } + + /// <summary> + /// Translates the message using the appropriate SOAP versioning scheme. + /// </summary> + /// <param name="message">The message to be translated.</param> + private string TranslateMessage(Message message) + { + return (Encoder.MessageVersion == MessageVersion.Soap11) + ? TranslateMessageAsSoap11(message) + : TranslateMessageAsSoap12(message); + } + + /// <summary> + /// Translates the message using the SOAP 1.1 schema. + /// </summary> + /// <param name="message">The message to be translated.</param> + private static string TranslateMessageAsSoap11(Message message) + { + StringBuilder sb = new StringBuilder(); + XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(XmlWriter.Create(sb)); + message.WriteStartEnvelope(writer); + message.WriteBody(writer); + writer.Flush(); + + string raw = sb.ToString(); + //to get past the damn utf 16 header + raw = raw.Substring(raw.LastIndexOf("?>") + 2).Trim(); + + //well there is no WriteEndEnvelope(writer) method:-) + return raw + "</s:Envelope>"; + } + + /// <summary> + /// Translates the message using the SOAP 1.2 schema. + /// </summary> + /// <param name="message">The message to be translated.</param> + private static string TranslateMessageAsSoap12(Message message) + { + string raw = message.ToString(); + raw = raw.Substring(raw.LastIndexOf("?>") + 1).Trim(); + return raw; + } + + /// <summary> + /// Begins an asynchronous operation to transmit a message to the destination of the output channel. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous message transmission. + /// </returns> + /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message" /> being sent on the output channel. </param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate. </param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous send operation.</param> + public IAsyncResult BeginSend(Message message, AsyncCallback callback, object state) + { + return BeginSend(message, DefaultSendTimeout, callback, state); + } + + /// <summary> + /// Begins an asynchronous operation to transmit a message to the destination of the output channel within a specified interval of time. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous send operation. + /// </returns> + /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message" /> being sent on the output channel.</param> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the send operation has to complete before timing out.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives the notification of the asynchronous operation send completion.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous send operation.</param> + public IAsyncResult BeginSend(Message message, TimeSpan timeout, AsyncCallback callback, object state) + { + ThrowIfDisposedOrNotOpen(); + return new NmsAsyncResult(this, message, callback, state); + } + + /// <summary> + /// Completes an asynchronous operation to transmit a message to the destination of the output channel. + /// </summary> + /// <param name="result">The <see cref="T:System.IAsyncResult"/> returned by a call to the <see cref="System.ServiceModel.Channels.IOutputChannel.BeginSend"/> method.</param> + public void EndSend(IAsyncResult result) + { + NmsAsyncResult.End(result); + } + + /// <summary> + /// Gets the URI that contains the transport address to which messages are sent on the output channel. + /// </summary> + /// <returns> + /// The <see cref="T:System.Uri" /> that contains the transport address to which messages are sent on the output channel. + /// </returns> + public Uri Via + { + get { return _via; } + } + + #endregion + + #region Implementation of CommunicationObject + + /// <summary> + /// Gets the property. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public override T GetProperty<T>() + { + if (typeof(T) == typeof(IOutputChannel)) + { + return (T)(object)this; + } + + T messageEncoderProperty = Encoder.GetProperty<T>(); + if (messageEncoderProperty != null) + { + return messageEncoderProperty; + } + + return base.GetProperty<T>(); + } + + /// <summary> + /// Inserts processing on a communication object after it transitions to the closing state due to the invocation of a synchronous abort operation. + /// </summary> + protected override void OnAbort() + { + OnClose(TimeSpan.Zero); + } + + /// <summary> + /// Inserts processing on a communication object after it transitions to the closing state due to the invocation of a synchronous close operation. + /// </summary> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on close operation has to complete before timing out.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + protected override void OnClose(TimeSpan timeout) + { + if (_connection != null) + { + _connection.Close(); + _connection.Dispose(); + } + } + + /// <summary> + /// Completes an asynchronous operation on the close of a communication object. + /// </summary> + /// <param name="result">The <see cref="T:System.IAsyncResult" /> that is returned by a call to the <see cref="M:System.ServiceModel.Channels.CommunicationObject.OnEndClose(System.IAsyncResult)" /> method.</param> + protected override void OnEndClose(IAsyncResult result) + { + CompletedAsyncResult.End(result); + } + + /// <summary> + /// Inserts processing after a communication object transitions to the closing state due to the invocation of an asynchronous close operation. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous on close operation. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on close operation has to complete before timing out.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives notification of the completion of the asynchronous on close operation.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous on close operation.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) + { + OnClose(timeout); + return new CompletedAsyncResult(callback, state); + } + + /// <summary> + /// Inserts processing on a communication object after it transitions into the opening state which must complete within a specified interval of time. + /// </summary> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on open operation has to complete before timing out.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + /// <exception cref="T:System.TimeoutException">The interval of time specified by <paramref name="timeout" /> that was allotted for the operation was exceeded before the operation was completed.</exception> + protected override void OnOpen(TimeSpan timeout) + { + } + + /// <summary> + /// Inserts processing on a communication object after it transitions to the opening state due to the invocation of an asynchronous open operation. + /// </summary> + /// <returns> + /// The <see cref="T:System.IAsyncResult" /> that references the asynchronous on open operation. + /// </returns> + /// <param name="timeout">The <see cref="T:System.TimeSpan" /> that specifies how long the on open operation has to complete before timing out.</param> + /// <param name="callback">The <see cref="T:System.AsyncCallback" /> delegate that receives notification of the completion of the asynchronous on open operation.</param> + /// <param name="state">An object, specified by the application, that contains state information associated with the asynchronous on open operation.</param> + /// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="timeout" /> is less than zero.</exception> + protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state) + { + return new CompletedAsyncResult(callback, state); + } + + /// <summary> + /// Completes an asynchronous operation on the open of a communication object. + /// </summary> + /// <param name="result">The <see cref="T:System.IAsyncResult" /> that is returned by a call to the <see cref="M:System.ServiceModel.Channels.CommunicationObject.OnEndOpen(System.IAsyncResult)" /> method.</param> + protected override void OnEndOpen(IAsyncResult result) + { + CompletedAsyncResult.End(result); + } + + #endregion + + /// <summary> + /// Encodes the message. + /// </summary> + /// <param name="message">The message.</param> + public ArraySegment<byte> EncodeMessage(Message message) + { + try + { + return Encoder.WriteMessage(message, Int32.MaxValue, BufferManager); + } + finally + { + // The message is consumed by serialising it, so clean up here. + message.Close(); + } + } + + #region Private members + + private readonly Uri _via; + private readonly IConnection _connection; + + #endregion + } +} \ No newline at end of file Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/ndoc/ ------------------------------------------------------------------------------ bugtraq:label = Issue#: Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/ndoc/ ------------------------------------------------------------------------------ --- bugtraq:message (added) +++ bugtraq:message Fri Oct 31 10:43:10 2008 @@ -0,0 +1 @@ +Fixes [AMQNET-%BUGID%]. (See https://issues.apache.org/activemq/browse/AMQNET-%BUGID%) Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/ndoc/ ------------------------------------------------------------------------------ bugtraq:url = https://issues.apache.org/activemq/browse/AMQNET-%BUGID% Added: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/ndoc/NamespaceSummary.xml URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/ndoc/NamespaceSummary.xml?rev=709503&view=auto ============================================================================== --- activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/ndoc/NamespaceSummary.xml (added) +++ activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/main/ndoc/NamespaceSummary.xml Fri Oct 31 10:43:10 2008 @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<namespaces> + <namespace name="Apache.NMS.ActiveMQ.WCF"> + The <b>Apache.NMS.ActiveMQ.WCF</b> namespace implements a Windows Communications Foundation transport for ActiveMQ. + </namespace> +</namespaces> Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/ ------------------------------------------------------------------------------ bugtraq:label = Issue#: Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/ ------------------------------------------------------------------------------ --- bugtraq:message (added) +++ bugtraq:message Fri Oct 31 10:43:10 2008 @@ -0,0 +1 @@ +Fixes [AMQNET-%BUGID%]. (See https://issues.apache.org/activemq/browse/AMQNET-%BUGID%) Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/ ------------------------------------------------------------------------------ bugtraq:url = https://issues.apache.org/activemq/browse/AMQNET-%BUGID% Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/csharp/ ------------------------------------------------------------------------------ bugtraq:label = Issue#: Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/csharp/ ------------------------------------------------------------------------------ --- bugtraq:message (added) +++ bugtraq:message Fri Oct 31 10:43:10 2008 @@ -0,0 +1 @@ +Fixes [AMQNET-%BUGID%]. (See https://issues.apache.org/activemq/browse/AMQNET-%BUGID%) Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/csharp/ ------------------------------------------------------------------------------ bugtraq:url = https://issues.apache.org/activemq/browse/AMQNET-%BUGID% Added: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/csharp/CommonAssemblyInfo.cs URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/csharp/CommonAssemblyInfo.cs?rev=709503&view=auto ============================================================================== --- activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/csharp/CommonAssemblyInfo.cs (added) +++ activemq/activemq-dotnet/Apache.NMS.WCF/trunk/src/test/csharp/CommonAssemblyInfo.cs Fri Oct 31 10:43:10 2008 @@ -0,0 +1,28 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:2.0.50727.3053 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +[assembly: ComVisibleAttribute(false)] +[assembly: CLSCompliantAttribute(true)] +[assembly: AssemblyTitleAttribute("WCF Provider for ActiveMQ Class Library")] +[assembly: AssemblyDescriptionAttribute("WCF Provider for ActiveMQ Class Library (.Net Messaging Library Implementation): " + + "An implementation of Windows Communications Framework API for ActiveMQ")] +[assembly: AssemblyConfigurationAttribute("SNAPSHOT")] +[assembly: AssemblyCompanyAttribute("http://activemq.apache.org/nms")] +[assembly: AssemblyProductAttribute("WCF Provider for ActiveMQ Class Library")] +[assembly: AssemblyCopyrightAttribute("Copyright (C) 2005-2008 Apache Software Foundation")] +[assembly: AssemblyTrademarkAttribute("")] +[assembly: AssemblyCultureAttribute("")] +[assembly: AssemblyVersionAttribute("1.1.0")] +[assembly: AssemblyInformationalVersionAttribute("1.1.0")] + Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vendor/ ------------------------------------------------------------------------------ bugtraq:label = Issue#: Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vendor/ ------------------------------------------------------------------------------ --- bugtraq:message (added) +++ bugtraq:message Fri Oct 31 10:43:10 2008 @@ -0,0 +1 @@ +Fixes [AMQNET-%BUGID%]. (See https://issues.apache.org/activemq/browse/AMQNET-%BUGID%) Propchange: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vendor/ ------------------------------------------------------------------------------ bugtraq:url = https://issues.apache.org/activemq/browse/AMQNET-%BUGID% Added: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.csproj URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.csproj?rev=709503&view=auto ============================================================================== --- activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.csproj (added) +++ activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.csproj Fri Oct 31 10:43:10 2008 @@ -0,0 +1,134 @@ +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>9.0.30729</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{96BAB638-2ECF-4648-8553-8FE6B9A4816F}</ProjectGuid> + <OutputType>Library</OutputType> + <RootNamespace>Apache.NMS.WCF</RootNamespace> + <AssemblyName>Apache.NMS.WCF</AssemblyName> + <WarningLevel>4</WarningLevel> + <SignAssembly>false</SignAssembly> + <AssemblyOriginatorKeyFile> + </AssemblyOriginatorKeyFile> + <FileUpgradeFlags> + </FileUpgradeFlags> + <OldToolsVersion>2.0</OldToolsVersion> + <UpgradeBackupLocation> + </UpgradeBackupLocation> + <PublishUrl>publish\</PublishUrl> + <Install>true</Install> + <InstallFrom>Disk</InstallFrom> + <UpdateEnabled>false</UpdateEnabled> + <UpdateMode>Foreground</UpdateMode> + <UpdateInterval>7</UpdateInterval> + <UpdateIntervalUnits>Days</UpdateIntervalUnits> + <UpdatePeriodically>false</UpdatePeriodically> + <UpdateRequired>false</UpdateRequired> + <MapFileExtensions>true</MapFileExtensions> + <ApplicationRevision>0</ApplicationRevision> + <ApplicationVersion>1.0.0.%2a</ApplicationVersion> + <IsWebBootstrapper>false</IsWebBootstrapper> + <UseApplicationTrust>false</UseApplicationTrust> + <BootstrapperEnabled>true</BootstrapperEnabled> + <SccProjectName>Svn</SccProjectName> + <SccLocalPath>Svn</SccLocalPath> + <SccAuxPath>Svn</SccAuxPath> + <SccProvider>SubversionScc</SccProvider> + <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> + <TargetFrameworkSubset> + </TargetFrameworkSubset> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>build\net-3.5\debug\</OutputPath> + <DefineConstants>TRACE;DEBUG;NET,NET_2_0,NET_3_5</DefineConstants> + <AllowUnsafeBlocks>false</AllowUnsafeBlocks> + <DocumentationFile>build\net-3.5\debug\Apache.NMS.WCF.xml</DocumentationFile> + <NoWarn>0419</NoWarn> + <TreatWarningsAsErrors>true</TreatWarningsAsErrors> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <Optimize>true</Optimize> + <OutputPath>build\net-3.5\release\</OutputPath> + <DefineConstants>TRACE;NET,NET_2_0,NET_3_5</DefineConstants> + <AllowUnsafeBlocks>false</AllowUnsafeBlocks> + <DebugType>full</DebugType> + <DocumentationFile>build\net-3.5\release\Apache.NMS.WCF.xml</DocumentationFile> + <TreatWarningsAsErrors>true</TreatWarningsAsErrors> + <NoWarn>0419</NoWarn> + </PropertyGroup> + <ItemGroup> + <Reference Include="Apache.NMS, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>vendor\Apache.NMS\net-3.5\Apache.NMS.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.configuration" /> + <Reference Include="System.Runtime.Serialization"> + <RequiredTargetFramework>3.0</RequiredTargetFramework> + </Reference> + <Reference Include="System.ServiceModel"> + <RequiredTargetFramework>3.0</RequiredTargetFramework> + </Reference> + <Reference Include="System.Web.Services" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Content Include="LICENSE.txt"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Include="nant-common.xml" /> + <Content Include="NOTICE.txt"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Include="README.txt" /> + </ItemGroup> + <ItemGroup> + <BootstrapperPackage Include="Microsoft.Net.Framework.2.0"> + <Visible>False</Visible> + <ProductName>.NET Framework 2.0 %28x86%29</ProductName> + <Install>true</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Net.Framework.3.0"> + <Visible>False</Visible> + <ProductName>.NET Framework 3.0 %28x86%29</ProductName> + <Install>false</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Net.Framework.3.5"> + <Visible>False</Visible> + <ProductName>.NET Framework 3.5</ProductName> + <Install>false</Install> + </BootstrapperPackage> + </ItemGroup> + <ItemGroup> + <Compile Include="src\main\csharp\AsyncResult.cs" /> + <Compile Include="src\main\csharp\CommonAssemblyInfo.cs" /> + <Compile Include="src\main\csharp\Configuration\AddressingVersions.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsBinding.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsBindingCollection.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsBindingElement.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsConfigurationDefaults.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsConfigurationStrings.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsConstants.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsTransportBindingElement.cs" /> + <Compile Include="src\main\csharp\Configuration\NmsTransportElement.cs" /> + <Compile Include="src\main\csharp\ConnectionFactoryManager.cs" /> + <Compile Include="src\main\csharp\InputQueue.cs" /> + <Compile Include="src\main\csharp\NmsAsyncResult.cs" /> + <Compile Include="src\main\csharp\NmsChannelBase.cs" /> + <Compile Include="src\main\csharp\NmsChannelFactory.cs" /> + <Compile Include="src\main\csharp\NmsChannelHelper.cs" /> + <Compile Include="src\main\csharp\NmsChannelListener.cs" /> + <Compile Include="src\main\csharp\NmsInputChannel.cs" /> + <Compile Include="src\main\csharp\NmsOutputChannel.cs" /> + </ItemGroup> + <ItemGroup> + <None Include="nant.build" /> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" /> +</Project> \ No newline at end of file Added: activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.sln URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.sln?rev=709503&view=auto ============================================================================== --- activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.sln (added) +++ activemq/activemq-dotnet/Apache.NMS.WCF/trunk/vs2008-nms-wcf.sln Fri Oct 31 10:43:10 2008 @@ -0,0 +1,24 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vs2008-nms-wcf", "vs2008-nms-wcf.csproj", "{96BAB638-2ECF-4648-8553-8FE6B9A4816F}" +EndProject +Global + GlobalSection(SubversionScc) = preSolution + Svn-Managed = True + Manager = AnkhSVN - Subversion Support for Visual Studio + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {96BAB638-2ECF-4648-8553-8FE6B9A4816F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96BAB638-2ECF-4648-8553-8FE6B9A4816F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96BAB638-2ECF-4648-8553-8FE6B9A4816F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96BAB638-2ECF-4648-8553-8FE6B9A4816F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal
