/[gpgoe]/trunk/init/GPGOEInit.c
ViewVC logotype

Annotation of /trunk/init/GPGOEInit.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18 - (hide annotations)
Thu Apr 13 07:41:30 2006 UTC (19 years ago) by twoaday
File MIME type: text/plain
File size: 8061 byte(s)
Prepare 0.8.1 release.


1 twoaday 1 /* GPGOEInit.c - GPGOE DLL Loader
2     * Copyright (C) 2001, 2002, 2006 Timo Schulz
3     *
4     * This file is part of GPGOE.
5     *
6     * GPGOE is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU Lesser General Public License as published by
8     * the Free Software Foundation; either version 2.1 of the License, or
9     * (at your option) any later version.
10     *
11     * GPGOE is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU Lesser General Public License
17     * along with GPGOE; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20    
21 twoaday 4 #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24 twoaday 1 #include <windows.h>
25 twoaday 18 #include <tlhelp32.h>
26     #include <stdio.h>
27     #include <ctype.h>
28    
29 twoaday 1 #include "resource.h"
30    
31    
32 twoaday 18 /* Supported plug-in modes. */
33     enum gpgoe_mode_t {
34     GPGOE_MODE_NORMAL = 0,
35     GPGOE_MODE_PLAINREPLY = 1
36     };
37 twoaday 2
38 twoaday 18 /* DLL imports. */
39     int gpgoe_initialize (void);
40     int gpgoe_remove (void);
41     void gpgoe_set_active_modes (int mode);
42     int gpgoe_get_active_modes (void);
43    
44    
45     /* Global module handle. */
46 twoaday 1 static HINSTANCE glob_hinst = NULL;
47    
48 twoaday 18 /* String array of programs which are known to cause trouble
49     with GPGoe. */
50     static const char *conflict_apps[] = {
51     "DUMMY", /* dummy entry. */
52     "SPYXX.EXE",
53     NULL
54     };
55 twoaday 1
56 twoaday 18
57     /* Enumerate all processes and figure out if a program
58     is running which could be a conflict for gpgoe. */
59     static int
60     check_for_conflict_apps (void)
61     {
62     PROCESSENTRY32 pe;
63     HANDLE hd;
64     BOOL next;
65     int fnd = 0;
66    
67     hd = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
68     if (hd == (HANDLE)-1)
69     return 0;
70    
71     memset (&pe, 0, sizeof (pe));
72     pe.dwSize = sizeof (pe);
73     next = Process32First (hd, &pe);
74     while (next) {
75     size_t i;
76    
77     for (i=0; i < strlen (pe.szExeFile); i++)
78     pe.szExeFile[i] = (char)toupper ((int)pe.szExeFile[i]);
79     for (i=0; conflict_apps[i] != NULL; i++) {
80     if (strstr (pe.szExeFile, conflict_apps[i])) {
81     fnd = i;
82     break;
83     }
84     }
85     next = Process32Next (hd, &pe);
86     if (!next)
87     break;
88     }
89     CloseHandle (hd);
90     return fnd;
91     }
92    
93    
94     /* Return -1 if there was a running instance of OE detected. */
95     static int
96     outlook_is_running (void)
97     {
98     if (!FindWindowEx (NULL, NULL, "Outlook Express Browser Class", NULL))
99     return 0;
100     return -1;
101     }
102    
103    
104     /* Set the menu item @muid to the state @state. */
105     void
106     set_menu_state (HMENU menu, UINT muid, UINT state)
107     {
108     MENUITEMINFO mii;
109    
110     memset (&mii, 0, sizeof (mii));
111     mii.cbSize = sizeof (mii);
112     mii.fMask = MIIM_STATE;
113     mii.fState = state;
114     SetMenuItemInfo (menu, muid, FALSE, &mii);
115     }
116    
117    
118     /* Get an option with the name @name from the registry. */
119     int
120     get_gpgoe_option (const char *name)
121     {
122     HKEY hkey;
123     LONG err;
124     char val[32];
125     DWORD type = 0, vallen = sizeof (val);
126    
127     err = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\GNU\\GPGoe", 0,
128     KEY_READ, &hkey);
129     if (err != ERROR_SUCCESS)
130     return 0;
131     err = RegQueryValueEx (hkey, name, NULL, &type, (BYTE*)val, &vallen);
132     RegCloseKey (hkey);
133     if (err != ERROR_SUCCESS)
134     return 0;
135     return atoi (val);
136     }
137    
138    
139     /* Put an option with the name @name and the value @val in th registry. */
140     int
141     put_gpgoe_option (const char *name, int val)
142     {
143     HKEY hkey;
144     char buf[32];
145     LONG err;
146    
147     sprintf (buf, "%d", val);
148     err = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\GNU\\GPGoe", 0,
149     KEY_WRITE, &hkey);
150     if (err != ERROR_SUCCESS)
151     return -1;
152     err = RegSetValueEx (hkey, name, 0, REG_SZ, (BYTE *)buf, strlen (buf));
153     RegCloseKey (hkey);
154     return err != ERROR_SUCCESS? -1 : 0;
155     }
156    
157    
158     /* Create the GPGoe registry if needed. */
159     static int
160     create_registry_key (void)
161     {
162     HKEY hkey;
163     LONG err;
164    
165     err = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\GNU\\GPGoe",
166     0, KEY_READ, &hkey);
167     if (err == ERROR_SUCCESS) {
168     RegCloseKey (hkey);
169     return 0;
170     }
171     err = RegCreateKey (HKEY_CURRENT_USER, "Software\\GNU\\GPGoe", &hkey);
172     if (err != ERROR_SUCCESS)
173     return -1;
174     RegCloseKey (hkey);
175     return 0;
176     }
177    
178    
179     /* Main window procedure for the taskbar program. */
180 twoaday 1 LRESULT CALLBACK
181     gpgoe_main_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
182     {
183 twoaday 18 static int decrypt_replies = 0;
184 twoaday 1 NOTIFYICONDATA NID;
185 twoaday 18 POINT p;
186     HMENU hm, popup;
187 twoaday 1 int id;
188    
189 twoaday 2 switch (msg) {
190 twoaday 1 case WM_CREATE:
191 twoaday 2 NID.cbSize = sizeof (NID);
192 twoaday 18 NID.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
193 twoaday 1 NID.uCallbackMessage = WM_USER;
194     NID.hWnd = hwnd;
195 twoaday 2 NID.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_GPGOE));
196 twoaday 18 strcpy(NID.szTip, "GPG for Outlook Express");
197 twoaday 1 Shell_NotifyIcon (NIM_ADD, &NID);
198 twoaday 18 DestroyIcon (NID.hIcon);
199    
200     decrypt_replies = get_gpgoe_option ("PlaintextReply");
201     if (decrypt_replies)
202     gpgoe_set_active_modes (GPGOE_MODE_PLAINREPLY);
203 twoaday 1 if (gpgoe_initialize ()) {
204 twoaday 18 MessageBox (hwnd, "Couldn't register GPG OE hook", "Error", MB_ICONERROR|MB_OK);
205 twoaday 1 ExitProcess (0);
206     }
207     break;
208    
209     case WM_DESTROY:
210     case WM_ENDSESSION:
211 twoaday 18 put_gpgoe_option ("PlaintextReply", decrypt_replies);
212 twoaday 1 gpgoe_remove ();
213 twoaday 2 Shell_NotifyIcon (NIM_DELETE, &NID);
214 twoaday 1 PostQuitMessage (0);
215     ExitProcess (0);
216     return 0;
217    
218 twoaday 18 case WM_COMMAND:
219     switch (LOWORD (wparam)) {
220     case ID_INIT_SUPP_PLAINREPLY:
221     decrypt_replies ^= 1;
222     if (!decrypt_replies) {
223     int modes = gpgoe_get_active_modes ();
224     gpgoe_set_active_modes (modes & (~GPGOE_MODE_PLAINREPLY));
225     }
226     else {
227     gpgoe_set_active_modes (GPGOE_MODE_PLAINREPLY);
228     if (outlook_is_running ())
229     MessageBox (NULL, "You need to restart Outlook Express.",
230     "GPGOE Information", MB_ICONINFORMATION|MB_OK);
231     }
232     break;
233    
234     case ID_INIT_QUIT:
235     SendMessage (hwnd, WM_DESTROY, 0, 0);
236     break;
237     }
238     break;
239    
240 twoaday 1 case WM_USER:
241     switch (lparam) {
242     case WM_LBUTTONDBLCLK:
243 twoaday 2 SetForegroundWindow (hwnd);
244 twoaday 1 id = MessageBox (NULL, "Remove the GPG OE plug-in from the system?",
245     "Are you sure?", MB_YESNO|MB_ICONINFORMATION);
246     if (id == IDYES)
247     SendMessage (hwnd, WM_DESTROY, 0, 0);
248     break;
249    
250     case WM_RBUTTONUP:
251 twoaday 18 SetForegroundWindow (hwnd);
252     GetCursorPos (&p);
253     hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_INIT));
254     popup = GetSubMenu (hm, 0);
255     set_menu_state (popup, ID_INIT_SUPP_PLAINREPLY,
256     decrypt_replies? MFS_CHECKED : MFS_UNCHECKED);
257     TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, hwnd, NULL);
258     PostMessage (hwnd, WM_USER, 0, 0);
259     DestroyMenu (popup);
260     DestroyMenu (hm);
261 twoaday 1 break;
262     }
263     break;
264 twoaday 18 }
265 twoaday 1
266 twoaday 2 return DefWindowProc (hwnd, msg, wparam, lparam);
267 twoaday 1 }
268    
269    
270 twoaday 18 /* Main entry function. */
271 twoaday 1 int WINAPI
272     WinMain (HINSTANCE hinst, HINSTANCE prev, LPSTR cmdline, int cmd_show)
273     {
274     WNDCLASS wc;
275     HWND hwnd;
276     MSG msg;
277 twoaday 18 int idx;
278    
279     idx = check_for_conflict_apps ();
280     if (idx > 0) {
281     char buf[256];
282     _snprintf (buf, sizeof (buf)-1,
283     "GPGoe found an instance of a program which\n"
284     "might be effect the functionality of the plugin.\n"
285     "\n"
286     "Name of the process: %s\n"
287     "\n"
288     "Continue to load the plug-in?", conflict_apps[idx]);
289     idx = MessageBox (NULL, buf, "GPGOE Warning", MB_ICONWARNING|MB_YESNO);
290     if (idx == IDNO)
291     return 0;
292     }
293 twoaday 1
294 twoaday 18 create_registry_key ();
295 twoaday 1 glob_hinst = hinst;
296     CreateMutex (NULL, 1, "GPGOE");
297     if (GetLastError () == ERROR_ALREADY_EXISTS)
298     return 0;
299    
300 twoaday 2 memset (&wc, 0, sizeof(wc));
301 twoaday 1 wc.hInstance = hinst;
302     wc.lpszClassName = "GPGOE";
303     wc.lpfnWndProc = (WNDPROC)gpgoe_main_proc;
304 twoaday 2 if (!RegisterClass (&wc)) {
305 twoaday 18 MessageBox (NULL, "Couldn't register the window class", "Error",
306     MB_ICONERROR|MB_OK);
307     return 1;
308 twoaday 1 }
309    
310 twoaday 18 hwnd = CreateWindow ("GPGOE", "GPGOE", 0, 0, 0, 0, 0, NULL, NULL, hinst, NULL);
311 twoaday 1 if (!hwnd) {
312 twoaday 18 MessageBox (NULL, "Couldn't create window", "Error", MB_ICONERROR|MB_OK);
313 twoaday 1 return 1;
314     }
315     UpdateWindow (hwnd);
316     while (GetMessage (&msg, hwnd, 0, 0)) {
317     TranslateMessage (&msg);
318     DispatchMessage (&msg);
319     }
320     return 0;
321     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26