File: infocard\client\System\IdentityModel\Selectors\InternalPolicyElement.cs
Project: ndp\cdf\src\WCF\System.IdentityModel.Selectors.csproj (System.IdentityModel.Selectors)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IdentityModel.Selectors
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Xml;
 
    using Microsoft.InfoCards.Diagnostics;
    using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;
 
    //
    // Summary:
    //  This is the managed representation of the native POLICY_ELEMENT struct.  This internal version
    //  knows how to Marshal itself and manages the native memory associated with a marshaled POLICY_ELEMENT.
    //
    internal class InternalPolicyElement : IDisposable
    {
        CardSpacePolicyElement m_element;
 
        NativePolicyElement m_nativeElement;
 
        IntPtr m_nativePtr;
 
 
 
        //
        // Parameters:
        //  target     - The target of the token being described.
        //  parameters - describes the type of token required by the target.
        //
        public InternalPolicyElement(CardSpacePolicyElement element)
        {
            m_nativePtr = IntPtr.Zero;
            if (null == element.Target)
            {
                throw IDT.ThrowHelperArgumentNull("PolicyElement.Target");
            }
 
            m_element = element;
        }
 
        public static int Size
        {
            get
            {
                return Marshal.SizeOf(typeof(NativePolicyElement));
            }
        }
 
        //
        // Summary:
        //  Marshals the PolicyElement to it's native format.
        //
        // Parameters:
        //  ptr  - A pointer to native memory in which to place the native format of the PolicyElement.  Must be
        //         a buffer atleast as large as this.Size.
        //
        public void DoMarshal(IntPtr ptr)
        {
            string target = m_element.Target.OuterXml;
            string issuer = "";
 
            IDT.DebugAssert(IntPtr.Zero == m_nativePtr, "Pointer already assigned");
 
            m_nativePtr = ptr;
            if (m_element.Issuer != null)
            {
                issuer = m_element.Issuer.OuterXml;
            }
            string tokenParameters = string.Empty;
            if (null != m_element.Parameters)
            {
                tokenParameters = CardSpaceSelector.XmlToString(m_element.Parameters);
            }
 
            m_nativeElement.targetEndpointAddress = target;
            m_nativeElement.issuerEndpointAddress = issuer;
            m_nativeElement.issuedTokenParameters = tokenParameters;
            m_nativeElement.policyNoticeLink = null != m_element.PolicyNoticeLink ? m_element.PolicyNoticeLink.ToString() : null;
            m_nativeElement.policyNoticeVersion = m_element.PolicyNoticeVersion;
            m_nativeElement.isManagedCardProvider = m_element.IsManagedIssuer;
 
            Marshal.StructureToPtr(m_nativeElement, ptr, false);
 
            return;
        }
 
        public void Dispose()
        {
            Dispose(true);
        }
 
        ~InternalPolicyElement()
        {
            Dispose(false);
        }
 
        private void Dispose(bool disposing)
        {
 
            if (IntPtr.Zero != m_nativePtr)
            {
                Marshal.DestroyStructure(m_nativePtr, typeof(NativePolicyElement));
                m_nativePtr = IntPtr.Zero;
            }
            if (disposing)
            {
                GC.SuppressFinalize(this);
            }
 
        }
    }
}