Update README to say GPLv2 or later and remove references to bzr.
[jerry/slag.git] / win32 / spoolss / PrinterChangeNotification.c
1 /******************************************************************\r
2  * SPOOLSS regression testing code for Samba print servers\r
3  * \r
4  *****************************************************************/\r
5 \r
6 #include <windows.h>\r
7 #include <stdio.h>\r
8 #include "printlib.h"\r
9 \r
10 void PrintNotifyInfoData(PRINTER_NOTIFY_INFO_DATA *p)\r
11 {\r
12         printf("\tType\t=0x%x\n", p->Type);\r
13         printf("\tField\t=0x%x\n", p->Field);\r
14         printf("\tId\t=0x%x\n", p->Id);\r
15         printf("\tdata\t= %s\n", p->NotifyData.Data.pBuf);\r
16 \r
17         return;\r
18 \r
19 }\r
20 \r
21 \r
22 int main (int argc, char* argv[])\r
23 {\r
24         \r
25         HANDLE  server, change;\r
26         PRINTER_NOTIFY_INFO     *change_info = NULL;\r
27         PRINTER_NOTIFY_OPTIONS watch, *pWatch = NULL;\r
28         PRINTER_NOTIFY_OPTIONS_TYPE data;\r
29         DWORD option = PRINTER_CHANGE_PRINTER_DRIVER;\r
30         BOOL use_notify_options = TRUE;\r
31         DWORD   condition;\r
32         DWORD flags = PRINTER_NOTIFY_OPTIONS_REFRESH;\r
33 \r
34 \r
35 \r
36         if ((argc < 3) || (strcmp(argv[1], "-l") && strcmp(argv[1], "-t")))\r
37         {\r
38                 fprintf (stderr, "usage: -l|-t %s <servername>\n", argv[0]);\r
39                 exit (-1);\r
40         }\r
41 \r
42         if (strcmp(argv[1], "-l") == 0)\r
43                 use_notify_options = FALSE;\r
44 \r
45 \r
46         if (!OpenPrinter (argv[2], &server, NULL))\r
47         {\r
48                 PrintLastError();\r
49                 exit (-1);\r
50         }\r
51         else\r
52         {\r
53                 printf ("Printer [%s] opened successfully.\n\n", argv[2]);\r
54         }\r
55 \r
56         printf ("flags = PRINTER_CHANGE_PRINTER\n");\r
57         watch.Version = 2;\r
58         watch.Count = 1;\r
59         watch.pTypes = &data;\r
60         data.Type = PRINTER_NOTIFY_TYPE;\r
61         data.Count = 1;\r
62         data.pFields = &option;\r
63 \r
64         if (use_notify_options) {\r
65                 pWatch = &watch;\r
66                 option = PRINTER_NOTIFY_FIELD_DRIVER_NAME;\r
67         }\r
68 \r
69         if ((change=FindFirstPrinterChangeNotification(server, option, 0, pWatch)) == INVALID_HANDLE_VALUE)\r
70         {\r
71                 printf ("FindFirstPrinterChangeNotification failed : ");\r
72                 PrintLastError();\r
73                 ClosePrinter(server);\r
74                 exit (-1);\r
75         }\r
76         else\r
77                 printf ("FindFirstPrinterChangeNotification succeeded with flags [PRINTER_CHANGE_PRINTER_DRIVER]\n\n");\r
78 \r
79         if (pWatch) {\r
80                 printf ("Calling FindNextPrinterCangeNotification() with PRINTER_NOTIFY_OPTIONS_REFRESH\n");\r
81                 memset(&watch, 0x0, sizeof(watch));\r
82                 watch.Flags = PRINTER_NOTIFY_OPTIONS_REFRESH;\r
83                 watch.Version = 2;\r
84                 if (FindNextPrinterChangeNotification(change, &condition, pWatch, &change_info))\r
85                         printf ("Received change notification of [0x%x]\n", condition);\r
86                 else\r
87                         PrintLastError();\r
88 \r
89                 if (change_info) {\r
90                         int i;\r
91 \r
92                         printf("\tVersion\t=0x%x\n", change_info->Version);\r
93                         printf("\tFlags\t=0x%x\n", change_info->Flags);\r
94                         printf("\tCount\t=%d\n", change_info->Count);\r
95 \r
96                         for (i=0; i<(int)change_info->Count; i++) {\r
97                                 PrintNotifyInfoData(&change_info->aData[i]);\r
98                                 printf("\n");\r
99                         }\r
100                 }\r
101 \r
102                 FreePrinterNotifyInfo(change_info);\r
103                 printf ("\n");\r
104         }\r
105 \r
106         do \r
107         {\r
108 \r
109                 printf ("Waiting for Printer Change Notification...\n");\r
110 \r
111                 if (WaitForSingleObject(change, INFINITE) != WAIT_OBJECT_0)\r
112                         continue;\r
113 \r
114                 if (FindNextPrinterChangeNotification(change, &condition, NULL, &change_info))\r
115                         printf ("Received change notification of [0x%x]\n", condition);\r
116                 else\r
117                         PrintLastError();\r
118 \r
119                 if (change_info) {\r
120                         int i;\r
121 \r
122                         printf("\tVersion\t=0x%x\n", change_info->Version);\r
123                         printf("\tFlags\t=0x%x\n", change_info->Flags);\r
124                         printf("\tCount\t=%d\n", change_info->Count);\r
125 \r
126                         for (i=0; i<(int)change_info->Count; i++) {\r
127                                 PrintNotifyInfoData(&change_info->aData[i]);\r
128                                 printf("\n");\r
129                         }\r
130                 }\r
131 \r
132                 FreePrinterNotifyInfo(change_info);\r
133                 printf ("\n");\r
134         } while (1);\r
135         \r
136 \r
137         if (FindClosePrinterChangeNotification(change))\r
138                 printf ("FindClosePrinterChangeNotification call succeeded.\n");\r
139         else\r
140         {\r
141                 printf ("FindClosePrinterChangeNotification failed : ");\r
142                 PrintLastError();\r
143         }\r
144         printf ("\n");\r
145 \r
146         if (!ClosePrinter(server))\r
147                 PrintLastError();\r
148         else\r
149                 printf ("Printer [%s] closed successfully.\n", argv[2]);\r
150 \r
151         return 0;\r
152 \r
153 }