summaryrefslogtreecommitdiff
path: root/source3/printing
diff options
context:
space:
mode:
Diffstat (limited to 'source3/printing')
-rw-r--r--source3/printing/nt_printing.c46
1 files changed, 37 insertions, 9 deletions
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);