Code:
/ 4.0 / 4.0 / 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.
//----------------------------------------------------------------------------
//
//
// 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

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AppSettingsReader.cs
- ApplicationServiceManager.cs
- SkinBuilder.cs
- LinkButton.cs
- PinnedBufferMemoryStream.cs
- InkCanvasSelection.cs
- DataBinding.cs
- Label.cs
- XmlSchemaAttribute.cs
- SkipStoryboardToFill.cs
- SafeMemoryMappedFileHandle.cs
- EpmSyndicationContentDeSerializer.cs
- TextBoxBase.cs
- StickyNote.cs
- ValidatingPropertiesEventArgs.cs
- PrinterUnitConvert.cs
- TagMapInfo.cs
- InputBinder.cs
- HttpDebugHandler.cs
- PathNode.cs
- Vector3DCollectionConverter.cs
- SystemInfo.cs
- PageCache.cs
- FrameworkElementFactoryMarkupObject.cs
- DropShadowEffect.cs
- ExecutionEngineException.cs
- Form.cs
- BasicHttpBindingElement.cs
- SQLDateTime.cs
- GridView.cs
- SqlRecordBuffer.cs
- HtmlTable.cs
- assemblycache.cs
- XhtmlBasicListAdapter.cs
- XmlElement.cs
- StateChangeEvent.cs
- StrokeDescriptor.cs
- X509Chain.cs
- Dynamic.cs
- InfoCardTrace.cs
- BatchParser.cs
- ValidationErrorEventArgs.cs
- RC2.cs
- VerticalAlignConverter.cs
- MouseEventArgs.cs
- CapabilitiesUse.cs
- OutputCacheSettingsSection.cs
- StyleSheet.cs
- SettingsAttributeDictionary.cs
- DocumentSchemaValidator.cs
- SafeViewOfFileHandle.cs
- CodeDOMProvider.cs
- BindMarkupExtensionSerializer.cs
- LayoutSettings.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- ProcessingInstructionAction.cs
- SqlUserDefinedAggregateAttribute.cs
- FrameworkContentElementAutomationPeer.cs
- GridViewRowEventArgs.cs
- COM2IDispatchConverter.cs
- TextureBrush.cs
- XmlArrayItemAttributes.cs
- AutoFocusStyle.xaml.cs
- RootBrowserWindowProxy.cs
- ChildDocumentBlock.cs
- path.cs
- ElementMarkupObject.cs
- ColumnTypeConverter.cs
- isolationinterop.cs
- CacheRequest.cs
- SplitterDesigner.cs
- PeerTransportListenAddressConverter.cs
- JoinGraph.cs
- listitem.cs
- TextBoxLine.cs
- ProfileGroupSettingsCollection.cs
- ListViewGroupConverter.cs
- SqlUtils.cs
- DataGridViewDataConnection.cs
- ServiceX509SecurityTokenProvider.cs
- PriorityBinding.cs
- ItemsPresenter.cs
- PerformanceCounterCategory.cs
- EntityTypeEmitter.cs
- PropertyGrid.cs
- ServerValidateEventArgs.cs
- ButtonBase.cs
- ToolboxService.cs
- Stack.cs
- BindableAttribute.cs
- ExtensibleSyndicationObject.cs
- ConnectionConsumerAttribute.cs
- XmlArrayItemAttribute.cs
- DependencyObject.cs
- ExpressionVisitorHelpers.cs
- prompt.cs
- AppDomainFactory.cs
- ToolboxItemAttribute.cs
- _UriTypeConverter.cs
- ToolStripSeparator.cs