Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / ConnectionModeReader.cs / 1 / ConnectionModeReader.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System.Threading; using System.ServiceModel; using System.Collections.Generic; using System.Diagnostics; delegate void ConnectionModeCallback(ConnectionModeReader connectionModeReader); sealed class ConnectionModeReader : InitialServerConnectionReader { Exception readException; ServerModeDecoder decoder; byte[] buffer; int offset; int size; ConnectionModeCallback callback; static WaitCallback readCallback; TimeoutHelper receiveTimeoutHelper; public ConnectionModeReader(IConnection connection, ConnectionModeCallback callback, ConnectionClosedCallback closedCallback) : base(connection, closedCallback) { this.callback = callback; } public int BufferOffset { get { return offset; } } public int BufferSize { get { return size; } } public long StreamPosition { get { return decoder.StreamPosition; } } public TimeSpan GetRemainingTimeout() { return this.receiveTimeoutHelper.RemainingTime(); } void Complete(Exception e) { // exception will be logged by the caller readException = e; Complete(); } void Complete() { callback(this); } bool ContinueReading() { for (; ; ) { if (size == 0) { if (readCallback == null) { readCallback = new WaitCallback(ReadCallback); } if (Connection.BeginRead(0, Connection.AsyncReadBufferSize, GetRemainingTimeout(), readCallback, this) == AsyncReadResult.Queued) { break; } if (!GetReadResult()) // we're at EOF, bail { return false; } } for (; ; ) { int bytesDecoded; try { bytesDecoded = decoder.Decode(buffer, offset, size); } catch (CommunicationException e) { // see if we need to send back a framing fault string framingFault; if (FramingEncodingString.TryGetFaultString(e, out framingFault)) { byte[] drainBuffer = new byte[128]; InitialServerConnectionReader.SendFault( Connection, framingFault, drainBuffer, GetRemainingTimeout(), MaxViaSize + MaxContentTypeSize); base.Close(GetRemainingTimeout()); } throw; } if (bytesDecoded > 0) { offset += bytesDecoded; size -= bytesDecoded; } if (decoder.CurrentState == ServerModeDecoder.State.Done) { return true; } if (size == 0) { break; } } } return false; } static void ReadCallback(object state) { ConnectionModeReader reader = (ConnectionModeReader)state; bool completeSelf = false; Exception completionException = null; try { if (reader.GetReadResult()) { completeSelf = reader.ContinueReading(); } } #pragma warning suppress 56500 // [....], transferring exception to caller catch (Exception e) { if (DiagnosticUtility.IsFatal(e)) { throw; } completeSelf = true; completionException = e; } if (completeSelf) { reader.Complete(completionException); } } bool GetReadResult() { offset = 0; size = Connection.EndRead(); if (size == 0) { if (this.decoder.StreamPosition == 0) // client timed out a cached connection { base.Close(GetRemainingTimeout()); return false; } else { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(decoder.CreatePrematureEOFException()); } } // restore ExceptionEventType to Error after the initial read for cached connections Connection.ExceptionEventType = TraceEventType.Error; if (buffer == null) { buffer = Connection.AsyncReadBuffer; } return true; } public FramingMode GetConnectionMode() { if (readException != null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelper(readException, Connection.ExceptionEventType); } return decoder.Mode; } public void StartReading(TimeSpan receiveTimeout, ItemDequeuedCallback connectionDequeuedCallback) { this.decoder = new ServerModeDecoder(); this.receiveTimeoutHelper = new TimeoutHelper(receiveTimeout); this.ConnectionDequeuedCallback = connectionDequeuedCallback; bool completeSelf = false; Exception completionException = null; try { completeSelf = ContinueReading(); } #pragma warning suppress 56500 // [....], transferring exception to caller catch (Exception e) { if (DiagnosticUtility.IsFatal(e)) { throw; } completeSelf = true; completionException = e; } if (completeSelf) { Complete(completionException); } } } } // 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
- AutomationTextAttribute.cs
- SecurityCriticalDataForSet.cs
- QilList.cs
- SmiEventSink.cs
- DataTablePropertyDescriptor.cs
- BlobPersonalizationState.cs
- WebPartPersonalization.cs
- EditorZoneBase.cs
- ConfigViewGenerator.cs
- SqlInfoMessageEvent.cs
- SiteMapNodeItem.cs
- Vector3DAnimation.cs
- ZipIOCentralDirectoryBlock.cs
- ExceptionHelpers.cs
- QueryReaderSettings.cs
- WebRequestModuleElement.cs
- ZipIOExtraFieldPaddingElement.cs
- CommentEmitter.cs
- MetadataArtifactLoaderComposite.cs
- EncoderBestFitFallback.cs
- HyperLinkColumn.cs
- EnumDataContract.cs
- MarkupProperty.cs
- SelectedGridItemChangedEvent.cs
- PbrsForward.cs
- CompatibleIComparer.cs
- IdentifierElement.cs
- SmtpNegotiateAuthenticationModule.cs
- XsltSettings.cs
- PackagePartCollection.cs
- StylusLogic.cs
- XamlTemplateSerializer.cs
- InitializationEventAttribute.cs
- formatter.cs
- DataGridViewButtonColumn.cs
- RectAnimationUsingKeyFrames.cs
- SystemUnicastIPAddressInformation.cs
- TCPClient.cs
- SafeEventLogReadHandle.cs
- DocumentPaginator.cs
- ReceiveActivityValidator.cs
- DependsOnAttribute.cs
- TextContainerHelper.cs
- ClientRequest.cs
- Reference.cs
- SafeEventLogReadHandle.cs
- WinCategoryAttribute.cs
- TransformValueSerializer.cs
- Point3DAnimationBase.cs
- SystemKeyConverter.cs
- ObjectAnimationUsingKeyFrames.cs
- FileRecordSequence.cs
- SoapFault.cs
- UidManager.cs
- TextParagraphView.cs
- SqlNodeAnnotation.cs
- AssociationSetMetadata.cs
- CollectionConverter.cs
- ConstrainedDataObject.cs
- ListItemCollection.cs
- SqlDataSourceView.cs
- WorkflowTransactionOptions.cs
- UseManagedPresentationBindingElement.cs
- ReadOnlyDictionary.cs
- COM2DataTypeToManagedDataTypeConverter.cs
- EntityDataSourceEntitySetNameItem.cs
- Pens.cs
- BindingCompleteEventArgs.cs
- PrintDialogException.cs
- Operand.cs
- selecteditemcollection.cs
- Int16.cs
- PartialCachingControl.cs
- DataList.cs
- ReadOnlyObservableCollection.cs
- InvalidCastException.cs
- IResourceProvider.cs
- AutomationIdentifierGuids.cs
- DatePickerAutomationPeer.cs
- XmlElementElementCollection.cs
- ClientBuildManagerCallback.cs
- TextElementEditingBehaviorAttribute.cs
- NumberFunctions.cs
- DeflateStreamAsyncResult.cs
- RenderDataDrawingContext.cs
- GroupBoxRenderer.cs
- FrameworkPropertyMetadata.cs
- EventBuilder.cs
- DataServiceHost.cs
- OrderingQueryOperator.cs
- AsynchronousChannelMergeEnumerator.cs
- CollaborationHelperFunctions.cs
- _HeaderInfo.cs
- DefaultTraceListener.cs
- ColumnMapTranslator.cs
- Parameter.cs
- WithStatement.cs
- WinEventQueueItem.cs
- BaseComponentEditor.cs
- _NegoStream.cs