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
- MenuRenderer.cs
- SymmetricCryptoHandle.cs
- NodeInfo.cs
- ActivationArguments.cs
- ScrollBarRenderer.cs
- DesignerSerializationManager.cs
- QilTernary.cs
- StylusButtonCollection.cs
- StreamGeometryContext.cs
- BamlRecordReader.cs
- OleDbStruct.cs
- AmbientLight.cs
- CompressedStack.cs
- WebResourceUtil.cs
- DataGridViewColumn.cs
- ImageClickEventArgs.cs
- DataGridViewComponentPropertyGridSite.cs
- COM2ICategorizePropertiesHandler.cs
- DocobjHost.cs
- DropTarget.cs
- CompatibleIComparer.cs
- WorkflowStateRollbackService.cs
- InteropAutomationProvider.cs
- BuildResult.cs
- MessageBox.cs
- ResourceLoader.cs
- SerializationInfo.cs
- Int64Storage.cs
- XmlTextAttribute.cs
- RegexReplacement.cs
- TemplateBamlRecordReader.cs
- Point4DValueSerializer.cs
- sqlpipe.cs
- StringBuilder.cs
- IRCollection.cs
- RuntimeCompatibilityAttribute.cs
- Geometry3D.cs
- SmtpReplyReaderFactory.cs
- BrowserInteropHelper.cs
- FormatterConverter.cs
- PropertyPathWorker.cs
- SqlDuplicator.cs
- TagPrefixAttribute.cs
- SqlXml.cs
- InternalResources.cs
- StoryFragments.cs
- SourceFileBuildProvider.cs
- ScaleTransform.cs
- StylusButton.cs
- ByteAnimationBase.cs
- SoapReflectionImporter.cs
- GeometryCollection.cs
- CodeDelegateCreateExpression.cs
- FormViewUpdateEventArgs.cs
- MobileUserControlDesigner.cs
- AdornerLayer.cs
- MenuCommand.cs
- SafeNativeMethods.cs
- CodeExpressionStatement.cs
- XmlTypeMapping.cs
- NamedServiceModelExtensionCollectionElement.cs
- TemplateBindingExpression.cs
- MouseButtonEventArgs.cs
- IriParsingElement.cs
- AssemblyAttributesGoHere.cs
- input.cs
- CodeGroup.cs
- JsonEncodingStreamWrapper.cs
- ExtentKey.cs
- TextAdaptor.cs
- FacetChecker.cs
- SSmlParser.cs
- SurrogateDataContract.cs
- CorrelationToken.cs
- BaseCAMarshaler.cs
- PrintingPermissionAttribute.cs
- SafeFileMappingHandle.cs
- Propagator.cs
- EntitySqlQueryState.cs
- DataPagerFieldCommandEventArgs.cs
- PeerNearMe.cs
- DesignerView.Commands.cs
- QuotedPairReader.cs
- ExceptionUtil.cs
- WindowsProgressbar.cs
- Focus.cs
- TimeEnumHelper.cs
- IntAverageAggregationOperator.cs
- Rotation3DAnimationBase.cs
- ScriptControl.cs
- ViewManager.cs
- DeflateEmulationStream.cs
- AttachedAnnotation.cs
- CounterSampleCalculator.cs
- StatusBarItem.cs
- NullRuntimeConfig.cs
- MatrixAnimationUsingKeyFrames.cs
- SelectionService.cs
- Cursors.cs
- ScrollChangedEventArgs.cs