[Mono-bugs] [Bug 80519][Nor] New - System.Drawing.Printing doesn't find the default printer.
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Sun Jan 14 12:15:12 EST 2007
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by vlad.dimitrov at gmail.com.
http://bugzilla.ximian.com/show_bug.cgi?id=80519
--- shadow/80519 2007-01-14 12:15:12.000000000 -0500
+++ shadow/80519.tmp.21067 2007-01-14 12:15:12.000000000 -0500
@@ -0,0 +1,88 @@
+Bug#: 80519
+Product: Mono: Class Libraries
+Version: 1.2
+OS: GNU/Linux [Other]
+OS Details:
+Status: NEW
+Resolution:
+Severity:
+Priority: Normal
+Component: Sys.Drawing.
+AssignedTo: mono-bugs at ximian.com
+ReportedBy: vlad.dimitrov at gmail.com
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: System.Drawing.Printing doesn't find the default printer.
+
+1) PreviewPrintController throws exception because it doesn't have valid
+PrinterSettings associated with the PrintDocument
+2) PrintDocument has some PrinterSetttings but they are not valid because
+the PrinterName is empty
+3) PrinterName is empty because SysPrn.Service.DefaultPrinter is empty.
+4) Since System.Drawing.Printing.PrinterSettings.InstalledPrinters (witch
+gets it from SysPrn.Service.InstalledPrinters) returns my printer name
+this means that SysPrn.Service has "cups_installed" set to true
+5) This leads me to the conclusion that "IntPtr cupsGetDefault ();" from
+"libcups" returns empty string
+
+Based on the information here:
+
+http://www.cups.org/documentation.php/api-cups.html#cupsGetDefault2
+
+It says "Applications should use the cupsGetDests() and cupsGetDest()
+functions to get the user-defined default printer, as this function does
+not support the lpoptions-defined default printer."
+
+I made a test on my machine (Ubuntu 6.06) and found a solution that works
+on my machine. I used some code from mono as a code base and this piece of
+code finds my default printer.
+
+ private void button2_Click (object sender, EventArgs e)
+ {
+ int printerCount;
+ IntPtr savedDests = IntPtr.Zero;
+ IntPtr dests;
+ CUPS_DESTS dest = new CUPS_DESTS ();
+ int destStructSize = Marshal.SizeOf (typeof (CUPS_DESTS));
+ string defPrinter = string.Empty;
+
+ //if (cups_installed == false)
+ // return col;
+
+ printerCount = cupsGetDests (ref savedDests);
+
+ dests = savedDests;
+ for (int i = 0; i < printerCount; i++) {
+ dest = (CUPS_DESTS) Marshal.PtrToStructure (dests, typeof
+(CUPS_DESTS));
+
+ if (dest.is_default != 0) {
+ defPrinter = Marshal.PtrToStringAnsi (dest.name);
+ }
+ // Free allocated unmanaged memory
+ Marshal.FreeHGlobal (dest.name);
+ Marshal.FreeHGlobal (dest.instance);
+ Marshal.FreeHGlobal (dest.options);
+ dests = new IntPtr (dests.ToInt64 () + destStructSize);
+ }
+ // Free allocated unmanaged memory
+ Marshal.FreeHGlobal (savedDests);
+
+ textBox1.Text = defPrinter;
+ }
+
+ [DllImport ("libcups", CharSet = CharSet.Ansi)]
+ static extern int cupsGetDests (ref IntPtr dests);
+
+ public struct CUPS_DESTS
+ {
+ public IntPtr name;
+ public IntPtr instance;
+ public int is_default;
+ public int num_options;
+ public IntPtr options;
+ }
+
+I hope this should be enough to fix the problem.
More information about the mono-bugs
mailing list