Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Framework / MS / Internal / PtsHost / PageBreakRecord.cs / 1 / PageBreakRecord.cs
//----------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
// File: PageBreakRecord.cs
//
// Description: Break records for PTS pages.
//
//---------------------------------------------------------------------------
using System; // IntPtr, IDisposable, ...
using System.Threading; // Interlocked
using System.Security; // SecurityCritical
using MS.Internal.PtsHost.UnsafeNativeMethods; // PTS
namespace MS.Internal.PtsHost
{
///
/// PageBreakRecord is used to represent a break record for top level PTS
/// page. Points to break record structure of PTS page.
///
internal sealed class PageBreakRecord : IDisposable
{
//-------------------------------------------------------------------
//
// Constructors
//
//-------------------------------------------------------------------
#region Constructors
///
/// Constructor.
///
/// Current PTS Context.
/// PTS page break record.
/// Page number.
internal PageBreakRecord(PtsContext ptsContext, SecurityCriticalDataForSet br, int pageNumber)
{
Invariant.Assert(ptsContext != null, "Invalid PtsContext object.");
Invariant.Assert(br.Value != IntPtr.Zero, "Invalid break record object.");
_br = br;
_pageNumber = pageNumber;
// In the finalizer we may need to reference an object instance
// to do the right cleanup. For this reason store a WeakReference
// to such object.
_ptsContext = new WeakReference(ptsContext);
// BreakRecord contains unmanaged resources that need to be released when
// BreakRecord is destroyed or Dispatcher is closing. For this reason keep
// track of this BreakRecord in PtsContext.
ptsContext.OnPageBreakRecordCreated(_br);
}
///
/// Finalizer - releases unmanaged resources.
///
~PageBreakRecord()
{
Dispose(false);
}
#endregion Constructors
//--------------------------------------------------------------------
//
// Public Methods
//
//-------------------------------------------------------------------
#region Public Methods
///
/// Dispose allocated resources.
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion Public Methods
//--------------------------------------------------------------------
//
// Internal Properties
//
//--------------------------------------------------------------------
#region Internal Properties
///
/// PTS page break record.
///
internal IntPtr BreakRecord
{
get { return _br.Value; }
}
///
/// Page number of the page starting at the break position.
///
internal int PageNumber
{
get { return _pageNumber; }
}
#endregion Internal Properties
//-------------------------------------------------------------------
//
// Private Methods
//
//--------------------------------------------------------------------
#region Private Methods
///
/// Destroys all unmanaged resources.
///
/// Whether dispose is caused by explicit call to Dispose.
///
/// Finalizer needs to follow rules below:
/// a) Your Finalize method must tolerate partially constructed instances.
/// b) Your Finalize method must consider the consequence of failure.
/// c) Your object is callable after Finalization.
/// d) Your object is callable during Finalization.
/// e) Your Finalizer could be called multiple times.
/// f) Your Finalizer runs in a delicate security context.
/// See: http://blogs.msdn.com/[....]/archive/2004/02/20/77460.aspx
///
///
/// Critical, because sets SecurityCriticalDataForSet.
/// Safe, because sets SecurityCriticalDataForSet to IntPtr.Zero, which is safe.
///
[SecurityCritical, SecurityTreatAsSafe]
private void Dispose(bool disposing)
{
PtsContext ptsContext = null;
// Do actual dispose only once.
if (Interlocked.CompareExchange(ref _disposed, 1, 0) == 0)
{
// Dispose PTS break record.
// According to following article the entire reachable graph from
// a finalizable object is promoted, and it is safe to access its
// members if they do not have their own finalizers.
// Hence it is OK to access _ptsContext during finalization.
// See: http://blogs.msdn.com/[....]/archive/2004/02/20/77460.aspx
ptsContext = _ptsContext.Target as PtsContext;
if (ptsContext != null && !ptsContext.Disposed)
{
// Notify PtsContext that BreakRecord is not used anymore, so all
// associated resources can by destroyed.
ptsContext.OnPageBreakRecordDisposed(_br, disposing);
}
// Cleanup the state.
_br.Value = IntPtr.Zero;
_ptsContext = null;
}
}
#endregion Private Methods
//-------------------------------------------------------------------
//
// Private Fields
//
//-------------------------------------------------------------------
#region Private Fields
///
/// PTS page break record.
///
private SecurityCriticalDataForSet _br;
///
/// Page number of the page starting at the break position.
///
private readonly int _pageNumber;
///
/// In the finalizer we may need to reference an instance of PtsContext
/// to do the right cleanup. For this reason store a WeakReference
/// to it.
///
private WeakReference _ptsContext;
///
/// Whether object is already disposed.
///
private int _disposed;
#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.
//
// File: PageBreakRecord.cs
//
// Description: Break records for PTS pages.
//
//---------------------------------------------------------------------------
using System; // IntPtr, IDisposable, ...
using System.Threading; // Interlocked
using System.Security; // SecurityCritical
using MS.Internal.PtsHost.UnsafeNativeMethods; // PTS
namespace MS.Internal.PtsHost
{
///
/// PageBreakRecord is used to represent a break record for top level PTS
/// page. Points to break record structure of PTS page.
///
internal sealed class PageBreakRecord : IDisposable
{
//-------------------------------------------------------------------
//
// Constructors
//
//-------------------------------------------------------------------
#region Constructors
///
/// Constructor.
///
/// Current PTS Context.
/// PTS page break record.
/// Page number.
internal PageBreakRecord(PtsContext ptsContext, SecurityCriticalDataForSet br, int pageNumber)
{
Invariant.Assert(ptsContext != null, "Invalid PtsContext object.");
Invariant.Assert(br.Value != IntPtr.Zero, "Invalid break record object.");
_br = br;
_pageNumber = pageNumber;
// In the finalizer we may need to reference an object instance
// to do the right cleanup. For this reason store a WeakReference
// to such object.
_ptsContext = new WeakReference(ptsContext);
// BreakRecord contains unmanaged resources that need to be released when
// BreakRecord is destroyed or Dispatcher is closing. For this reason keep
// track of this BreakRecord in PtsContext.
ptsContext.OnPageBreakRecordCreated(_br);
}
///
/// Finalizer - releases unmanaged resources.
///
~PageBreakRecord()
{
Dispose(false);
}
#endregion Constructors
//--------------------------------------------------------------------
//
// Public Methods
//
//-------------------------------------------------------------------
#region Public Methods
///
/// Dispose allocated resources.
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion Public Methods
//--------------------------------------------------------------------
//
// Internal Properties
//
//--------------------------------------------------------------------
#region Internal Properties
///
/// PTS page break record.
///
internal IntPtr BreakRecord
{
get { return _br.Value; }
}
///
/// Page number of the page starting at the break position.
///
internal int PageNumber
{
get { return _pageNumber; }
}
#endregion Internal Properties
//-------------------------------------------------------------------
//
// Private Methods
//
//--------------------------------------------------------------------
#region Private Methods
///
/// Destroys all unmanaged resources.
///
/// Whether dispose is caused by explicit call to Dispose.
///
/// Finalizer needs to follow rules below:
/// a) Your Finalize method must tolerate partially constructed instances.
/// b) Your Finalize method must consider the consequence of failure.
/// c) Your object is callable after Finalization.
/// d) Your object is callable during Finalization.
/// e) Your Finalizer could be called multiple times.
/// f) Your Finalizer runs in a delicate security context.
/// See: http://blogs.msdn.com/[....]/archive/2004/02/20/77460.aspx
///
///
/// Critical, because sets SecurityCriticalDataForSet.
/// Safe, because sets SecurityCriticalDataForSet to IntPtr.Zero, which is safe.
///
[SecurityCritical, SecurityTreatAsSafe]
private void Dispose(bool disposing)
{
PtsContext ptsContext = null;
// Do actual dispose only once.
if (Interlocked.CompareExchange(ref _disposed, 1, 0) == 0)
{
// Dispose PTS break record.
// According to following article the entire reachable graph from
// a finalizable object is promoted, and it is safe to access its
// members if they do not have their own finalizers.
// Hence it is OK to access _ptsContext during finalization.
// See: http://blogs.msdn.com/[....]/archive/2004/02/20/77460.aspx
ptsContext = _ptsContext.Target as PtsContext;
if (ptsContext != null && !ptsContext.Disposed)
{
// Notify PtsContext that BreakRecord is not used anymore, so all
// associated resources can by destroyed.
ptsContext.OnPageBreakRecordDisposed(_br, disposing);
}
// Cleanup the state.
_br.Value = IntPtr.Zero;
_ptsContext = null;
}
}
#endregion Private Methods
//-------------------------------------------------------------------
//
// Private Fields
//
//-------------------------------------------------------------------
#region Private Fields
///
/// PTS page break record.
///
private SecurityCriticalDataForSet _br;
///
/// Page number of the page starting at the break position.
///
private readonly int _pageNumber;
///
/// In the finalizer we may need to reference an instance of PtsContext
/// to do the right cleanup. For this reason store a WeakReference
/// to it.
///
private WeakReference _ptsContext;
///
/// Whether object is already disposed.
///
private int _disposed;
#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
- ClientFactory.cs
- RequestQueryProcessor.cs
- GlyphingCache.cs
- VersionValidator.cs
- TraceHelpers.cs
- SmtpFailedRecipientException.cs
- ActivityDesignerResources.cs
- _HeaderInfoTable.cs
- SimpleHandlerFactory.cs
- FixUpCollection.cs
- ILGen.cs
- SimpleType.cs
- ComMethodElement.cs
- DesignerAutoFormatStyle.cs
- ButtonPopupAdapter.cs
- FileChangesMonitor.cs
- TabRenderer.cs
- XamlToRtfWriter.cs
- ChildChangedEventArgs.cs
- StackSpiller.Generated.cs
- NodeInfo.cs
- MsmqInputChannelListenerBase.cs
- AnnotationAuthorChangedEventArgs.cs
- smtpconnection.cs
- ThousandthOfEmRealDoubles.cs
- ChtmlSelectionListAdapter.cs
- OutputCacheSettingsSection.cs
- COM2IDispatchConverter.cs
- ImageList.cs
- FixedTextSelectionProcessor.cs
- FilterQuery.cs
- Win32.cs
- MemberAccessException.cs
- ConfigurationPropertyCollection.cs
- FigureParaClient.cs
- FrameworkContextData.cs
- TabControlCancelEvent.cs
- BitmapEffectInputConnector.cs
- SmtpReplyReader.cs
- CellParagraph.cs
- ComEventsSink.cs
- coordinatorscratchpad.cs
- HttpRuntimeSection.cs
- ContentPlaceHolder.cs
- SelectionItemPattern.cs
- DataServices.cs
- UnsafeNativeMethods.cs
- SqlMetaData.cs
- XMLDiffLoader.cs
- XmlDownloadManager.cs
- IisTraceWebEventProvider.cs
- PopupEventArgs.cs
- DiagnosticsConfigurationHandler.cs
- unitconverter.cs
- RoutedEventValueSerializer.cs
- SelectionPattern.cs
- HtmlShimManager.cs
- OverflowException.cs
- StreamResourceInfo.cs
- XPathDocumentNavigator.cs
- BuildProviderAppliesToAttribute.cs
- TextRangeEditTables.cs
- ADConnectionHelper.cs
- SQLRoleProvider.cs
- SeparatorAutomationPeer.cs
- StateMachineAction.cs
- FtpRequestCacheValidator.cs
- securestring.cs
- ObjectDataSourceWizardForm.cs
- ScalarType.cs
- log.cs
- StrokeDescriptor.cs
- HttpListenerRequest.cs
- ScriptDescriptor.cs
- Style.cs
- EdmScalarPropertyAttribute.cs
- DockPattern.cs
- PropertyGrid.cs
- CommandArguments.cs
- PriorityBinding.cs
- TemplateAction.cs
- DeferredReference.cs
- ZipFileInfoCollection.cs
- ConnectionsZone.cs
- PhysicalOps.cs
- InvalidContentTypeException.cs
- EntityStoreSchemaFilterEntry.cs
- DataSourceView.cs
- SafeNativeMethods.cs
- InvokeProviderWrapper.cs
- TypeUtil.cs
- XmlSiteMapProvider.cs
- StateChangeEvent.cs
- MachineKeyConverter.cs
- XmlEncoding.cs
- precedingsibling.cs
- LocalClientSecuritySettings.cs
- Root.cs
- SAPICategories.cs
- PartialTrustVisibleAssemblyCollection.cs