Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / MS / Internal / Printing / Win32PrintDialog.cs / 1 / Win32PrintDialog.cs
// Microsoft Avalon
// Copyright (c) Microsoft Corporation, 2005
//
// File: Win32PrintDialog.cs
//
// 05/24/2003 : mharper - created
//
//------------------------------------------------------------------------------
using System;
using System.Drawing.Printing;
using System.Printing.Interop;
using System.Printing;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Windows.Controls;
namespace MS.Internal.Printing
{
///
/// This entire class is implemented in this file. However, the class
/// is marked partial because this class utilizes/implements a marshaler
/// class that is private to it in another file. The object is called
/// PrintDlgExMarshaler and warranted its own file.
///
internal partial class Win32PrintDialog
{
#region Constructor
///
/// Constructs an instance of the Win32PrintDialog. This class is used for
/// displaying the Win32 PrintDlgEx dialog and obtaining a user selected
/// printer and PrintTicket for a print operation.
///
///
/// Critical: - Sets critical data.
/// TreatAsSafe: - Sets the critical data to null for initialization.
///
[SecurityCritical, SecurityTreatAsSafe]
public
Win32PrintDialog()
{
_printTicket = null;
_printQueue = null;
_minPage = 1;
_maxPage = 9999;
_pageRangeSelection = PageRangeSelection.AllPages;
}
#endregion Constructor
#region Internal methods
///
/// Displays a modal Win32 print dialog to allow the user to select the desired
/// printer and set the printing options. The data generated by this method
/// can be accessed via the properties on the instance of this class.
///
///
/// Critical: - Create an instance of a critical class, calls critical
/// methods on that instance, and retrieves critical properties.
/// TreatAsSafe: - This code simply displays a WIN32 based dialog, gets the
/// print settings from the user, and saves the data away as
/// critical. The "unsafe" data that does into the unmanaged
/// are properties marked critical (PrintTicket and PrintQueue)
/// on this class. The other data that enters the unmanaged
/// API are values that are integer based and uninteresting so
/// therefore are not critical (MinPage, MaxPage, and page range
/// values. Any data that is created by this method that is
/// considered unsafe is marked critical. There are 2 properties
/// that are extracted from the unmanaged call that are not considered
/// critical. These are _pageRange and _pageRangeSelection. We do not
/// care if these are exposed since the data means nothing except to
/// the code that is doing the printing.
///
[SecurityCritical, SecurityTreatAsSafe]
internal
UInt32
ShowDialog()
{
UInt32 result = NativeMethods.PD_RESULT_CANCEL;
//
// Get the process main window handle
//
IntPtr owner = IntPtr.Zero;
if ((System.Windows.Application.Current != null) &&
(System.Windows.Application.Current.MainWindow != null))
{
System.Windows.Interop.WindowInteropHelper helper =
new System.Windows.Interop.WindowInteropHelper(System.Windows.Application.Current.MainWindow);
owner = helper.CriticalHandle;
}
try
{
if (this._printQueue == null || this._printTicket == null)
{
// Normally printDlgEx.SyncToStruct() probes the printer if both the print queue and print
// ticket are not null.
// If either is null we probe the printer ourselves
// If we dont end users will get notified that printing is disabled *after*
// the print dialog has been displayed.
ProbeForPrintingSupport();
}
//
// Create a PrintDlgEx instance to invoke the Win32 Print Dialog
//
using (PrintDlgExMarshaler printDlgEx = new PrintDlgExMarshaler(owner, this))
{
printDlgEx.SyncToStruct();
//
// Display the Win32 print dialog
//
Int32 hr = UnsafeNativeMethods.PrintDlgEx(printDlgEx.UnmanagedPrintDlgEx);
if (hr == MS.Win32.NativeMethods.S_OK)
{
result = printDlgEx.SyncFromStruct();
}
}
}
catch(PrintingNotSupportedException)
{
string message = System.Windows.SR.Get(System.Windows.SRID.PrintDialogInstallPrintSupportMessageBox);
string caption = System.Windows.SR.Get(System.Windows.SRID.PrintDialogInstallPrintSupportCaption);
bool isRtlCaption = caption != null && caption.Length > 0 && caption[0] == RightToLeftMark;
System.Windows.MessageBoxOptions mbOptions = isRtlCaption ? System.Windows.MessageBoxOptions.RtlReading : System.Windows.MessageBoxOptions.None;
int type =
(int) System.Windows.MessageBoxButton.OK
| (int) System.Windows.MessageBoxImage.Information
| (int) mbOptions;
if (owner == IntPtr.Zero)
{
owner = MS.Win32.UnsafeNativeMethods.GetActiveWindow();
}
if(0 != MS.Win32.UnsafeNativeMethods.MessageBox(new HandleRef(null, owner), message, caption, type))
{
result = NativeMethods.PD_RESULT_CANCEL;
}
}
return result;
}
#endregion Internal methods
#region Internal properties
///
/// Critical: Accesses critical data.
///
internal PrintTicket PrintTicket
{
[SecurityCritical]
get
{
return _printTicket;
}
[SecurityCritical]
set
{
_printTicket = value;
}
}
///
/// Critical: Accesses critical data.
///
internal PrintQueue PrintQueue
{
[SecurityCritical]
get
{
return _printQueue;
}
[SecurityCritical]
set
{
_printQueue = value;
}
}
///
/// Gets or sets the minimum page number allowed in the page ranges.
///
internal UInt32 MinPage
{
get
{
return _minPage;
}
set
{
_minPage = value;
}
}
///
/// Gets or sets the maximum page number allowed in the page ranges.
///
internal UInt32 MaxPage
{
get
{
return _maxPage;
}
set
{
_maxPage = value;
}
}
///
/// Gets or Sets the PageRangeSelection option for the print dialog.
///
internal PageRangeSelection PageRangeSelection
{
get
{
return _pageRangeSelection;
}
set
{
_pageRangeSelection = value;
}
}
///
/// Gets or sets a PageRange objects used when the PageRangeSelection
/// option is set to UserPages.
///
internal PageRange PageRange
{
get
{
return _pageRange;
}
set
{
_pageRange = value;
}
}
///
/// Gets or sets a flag to enable/disable the page range control on the dialog.
///
internal bool PageRangeEnabled
{
get
{
return _pageRangeEnabled;
}
set
{
_pageRangeEnabled = value;
}
}
#endregion Internal properties
#region Private methods
///
/// Probe to see if printing support is installed
///
///
/// Critical - Asserts DefaultPrinting permission in order to probe to see if a printer is available
///
[SecurityCritical]
private void ProbeForPrintingSupport()
{
// Without a print queue object we have to make up a name for the printer.
// We will just ---- the print queue exception it generates later.
// We could avoid the exception if we had access to
// MS.Internal.Printing.Configuration.NativeMethods.BindPTProviderThunk
string printerName = (this._printQueue != null) ? this._printQueue.FullName : string.Empty;
(new PrintingPermission(PrintingPermissionLevel.DefaultPrinting)).Assert(); //BlessedAssert
try
{
// If printer support is not installed this should throw a PrintingNotSupportedException
using (IDisposable converter = new PrintTicketConverter(printerName, 1))
{
}
}
catch (PrintQueueException)
{
// We can ---- print queue exceptions because they imply that printing
// support is installed
}
finally
{
PrintingPermission.RevertAssert();
}
}
#endregion
#region Private data
///
/// Critical: This is the print ticket used for printing
/// the current job. It is critical because it
/// could contains some user sensitive data
///
[SecurityCritical]
private
PrintTicket _printTicket;
///
/// Critical: This is an object that represents a print queue.
/// Any code that has access to this object has the
/// potential to print jobs to this printer so it is
/// a critical system resource.
///
[SecurityCritical]
private
PrintQueue _printQueue;
private
PageRangeSelection _pageRangeSelection;
private
PageRange _pageRange;
private
bool _pageRangeEnabled;
private
UInt32 _minPage;
private
UInt32 _maxPage;
private
const char RightToLeftMark = '\u200F';
#endregion Private data
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Microsoft Avalon
// Copyright (c) Microsoft Corporation, 2005
//
// File: Win32PrintDialog.cs
//
// 05/24/2003 : mharper - created
//
//------------------------------------------------------------------------------
using System;
using System.Drawing.Printing;
using System.Printing.Interop;
using System.Printing;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Windows.Controls;
namespace MS.Internal.Printing
{
///
/// This entire class is implemented in this file. However, the class
/// is marked partial because this class utilizes/implements a marshaler
/// class that is private to it in another file. The object is called
/// PrintDlgExMarshaler and warranted its own file.
///
internal partial class Win32PrintDialog
{
#region Constructor
///
/// Constructs an instance of the Win32PrintDialog. This class is used for
/// displaying the Win32 PrintDlgEx dialog and obtaining a user selected
/// printer and PrintTicket for a print operation.
///
///
/// Critical: - Sets critical data.
/// TreatAsSafe: - Sets the critical data to null for initialization.
///
[SecurityCritical, SecurityTreatAsSafe]
public
Win32PrintDialog()
{
_printTicket = null;
_printQueue = null;
_minPage = 1;
_maxPage = 9999;
_pageRangeSelection = PageRangeSelection.AllPages;
}
#endregion Constructor
#region Internal methods
///
/// Displays a modal Win32 print dialog to allow the user to select the desired
/// printer and set the printing options. The data generated by this method
/// can be accessed via the properties on the instance of this class.
///
///
/// Critical: - Create an instance of a critical class, calls critical
/// methods on that instance, and retrieves critical properties.
/// TreatAsSafe: - This code simply displays a WIN32 based dialog, gets the
/// print settings from the user, and saves the data away as
/// critical. The "unsafe" data that does into the unmanaged
/// are properties marked critical (PrintTicket and PrintQueue)
/// on this class. The other data that enters the unmanaged
/// API are values that are integer based and uninteresting so
/// therefore are not critical (MinPage, MaxPage, and page range
/// values. Any data that is created by this method that is
/// considered unsafe is marked critical. There are 2 properties
/// that are extracted from the unmanaged call that are not considered
/// critical. These are _pageRange and _pageRangeSelection. We do not
/// care if these are exposed since the data means nothing except to
/// the code that is doing the printing.
///
[SecurityCritical, SecurityTreatAsSafe]
internal
UInt32
ShowDialog()
{
UInt32 result = NativeMethods.PD_RESULT_CANCEL;
//
// Get the process main window handle
//
IntPtr owner = IntPtr.Zero;
if ((System.Windows.Application.Current != null) &&
(System.Windows.Application.Current.MainWindow != null))
{
System.Windows.Interop.WindowInteropHelper helper =
new System.Windows.Interop.WindowInteropHelper(System.Windows.Application.Current.MainWindow);
owner = helper.CriticalHandle;
}
try
{
if (this._printQueue == null || this._printTicket == null)
{
// Normally printDlgEx.SyncToStruct() probes the printer if both the print queue and print
// ticket are not null.
// If either is null we probe the printer ourselves
// If we dont end users will get notified that printing is disabled *after*
// the print dialog has been displayed.
ProbeForPrintingSupport();
}
//
// Create a PrintDlgEx instance to invoke the Win32 Print Dialog
//
using (PrintDlgExMarshaler printDlgEx = new PrintDlgExMarshaler(owner, this))
{
printDlgEx.SyncToStruct();
//
// Display the Win32 print dialog
//
Int32 hr = UnsafeNativeMethods.PrintDlgEx(printDlgEx.UnmanagedPrintDlgEx);
if (hr == MS.Win32.NativeMethods.S_OK)
{
result = printDlgEx.SyncFromStruct();
}
}
}
catch(PrintingNotSupportedException)
{
string message = System.Windows.SR.Get(System.Windows.SRID.PrintDialogInstallPrintSupportMessageBox);
string caption = System.Windows.SR.Get(System.Windows.SRID.PrintDialogInstallPrintSupportCaption);
bool isRtlCaption = caption != null && caption.Length > 0 && caption[0] == RightToLeftMark;
System.Windows.MessageBoxOptions mbOptions = isRtlCaption ? System.Windows.MessageBoxOptions.RtlReading : System.Windows.MessageBoxOptions.None;
int type =
(int) System.Windows.MessageBoxButton.OK
| (int) System.Windows.MessageBoxImage.Information
| (int) mbOptions;
if (owner == IntPtr.Zero)
{
owner = MS.Win32.UnsafeNativeMethods.GetActiveWindow();
}
if(0 != MS.Win32.UnsafeNativeMethods.MessageBox(new HandleRef(null, owner), message, caption, type))
{
result = NativeMethods.PD_RESULT_CANCEL;
}
}
return result;
}
#endregion Internal methods
#region Internal properties
///
/// Critical: Accesses critical data.
///
internal PrintTicket PrintTicket
{
[SecurityCritical]
get
{
return _printTicket;
}
[SecurityCritical]
set
{
_printTicket = value;
}
}
///
/// Critical: Accesses critical data.
///
internal PrintQueue PrintQueue
{
[SecurityCritical]
get
{
return _printQueue;
}
[SecurityCritical]
set
{
_printQueue = value;
}
}
///
/// Gets or sets the minimum page number allowed in the page ranges.
///
internal UInt32 MinPage
{
get
{
return _minPage;
}
set
{
_minPage = value;
}
}
///
/// Gets or sets the maximum page number allowed in the page ranges.
///
internal UInt32 MaxPage
{
get
{
return _maxPage;
}
set
{
_maxPage = value;
}
}
///
/// Gets or Sets the PageRangeSelection option for the print dialog.
///
internal PageRangeSelection PageRangeSelection
{
get
{
return _pageRangeSelection;
}
set
{
_pageRangeSelection = value;
}
}
///
/// Gets or sets a PageRange objects used when the PageRangeSelection
/// option is set to UserPages.
///
internal PageRange PageRange
{
get
{
return _pageRange;
}
set
{
_pageRange = value;
}
}
///
/// Gets or sets a flag to enable/disable the page range control on the dialog.
///
internal bool PageRangeEnabled
{
get
{
return _pageRangeEnabled;
}
set
{
_pageRangeEnabled = value;
}
}
#endregion Internal properties
#region Private methods
///
/// Probe to see if printing support is installed
///
///
/// Critical - Asserts DefaultPrinting permission in order to probe to see if a printer is available
///
[SecurityCritical]
private void ProbeForPrintingSupport()
{
// Without a print queue object we have to make up a name for the printer.
// We will just ---- the print queue exception it generates later.
// We could avoid the exception if we had access to
// MS.Internal.Printing.Configuration.NativeMethods.BindPTProviderThunk
string printerName = (this._printQueue != null) ? this._printQueue.FullName : string.Empty;
(new PrintingPermission(PrintingPermissionLevel.DefaultPrinting)).Assert(); //BlessedAssert
try
{
// If printer support is not installed this should throw a PrintingNotSupportedException
using (IDisposable converter = new PrintTicketConverter(printerName, 1))
{
}
}
catch (PrintQueueException)
{
// We can ---- print queue exceptions because they imply that printing
// support is installed
}
finally
{
PrintingPermission.RevertAssert();
}
}
#endregion
#region Private data
///
/// Critical: This is the print ticket used for printing
/// the current job. It is critical because it
/// could contains some user sensitive data
///
[SecurityCritical]
private
PrintTicket _printTicket;
///
/// Critical: This is an object that represents a print queue.
/// Any code that has access to this object has the
/// potential to print jobs to this printer so it is
/// a critical system resource.
///
[SecurityCritical]
private
PrintQueue _printQueue;
private
PageRangeSelection _pageRangeSelection;
private
PageRange _pageRange;
private
bool _pageRangeEnabled;
private
UInt32 _minPage;
private
UInt32 _maxPage;
private
const char RightToLeftMark = '\u200F';
#endregion Private data
}
}
// 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
- SplitterPanel.cs
- BinaryParser.cs
- NetSectionGroup.cs
- ObjectSecurity.cs
- BoolExpressionVisitors.cs
- HostSecurityManager.cs
- categoryentry.cs
- PresentationTraceSources.cs
- BatchParser.cs
- XmlSchemaException.cs
- LocalValueEnumerator.cs
- SymLanguageVendor.cs
- ChildDocumentBlock.cs
- TraceListener.cs
- DataTableCollection.cs
- OdbcInfoMessageEvent.cs
- ImageMap.cs
- FramingFormat.cs
- TypeKeyValue.cs
- SqlBulkCopy.cs
- AsymmetricSecurityProtocol.cs
- WindowsEditBoxRange.cs
- ButtonPopupAdapter.cs
- StringSource.cs
- WebPartCatalogCloseVerb.cs
- NativeMethods.cs
- XmlSchemaProviderAttribute.cs
- GenericAuthenticationEventArgs.cs
- HtmlInputSubmit.cs
- MappingMetadataHelper.cs
- FixedElement.cs
- SchemaTableColumn.cs
- DirectoryRedirect.cs
- SqlUserDefinedTypeAttribute.cs
- SynthesizerStateChangedEventArgs.cs
- xml.cs
- TypeGenericEnumerableViewSchema.cs
- RegionInfo.cs
- RijndaelCryptoServiceProvider.cs
- AssociatedControlConverter.cs
- Parsers.cs
- ItemList.cs
- AdapterDictionary.cs
- BufferedGraphics.cs
- ContainerParagraph.cs
- PhysicalFontFamily.cs
- ObjectMemberMapping.cs
- ComboBox.cs
- TextChangedEventArgs.cs
- KeyBinding.cs
- SelectorAutomationPeer.cs
- NullableIntMinMaxAggregationOperator.cs
- ItemType.cs
- SymmetricSecurityProtocol.cs
- ExpressionEvaluator.cs
- ReadOnlyDictionary.cs
- CheckoutException.cs
- StringResourceManager.cs
- TreeViewImageKeyConverter.cs
- EntityDataSourceStatementEditor.cs
- PageSetupDialog.cs
- StylusSystemGestureEventArgs.cs
- SqlConnectionPoolProviderInfo.cs
- COM2TypeInfoProcessor.cs
- ContainerFilterService.cs
- Viewport3DAutomationPeer.cs
- InfiniteIntConverter.cs
- WebRequest.cs
- MultipleViewProviderWrapper.cs
- sqlmetadatafactory.cs
- TranslateTransform3D.cs
- TrustLevelCollection.cs
- ProfessionalColors.cs
- ProfessionalColors.cs
- ItemCollectionEditor.cs
- RegexMatch.cs
- ExcCanonicalXml.cs
- OperationPerformanceCounters.cs
- ToolStripTemplateNode.cs
- EntityDataSourceStatementEditorForm.cs
- ValidationErrorCollection.cs
- SafeEventLogWriteHandle.cs
- NamespaceQuery.cs
- log.cs
- Highlights.cs
- SqlMetaData.cs
- Timer.cs
- SafeProcessHandle.cs
- TypeConverter.cs
- DesignerActionItem.cs
- ControlBuilderAttribute.cs
- PropertyNames.cs
- Util.cs
- VisemeEventArgs.cs
- UIElementParaClient.cs
- KeyPressEvent.cs
- RoleGroup.cs
- shaperfactory.cs
- ErrorWebPart.cs
- XmlDataSource.cs