TextServicesCompartment.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Input / TextServicesCompartment.cs / 1305600 / TextServicesCompartment.cs

                            //---------------------------------------------------------------------------- 
//
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved.
//  
//
// Description: Manages Text Services Compartment. 
// 
// History:
//  07/30/2003 : yutakas - Ported from .net tree. 
//
//---------------------------------------------------------------------------

using System; 
using System.Runtime.InteropServices;
using System.Windows.Threading; 
 
using System.Security;
using System.Security.Permissions; 
using System.Diagnostics;
using System.Collections;
using MS.Utility;
using MS.Win32; 
using MS.Internal;
 
namespace System.Windows.Input 
{
    //----------------------------------------------------- 
    //
    //  TextServicesCompartment class
    //
    //----------------------------------------------------- 

    internal class TextServicesCompartment 
    { 
        //------------------------------------------------------
        // 
        //  Constructors
        //
        //-----------------------------------------------------
 
        /// 
        /// Critical - directly calls unmanaged code based on guid 
        ///  
        [SecurityCritical]
        internal TextServicesCompartment(Guid guid, UnsafeNativeMethods.ITfCompartmentMgr compartmentmgr) 
        {
            _guid = guid;
            _compartmentmgr = new SecurityCriticalData(compartmentmgr);
            _cookie = UnsafeNativeMethods.TF_INVALID_COOKIE; 
        }
 
        //------------------------------------------------------ 
        //
        //  Public Methods 
        //
        //------------------------------------------------------

        #region Public Methods 
        #endregion Public Methods
 
        //----------------------------------------------------- 
        //
        //  Public Operators 
        //
        //------------------------------------------------------

 
        //-----------------------------------------------------
        // 
        //  Public Properties 
        //
        //----------------------------------------------------- 


        //-----------------------------------------------------
        // 
        //  Public Events
        // 
        //------------------------------------------------------ 

 
        //-----------------------------------------------------
        //
        //  Protected Methods
        // 
        //------------------------------------------------------
 
 
        //------------------------------------------------------
        // 
        //  Internal Methods
        //
        //-----------------------------------------------------
 
        #region Internal Methods
 
        ///  
        ///     Advise the notify sink of the compartment update.
        ///  
        /// 
        /// Critical - wires up multiple unmanaged objects together
        /// 
        [SecurityCritical] 
        internal void AdviseNotifySink(UnsafeNativeMethods.ITfCompartmentEventSink sink)
        { 
            Debug.Assert(_cookie == UnsafeNativeMethods.TF_INVALID_COOKIE, "cookie is already set."); 

            UnsafeNativeMethods.ITfCompartment compartment = GetITfCompartment(); 
            if (compartment == null)
                return;

            UnsafeNativeMethods.ITfSource source = compartment as UnsafeNativeMethods.ITfSource; 

            // workaround because I can't pass a ref to a readonly constant 
            Guid guid = UnsafeNativeMethods.IID_ITfCompartmentEventSink; 

            source.AdviseSink(ref guid, sink, out _cookie); 
            Marshal.ReleaseComObject(compartment);
            Marshal.ReleaseComObject(source);
        }
 
        /// 
        ///     Unadvise the notify sink of the compartment update. 
        ///  
        /// 
        /// Critical - wires up multiple unmanaged objects together 
        /// 
        [SecurityCritical]
        internal void UnadviseNotifySink()
        { 
            Debug.Assert(_cookie != UnsafeNativeMethods.TF_INVALID_COOKIE, "cookie is not set.");
 
            UnsafeNativeMethods.ITfCompartment compartment = GetITfCompartment(); 
            if (compartment == null)
                return; 

            UnsafeNativeMethods.ITfSource source = compartment as UnsafeNativeMethods.ITfSource;
            source.UnadviseSink(_cookie);
            _cookie = UnsafeNativeMethods.TF_INVALID_COOKIE; 

            Marshal.ReleaseComObject(compartment); 
            Marshal.ReleaseComObject(source); 
        }
 
        /// 
        ///    Retrieve ITfCompartment
        /// 
        ///  
        /// Critical - returns critical resource
        ///  
        [SecurityCritical] 
        internal UnsafeNativeMethods.ITfCompartment GetITfCompartment()
        { 
            UnsafeNativeMethods.ITfCompartment itfcompartment;
            _compartmentmgr.Value.GetCompartment(ref _guid, out itfcompartment);
            return itfcompartment;
        } 

        #endregion Internal methods 
 
        //------------------------------------------------------
        // 
        //  Internal Properties
        //
        //-----------------------------------------------------
 
        #region Internal Properties
 
        ///  
        ///     Cast the compartment variant to bool.
        ///  
        internal bool BooleanValue
        {
            get
            { 
                object obj = Value;
                if (obj == null) 
                    return false; 

                if ((int)obj != 0) 
                    return true;

                return false;
            } 
            set
            { 
                Value = value ? 1 : 0; 
            }
        } 

        /// 
        ///     Cast the compartment variant to int.
        ///  
        internal int IntValue
        { 
            get 
            {
                object obj = Value; 
                if (obj == null)
                    return 0;

                return (int)obj; 
            }
            set 
            { 
                Value = value;
            } 
        }

        /// 
        ///     Get the compartment variant. 
        /// 
        ///  
        /// Critical - access unmanaged code 
        /// TreatAsSafe - returns "safe" variant based value from the store
        ///  
        internal object Value
        {
            [SecurityCritical, SecurityTreatAsSafe]
            get 
            {
                UnsafeNativeMethods.ITfCompartment compartment = GetITfCompartment(); 
 
                if (compartment == null)
                    return null; 

                object obj;

                compartment.GetValue(out obj); 

                Marshal.ReleaseComObject(compartment); 
 
                return obj;
            } 
            [SecurityCritical, SecurityTreatAsSafe]
            set
            {
                UnsafeNativeMethods.ITfCompartment compartment = GetITfCompartment(); 

                if (compartment == null) 
                    return; 

                compartment.SetValue(0 /* clientid */, ref value); 
                Marshal.ReleaseComObject(compartment);
            }
        }
 
        #endregion Internal Properties
 
        //----------------------------------------------------- 
        //
        //  Private Methods 
        //
        //-----------------------------------------------------

        //------------------------------------------------------ 
        //
        //  Private Fields 
        // 
        //-----------------------------------------------------
 
        #region Private Fields

        /// 
        ///     Critical: UnsafeNativeMethods.ITfCompartmentMgr has methods with SuppressUnmanagedCodeSecurity. 
        /// 
        private readonly SecurityCriticalData _compartmentmgr; 
 
        private Guid _guid;
        private int _cookie; 

        #endregion Private Fields

    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK