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
- PeerCollaboration.cs
- QilPatternVisitor.cs
- ApplicationDirectoryMembershipCondition.cs
- SettingsPropertyIsReadOnlyException.cs
- TableLayoutSettingsTypeConverter.cs
- Popup.cs
- ConstNode.cs
- WebPartVerbCollection.cs
- BoundConstants.cs
- ParallelTimeline.cs
- SortExpressionBuilder.cs
- CompositionTarget.cs
- ExpressionWriter.cs
- GeometryCombineModeValidation.cs
- _Rfc2616CacheValidators.cs
- HtmlFormParameterReader.cs
- Point3D.cs
- DesignerObject.cs
- ListBoxChrome.cs
- AssemblyResourceLoader.cs
- DateTimeConstantAttribute.cs
- QuotedPrintableStream.cs
- _SecureChannel.cs
- ExtendedPropertyDescriptor.cs
- SqlGenericUtil.cs
- HashAlgorithm.cs
- EventBuilder.cs
- PenContexts.cs
- DeploymentSectionCache.cs
- UnsafeNativeMethodsTablet.cs
- PropertySet.cs
- HwndProxyElementProvider.cs
- RegexGroup.cs
- Serializer.cs
- SharedPerformanceCounter.cs
- GenericEnumConverter.cs
- XmlILIndex.cs
- NativeConfigurationLoader.cs
- MultiSelectRootGridEntry.cs
- XmlSchemaValidationException.cs
- Panel.cs
- SerialReceived.cs
- ResponseBodyWriter.cs
- InvalidOleVariantTypeException.cs
- WriteTimeStream.cs
- IDReferencePropertyAttribute.cs
- Selector.cs
- TextEmbeddedObject.cs
- CopyCodeAction.cs
- NavigationProgressEventArgs.cs
- CommonXSendMessage.cs
- URIFormatException.cs
- UserControl.cs
- AnnotationComponentChooser.cs
- PermissionSetTriple.cs
- AuthenticationSection.cs
- ChannelOptions.cs
- LabelAutomationPeer.cs
- CachedPathData.cs
- FixedPage.cs
- ExpressionBuilderContext.cs
- BrowserDefinitionCollection.cs
- WmlTextBoxAdapter.cs
- PointLightBase.cs
- FileRecordSequence.cs
- ByteStorage.cs
- BuildProviderCollection.cs
- ResolveNameEventArgs.cs
- RepeatBehavior.cs
- PluggableProtocol.cs
- XPathSelectionIterator.cs
- FragmentQueryKB.cs
- StylusPointProperties.cs
- SettingsAttributeDictionary.cs
- BookmarkTable.cs
- InitializerFacet.cs
- TreeIterator.cs
- PerfService.cs
- InvalidOperationException.cs
- SkinBuilder.cs
- CatalogPartCollection.cs
- ExpandableObjectConverter.cs
- DefinitionBase.cs
- OperationSelectorBehavior.cs
- MultipartIdentifier.cs
- TransportOutputChannel.cs
- OleDbPropertySetGuid.cs
- XmlQueryTypeFactory.cs
- GridSplitter.cs
- DynamicHyperLink.cs
- Context.cs
- XpsException.cs
- datacache.cs
- AudioSignalProblemOccurredEventArgs.cs
- VectorValueSerializer.cs
- XmlUTF8TextWriter.cs
- GridViewColumnCollectionChangedEventArgs.cs
- DocumentXmlWriter.cs
- InputElement.cs
- SerializationInfoEnumerator.cs