From abcd1cad3af7ee111f711544407222951e33238e Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 14 Dec 2001 20:38:04 +0000 Subject: ChangeID fixe from APPLIANCE_HEAD (This used to be commit 096d06a961e3a3e6f6952754875b83558448f449) --- source3/printing/nt_printing.c | 46 +++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) (limited to 'source3/printing') diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index 481f61528d..c2cd1d6eeb 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -2643,7 +2643,39 @@ WERROR mod_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) { case 2: { - printer.info_2->c_setprinter++; + /* + * Update the changestamp. Emperical tests show that the + * ChangeID is always updated,but c_setprinter is only + * incremented on a SetPrinter() call. + */ + + time_t time_unix = time(NULL); + + /* ChangeID **must** be increasing over the lifetime + of client's spoolss service in order for the + client's cache to show updates */ + + printer.info_2->changeid = time_unix * 100; + + /* + * Because one day someone will ask: + * NT->NT An admin connection to a remote + * printer show changes imeediately in + * the properities dialog + * + * A non-admin connection will only show the + * changes after viewing the properites page + * 2 times. Seems to be related to a + * race condition in the client between the spooler + * updating the local cache and the Explorer.exe GUI + * actually displaying the properties. + * + * This is fixed in Win2k. admin/non-admin + * connections both display changes immediately. + * + * 14/12/01 --jerry + */ + result=update_a_printer_2(printer.info_2); break; } @@ -2671,17 +2703,13 @@ WERROR add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) case 2: { /* - * Update the changestamp. - * Note we must *not* do this in mod_a_printer(). + * Update the changestamp. See comments in mod_a_printer() + * --jerry */ - NTTIME time_nt; + time_t time_unix = time(NULL); - unix_to_nt_time(&time_nt, time_unix); - if (printer.info_2->changeid==time_nt.low) - printer.info_2->changeid++; - else - printer.info_2->changeid=time_nt.low; + printer.info_2->changeid = time_unix * 100; printer.info_2->c_setprinter++; result=update_a_printer_2(printer.info_2); -- cgit