summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 3a2bde2d05..795a420a23 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -170,6 +170,41 @@ static void free_spool_notify_option(SPOOL_NOTIFY_OPTION **pp)
SAFE_FREE(*pp);
}
+/****************************************************************************
+ wrapper function to maintain a reference count to the number of
+ open change notification handles we have
+****************************************************************************/
+
+static BOOL spooler_message_flags( BOOL doreg )
+{
+ static uint32 ref_count = 0;
+ BOOL result = True;
+
+ /*
+ * check for boundary counditions ....
+ * if ref_count == 0 and we want to register OR
+ * if ref_count == 1 and we want to deregister, THEN
+ * OK.
+ */
+
+ if ( ((ref_count == 0) && doreg) || ((ref_count == 1) && !doreg) )
+ result = register_message_flags( doreg, FLAG_MSG_PRINTING );
+
+ /* increment/decrement reference count */
+
+ if ( doreg )
+ ref_count++;
+ else {
+ /* minimum is always 0 */
+ if ( ref_count )
+ ref_count--;
+ }
+
+ DEBUG(10,("spooler_message_flags: ref_count == %d\n", ref_count));
+
+ return result;
+}
+
/***************************************************************************
Disconnect from the client
****************************************************************************/
@@ -198,6 +233,11 @@ static void srv_spoolss_replycloseprinter(POLICY_HND *handle)
message_deregister(MSG_PRINTER_NOTIFY2);
}
+ /* Tell the connections db we're not interested in printer notify messages. */
+ /* reference count is handled by spooler_message_flags() */
+
+ spooler_message_flags( False );
+
smb_connections--;
}
@@ -220,9 +260,6 @@ static void free_printer_entry(void *ptr)
Printer->notify.option=NULL;
Printer->notify.client_connected=False;
- /* Tell the connections db we're not interested in printer notify messages. */
- register_message_flags(False, FLAG_MSG_PRINTING);
-
/* Remove from the internal list. */
DLIST_REMOVE(printers_list, Printer);
@@ -2242,8 +2279,6 @@ WERROR _spoolss_rffpcnex(pipes_struct *p, SPOOL_Q_RFFPCNEX *q_u, SPOOL_R_RFFPCNE
&Printer->notify.client_hnd))
return WERR_SERVER_UNAVAILABLE;
- /* Tell the connections db we're interested in printer notify messages. */
- register_message_flags(True, FLAG_MSG_PRINTING);
Printer->notify.client_connected=True;
return WERR_OK;
@@ -5599,9 +5634,6 @@ WERROR _spoolss_fcpn(pipes_struct *p, SPOOL_Q_FCPN *q_u, SPOOL_R_FCPN *r_u)
free_spool_notify_option(&Printer->notify.option);
Printer->notify.client_connected=False;
- /* Tell the connections db we're not interested in printer notify messages. */
- register_message_flags(False, FLAG_MSG_PRINTING);
-
return WERR_OK;
}