Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Core / CSharp / System / Windows / OleServicesContext.cs / 1 / OleServicesContext.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description: Ole Services for DragDrop and Clipboard.
//
// History:
// 05/05/2004 : sangilj - Created.
//
//---------------------------------------------------------------------------
using MS.Win32;
using MS.Internal;
using System.Security;
using System.Security.Permissions;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Threading;
using System.Windows.Input;
using SR=MS.Internal.PresentationCore.SR;
using SRID=MS.Internal.PresentationCore.SRID;
using IComDataObject = System.Runtime.InteropServices.ComTypes.IDataObject;
namespace System.Windows
{
//-----------------------------------------------------
//
// OleServicesContext class
//
//-----------------------------------------------------
///
/// This class manages Ole services for DragDrop and Clipboard.
/// The instance of OleServicesContext class is created per Thread...Dispatcher.
///
///
///
//
internal class OleServicesContext
{
//------------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// Instantiates a OleServicesContext.
///
private OleServicesContext()
{
// We need to get the Dispatcher Thread in order to get OLE DragDrop and Clipboard services that
// require STA.
SetDispatcherThread();
}
#endregion Constructors
//------------------------------------------------------
//
// Internal Properties
//
//------------------------------------------------------
#region Internal Properties
///
/// Get the ole services context associated with the current Thread.
///
internal static OleServicesContext CurrentOleServicesContext
{
get
{
OleServicesContext oleServicesContext;
// Get the ole services context from the Thread data slot.
oleServicesContext = (OleServicesContext)Thread.GetData(OleServicesContext._threadDataSlot);
if (oleServicesContext == null)
{
// Create OleSErvicesContext instance.
oleServicesContext = new OleServicesContext();
// Save the ole services context into the UIContext data slot.
Thread.SetData(OleServicesContext._threadDataSlot, oleServicesContext);
}
return oleServicesContext;
}
}
#endregion Internal Properties
//-----------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
///
/// OleSetClipboard - Call OLE Interopo OleSetClipboard()
///
///
/// Critical - calls unsafe methods, and passes native pointer to native code...
///
[SecurityCritical]
internal int OleSetClipboard(IComDataObject dataObject)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleSetClipboard(dataObject);
}
///
/// OleGetClipboard - Call OLE Interop OleGetClipboard()
///
///
/// Critical - gets critical data from the clipboard... defense in depth, we still
/// protect the data (because you need to use COM interop to get to it)
/// but we want to track the people accessing this.
///
[SecurityCritical]
internal int OleGetClipboard(ref IComDataObject dataObject)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleGetClipboard(ref dataObject);
}
///
/// OleFlushClipboard - Call OLE Interop OleFlushClipboard()
///
///
/// Critical - calls critical code, flushes data to clipboard
/// TreatAsSafe - flushing the data is always acceptable to
/// do, only penalty would be performance.
///
[SecurityCritical, SecurityTreatAsSafe]
internal int OleFlushClipboard()
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleFlushClipboard();
}
///
/// OleIsCurrentClipboard - OleIsCurrentClipboard only works for the data object
/// used in the OleSetClipboard. This means that it can’t be called by the consumer
/// of the data object to determine if the object that was on the clipboard at the
/// previous OleGetClipboard call is still on the Clipboard.
///
///
/// Critical - calls critical code: OleIsCurrentClipboard.
/// TreatAsSafe - Determining if a data object is still on the clipboard does not pose a security risk.
///
[SecurityCritical, SecurityTreatAsSafe]
internal int OleIsCurrentClipboard(IComDataObject dataObject)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleIsCurrentClipboard(dataObject);
}
///
/// OleDoDragDrop - Call OLE Interop DoDragDrop()
/// Initiate OLE DragDrop
///
///
/// Critical: Since it calls to Dispatcher.InputManager
/// TreatAsSafe: Since it does not expose the InputManager
///
[SecurityCritical,SecurityTreatAsSafe]
internal void OleDoDragDrop(IComDataObject dataObject, UnsafeNativeMethods.IOleDropSource dropSource, int allowedEffects, int[] finalEffect)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
InputManager inputManager = (InputManager)Dispatcher.CurrentDispatcher.InputManager;
if (inputManager != null)
{
inputManager.InDragDrop = true;
}
try
{
UnsafeNativeMethods.DoDragDrop(dataObject, dropSource, allowedEffects, finalEffect);
}
finally
{
if (inputManager != null)
{
inputManager.InDragDrop = false;
}
}
}
///
/// OleRegisterDragDrop - Call OLE Interop RegisterDragDrop()
///
internal int OleRegisterDragDrop(HandleRef windowHandle, UnsafeNativeMethods.IOleDropTarget dropTarget)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.RegisterDragDrop(windowHandle, dropTarget);
}
///
/// OleRevokeDragDrop - Call OLE Interop RevokeDragDrop()
///
internal int OleRevokeDragDrop(HandleRef windowHandle)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.RevokeDragDrop(windowHandle);
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
#region Private Methods
///
/// SetDispatcherThread - Initialize OleServicesContext that will call Ole initialize for ole services(DragDrop and Clipboard)
/// and add the disposed event handler of Dispatcher to clean up resources and uninitalize Ole.
///
private void SetDispatcherThread()
{
int hr;
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
// Initialize Ole services.
// Balanced with OleUninitialize call in OnDispatcherShutdown.
hr = OleInitialize();
if (!NativeMethods.Succeeded(hr))
{
throw new SystemException(SR.Get(SRID.OleServicesContext_oleInitializeFailure, hr));
}
// Add Dispatcher.Shutdown event handler.
// We will call ole Uninitialize and clean up the resource when UIContext is terminated.
Dispatcher.CurrentDispatcher.ShutdownFinished += new EventHandler(OnDispatcherShutdown);
}
///
/// This is a callback when Dispatcher is shut down.
///
///
/// This method must be called before shutting down the application
/// on the dispatcher thread. It must be called by the same
/// thread running the dispatcher and the thread must have its
/// ApartmentState property set to ApartmentState.STA.
///
private void OnDispatcherShutdown(object sender, EventArgs args)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
// Uninitialize Ole services.
// Balanced with OleInitialize call in SetDispatcherThread.
OleUninitialize();
}
// Wrapper for UnsafeNativeMethods.OleInitialize, useful for debugging.
///
/// Critical - calls critical method (OleInitialize)
/// TreatAsSafe - safe to call anytime (ref counting issues aside)
///
[SecurityCritical,SecurityTreatAsSafe]
private int OleInitialize()
{
#if DEBUG
_debugOleInitializeRefCount++;
#endif // DEBUG
return UnsafeNativeMethods.OleInitialize();
}
// Wrapper for UnsafeNativeMethods.OleUninitialize, useful for debugging.
///
/// Critical - calls critical method (OleUninitialize)
/// TreatAsSafe - safe to call OLeUninitialize
///
[SecurityCritical, SecurityTreatAsSafe]
private int OleUninitialize()
{
int hr;
hr = UnsafeNativeMethods.OleUninitialize();
#if DEBUG
_debugOleInitializeRefCount--;
Invariant.Assert(_debugOleInitializeRefCount >= 0, "Unbalanced call to OleUnitialize!");
#endif // DEBUG
return hr;
}
#endregion Private Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
// This is a slot to store OleServicesContext class per thread.
private static readonly LocalDataStoreSlot _threadDataSlot = Thread.AllocateDataSlot();
#if DEBUG
// Ref count of calls to OleInitialize/OleUnitialize.
private int _debugOleInitializeRefCount;
#endif // DEBUG
#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: Ole Services for DragDrop and Clipboard.
//
// History:
// 05/05/2004 : sangilj - Created.
//
//---------------------------------------------------------------------------
using MS.Win32;
using MS.Internal;
using System.Security;
using System.Security.Permissions;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Threading;
using System.Windows.Input;
using SR=MS.Internal.PresentationCore.SR;
using SRID=MS.Internal.PresentationCore.SRID;
using IComDataObject = System.Runtime.InteropServices.ComTypes.IDataObject;
namespace System.Windows
{
//-----------------------------------------------------
//
// OleServicesContext class
//
//-----------------------------------------------------
///
/// This class manages Ole services for DragDrop and Clipboard.
/// The instance of OleServicesContext class is created per Thread...Dispatcher.
///
///
///
//
internal class OleServicesContext
{
//------------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// Instantiates a OleServicesContext.
///
private OleServicesContext()
{
// We need to get the Dispatcher Thread in order to get OLE DragDrop and Clipboard services that
// require STA.
SetDispatcherThread();
}
#endregion Constructors
//------------------------------------------------------
//
// Internal Properties
//
//------------------------------------------------------
#region Internal Properties
///
/// Get the ole services context associated with the current Thread.
///
internal static OleServicesContext CurrentOleServicesContext
{
get
{
OleServicesContext oleServicesContext;
// Get the ole services context from the Thread data slot.
oleServicesContext = (OleServicesContext)Thread.GetData(OleServicesContext._threadDataSlot);
if (oleServicesContext == null)
{
// Create OleSErvicesContext instance.
oleServicesContext = new OleServicesContext();
// Save the ole services context into the UIContext data slot.
Thread.SetData(OleServicesContext._threadDataSlot, oleServicesContext);
}
return oleServicesContext;
}
}
#endregion Internal Properties
//-----------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
///
/// OleSetClipboard - Call OLE Interopo OleSetClipboard()
///
///
/// Critical - calls unsafe methods, and passes native pointer to native code...
///
[SecurityCritical]
internal int OleSetClipboard(IComDataObject dataObject)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleSetClipboard(dataObject);
}
///
/// OleGetClipboard - Call OLE Interop OleGetClipboard()
///
///
/// Critical - gets critical data from the clipboard... defense in depth, we still
/// protect the data (because you need to use COM interop to get to it)
/// but we want to track the people accessing this.
///
[SecurityCritical]
internal int OleGetClipboard(ref IComDataObject dataObject)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleGetClipboard(ref dataObject);
}
///
/// OleFlushClipboard - Call OLE Interop OleFlushClipboard()
///
///
/// Critical - calls critical code, flushes data to clipboard
/// TreatAsSafe - flushing the data is always acceptable to
/// do, only penalty would be performance.
///
[SecurityCritical, SecurityTreatAsSafe]
internal int OleFlushClipboard()
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleFlushClipboard();
}
///
/// OleIsCurrentClipboard - OleIsCurrentClipboard only works for the data object
/// used in the OleSetClipboard. This means that it can’t be called by the consumer
/// of the data object to determine if the object that was on the clipboard at the
/// previous OleGetClipboard call is still on the Clipboard.
///
///
/// Critical - calls critical code: OleIsCurrentClipboard.
/// TreatAsSafe - Determining if a data object is still on the clipboard does not pose a security risk.
///
[SecurityCritical, SecurityTreatAsSafe]
internal int OleIsCurrentClipboard(IComDataObject dataObject)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.OleIsCurrentClipboard(dataObject);
}
///
/// OleDoDragDrop - Call OLE Interop DoDragDrop()
/// Initiate OLE DragDrop
///
///
/// Critical: Since it calls to Dispatcher.InputManager
/// TreatAsSafe: Since it does not expose the InputManager
///
[SecurityCritical,SecurityTreatAsSafe]
internal void OleDoDragDrop(IComDataObject dataObject, UnsafeNativeMethods.IOleDropSource dropSource, int allowedEffects, int[] finalEffect)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
InputManager inputManager = (InputManager)Dispatcher.CurrentDispatcher.InputManager;
if (inputManager != null)
{
inputManager.InDragDrop = true;
}
try
{
UnsafeNativeMethods.DoDragDrop(dataObject, dropSource, allowedEffects, finalEffect);
}
finally
{
if (inputManager != null)
{
inputManager.InDragDrop = false;
}
}
}
///
/// OleRegisterDragDrop - Call OLE Interop RegisterDragDrop()
///
internal int OleRegisterDragDrop(HandleRef windowHandle, UnsafeNativeMethods.IOleDropTarget dropTarget)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.RegisterDragDrop(windowHandle, dropTarget);
}
///
/// OleRevokeDragDrop - Call OLE Interop RevokeDragDrop()
///
internal int OleRevokeDragDrop(HandleRef windowHandle)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
return UnsafeNativeMethods.RevokeDragDrop(windowHandle);
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
#region Private Methods
///
/// SetDispatcherThread - Initialize OleServicesContext that will call Ole initialize for ole services(DragDrop and Clipboard)
/// and add the disposed event handler of Dispatcher to clean up resources and uninitalize Ole.
///
private void SetDispatcherThread()
{
int hr;
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
// Initialize Ole services.
// Balanced with OleUninitialize call in OnDispatcherShutdown.
hr = OleInitialize();
if (!NativeMethods.Succeeded(hr))
{
throw new SystemException(SR.Get(SRID.OleServicesContext_oleInitializeFailure, hr));
}
// Add Dispatcher.Shutdown event handler.
// We will call ole Uninitialize and clean up the resource when UIContext is terminated.
Dispatcher.CurrentDispatcher.ShutdownFinished += new EventHandler(OnDispatcherShutdown);
}
///
/// This is a callback when Dispatcher is shut down.
///
///
/// This method must be called before shutting down the application
/// on the dispatcher thread. It must be called by the same
/// thread running the dispatcher and the thread must have its
/// ApartmentState property set to ApartmentState.STA.
///
private void OnDispatcherShutdown(object sender, EventArgs args)
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
throw new ThreadStateException(SR.Get(SRID.OleServicesContext_ThreadMustBeSTA));
}
// Uninitialize Ole services.
// Balanced with OleInitialize call in SetDispatcherThread.
OleUninitialize();
}
// Wrapper for UnsafeNativeMethods.OleInitialize, useful for debugging.
///
/// Critical - calls critical method (OleInitialize)
/// TreatAsSafe - safe to call anytime (ref counting issues aside)
///
[SecurityCritical,SecurityTreatAsSafe]
private int OleInitialize()
{
#if DEBUG
_debugOleInitializeRefCount++;
#endif // DEBUG
return UnsafeNativeMethods.OleInitialize();
}
// Wrapper for UnsafeNativeMethods.OleUninitialize, useful for debugging.
///
/// Critical - calls critical method (OleUninitialize)
/// TreatAsSafe - safe to call OLeUninitialize
///
[SecurityCritical, SecurityTreatAsSafe]
private int OleUninitialize()
{
int hr;
hr = UnsafeNativeMethods.OleUninitialize();
#if DEBUG
_debugOleInitializeRefCount--;
Invariant.Assert(_debugOleInitializeRefCount >= 0, "Unbalanced call to OleUnitialize!");
#endif // DEBUG
return hr;
}
#endregion Private Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
// This is a slot to store OleServicesContext class per thread.
private static readonly LocalDataStoreSlot _threadDataSlot = Thread.AllocateDataSlot();
#if DEBUG
// Ref count of calls to OleInitialize/OleUnitialize.
private int _debugOleInitializeRefCount;
#endif // DEBUG
#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
- ListSourceHelper.cs
- ColorConverter.cs
- ILGenerator.cs
- PersonalizationStateInfoCollection.cs
- SingleStorage.cs
- MatrixTransform3D.cs
- HebrewCalendar.cs
- WebPartsPersonalization.cs
- WinEventTracker.cs
- ToolZoneDesigner.cs
- RenderData.cs
- ListBindingConverter.cs
- DelayedRegex.cs
- TimeZone.cs
- SiteMapDataSourceView.cs
- XmlSchemaSimpleTypeList.cs
- HttpModuleAction.cs
- WhitespaceRule.cs
- TraceContextEventArgs.cs
- QueueTransferProtocol.cs
- Recipient.cs
- PropertySourceInfo.cs
- DataSvcMapFile.cs
- FixedSOMLineCollection.cs
- XmlAttribute.cs
- PointHitTestResult.cs
- ScrollItemProviderWrapper.cs
- ResourceSet.cs
- DetailsViewPagerRow.cs
- IntSecurity.cs
- followingquery.cs
- ParseHttpDate.cs
- PropertyChangedEventManager.cs
- FrameworkContentElementAutomationPeer.cs
- OneWayElement.cs
- ColorConverter.cs
- ClientTargetSection.cs
- DbProviderFactories.cs
- ReservationCollection.cs
- XmlSchemaObject.cs
- FixedSOMSemanticBox.cs
- TypeToken.cs
- ResourceReferenceKeyNotFoundException.cs
- ContainerActivationHelper.cs
- Configuration.cs
- ReflectionTypeLoadException.cs
- DigitalSignature.cs
- ParameterToken.cs
- DbgUtil.cs
- FunctionNode.cs
- HtmlUtf8RawTextWriter.cs
- PermissionSetTriple.cs
- HtmlProps.cs
- SqlNamer.cs
- DataSourceConverter.cs
- BaseTemplateParser.cs
- CurrentTimeZone.cs
- DragDrop.cs
- DataColumnChangeEvent.cs
- CombinedGeometry.cs
- DataServiceBehavior.cs
- Geometry.cs
- LazyLoadBehavior.cs
- ManagementObjectCollection.cs
- Attribute.cs
- PasswordRecoveryAutoFormat.cs
- QuaternionConverter.cs
- ImageFormat.cs
- StateDesigner.Layouts.cs
- OutOfProcStateClientManager.cs
- StdValidatorsAndConverters.cs
- BaseDataBoundControl.cs
- StoreAnnotationsMap.cs
- GatewayDefinition.cs
- ManipulationDevice.cs
- IpcClientManager.cs
- FontConverter.cs
- ToolStripPanel.cs
- RequiredAttributeAttribute.cs
- HMACSHA384.cs
- FixedSOMFixedBlock.cs
- ParallelTimeline.cs
- Walker.cs
- SemanticTag.cs
- MenuScrollingVisibilityConverter.cs
- AlphabeticalEnumConverter.cs
- UrlMapping.cs
- SqlDataSourceCommandParser.cs
- ManagementOptions.cs
- DataBoundControl.cs
- _NestedMultipleAsyncResult.cs
- TextTreeTextElementNode.cs
- UrlMappingsModule.cs
- XPathNodeIterator.cs
- SymmetricAlgorithm.cs
- SemanticTag.cs
- AnnotationMap.cs
- DSASignatureFormatter.cs
- BevelBitmapEffect.cs
- MobileListItem.cs