Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / TransactionBridge / Microsoft / Transactions / Wsat / Recovery / DotNetATv1WindowsLogEntrySerializer.cs / 1 / DotNetATv1WindowsLogEntrySerializer.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
// This file contains the knowledge of how to serialize a v1 WS-AT log entry record
using System;
using System.ServiceModel.Channels;
using System.Diagnostics;
using System.IO;
using System.IdentityModel.Claims;
using System.IdentityModel.Policy;
using System.ServiceModel;
using System.Text;
using System.Xml;
using Microsoft.Transactions.Bridge;
using Microsoft.Transactions.Wsat.Messaging;
using Microsoft.Transactions.Wsat.Protocol;
using DiagnosticUtility = Microsoft.Transactions.Bridge.DiagnosticUtility;
namespace Microsoft.Transactions.Wsat.Recovery
{
[Flags]
enum WsATv1LogEntryFlags : byte
{
OptimizedEndpointRepresentation = 0x01,
UsesDefaultPort = 0x02,
UsesStandardCoordinatorAddressPath = 0x04,
UsesStandardParticipantAddressPath = 0x08,
}
enum WsATv1LogEntryVersion : byte
{
v1 = 1,
v2 = 2,
}
class WsATv1LogEntrySerializer : LogEntrySerializer
{
ProtocolVersion protocolVersion;
static readonly string standardCoordinatorAddressPath10 =
"/" +
BindingStrings.AddressPrefix +
"/" +
BindingStrings.TwoPhaseCommitCoordinatorSuffix(ProtocolVersion.Version10);
static readonly string standardCoordinatorAddressPath11 =
"/" +
BindingStrings.AddressPrefix +
"/" +
BindingStrings.TwoPhaseCommitCoordinatorSuffix(ProtocolVersion.Version11);
static readonly string standardParticipantAddressPath10 =
"/" +
BindingStrings.AddressPrefix +
"/" +
BindingStrings.TwoPhaseCommitParticipantSuffix(ProtocolVersion.Version10);
static readonly string standardParticipantAddressPath11 =
"/" +
BindingStrings.AddressPrefix +
"/" +
BindingStrings.TwoPhaseCommitParticipantSuffix(ProtocolVersion.Version11);
public WsATv1LogEntrySerializer(LogEntry logEntry, ProtocolVersion protocolVersion)
:
base(logEntry)
{
this.protocolVersion = protocolVersion;
}
public static string StandardCoordinatorAddressPath (ProtocolVersion protocolVersion)
{
ProtocolVersionHelper.AssertProtocolVersion(protocolVersion, typeof(WsATv1LogEntrySerializer), "StandardCoordinatorAddressPath"); //assert valid protocol version
switch (protocolVersion)
{
case ProtocolVersion.Version10 :
return standardCoordinatorAddressPath10;
case ProtocolVersion.Version11 :
return standardCoordinatorAddressPath11;
default :
return null; // inaccessible path because we have asserted the protocol version
}
}
public static string StandardParticipantAddressPath (ProtocolVersion protocolVersion)
{
ProtocolVersionHelper.AssertProtocolVersion(protocolVersion, typeof(WsATv1LogEntrySerializer), "StandardParticipantAddressPath"); //assert valid protocol version
switch (protocolVersion)
{
case ProtocolVersion.Version10 :
return standardParticipantAddressPath10;
case ProtocolVersion.Version11 :
return standardParticipantAddressPath11;
default :
return null; // inaccessible path because we have asserted the protocol version
}
}
protected override void SerializeExtended()
{
DebugTrace.TraceEnter(this, "SerializeExtended");
WsATv1LogEntryFlags flags = 0, pathFlags = 0;
EndpointAddress address = this.logEntry.Endpoint;
Uri uri = address.Uri;
// Check for a remote enlistment id (and nothing else) in the ref params
// If we don't have this, give up and fallback to serializing the entire EPR
Guid remoteEnlistmentId;
if (GetRemoteEnlistmentId(address, out remoteEnlistmentId))
{
// Great. We can optimize the serialization of this EPR
flags |= WsATv1LogEntryFlags.OptimizedEndpointRepresentation;
// Make sure the EPR contains an https address
// It is worth noting that we will not reach this point without an address
// that the HttpsChannelFactory has accepted, but it's worth checking anyway
if (string.Compare(uri.Scheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) != 0)
{
DiagnosticUtility.FailFast("Endpoints must use the HTTPS scheme");
}
// Check for the default port
if (Configuration.DefaultHttpsPort == uri.Port)
{
flags |= WsATv1LogEntryFlags.UsesDefaultPort;
}
// Check for a standard address path
pathFlags = GetPathFlags(address, this.protocolVersion);
flags |= pathFlags;
}
//
// Write extended information to the stream
//
if (DebugTrace.Verbose)
{
DebugTrace.Trace(TraceLevel.Verbose, "SerializeExtended flags: {0}", flags);
}
// Version
byte version = 0;
ProtocolVersionHelper.AssertProtocolVersion(protocolVersion, this.GetType(), "SerializeExtended"); //assert valid protocol version
switch (this.protocolVersion)
{
case ProtocolVersion.Version10 :
version = (byte)WsATv1LogEntryVersion.v1;
break;
case ProtocolVersion.Version11 :
version = (byte)WsATv1LogEntryVersion.v2;
break;
// no default - we already asserted the protocol version
}
this.mem.WriteByte(version);
if (DebugTrace.Verbose)
{
DebugTrace.Trace(TraceLevel.Verbose, "Wrote version: {0} bytes", this.mem.Length);
}
// Flags
this.mem.WriteByte((byte)flags);
if (DebugTrace.Verbose)
{
DebugTrace.Trace(TraceLevel.Verbose, "Wrote flags: {0} bytes", this.mem.Length);
}
if ((flags & WsATv1LogEntryFlags.OptimizedEndpointRepresentation) == 0)
{
SerializationUtils.WriteEndpointAddress(this.mem, address, this.protocolVersion);
}
else
{
// Remote enlistmentId
SerializationUtils.WriteGuid(this.mem, ref remoteEnlistmentId);
if (DebugTrace.Verbose)
{
DebugTrace.Trace(TraceLevel.Verbose, "Wrote enlistmentId: {0} bytes", this.mem.Length);
}
// HostName
SerializationUtils.WriteString(this.mem, uri.Host);
if (DebugTrace.Verbose)
{
DebugTrace.Trace(TraceLevel.Verbose, "Wrote hostName: {0} bytes", this.mem.Length);
}
// Port
if ((flags & WsATv1LogEntryFlags.UsesDefaultPort) == 0)
{
if (!(uri.Port >= System.Net.IPEndPoint.MinPort && uri.Port <= System.Net.IPEndPoint.MaxPort))
{
// Between the time we captured the port and the time we write it out,
// the value should still appear to be valid. If things change, we have
// a bug somewhere and need to crash so that we don't write an invalid log entry.
DiagnosticUtility.FailFast("TCP port must be valid");
}
SerializationUtils.WriteInt(this.mem, uri.Port);
if (DebugTrace.Verbose)
{
DebugTrace.Trace(TraceLevel.Verbose, "Wrote port: {0} bytes", this.mem.Length);
}
}
// Path
if (pathFlags == 0)
{
SerializationUtils.WriteString(this.mem, uri.AbsolutePath);
if (DebugTrace.Verbose)
{
DebugTrace.Trace(TraceLevel.Verbose, "Wrote address path: {0} bytes", this.mem.Length);
}
}
}
DebugTrace.TraceLeave(this, "DeserializeExtended");
}
static WsATv1LogEntryFlags GetPathFlags(EndpointAddress address, ProtocolVersion protocolVersion)
{
if (address.Uri.AbsolutePath == StandardCoordinatorAddressPath(protocolVersion))
{
return WsATv1LogEntryFlags.UsesStandardCoordinatorAddressPath;
}
else if (address.Uri.AbsolutePath == StandardParticipantAddressPath(protocolVersion))
{
return WsATv1LogEntryFlags.UsesStandardParticipantAddressPath;
}
else
{
return 0;
}
}
static bool GetRemoteEnlistmentId(EndpointAddress address,
out Guid remoteEnlistmentId)
{
AddressHeaderCollection refParams = address.Headers;
if (refParams.Count == 1)
{
// We don't have to worry about catching ArgumentException here because
// we already checked that there's only one header in the collection.
AddressHeader refParam = refParams.FindHeader(EnlistmentHeader.HeaderName,
EnlistmentHeader.HeaderNamespace);
if (refParam != null)
{
XmlDictionaryReader reader = refParam.GetAddressHeaderReader();
using (reader)
{
try
{
ControlProtocol protocol;
EnlistmentHeader.ReadFrom(reader, out remoteEnlistmentId, out protocol);
return protocol == ControlProtocol.Durable2PC;
}
catch (InvalidEnlistmentHeaderException e)
{
DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Information);
}
}
}
}
remoteEnlistmentId = Guid.Empty;
return false;
}
}
}
// 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
- LockingPersistenceProvider.cs
- XmlTypeAttribute.cs
- PerspectiveCamera.cs
- dtdvalidator.cs
- SettingsBase.cs
- SynchronizationScope.cs
- EditingScope.cs
- XmlConvert.cs
- ApplicationSettingsBase.cs
- RequestDescription.cs
- TableAutomationPeer.cs
- CharAnimationUsingKeyFrames.cs
- FieldNameLookup.cs
- SinglePhaseEnlistment.cs
- ResolveResponseInfo.cs
- DateTimeEditor.cs
- BindingCompleteEventArgs.cs
- srgsitem.cs
- ConfigXmlDocument.cs
- SQLMoneyStorage.cs
- Rotation3DAnimationUsingKeyFrames.cs
- CultureInfoConverter.cs
- CheckBoxAutomationPeer.cs
- TimerElapsedEvenArgs.cs
- DecimalAnimationUsingKeyFrames.cs
- TextBoxDesigner.cs
- TransportSecurityProtocolFactory.cs
- PartitionedStreamMerger.cs
- CodeIndexerExpression.cs
- DescendentsWalkerBase.cs
- ReadOnlyTernaryTree.cs
- FacetChecker.cs
- GenericTextProperties.cs
- ObjectReferenceStack.cs
- TableItemProviderWrapper.cs
- CurrentTimeZone.cs
- WebControlsSection.cs
- FrameworkElement.cs
- RuleElement.cs
- SqlGenericUtil.cs
- MarkupObject.cs
- AtlasWeb.Designer.cs
- FrameworkObject.cs
- ScrollableControl.cs
- ConfigurationException.cs
- Model3D.cs
- BackgroundWorker.cs
- ProtocolsConfigurationHandler.cs
- EventKeyword.cs
- EqualityComparer.cs
- XmlAnyAttributeAttribute.cs
- PanelDesigner.cs
- ValueTypeIndexerReference.cs
- Filter.cs
- MultiSelector.cs
- DataGridViewCellLinkedList.cs
- HelpKeywordAttribute.cs
- BitmapEffectInputData.cs
- ControlDesignerState.cs
- PointHitTestParameters.cs
- TransformPattern.cs
- StandardOleMarshalObject.cs
- WebPartUtil.cs
- Polyline.cs
- EditorAttributeInfo.cs
- OdbcParameter.cs
- AccessorTable.cs
- CompilerLocalReference.cs
- HwndStylusInputProvider.cs
- PersonalizableTypeEntry.cs
- DataTableMappingCollection.cs
- KeyGestureConverter.cs
- SyndicationPerson.cs
- StaticExtension.cs
- SortKey.cs
- OneWayBindingElement.cs
- VectorCollectionConverter.cs
- X509UI.cs
- XPathException.cs
- PageThemeParser.cs
- ColorConvertedBitmap.cs
- ObjectViewFactory.cs
- WebInvokeAttribute.cs
- TransformProviderWrapper.cs
- JournalNavigationScope.cs
- UxThemeWrapper.cs
- SystemException.cs
- Utilities.cs
- XmlAutoDetectWriter.cs
- DispatcherProcessingDisabled.cs
- xmlglyphRunInfo.cs
- TextTreeNode.cs
- OrderedDictionary.cs
- BaseTemplateParser.cs
- FaultContext.cs
- Matrix.cs
- ListViewItemMouseHoverEvent.cs
- COSERVERINFO.cs
- EnumBuilder.cs
- WindowsListViewItemStartMenu.cs