Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / MessageBuffer.cs / 1 / MessageBuffer.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System.Xml; using System.ServiceModel; using System.ServiceModel.Dispatcher; using System.Xml.XPath; using System.Diagnostics; using System.IO; using System.Collections.Generic; public abstract class MessageBuffer : IXPathNavigable, IDisposable { public abstract int BufferSize { get; } void IDisposable.Dispose() { Close(); } public abstract void Close(); public virtual void WriteMessage(Stream stream) { if (stream == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("stream")); Message message = CreateMessage(); using (message) { XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(stream, XD.Dictionary, null, false); using (writer) { message.WriteMessage(writer); } } } public virtual string MessageContentType { get { return FramingEncodingString.Binary; } } public abstract Message CreateMessage(); internal Exception CreateBufferDisposedException() { return new ObjectDisposedException("", SR.GetString(SR.MessageBufferIsClosed)); } public XPathNavigator CreateNavigator() { return CreateNavigator(int.MaxValue, XmlSpace.None); } public XPathNavigator CreateNavigator(int nodeQuota) { return CreateNavigator(nodeQuota, XmlSpace.None); } public XPathNavigator CreateNavigator(XmlSpace space) { return CreateNavigator(int.MaxValue, space); } public XPathNavigator CreateNavigator(int nodeQuota, XmlSpace space) { if (nodeQuota <= 0) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("nodeQuota", SR.GetString(SR.FilterQuotaRange))); return new SeekableMessageNavigator(this.CreateMessage(), nodeQuota, space, true, true); } } class DefaultMessageBuffer : MessageBuffer { XmlBuffer msgBuffer; KeyValuePair[] properties; bool[] understoodHeaders; bool closed; MessageVersion version; public DefaultMessageBuffer(Message message, XmlBuffer msgBuffer) { this.msgBuffer = msgBuffer; this.version = message.Version; properties = new KeyValuePair [message.Properties.Count]; ((ICollection >)message.Properties).CopyTo(properties, 0); understoodHeaders = new bool[message.Headers.Count]; for (int i = 0; i < understoodHeaders.Length; ++i) understoodHeaders[i] = message.Headers.IsUnderstood(i); } object ThisLock { get { return msgBuffer; } } public override int BufferSize { get { return msgBuffer.BufferSize; } } public override void Close() { lock (ThisLock) { if (closed) return; closed = true; for (int i = 0; i < this.properties.Length; i++) { IDisposable disposable = this.properties[i].Value as IDisposable; if (disposable != null) disposable.Dispose(); } } } public override Message CreateMessage() { if (closed) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateBufferDisposedException()); Message msg = Message.CreateMessage(msgBuffer.GetReader(0), int.MaxValue, this.version); lock (ThisLock) { msg.Properties.CopyProperties(properties); } for (int i = 0; i < understoodHeaders.Length; ++i) { if (understoodHeaders[i]) msg.Headers.AddUnderstood(i); } return msg; } } class BufferedMessageBuffer : MessageBuffer { IBufferedMessageData messageData; KeyValuePair [] properties; bool closed; object thisLock = new object(); bool[] understoodHeaders; public BufferedMessageBuffer(IBufferedMessageData messageData, KeyValuePair [] properties, bool[] understoodHeaders) { this.messageData = messageData; this.properties = properties; this.understoodHeaders = understoodHeaders; messageData.Open(); } public override int BufferSize { get { lock (ThisLock) { if (closed) #pragma warning suppress 56503 // [....], Invalid State after dispose throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateBufferDisposedException()); return messageData.Buffer.Count; } } } public override void WriteMessage(Stream stream) { if (stream == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("stream")); lock (ThisLock) { if (closed) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateBufferDisposedException()); ArraySegment buffer = messageData.Buffer; stream.Write(buffer.Array, buffer.Offset, buffer.Count); } } public override string MessageContentType { get { lock (ThisLock) { if (closed) #pragma warning suppress 56503 // [....], Invalid State after dispose throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateBufferDisposedException()); return messageData.MessageEncoder.ContentType; } } } object ThisLock { get { return thisLock; } } public override void Close() { lock (ThisLock) { if (!closed) { closed = true; messageData.Close(); messageData = null; } } } public override Message CreateMessage() { lock (ThisLock) { if (closed) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateBufferDisposedException()); RecycledMessageState recycledMessageState = messageData.TakeMessageState(); if (recycledMessageState == null) recycledMessageState = new RecycledMessageState(); BufferedMessage bufferedMessage = new BufferedMessage(messageData, recycledMessageState, this.understoodHeaders); bufferedMessage.Properties.CopyProperties(this.properties); messageData.Open(); return bufferedMessage; } } } class BodyWriterMessageBuffer : MessageBuffer { BodyWriter bodyWriter; KeyValuePair [] properties; MessageHeaders headers; bool closed; object thisLock = new object(); public BodyWriterMessageBuffer(MessageHeaders headers, KeyValuePair [] properties, BodyWriter bodyWriter) { this.bodyWriter = bodyWriter; this.headers = new MessageHeaders(headers); this.properties = properties; } protected object ThisLock { get { return thisLock; } } public override int BufferSize { get { return 0; } } public override void Close() { lock (ThisLock) { if (!closed) { closed = true; bodyWriter = null; headers = null; properties = null; } } } public override Message CreateMessage() { lock (ThisLock) { if (closed) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateBufferDisposedException()); return new BodyWriterMessage(headers, properties, bodyWriter); } } protected BodyWriter BodyWriter { get { return bodyWriter; } } protected MessageHeaders Headers { get { return headers; } } protected KeyValuePair [] Properties { get { return properties; } } protected bool Closed { get { return closed; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DecimalAnimationUsingKeyFrames.cs
- QueryAsyncResult.cs
- DecoderFallbackWithFailureFlag.cs
- TogglePatternIdentifiers.cs
- TickBar.cs
- LinqDataSourceContextEventArgs.cs
- ProviderConnectionPointCollection.cs
- Misc.cs
- SecureEnvironment.cs
- DataControlPagerLinkButton.cs
- DataProtection.cs
- ProtocolsConfigurationHandler.cs
- CompositeTypefaceMetrics.cs
- BuildResult.cs
- AttributedMetaModel.cs
- GeometryDrawing.cs
- NotFiniteNumberException.cs
- SourceFilter.cs
- RtfNavigator.cs
- EmbossBitmapEffect.cs
- TextTrailingWordEllipsis.cs
- SafeTimerHandle.cs
- IDQuery.cs
- CheckBoxFlatAdapter.cs
- FieldMetadata.cs
- RegexCompiler.cs
- CodeVariableReferenceExpression.cs
- FileSystemEventArgs.cs
- TextEmbeddedObject.cs
- SHA256Managed.cs
- XMLSchema.cs
- RequestBringIntoViewEventArgs.cs
- RtfToXamlReader.cs
- BitmapEffectInput.cs
- XpsTokenContext.cs
- KeyValueSerializer.cs
- ColumnWidthChangingEvent.cs
- FixedTextSelectionProcessor.cs
- CryptoApi.cs
- DESCryptoServiceProvider.cs
- ResourceProperty.cs
- ProcessHostMapPath.cs
- CachedTypeface.cs
- SqlInternalConnectionTds.cs
- Options.cs
- Deflater.cs
- InkCanvasFeedbackAdorner.cs
- PassportAuthenticationModule.cs
- objectquery_tresulttype.cs
- PerformanceCounterManager.cs
- SqlNodeTypeOperators.cs
- ScaleTransform.cs
- BinaryObjectReader.cs
- Clause.cs
- TextParagraphCache.cs
- OdbcConnectionString.cs
- LicFileLicenseProvider.cs
- MonthCalendar.cs
- Decimal.cs
- ConfigurationLockCollection.cs
- FixedFlowMap.cs
- CombinedGeometry.cs
- VectorAnimationUsingKeyFrames.cs
- OleDbParameterCollection.cs
- DotNetATv1WindowsLogEntrySerializer.cs
- Image.cs
- thaishape.cs
- AsnEncodedData.cs
- NegotiateStream.cs
- AssemblyAttributes.cs
- WebPartCollection.cs
- BuildDependencySet.cs
- ProcessingInstructionAction.cs
- COAUTHIDENTITY.cs
- OracleRowUpdatedEventArgs.cs
- ParameterBuilder.cs
- AnnotationResourceCollection.cs
- WasEndpointConfigContainer.cs
- Int32Rect.cs
- RenderCapability.cs
- SafeLibraryHandle.cs
- Rectangle.cs
- ProxyWebPart.cs
- _UriSyntax.cs
- Line.cs
- Int32AnimationBase.cs
- KeyValuePairs.cs
- ObjectAnimationUsingKeyFrames.cs
- ResourceAttributes.cs
- ObjectRef.cs
- FixedHyperLink.cs
- LoginView.cs
- StringFunctions.cs
- Process.cs
- CompositeDispatchFormatter.cs
- XmlSchemaInfo.cs
- BindingExpression.cs
- ObsoleteAttribute.cs
- HTMLTagNameToTypeMapper.cs
- RectangleGeometry.cs