| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Transactions
- {
- using System;
- using System.Diagnostics;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- using System.Transactions;
- using System.Xml;
- using Microsoft.Transactions.Wsat.Messaging;
- class OleTxTransactionHeader : MessageHeader
- {
- const string OleTxHeaderElement = OleTxTransactionExternalStrings.OleTxTransaction;
- const string OleTxNamespace = OleTxTransactionExternalStrings.Namespace;
- static readonly XmlDictionaryString CoordinationNamespace = XD.CoordinationExternal10Dictionary.Namespace; // we keep using wscoor10 namespace for compatibility
-
- byte[] propagationToken;
- WsatExtendedInformation wsatInfo;
- public OleTxTransactionHeader(byte[] propagationToken, WsatExtendedInformation wsatInfo)
- {
- this.propagationToken = propagationToken;
- this.wsatInfo = wsatInfo;
- }
- public override bool MustUnderstand
- {
- get { return true; }
- }
-
- public override string Name
- {
- get { return OleTxHeaderElement; }
- }
- public override string Namespace
- {
- get { return OleTxNamespace; }
- }
- public byte[] PropagationToken
- {
- get { return this.propagationToken; }
- }
- public WsatExtendedInformation WsatExtendedInformation
- {
- get { return this.wsatInfo; }
- }
- protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
- {
- if (this.wsatInfo != null)
- {
- if (this.wsatInfo.Timeout != 0)
- {
- writer.WriteAttributeString(XD.CoordinationExternalDictionary.Expires,
- CoordinationNamespace,
- XmlConvert.ToString(this.wsatInfo.Timeout));
- }
- if (!string.IsNullOrEmpty(this.wsatInfo.Identifier))
- {
- writer.WriteAttributeString(XD.CoordinationExternalDictionary.Identifier,
- CoordinationNamespace,
- this.wsatInfo.Identifier);
- }
- }
- WritePropagationTokenElement(writer, this.propagationToken);
- }
- public static OleTxTransactionHeader ReadFrom(Message message)
- {
- int index;
- try
- {
- index = message.Headers.FindHeader(OleTxHeaderElement, OleTxNamespace);
- }
- catch (MessageHeaderException e)
- {
- DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new TransactionException(SR.GetString(SR.OleTxHeaderCorrupt), e));
- }
- if (index < 0)
- return null;
- OleTxTransactionHeader oleTxHeader;
- XmlDictionaryReader reader = message.Headers.GetReaderAtHeader(index);
- using (reader)
- {
- try
- {
- oleTxHeader = ReadFrom(reader);
- }
- catch (XmlException xe)
- {
- DiagnosticUtility.TraceHandledException(xe, TraceEventType.Error);
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new TransactionException(SR.GetString(SR.OleTxHeaderCorrupt), xe));
- }
- }
- MessageHeaderInfo header = message.Headers[index];
- if (!message.Headers.UnderstoodHeaders.Contains(header))
- {
- message.Headers.UnderstoodHeaders.Add(header);
- }
- return oleTxHeader;
- }
- static OleTxTransactionHeader ReadFrom(XmlDictionaryReader reader)
- {
- WsatExtendedInformation info = null;
- if (reader.IsStartElement(XD.OleTxTransactionExternalDictionary.OleTxTransaction,
- XD.OleTxTransactionExternalDictionary.Namespace))
- {
- string identifier = reader.GetAttribute(XD.CoordinationExternalDictionary.Identifier, CoordinationNamespace);
- if (!string.IsNullOrEmpty(identifier))
- {
- // Verify identifier is really a URI
- Uri uri;
- if (!Uri.TryCreate(identifier, UriKind.Absolute, out uri))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.GetString(SR.InvalidWsatExtendedInfo)));
- }
- }
- string attr = reader.GetAttribute(XD.CoordinationExternalDictionary.Expires, CoordinationNamespace);
- uint timeout = 0;
- if (!string.IsNullOrEmpty(attr))
- {
- try
- {
- timeout = XmlConvert.ToUInt32(attr);
- }
- catch (FormatException e)
- {
- DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.GetString(SR.InvalidWsatExtendedInfo), e));
- }
- catch (OverflowException e)
- {
- DiagnosticUtility.TraceHandledException(e, TraceEventType.Error);
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.GetString(SR.InvalidWsatExtendedInfo), e));
- }
- }
- if (!string.IsNullOrEmpty(identifier) || timeout != 0)
- {
- info = new WsatExtendedInformation(identifier, timeout);
- }
- }
- reader.ReadFullStartElement(XD.OleTxTransactionExternalDictionary.OleTxTransaction,
- XD.OleTxTransactionExternalDictionary.Namespace);
- byte[] propagationToken = ReadPropagationTokenElement(reader);
- // Skip extensibility elements...
- while (reader.IsStartElement())
- {
- reader.Skip();
- }
- reader.ReadEndElement();
- return new OleTxTransactionHeader(propagationToken, info);
- }
- public static void WritePropagationTokenElement(XmlDictionaryWriter writer, byte[] propagationToken)
- {
- writer.WriteStartElement(XD.OleTxTransactionExternalDictionary.PropagationToken,
- XD.OleTxTransactionExternalDictionary.Namespace);
- writer.WriteBase64(propagationToken, 0, propagationToken.Length);
- writer.WriteEndElement();
- }
- public static bool IsStartPropagationTokenElement(XmlDictionaryReader reader)
- {
- return reader.IsStartElement(XD.OleTxTransactionExternalDictionary.PropagationToken,
- XD.OleTxTransactionExternalDictionary.Namespace);
- }
- public static byte[] ReadPropagationTokenElement(XmlDictionaryReader reader)
- {
- reader.ReadFullStartElement(XD.OleTxTransactionExternalDictionary.PropagationToken,
- XD.OleTxTransactionExternalDictionary.Namespace);
- byte[] propagationToken = reader.ReadContentAsBase64();
- if (propagationToken.Length == 0)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.GetString(SR.InvalidPropagationToken)));
- }
- reader.ReadEndElement();
- return propagationToken;
- }
- }
- }
|