Proper merge of all the working printing stuff from APPLIANCE_HEAD.
[jra/samba/.git] / source3 / printing / notify.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 2.2
4    printing backend routines
5    Copyright (C) Tim Potter, 2002
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "printing.h"
23
24 /*
25  * Print notification routines
26  */
27
28 static void send_spoolss_notify2_msg(struct spoolss_notify_msg *msg)
29 {
30         char *buf = NULL;
31         int buflen = 0, len;
32         TDB_CONTEXT *tdb;
33
34         /* Let's not waste any time with this */
35
36         if (lp_disable_spoolss())
37                 return;
38
39         /* Flatten data into a message */
40
41 again:
42         len = 0;
43
44         /* Pack header */
45
46         len += tdb_pack(buf + len, buflen - len, "f", msg->printer);
47
48         len += tdb_pack(buf + len, buflen - len, "ddddd",
49                         msg->type, msg->field, msg->id, msg->len, msg->flags);
50
51         /* Pack data */
52
53         if (msg->len == 0)
54                 len += tdb_pack(buf + len, buflen - len, "dd",
55                                 msg->notify.value[0], msg->notify.value[1]);
56         else
57                 len += tdb_pack(buf + len, buflen - len, "B",
58                                 msg->len, msg->notify.data);
59
60         if (buflen != len) {
61                 buf = Realloc(buf, len);
62                 buflen = len;
63                 goto again;
64         }
65
66         /* Send message */
67
68         tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_DEFAULT, O_RDONLY, 0);
69
70         if (!tdb) {
71                 DEBUG(3, ("Failed to open connections database in send_spoolss_notify2_msg\n"));
72                 return;
73         }
74
75         message_send_all(tdb, MSG_PRINTER_NOTIFY2, buf,
76                          buflen, False, NULL);
77
78         SAFE_FREE(buf);
79         tdb_close(tdb);
80 }
81
82 static void send_notify_field_values(const char *printer_name, uint32 type,
83                                      uint32 field, uint32 id, uint32 value1, 
84                                      uint32 value2, uint32 flags)
85 {
86         struct spoolss_notify_msg msg;
87
88         ZERO_STRUCT(msg);
89
90         fstrcpy(msg.printer, printer_name);
91         msg.type = type;
92         msg.field = field;
93         msg.id = id;
94         msg.notify.value[0] = value1;
95         msg.notify.value[1] = value2;
96         msg.flags = flags;
97
98         send_spoolss_notify2_msg(&msg);
99 }
100
101 static void send_notify_field_buffer(const char *printer_name, uint32 type,
102                                      uint32 field, uint32 id, uint32 len,
103                                      char *buffer)
104 {
105         struct spoolss_notify_msg msg;
106
107         ZERO_STRUCT(msg);
108
109         fstrcpy(msg.printer, printer_name);
110         msg.type = type;
111         msg.field = field;
112         msg.id = id;
113         msg.len = len;
114         msg.notify.data = buffer;
115
116         send_spoolss_notify2_msg(&msg);
117 }
118
119 /* Send a message that the printer status has changed */
120
121 void notify_printer_status_byname(char *printer_name, uint32 status)
122 {
123         /* Printer status stored in value1 */
124
125         send_notify_field_values(printer_name, PRINTER_NOTIFY_TYPE, 
126                                  PRINTER_NOTIFY_STATUS, 0, 
127                                  status, 0, 0);
128 }
129
130 void notify_printer_status(int snum, uint32 status)
131 {
132         char *printer_name = PRINTERNAME(snum);
133
134         if (printer_name)
135                 notify_printer_status_byname(printer_name, status);
136 }
137
138 void notify_job_status_byname(char *printer_name, uint32 jobid, uint32 status,
139                               uint32 flags)
140 {
141         /* Job id stored in id field, status in value1 */
142
143         send_notify_field_values(printer_name, JOB_NOTIFY_TYPE,
144                                  JOB_NOTIFY_STATUS, jobid,
145                                  status, 0, flags);
146 }
147
148 void notify_job_status(int snum, uint32 jobid, uint32 status)
149 {
150         char *printer_name = PRINTERNAME(snum);
151
152         notify_job_status_byname(printer_name, jobid, status, 0);
153 }
154
155 void notify_job_total_bytes(int snum, uint32 jobid, uint32 size)
156 {
157         char *printer_name = PRINTERNAME(snum);
158
159         /* Job id stored in id field, status in value1 */
160
161         send_notify_field_values(printer_name, JOB_NOTIFY_TYPE,
162                                  JOB_NOTIFY_TOTAL_BYTES, jobid,
163                                  size, 0, 0);
164 }
165
166 void notify_job_total_pages(int snum, uint32 jobid, uint32 pages)
167 {
168         char *printer_name = PRINTERNAME(snum);
169
170         /* Job id stored in id field, status in value1 */
171
172         send_notify_field_values(printer_name, JOB_NOTIFY_TYPE,
173                                  JOB_NOTIFY_TOTAL_PAGES, jobid,
174                                  pages, 0, 0);
175 }
176
177 void notify_job_username(int snum, uint32 jobid, char *name)
178 {
179         char *printer_name = PRINTERNAME(snum);
180
181         send_notify_field_buffer(
182                 printer_name, JOB_NOTIFY_TYPE, JOB_NOTIFY_USER_NAME,
183                 jobid, strlen(name) + 1, name);
184 }
185
186 void notify_job_name(int snum, uint32 jobid, char *name)
187 {
188         char *printer_name = PRINTERNAME(snum);
189
190         send_notify_field_buffer(
191                 printer_name, JOB_NOTIFY_TYPE, JOB_NOTIFY_DOCUMENT,
192                 jobid, strlen(name) + 1, name);
193 }
194
195 void notify_job_submitted(int snum, uint32 jobid, time_t submitted)
196 {
197         char *printer_name = PRINTERNAME(snum);
198
199         send_notify_field_buffer(
200                 printer_name, JOB_NOTIFY_TYPE, JOB_NOTIFY_SUBMITTED,
201                 jobid, sizeof(submitted), (char *)&submitted);
202 }
203
204 void notify_printer_delete(char *printer_name)
205 {
206 }
207
208 void notify_printer_add(char *printer_name)
209 {
210 }
211
212 void notify_printer_driver(int num, char *driver_name)
213 {
214 }
215
216 void notify_printer_comment(int num, char *comment)
217 {
218 }
219
220 void notify_printer_sharename(int num, char *share_name)
221 {
222 }
223
224 void notify_printer_port(int num, char *port_name)
225 {
226 }
227
228 void notify_printer_location(int num, char *location)
229 {
230 }