Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / ReliableInputConnection.cs / 1 / ReliableInputConnection.cs
//---------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------------------- namespace System.ServiceModel.Channels { sealed class ReliableInputConnection { bool isLastKnown = false; bool isSequenceClosed = false; Int64 last = 0; SequenceRangeCollection ranges = SequenceRangeCollection.Empty; ReliableMessagingVersion reliableMessagingVersion; InterruptibleWaitObject shutdownWaitObject = new InterruptibleWaitObject(false); bool terminated = false; InterruptibleWaitObject terminateWaitObject = new InterruptibleWaitObject(false, false); public ReliableInputConnection() { } public bool AllAdded { get { return (this.ranges.Count == 1 && this.ranges[0].Lower == 1 && this.ranges[0].Upper == this.last) || this.isLastKnown; } } public bool IsLastKnown { get { return this.last != 0 || this.isLastKnown; } } public bool IsSequenceClosed { get { return this.isSequenceClosed; } } public Int64 Last { get { return this.last; } } public SequenceRangeCollection Ranges { get { return this.ranges; } } public ReliableMessagingVersion ReliableMessagingVersion { set { this.reliableMessagingVersion = value; } } public void Abort(ChannelBase channel) { this.shutdownWaitObject.Abort(channel); this.terminateWaitObject.Abort(channel); } public bool CanMerge(Int64 sequenceNumber) { return ReliableInputConnection.CanMerge(sequenceNumber, this.ranges); } // Returns true if merging the number will not increase the number of ranges past MaxSequenceRanges. public static bool CanMerge(Int64 sequenceNumber, SequenceRangeCollection ranges) { if (ranges.Count < ReliableMessagingConstants.MaxSequenceRanges) { return true; } ranges = ranges.MergeWith(sequenceNumber); return ranges.Count <= ReliableMessagingConstants.MaxSequenceRanges; } public void Fault(ChannelBase channel) { this.shutdownWaitObject.Fault(channel); this.terminateWaitObject.Fault(channel); } public bool IsValid(Int64 sequenceNumber, bool isLast) { if (this.reliableMessagingVersion == ReliableMessagingVersion.WSReliableMessagingFebruary2005) { if (isLast) { if (this.last == 0) { if (this.ranges.Count > 0) { return sequenceNumber > this.ranges[this.ranges.Count - 1].Upper; } else { return true; } } else { return sequenceNumber == this.last; } } else if (this.last > 0) { return sequenceNumber < this.last; } } else { if (this.isLastKnown) { return this.ranges.Contains(sequenceNumber); } } return true; } public void Merge(Int64 sequenceNumber, bool isLast) { this.ranges = this.ranges.MergeWith(sequenceNumber); if (isLast) this.last = sequenceNumber; if (this.AllAdded) this.shutdownWaitObject.Set(); } public bool SetCloseSequenceLast(Int64 last) { WsrmUtilities.AssertWsrm11(this.reliableMessagingVersion); bool validLast; if ((last < 1) || (this.ranges.Count == 0)) { validLast = true; } else { validLast = last >= this.ranges[this.ranges.Count - 1].Upper; } if (validLast) { this.isSequenceClosed = true; this.SetLast(last); } return validLast; } void SetLast(Int64 last) { if (this.isLastKnown) { DiagnosticUtility.DebugAssert("Last can only be set once."); throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false); } this.last = last; this.isLastKnown = true; this.shutdownWaitObject.Set(); } // Two error cases: // (1) The sequence contains holes. // (2) TerminateSequence.LastMsgNumber < last received message number. // In both cases the channel should be faulted. In case (2) the channel should send a fault. public bool SetTerminateSequenceLast(Int64 last, out bool isLastLargeEnough) { WsrmUtilities.AssertWsrm11(this.reliableMessagingVersion); isLastLargeEnough = true; // unspecified last if (last < 1) { return false; } int rangeCount = this.ranges.Count; Int64 lastReceived = (rangeCount > 0) ? this.ranges[rangeCount - 1].Upper : 0; // last is too small to be valid if (last < lastReceived) { isLastLargeEnough = false; return false; } // there is a hole in the sequence if ((rangeCount > 1) || (last > lastReceived)) { return false; } this.SetLast(last); return true; } public bool Terminate() { if ((this.reliableMessagingVersion == ReliableMessagingVersion.WSReliableMessagingFebruary2005) || this.isSequenceClosed) { if (!this.terminated && this.AllAdded) { this.terminateWaitObject.Set(); this.terminated = true; } return this.terminated; } return this.isLastKnown; } public IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state) { OperationWithTimeoutBeginCallback[] beginCallbacks = new OperationWithTimeoutBeginCallback[] {shutdownWaitObject.BeginWait, terminateWaitObject.BeginWait}; OperationEndCallback[] endCallbacks = new OperationEndCallback[] {shutdownWaitObject.EndWait, terminateWaitObject.EndWait}; return OperationWithTimeoutComposer.BeginComposeAsyncOperations(timeout, beginCallbacks, endCallbacks, callback, state); } public void Close(TimeSpan timeout) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); this.shutdownWaitObject.Wait(timeoutHelper.RemainingTime()); this.terminateWaitObject.Wait(timeoutHelper.RemainingTime()); } public void EndClose(IAsyncResult result) { OperationWithTimeoutComposer.EndComposeAsyncOperations(result); } } } // 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
- Graph.cs
- xmlfixedPageInfo.cs
- CompositeFontFamily.cs
- GeneralTransform.cs
- SqlCharStream.cs
- IIS7WorkerRequest.cs
- SynchronizationLockException.cs
- grammarelement.cs
- Thread.cs
- UpdatePanel.cs
- GroupLabel.cs
- StorageEndPropertyMapping.cs
- ButtonBase.cs
- DataGridLinkButton.cs
- DescendentsWalker.cs
- HtmlForm.cs
- Header.cs
- VisualBasicImportReference.cs
- RuntimeArgumentHandle.cs
- WasAdminWrapper.cs
- StorageSetMapping.cs
- DataGridViewEditingControlShowingEventArgs.cs
- DocumentViewerAutomationPeer.cs
- HtmlInputText.cs
- AlternateViewCollection.cs
- LocalizableResourceBuilder.cs
- ObjectAnimationBase.cs
- PersonalizationEntry.cs
- LogPolicy.cs
- ImageIndexConverter.cs
- FtpRequestCacheValidator.cs
- FileCodeGroup.cs
- TableChangeProcessor.cs
- PackageProperties.cs
- ExtendedProtectionPolicyElement.cs
- SourceFileBuildProvider.cs
- UserInitiatedRoutedEventPermission.cs
- WeakEventManager.cs
- GridViewRowEventArgs.cs
- ProcessProtocolHandler.cs
- UrlPath.cs
- PersonalizationAdministration.cs
- RowSpanVector.cs
- SoapReflectionImporter.cs
- ShaperBuffers.cs
- PkcsUtils.cs
- ApplicationHost.cs
- BounceEase.cs
- AutomationAttributeInfo.cs
- SizeAnimationBase.cs
- KeyNotFoundException.cs
- RemotingService.cs
- AdapterDictionary.cs
- SapiGrammar.cs
- VerificationAttribute.cs
- COM2EnumConverter.cs
- WebBrowsableAttribute.cs
- WizardDesigner.cs
- XMLSyntaxException.cs
- WasEndpointConfigContainer.cs
- FragmentNavigationEventArgs.cs
- StaticDataManager.cs
- SessionPageStatePersister.cs
- _LocalDataStoreMgr.cs
- ObjectQuery_EntitySqlExtensions.cs
- Lasso.cs
- PackageDigitalSignature.cs
- ComplexPropertyEntry.cs
- SimpleHandlerFactory.cs
- VideoDrawing.cs
- SqlUDTStorage.cs
- PerformanceCountersElement.cs
- GrammarBuilderWildcard.cs
- ConfigurationSchemaErrors.cs
- CodeObject.cs
- StrokeDescriptor.cs
- MenuAutoFormat.cs
- XmlWellformedWriterHelpers.cs
- SharedPersonalizationStateInfo.cs
- OleStrCAMarshaler.cs
- StackOverflowException.cs
- TextRangeEditLists.cs
- CodeDomDecompiler.cs
- Keyboard.cs
- FixedLineResult.cs
- DrawingVisualDrawingContext.cs
- XmlWrappingReader.cs
- MemberMaps.cs
- DoubleAnimation.cs
- VectorCollectionValueSerializer.cs
- ProfileSettingsCollection.cs
- HwndHost.cs
- DataServiceRequestArgs.cs
- SafeCloseHandleCritical.cs
- SqlExpressionNullability.cs
- safex509handles.cs
- EndCreateSecurityTokenRequest.cs
- HttpCacheVary.cs
- FunctionParameter.cs
- MethodExpr.cs