Add minimalistic protected-headers support
[gpgol.git] / src / watchmouse.c
1 /* watchmouse.c - Debug utility  
2  * Copyright (C) 2008 g10 Code GmbH
3  *
4  * Watchmouse is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published
6  * by the Free Software Foundation; either version 3 of the License,
7  * or (at your option) any later version.
8  *
9  * Watchmouse is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <windows.h>
21
22 #define PGM "watchmouse"
23
24 /* The Instance of this process.  */
25 static HINSTANCE glob_hinst;
26
27 /* The current hook handle. */
28 static HHOOK mouse_hook;
29
30
31
32
33 \f
34 /* Logging stuff.  */
35 static void
36 do_log (const char *fmt, va_list a, int w32err, int err,
37         const void *buf, size_t buflen)
38 {
39   FILE *logfp;
40
41   if (!logfp)
42     logfp = stderr;
43
44 /*   if (lock_log ()) */
45 /*     return; */
46   
47 /*   if (!logfp) */
48 /*     logfp = fopen (logfile, "a+"); */
49 /*   if (!logfp) */
50 /*     { */
51 /*       unlock_log (); */
52 /*       return; */
53 /*     } */
54   
55   fprintf (logfp, PGM"(%05lu):%s ", 
56            ((unsigned long)GetTickCount () % 100000),
57            err == 1? " error:":"");
58   vfprintf (logfp, fmt, a);
59   if (w32err) 
60     {
61       char tmpbuf[256];
62       
63       FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, w32err, 
64                      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), 
65                      tmpbuf, sizeof (tmpbuf)-1, NULL);
66       fputs (": ", logfp);
67       if (*tmpbuf && tmpbuf[strlen (tmpbuf)-1] == '\n')
68         tmpbuf[strlen (tmpbuf)-1] = 0;
69       if (*tmpbuf && tmpbuf[strlen (tmpbuf)-1] == '\r')
70         tmpbuf[strlen (tmpbuf)-1] = 0;
71       fprintf (logfp, "%s (%d)", tmpbuf, w32err);
72     }
73   if (buf)
74     {
75       const unsigned char *p = (const unsigned char*)buf;
76
77       for ( ; buflen; buflen--, p++)
78         fprintf (logfp, "%02X", *p);
79       putc ('\n', logfp);
80     }
81   else if ( *fmt && fmt[strlen (fmt) - 1] != '\n')
82     putc ('\n', logfp);
83
84   fflush (logfp);
85 /*   unlock_log (); */
86 }
87
88
89 void 
90 log_info (const char *fmt, ...)
91 {
92   va_list a;
93   
94   va_start (a, fmt);
95   do_log (fmt, a, 0, 0, NULL, 0);
96   va_end (a);
97 }
98
99 void 
100 log_error (const char *fmt, ...)
101 {
102   va_list a;
103   
104   va_start (a, fmt);
105   do_log (fmt, a, 0, 1, NULL, 0);
106   va_end (a);
107 }
108
109 void 
110 log_vinfo (const char *fmt, va_list a)
111 {
112   do_log (fmt, a, 0, 0, NULL, 0);
113 }
114
115
116 void 
117 log_info_w32 (int w32err, const char *fmt, ...)
118 {
119   va_list a;
120
121   if (w32err == -1)
122     w32err = GetLastError ();
123   
124   va_start (a, fmt);
125   do_log (fmt, a, w32err, 0, NULL, 0);
126   va_end (a);
127 }
128
129 void 
130 log_error_w32 (int w32err, const char *fmt, ...)
131 {
132   va_list a;
133
134   if (w32err == -1)
135     w32err = GetLastError ();
136   
137   va_start (a, fmt);
138   do_log (fmt, a, w32err, 1, NULL, 0);
139   va_end (a);
140 }
141
142
143 void 
144 log_hexdump (const void *buf, size_t buflen, const char *fmt, ...)
145 {
146   va_list a;
147
148   va_start (a, fmt);
149   do_log (fmt, a, 0, 2, buf, buflen);
150   va_end (a);
151 }
152
153 \f
154
155
156
157
158 /* Here we receive mouse events.  */
159 static LRESULT CALLBACK
160 mouse_proc (int code, WPARAM wparam, LPARAM lparam)
161 {
162   MOUSEHOOKSTRUCT mh;
163
164       log_info ("%d received. w=%ld l=%lu", 
165                 code, (long)wparam, (unsigned long)lparam);
166   if (code < 0)
167     ;
168   else if (code == HC_ACTION)
169     {
170       log_info ("HC_ACTION received. w=%ld l=%lu", 
171                 (long)wparam, (unsigned long)lparam);
172     }
173   else if (code == HC_NOREMOVE)
174     {
175
176     }
177
178   return CallNextHookEx (mouse_hook, code, wparam, lparam);
179 }
180
181
182
183 int
184 main (int argc, char **argv)
185 {
186   glob_hinst = GetModuleHandle (NULL);
187   if (!glob_hinst)
188     {
189       log_error_w32 (-1, "GetModuleHandle failed");
190       return 1;
191     }
192   log_info ("start");
193
194   mouse_hook = SetWindowsHookEx (WH_MOUSE, mouse_proc, NULL, GetCurrentThreadId());
195   if (!mouse_hook)
196     {
197       log_error_w32 (-1, "SetWindowsHookEx failed");
198       return 1;
199     }  
200
201   getc (stdin);
202
203   log_info ("stop");
204   return 0;
205 }
206
207
208 /*
209 Local Variables:
210 compile-command: "i586-mingw32msvc-gcc -Wall -g -o watchmouse.exe watchmouse.c"
211 End:
212 */