Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- EmptyCollection.cs
- WebServiceParameterData.cs
- ControlBindingsConverter.cs
- HideDisabledControlAdapter.cs
- HttpWebRequestElement.cs
- Size.cs
- XmlDataSource.cs
- altserialization.cs
- WorkflowDurableInstance.cs
- FunctionQuery.cs
- BuildProvider.cs
- SapiRecoInterop.cs
- DiagnosticTraceRecords.cs
- UiaCoreApi.cs
- cryptoapiTransform.cs
- PropertyGridEditorPart.cs
- InstanceDataCollection.cs
- ToolStripDesignerAvailabilityAttribute.cs
- RegistrationServices.cs
- SQLMembershipProvider.cs
- TransactionManager.cs
- ValidationRuleCollection.cs
- CacheForPrimitiveTypes.cs
- ConsoleKeyInfo.cs
- SoapException.cs
- SqlMethodTransformer.cs
- CompositionAdorner.cs
- RequiredFieldValidator.cs
- Main.cs
- InstalledFontCollection.cs
- WebPartEditorCancelVerb.cs
- ButtonField.cs
- HashMembershipCondition.cs
- BamlCollectionHolder.cs
- SystemWebSectionGroup.cs
- DataConnectionHelper.cs
- Odbc32.cs
- Material.cs
- InvokeGenerator.cs
- XPathEmptyIterator.cs
- HtmlWindow.cs
- WorkerRequest.cs
- DBConnectionString.cs
- Baml6ConstructorInfo.cs
- ExternalDataExchangeService.cs
- PropertyEmitterBase.cs
- DynamicQueryableWrapper.cs
- ContainerTracking.cs
- InternalConfirm.cs
- Label.cs
- _DigestClient.cs
- HelpProvider.cs
- CustomAttributeSerializer.cs
- BitmapEffectOutputConnector.cs
- NameSpaceExtractor.cs
- embossbitmapeffect.cs
- HtmlControlPersistable.cs
- SharingService.cs
- ModelFactory.cs
- InkPresenterAutomationPeer.cs
- ConnectionManagementSection.cs
- SeverityFilter.cs
- HostSecurityManager.cs
- InvokeMemberBinder.cs
- IHttpResponseInternal.cs
- DocumentPageViewAutomationPeer.cs
- Funcletizer.cs
- TextAnchor.cs
- WebBrowserDocumentCompletedEventHandler.cs
- DbProviderServices.cs
- SecurityKeyUsage.cs
- DetailsViewRowCollection.cs
- PointHitTestResult.cs
- MasterPageParser.cs
- RegexCapture.cs
- BitmapPalettes.cs
- DataDocumentXPathNavigator.cs
- SimpleTextLine.cs
- WebPartUtil.cs
- BasicHttpMessageSecurityElement.cs
- SqlUtil.cs
- TextParaClient.cs
- SourceItem.cs
- TextFormatter.cs
- SqlProfileProvider.cs
- CalendarDateChangedEventArgs.cs
- DocumentSequenceHighlightLayer.cs
- AppDomainProtocolHandler.cs
- PrintDialog.cs
- GridEntryCollection.cs
- PasswordRecovery.cs
- FrameworkContextData.cs
- QueryExpr.cs
- TypeConverterAttribute.cs
- ToolBar.cs
- ImageSourceConverter.cs
- SchemaDeclBase.cs
- DecoderExceptionFallback.cs
- ApplicationBuildProvider.cs
- WebBrowserContainer.cs