File: System\ServiceModel\Transactions\TransactionFormatter.cs
Project: ndp\cdf\src\WCF\ServiceModel\System.ServiceModel.csproj (System.ServiceModel)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel.Transactions
{
    using System;
    using System.ServiceModel.Channels;
    using System.Diagnostics;
    using System.ServiceModel;
    using System.Transactions;
 
    abstract class TransactionFormatter
    {
        static TransactionFormatter oleTxFormatter = new OleTxTransactionFormatter();
        static object syncRoot = new object();
 
        public static TransactionFormatter OleTxFormatter
        {
            get { return oleTxFormatter; }
        }
 
        // Double-checked locking pattern requires volatile for read/write synchronization
        static volatile TransactionFormatter wsatFormatter10;
        public static TransactionFormatter WsatFormatter10
        {
            get
            {
                if (wsatFormatter10 == null)
                {
                    lock (syncRoot)
                    {
                        if (wsatFormatter10 == null)
                        {
                            wsatFormatter10 = new WsatTransactionFormatter10();
                        }
                    }
                }
                return wsatFormatter10;
            }
        }
 
        // Double-checked locking pattern requires volatile for read/write synchronization
        static volatile TransactionFormatter wsatFormatter11;
        public static TransactionFormatter WsatFormatter11
        {
            get
            {
                if (wsatFormatter11 == null)
                {
                    lock (syncRoot)
                    {
                        if (wsatFormatter11 == null)
                        {
                            wsatFormatter11 = new WsatTransactionFormatter11();
                        }
                    }
                }
                return wsatFormatter11;
            }
        }
 
        public abstract MessageHeader EmptyTransactionHeader
        {
            get;
        }
 
        // Write transaction information to a message
        //
        // Return the transaction protocols that were successfully written to the message
        // Throw TransactionException if something goes wrong (e.g., TM comms failure)
        public abstract void WriteTransaction(Transaction transaction, Message message);
 
        // Read transaction information from a message
        // 
        // Return a TransactionInfo instance if transaction headers are present in the message
        // Return null if no transaction headers are present in the message
        // Throw TransactionException if something goes wrong (e.g., malformed XML)
        public abstract TransactionInfo ReadTransaction(Message message);
    }
 
    abstract class TransactionInfo
    {
        // Convert transaction information from a message into an actual transaction
        //
        // Return a transaction instance if successful (fallback down the list of protocols as needed)
        // Throw TransactionException if a could not be unmarshaled.
        //
        // Should not throw an exception
        public abstract Transaction UnmarshalTransaction();
    }
}