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 / Input / Stylus / PenThreadPool.cs / 1 / PenThreadPool.cs
using System; using System.Collections.Generic; using System.Threading; using System.Windows.Threading; using System.Security; using System.Security.Permissions; using MS.Win32.Penimc; namespace System.Windows.Input { ///////////////////////////////////////////////////////////////////////// ////// /// internal class PenThreadPool { ////// Critical - Constructor for singleton of our PenThreadPool. /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// Instance (above) /// /// [SecurityCritical] static PenThreadPool() { } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] [ThreadStatic] private static PenThreadPool _penThreadPool; ///////////////////////////////////////////////////////////////////// ////// ////// Critical - Returns a PenThread (creates as needed). /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// PenContext.Dispose /// PenContext.Enable /// PenContext.Disable /// /// [SecurityCritical] internal static PenThread GetPenThreadForPenContext(PenContext penContext) { // Create the threadstatic DynamicRendererThreadManager as needed for calling thread. // It only creates one if (_penThreadPool == null) { _penThreadPool = new PenThreadPool(); } return _penThreadPool.GetPenThreadForPenContextHelper(penContext); // Adds to weak ref list if creating new one. } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] private List_penThreadWeakRefList; ///////////////////////////////////////////////////////////////////// /// /// /// ////// Critical - Initializes critical data: m_PenThreads /// /// [SecurityCritical] internal PenThreadPool() { _penThreadWeakRefList = new List(); } /// /// Critical - Calls SecurityCritical code (PenThread constructor). /// Called by BeginService. /// TreatAsSafe boundry is Stylus.EnableCore, Stylus.RegisterHwndForInput /// and HwndWrapperHook class (via HwndSource.InputFilterMessage). /// [SecurityCritical] private PenThread GetPenThreadForPenContextHelper(PenContext penContext) { bool needCleanup = false; PenThread penThread = null; int i; // Scan existing penthreads to see if we have an available slot for context. for (i=0; i < _penThreadWeakRefList.Count; i++) { PenThread penThreadFound = _penThreadWeakRefList[i].Target as PenThread; if (penThreadFound == null) { needCleanup = true; } else { // See if we can use this one if (penContext == null || penThreadFound.AddPenContext(penContext)) { // We can use this one. penThread = penThreadFound; break; } } } if (needCleanup) { // prune invalid refs for (i=_penThreadWeakRefList.Count - 1; i >= 0; i--) { if (_penThreadWeakRefList[i].Target == null) { _penThreadWeakRefList.RemoveAt(i); } } } if (penThread == null) { penThread = new PenThread(); // Make sure we add this context to the penthread if (penContext != null) { penThread.AddPenContext(penContext); } _penThreadWeakRefList.Add(new WeakReference(penThread)); } return penThread; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections.Generic; using System.Threading; using System.Windows.Threading; using System.Security; using System.Security.Permissions; using MS.Win32.Penimc; namespace System.Windows.Input { ///////////////////////////////////////////////////////////////////////// ////// /// internal class PenThreadPool { ////// Critical - Constructor for singleton of our PenThreadPool. /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// Instance (above) /// /// [SecurityCritical] static PenThreadPool() { } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] [ThreadStatic] private static PenThreadPool _penThreadPool; ///////////////////////////////////////////////////////////////////// ////// ////// Critical - Returns a PenThread (creates as needed). /// marking this critical to prevent inadvertant access by transparent code /// /// Called by critical methods: /// PenContext.Dispose /// PenContext.Enable /// PenContext.Disable /// /// [SecurityCritical] internal static PenThread GetPenThreadForPenContext(PenContext penContext) { // Create the threadstatic DynamicRendererThreadManager as needed for calling thread. // It only creates one if (_penThreadPool == null) { _penThreadPool = new PenThreadPool(); } return _penThreadPool.GetPenThreadForPenContextHelper(penContext); // Adds to weak ref list if creating new one. } ///////////////////////////////////////////////////////////////////// ////// /// ////// Critical - marking this critical to prevent inadvertant /// access by transparent code /// /// [SecurityCritical] private List_penThreadWeakRefList; ///////////////////////////////////////////////////////////////////// /// /// /// ////// Critical - Initializes critical data: m_PenThreads /// /// [SecurityCritical] internal PenThreadPool() { _penThreadWeakRefList = new List(); } /// /// Critical - Calls SecurityCritical code (PenThread constructor). /// Called by BeginService. /// TreatAsSafe boundry is Stylus.EnableCore, Stylus.RegisterHwndForInput /// and HwndWrapperHook class (via HwndSource.InputFilterMessage). /// [SecurityCritical] private PenThread GetPenThreadForPenContextHelper(PenContext penContext) { bool needCleanup = false; PenThread penThread = null; int i; // Scan existing penthreads to see if we have an available slot for context. for (i=0; i < _penThreadWeakRefList.Count; i++) { PenThread penThreadFound = _penThreadWeakRefList[i].Target as PenThread; if (penThreadFound == null) { needCleanup = true; } else { // See if we can use this one if (penContext == null || penThreadFound.AddPenContext(penContext)) { // We can use this one. penThread = penThreadFound; break; } } } if (needCleanup) { // prune invalid refs for (i=_penThreadWeakRefList.Count - 1; i >= 0; i--) { if (_penThreadWeakRefList[i].Target == null) { _penThreadWeakRefList.RemoveAt(i); } } } if (penThread == null) { penThread = new PenThread(); // Make sure we add this context to the penthread if (penContext != null) { penThread.AddPenContext(penContext); } _penThreadWeakRefList.Add(new WeakReference(penThread)); } return penThread; } } } // 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
- OrderedEnumerableRowCollection.cs
- Selector.cs
- SemanticBasicElement.cs
- TypePresenter.xaml.cs
- RowCache.cs
- RequestSecurityTokenSerializer.cs
- DataGridViewCellCollection.cs
- CellIdBoolean.cs
- MDIWindowDialog.cs
- MethodCallTranslator.cs
- RelationHandler.cs
- CacheMode.cs
- DataGridViewCheckBoxColumn.cs
- Schema.cs
- PageParser.cs
- __ConsoleStream.cs
- ProcessModuleCollection.cs
- FixedTextContainer.cs
- CacheVirtualItemsEvent.cs
- Pkcs7Recipient.cs
- SqlRecordBuffer.cs
- Tile.cs
- IItemContainerGenerator.cs
- SecUtil.cs
- HttpWebResponse.cs
- DataGridViewCellParsingEventArgs.cs
- PerformanceCounter.cs
- ImageKeyConverter.cs
- ECDiffieHellman.cs
- COM2PropertyPageUITypeConverter.cs
- Overlapped.cs
- CommandCollectionEditor.cs
- ThemeInfoAttribute.cs
- KeyedPriorityQueue.cs
- SetIterators.cs
- ThicknessConverter.cs
- FormViewInsertedEventArgs.cs
- CatalogPartChrome.cs
- TabPage.cs
- InitiatorSessionSymmetricMessageSecurityProtocol.cs
- XPathNodeIterator.cs
- Splitter.cs
- ColumnCollection.cs
- HtmlInputButton.cs
- SafeEventLogWriteHandle.cs
- PersonalizationState.cs
- ADConnectionHelper.cs
- TextEncodedRawTextWriter.cs
- SystemTcpConnection.cs
- EventPrivateKey.cs
- HwndSourceParameters.cs
- HttpInputStream.cs
- CatalogZoneBase.cs
- Regex.cs
- HeaderedContentControl.cs
- GetPolicyDetailsRequest.cs
- TextureBrush.cs
- TreeViewTemplateSelector.cs
- VirtualDirectoryMappingCollection.cs
- Context.cs
- X509SecurityToken.cs
- TextFindEngine.cs
- SystemIcmpV4Statistics.cs
- CommandHelper.cs
- CodeComment.cs
- DataStreamFromComStream.cs
- FixedSOMPageElement.cs
- DetailsViewUpdatedEventArgs.cs
- WindowsToolbar.cs
- GroupBox.cs
- TargetInvocationException.cs
- RegexBoyerMoore.cs
- PeerApplication.cs
- RelationshipType.cs
- HyperLinkColumn.cs
- EmissiveMaterial.cs
- Util.cs
- PersonalizationState.cs
- FunctionGenerator.cs
- DBConnectionString.cs
- WindowsListViewScroll.cs
- FormsIdentity.cs
- PlainXmlDeserializer.cs
- Trigger.cs
- ComplexPropertyEntry.cs
- entityreference_tresulttype.cs
- SqlDataSourceRefreshSchemaForm.cs
- HttpCachePolicyWrapper.cs
- DynamicUpdateCommand.cs
- XmlValidatingReader.cs
- ReadOnlyDictionary.cs
- ArrayList.cs
- PositiveTimeSpanValidator.cs
- Operator.cs
- Compiler.cs
- MessageQueueConverter.cs
- SubordinateTransaction.cs
- StickyNoteHelper.cs
- ListView.cs
- RepeatButton.cs