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
- AnimationTimeline.cs
- FixedPageStructure.cs
- SiteMap.cs
- IPHostEntry.cs
- PowerModeChangedEventArgs.cs
- CookielessHelper.cs
- PrinterUnitConvert.cs
- SemaphoreSlim.cs
- PackagingUtilities.cs
- Stylesheet.cs
- GradientBrush.cs
- DataGridViewRowStateChangedEventArgs.cs
- DataObjectAttribute.cs
- XmlDomTextWriter.cs
- RemotingConfigParser.cs
- MemberHolder.cs
- FileSecurity.cs
- FileNotFoundException.cs
- WindowsGraphicsCacheManager.cs
- HtmlTableCellCollection.cs
- SimpleHandlerBuildProvider.cs
- ComponentSerializationService.cs
- TextBoxRenderer.cs
- UdpChannelFactory.cs
- KerberosSecurityTokenAuthenticator.cs
- CompilerLocalReference.cs
- ExpressionEditorSheet.cs
- DataGridViewImageColumn.cs
- SamlAuthenticationClaimResource.cs
- TypeBuilder.cs
- SiteMapHierarchicalDataSourceView.cs
- RecipientInfo.cs
- LingerOption.cs
- StreamUpdate.cs
- AutomationIdentifier.cs
- AlphabeticalEnumConverter.cs
- XmlNamespaceMapping.cs
- SystemIcons.cs
- AutomationElement.cs
- SuppressMergeCheckAttribute.cs
- ExtensionQuery.cs
- NavigatorOutput.cs
- PerspectiveCamera.cs
- SmiSettersStream.cs
- oledbmetadatacollectionnames.cs
- LocalizabilityAttribute.cs
- DataGridPageChangedEventArgs.cs
- ManualResetEvent.cs
- Types.cs
- ExpressionWriter.cs
- TypefaceMetricsCache.cs
- HtmlElement.cs
- OleDbPropertySetGuid.cs
- SchemaObjectWriter.cs
- Freezable.cs
- MimeParameterWriter.cs
- ContextMenuService.cs
- DataControlField.cs
- SelectionListDesigner.cs
- PatternMatcher.cs
- BeginEvent.cs
- XmlTextReader.cs
- Debugger.cs
- ElementProxy.cs
- WebBrowserEvent.cs
- TransformCollection.cs
- Logging.cs
- SRef.cs
- XmlRawWriter.cs
- ConfigurationStrings.cs
- DataContractFormatAttribute.cs
- ListDictionaryInternal.cs
- ItemsPanelTemplate.cs
- PaginationProgressEventArgs.cs
- EntityDataSourceReferenceGroup.cs
- DataGridViewColumn.cs
- remotingproxy.cs
- TreeNodeSelectionProcessor.cs
- MainMenu.cs
- ExtendedPropertyCollection.cs
- FunctionGenerator.cs
- BooleanAnimationUsingKeyFrames.cs
- BamlTreeMap.cs
- OleDbError.cs
- BamlRecords.cs
- Site.cs
- PrintDialogException.cs
- AssemblyCollection.cs
- Shape.cs
- ZoneLinkButton.cs
- SequentialWorkflowRootDesigner.cs
- SpeechEvent.cs
- ConnectionManagementElement.cs
- CapiSymmetricAlgorithm.cs
- WindowsToolbarAsMenu.cs
- CountAggregationOperator.cs
- BitmapMetadata.cs
- CFGGrammar.cs
- LocalIdKeyIdentifierClause.cs
- _SecureChannel.cs