* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Drawing / System.Drawing.Printing / PrintingServicesWin32.cs
index 5d5bc712328583d9624c9d3a9d38c71d1e091d50..66a34c504d541b10a33a9b2a6076813ccd89e1af 100644 (file)
@@ -117,10 +117,8 @@ namespace System.Drawing.Printing
                                PaperSize ps;
                                PaperKind kind;
                                for (int i = 0; i < ret; i++) {
-                                       x = Marshal.ReadInt32 (ptr_sizes);
-                                       ptr_sizes = new IntPtr (ptr_sizes.ToInt64 () + 4);
-                                       y = Marshal.ReadInt32 (ptr_sizes);
-                                       ptr_sizes = new IntPtr (ptr_sizes.ToInt64 () + 4);
+                                       x = Marshal.ReadInt32 (ptr_sizes, i * 4);
+                                       y = Marshal.ReadInt32 (ptr_sizes, (i + 1) * 4);
 
                                        x = PrinterUnitConvert.Convert (x, PrinterUnit.TenthsOfAMillimeter,
                                              PrinterUnit.Display);
@@ -160,28 +158,28 @@ namespace System.Drawing.Printing
                        di.lpszDatatype = IntPtr.Zero;
                        di.fwType = 0;
 
-                       ret = Win32StartDoc (gr.Hdc, ref di);                   
+                       ret = Win32StartDoc (gr.Hdc, ref di);
                        Marshal.FreeHGlobal (di.lpszDocName);
                        return (ret > 0) ? true : false;
                }
 
                internal override bool StartPage (GraphicsPrinter gr)
                {
-                       int ret = Win32StartPage (gr.Hdc);                      
+                       int ret = Win32StartPage (gr.Hdc);
                        return (ret > 0) ? true : false;
                }
 
                internal override bool EndPage (GraphicsPrinter gr)
                {
-                       int ret = Win32EndPage (gr.Hdc);                        
+                       int ret = Win32EndPage (gr.Hdc);
                        return (ret > 0) ? true : false;
                }
 
                internal override bool EndDoc (GraphicsPrinter gr)
                {
                        int ret = Win32EndDoc (gr.Hdc);
-                       Win32DeleteDC (gr.Hdc);                 
-                       gr.Graphics.Dispose ();                                         
+                       Win32DeleteDC (gr.Hdc);
+                       gr.Graphics.Dispose ();
                        return (ret > 0) ? true : false;
                }
 
@@ -198,7 +196,7 @@ namespace System.Drawing.Printing
                                StringBuilder name = new StringBuilder (1024);
                                int length = name.Capacity;
 
-                               Win32GetDefaultPrinter (name, ref length);                              
+                               Win32GetDefaultPrinter (name, ref length);
                                return name.ToString ();
                        }
                }
@@ -235,11 +233,83 @@ namespace System.Drawing.Printing
                        }
                }
 
+               internal override void GetPrintDialogInfo (string printer, ref string port, ref string type, ref string status, ref string comment)
+               {
+                       IntPtr hPrn;
+                       PRINTER_INFO printer_info = new PRINTER_INFO ();
+                       int needed = 0;
+                       IntPtr ptr;
+
+                       Win32OpenPrinter (printer, out hPrn, IntPtr.Zero);
+                       
+                       if (hPrn == IntPtr.Zero)
+                               return;
+
+                       Win32GetPrinter (hPrn, 2, IntPtr.Zero, 0, ref needed);
+                       ptr = Marshal.AllocHGlobal (needed);
+
+                       Win32GetPrinter (hPrn, 2, ptr, needed, ref needed);
+                       printer_info = (PRINTER_INFO) Marshal.PtrToStructure (ptr, typeof (PRINTER_INFO));
+                       Marshal.FreeHGlobal (ptr);
+
+                       port  = Marshal.PtrToStringUni (printer_info.pPortName);
+                       comment  = Marshal.PtrToStringUni (printer_info.pComment);
+                       type  = Marshal.PtrToStringUni (printer_info.pDriverName);
+                       status = GetPrinterStatusMsg (printer_info.Status);
+
+                       Win32ClosePrinter (hPrn);
+               }
+
+               private string GetPrinterStatusMsg (uint status)
+               {
+                       string rslt = string.Empty;
+
+                       if (status == 0)
+                               return "Ready";
+
+                       if ((status & (uint) PrinterStatus.PS_PAUSED) != 0) rslt += "Paused; ";
+                       if ((status & (uint) PrinterStatus.PS_ERROR) != 0) rslt += "Error; ";
+                       if ((status & (uint) PrinterStatus.PS_PENDING_DELETION) != 0) rslt += "Pending deletion; ";
+                       if ((status & (uint) PrinterStatus.PS_PAPER_JAM) != 0) rslt += "Paper jam; ";
+                       if ((status & (uint) PrinterStatus.PS_PAPER_OUT) != 0) rslt += "Paper out; ";
+                       if ((status & (uint) PrinterStatus.PS_MANUAL_FEED) != 0) rslt += "Manual feed; ";
+                       if ((status & (uint) PrinterStatus.PS_PAPER_PROBLEM) != 0) rslt += "Paper problem; ";
+                       if ((status & (uint) PrinterStatus.PS_OFFLINE) != 0) rslt += "Offline; ";
+                       if ((status & (uint) PrinterStatus.PS_IO_ACTIVE) != 0) rslt += "I/O active; ";
+                       if ((status & (uint) PrinterStatus.PS_BUSY) != 0) rslt += "Busy; ";
+                       if ((status & (uint) PrinterStatus.PS_PRINTING) != 0) rslt += "Printing; ";
+                       if ((status & (uint) PrinterStatus.PS_OUTPUT_BIN_FULL) != 0) rslt += "Output bin full; ";
+                       if ((status & (uint) PrinterStatus.PS_NOT_AVAILABLE) != 0) rslt += "Not available; ";
+                       if ((status & (uint) PrinterStatus.PS_WAITING) != 0) rslt += "Waiting; ";
+                       if ((status & (uint) PrinterStatus.PS_PROCESSING) != 0) rslt += "Processing; ";
+                       if ((status & (uint) PrinterStatus.PS_INITIALIZING) != 0) rslt += "Initializing; ";
+                       if ((status & (uint) PrinterStatus.PS_WARMING_UP) != 0) rslt += "Warming up; ";
+                       if ((status & (uint) PrinterStatus.PS_TONER_LOW) != 0) rslt += "Toner low; ";
+                       if ((status & (uint) PrinterStatus.PS_NO_TONER) != 0) rslt += "No toner; ";
+                       if ((status & (uint) PrinterStatus.PS_PAGE_PUNT) != 0) rslt += "Page punt; ";
+                       if ((status & (uint) PrinterStatus.PS_USER_INTERVENTION) != 0) rslt += "User intervention; ";
+                       if ((status & (uint) PrinterStatus.PS_OUT_OF_MEMORY) != 0) rslt += "Out of memory; ";
+                       if ((status & (uint) PrinterStatus.PS_DOOR_OPEN) != 0) rslt += "Door open; ";
+                       if ((status & (uint) PrinterStatus.PS_SERVER_UNKNOWN) != 0) rslt += "Server unkown; ";
+                       if ((status & (uint) PrinterStatus.PS_POWER_SAVE) != 0) rslt += "Power save; ";
+
+                       return rslt;
+               }
+
                //
                // DllImports
                //
 
-               [DllImport("winspool.drv", CharSet=CharSet.Unicode, EntryPoint="DeviceCapabilities", SetLastError=true)]\r
+               [DllImport("winspool.drv", CharSet=CharSet.Unicode, EntryPoint="OpenPrinter", SetLastError=true)]\r
+               static extern int Win32OpenPrinter (string pPrinterName, out IntPtr phPrinter, IntPtr pDefault);
+
+               [DllImport("winspool.drv", CharSet=CharSet.Unicode, EntryPoint="GetPrinter", SetLastError=true)]
+               static extern int Win32GetPrinter (IntPtr hPrinter, int level, IntPtr dwBuf, int size, ref int dwNeeded);
+
+               [DllImport("winspool.drv", CharSet=CharSet.Unicode, EntryPoint="ClosePrinter", SetLastError=true)]
+               static extern int Win32ClosePrinter (IntPtr hPrinter);\r
+
+               [DllImport("winspool.drv", CharSet=CharSet.Unicode, EntryPoint="DeviceCapabilities", SetLastError=true)]
                static extern int Win32DeviceCapabilities (string device, string port, DCCapabilities cap, IntPtr outputBuffer, IntPtr deviceMode);
 
                [DllImport("winspool.drv", CharSet=CharSet.Unicode, EntryPoint="EnumPrinters", SetLastError=true)]
@@ -308,42 +378,72 @@ namespace System.Drawing.Printing
                }
 
                // Enums
-               internal enum DCCapabilities : short\r
-               {\r
-                       DC_FIELDS = 1,\r
-                       DC_PAPERS = 2,\r
-                       DC_PAPERSIZE = 3,\r
-                       DC_MINEXTENT = 4,\r
-                       DC_MAXEXTENT = 5,\r
-                       DC_BINS = 6,\r
-                       DC_DUPLEX = 7,\r
-                       DC_SIZE = 8,\r
-                       DC_EXTRA = 9,\r
-                       DC_VERSION = 10,\r
-                       DC_DRIVER = 11,\r
-                       DC_BINNAMES = 12,\r
-                       DC_ENUMRESOLUTIONS = 13,\r
-                       DC_FILEDEPENDENCIES = 14,\r
-                       DC_TRUETYPE = 15,\r
-                       DC_PAPERNAMES = 16,\r
-                       DC_ORIENTATION = 17,\r
-                       DC_COPIES = 18,\r
-                       DC_BINADJUST = 19,\r
-                       DC_EMF_COMPLIANT = 20,\r
-                       DC_DATATYPE_PRODUCED = 21,\r
-                       DC_COLLATE = 22,\r
-                       DC_MANUFACTURER = 23,\r
-                       DC_MODEL = 24,\r
-                       DC_PERSONALITY = 25,\r
-                       DC_PRINTRATE = 26,\r
-                       DC_PRINTRATEUNIT = 27,\r
-                       DC_PRINTERMEM = 28,\r
-                       DC_MEDIAREADY = 29,\r
-                       DC_STAPLE = 30,\r
-                       DC_PRINTRATEPPM = 31,\r
-                       DC_COLORDEVICE = 32,\r
-                       DC_NUP = 33\r
+               internal enum DCCapabilities : short
+               {
+                       DC_FIELDS = 1,
+                       DC_PAPERS = 2,
+                       DC_PAPERSIZE = 3,
+                       DC_MINEXTENT = 4,
+                       DC_MAXEXTENT = 5,
+                       DC_BINS = 6,
+                       DC_DUPLEX = 7,
+                       DC_SIZE = 8,
+                       DC_EXTRA = 9,
+                       DC_VERSION = 10,
+                       DC_DRIVER = 11,
+                       DC_BINNAMES = 12,
+                       DC_ENUMRESOLUTIONS = 13,
+                       DC_FILEDEPENDENCIES = 14,
+                       DC_TRUETYPE = 15,
+                       DC_PAPERNAMES = 16,
+                       DC_ORIENTATION = 17,
+                       DC_COPIES = 18,
+                       DC_BINADJUST = 19,
+                       DC_EMF_COMPLIANT = 20,
+                       DC_DATATYPE_PRODUCED = 21,
+                       DC_COLLATE = 22,
+                       DC_MANUFACTURER = 23,
+                       DC_MODEL = 24,
+                       DC_PERSONALITY = 25,
+                       DC_PRINTRATE = 26,
+                       DC_PRINTRATEUNIT = 27,
+                       DC_PRINTERMEM = 28,
+                       DC_MEDIAREADY = 29,
+                       DC_STAPLE = 30,
+                       DC_PRINTRATEPPM = 31,
+                       DC_COLORDEVICE = 32,
+                       DC_NUP = 33
                }
+
+               [Flags]
+               internal enum PrinterStatus : uint
+               {
+                       PS_PAUSED =             0x00000001,\r
+                       PS_ERROR =              0x00000002,\r
+                       PS_PENDING_DELETION =   0x00000004,\r
+                       PS_PAPER_JAM =          0x00000008,\r
+                       PS_PAPER_OUT =          0x00000010,\r
+                       PS_MANUAL_FEED =        0x00000020,\r
+                       PS_PAPER_PROBLEM =      0x00000040,\r
+                       PS_OFFLINE =            0x00000080,\r
+                       PS_IO_ACTIVE =          0x00000100,\r
+                       PS_BUSY =               0x00000200,\r
+                       PS_PRINTING     =       0x00000400,\r
+                       PS_OUTPUT_BIN_FULL =    0x00000800,\r
+                       PS_NOT_AVAILABLE =      0x00001000,\r
+                       PS_WAITING =            0x00002000,\r
+                       PS_PROCESSING =         0x00004000,\r
+                       PS_INITIALIZING =       0x00008000,\r
+                       PS_WARMING_UP =         0x00010000,\r
+                       PS_TONER_LOW =          0x00020000,\r
+                       PS_NO_TONER =           0x00040000,\r
+                       PS_PAGE_PUNT =          0x00080000,\r
+                       PS_USER_INTERVENTION =  0x00100000,\r
+                       PS_OUT_OF_MEMORY =      0x00200000,\r
+                       PS_DOOR_OPEN =          0x00400000,\r
+                       PS_SERVER_UNKNOWN =     0x00800000,\r
+                       PS_POWER_SAVE =         0x01000000
+               }
        }
 }