< prev index next >

src/java.desktop/windows/classes/sun/print/PrintServiceLookupProvider.java

Print this page

        

*** 315,351 **** defaultPrintService = new Win32PrintService(defaultPrinter); } return defaultPrintService; } class PrinterChangeListener implements Runnable { ! long chgObj; PrinterChangeListener() { ! chgObj = notifyFirstPrinterChange(null); } @Override public void run() { ! if (chgObj != -1) { ! while (true) { ! // wait for configuration to change ! if (notifyPrinterChange(chgObj) != 0) { ! try { refreshServices(); ! } catch (SecurityException se) { ! break; ! } ! } else { ! notifyClosePrinterChange(chgObj); ! break; ! } } } } } private native String getDefaultPrinterName(); private native String[] getAllPrinterNames(); ! private native long notifyFirstPrinterChange(String printer); ! private native void notifyClosePrinterChange(long chgObj); ! private native int notifyPrinterChange(long chgObj); } --- 315,365 ---- defaultPrintService = new Win32PrintService(defaultPrinter); } return defaultPrintService; } + /* Windows provides *PrinterChangeNotification* functions that provides + information about printer status changes of the local printers but not + network printers. + Alternatively, Windows provides a way thro' which one can get the + network printer status changes by using WMI, RegistryKeyChange combination, + which is a slightly complex mechanism. + The Windows WMI offers an async and sync method to read thro' registry + via the WQL query. The async method is considered dangerous as it leaves + open a channel until we close it. But the async method has the advantage of + being notified of a change in registry by calling callback without polling for it. + The sync method uses the polling mechanism to notify. + RegistryValueChange cannot be used in combination with WMI to get registry + value change notification because of an error that may be generated because the + scope of the query would be too big to handle(at times). + Hence an alternative mechanism is choosen via the EnumPrinters by polling for the + count of printer status changes(add\remove) and based on it update the printers + list. + */ class PrinterChangeListener implements Runnable { ! long prevRemotePrintersCount = 0; ! PrinterChangeListener() { ! prevRemotePrintersCount = GetRemotePrintersCount(); } @Override public void run() { ! while(true) { ! long currentRemotePrintersCount = GetRemotePrintersCount(); ! if(prevRemotePrintersCount != currentRemotePrintersCount) { ! ! // updated the printers data ! // printers list now contains both local and network printer data refreshServices(); ! ! // store the current data for next comparison ! prevRemotePrintersCount = currentRemotePrintersCount; } } } } private native String getDefaultPrinterName(); private native String[] getAllPrinterNames(); ! private native long GetRemotePrintersCount(); }
< prev index next >