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
- DBProviderConfigurationHandler.cs
- ItemsPanelTemplate.cs
- LookupBindingPropertiesAttribute.cs
- SHA384Managed.cs
- ChameleonKey.cs
- Matrix3DConverter.cs
- GeneralTransformGroup.cs
- DoubleConverter.cs
- LightweightEntityWrapper.cs
- ProgressBar.cs
- ZipIOExtraField.cs
- ColorIndependentAnimationStorage.cs
- TextModifier.cs
- XmlSchemaObjectCollection.cs
- GridViewUpdatedEventArgs.cs
- XamlBuildTaskServices.cs
- SQLByte.cs
- UpDownBaseDesigner.cs
- SymmetricAlgorithm.cs
- UserControlDesigner.cs
- MenuCommands.cs
- ChangeBlockUndoRecord.cs
- RadioButtonBaseAdapter.cs
- MarkupCompiler.cs
- AttributeUsageAttribute.cs
- ScriptingProfileServiceSection.cs
- PriorityRange.cs
- InvalidOleVariantTypeException.cs
- InputMethod.cs
- ConsumerConnectionPointCollection.cs
- PathParser.cs
- sqlcontext.cs
- ContainerUIElement3D.cs
- Point3DAnimationUsingKeyFrames.cs
- NotCondition.cs
- TableSectionStyle.cs
- Brush.cs
- Vector3DAnimation.cs
- OdbcConnectionPoolProviderInfo.cs
- EnumConverter.cs
- COSERVERINFO.cs
- MemberInfoSerializationHolder.cs
- SerialStream.cs
- Panel.cs
- XmlElement.cs
- ImageSource.cs
- Pointer.cs
- EntityDataSourceDesigner.cs
- RMPublishingDialog.cs
- ClientUtils.cs
- RangeContentEnumerator.cs
- ClientOperation.cs
- DirectionalLight.cs
- CompositeDesignerAccessibleObject.cs
- XmlNodeReader.cs
- SystemIPInterfaceStatistics.cs
- AddInControllerImpl.cs
- OutOfMemoryException.cs
- EdmTypeAttribute.cs
- oledbconnectionstring.cs
- ReliableChannelFactory.cs
- SmtpCommands.cs
- PanelStyle.cs
- SqlDataSourceView.cs
- MenuItemStyleCollectionEditor.cs
- MessageSmuggler.cs
- CacheEntry.cs
- WebPartChrome.cs
- NamespaceMapping.cs
- CssClassPropertyAttribute.cs
- ZipFileInfoCollection.cs
- SoapReflectionImporter.cs
- NamedPipeChannelFactory.cs
- RowBinding.cs
- EditorZoneBase.cs
- EditBehavior.cs
- DurableEnlistmentState.cs
- StretchValidation.cs
- HtmlTable.cs
- Vertex.cs
- NotImplementedException.cs
- EntityDesignerUtils.cs
- BuildProviderCollection.cs
- RSAOAEPKeyExchangeFormatter.cs
- DesignerDataTable.cs
- SingleObjectCollection.cs
- TraceContextRecord.cs
- SetStoryboardSpeedRatio.cs
- DrawingImage.cs
- ByeMessageCD1.cs
- EqualityComparer.cs
- WindowsEditBoxRange.cs
- Process.cs
- ManifestResourceInfo.cs
- RuntimeCompatibilityAttribute.cs
- CodeBlockBuilder.cs
- CryptographicAttribute.cs
- XmlSchemaImporter.cs
- VisualBasicDesignerHelper.cs
- CodeVariableDeclarationStatement.cs