/[gpgoe]/trunk/src/OEProc.c
ViewVC logotype

Annotation of /trunk/src/OEProc.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (hide annotations)
Fri Apr 7 10:46:41 2006 UTC (19 years, 1 month ago) by twoaday
File MIME type: text/plain
File size: 8964 byte(s)


1 twoaday 1 /* OEProc.c - OE window procedures
2     * Copyright (C) 2001, 2002, 2003, 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     #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24     #include <windows.h>
25     #include <stdio.h>
26 twoaday 11 #include <commctrl.h>
27    
28 twoaday 1 #include "gpgme.h"
29     #include "GPGOE.h"
30    
31 twoaday 12 /* Outlook V6.x command IDs. */
32     #define ID_OE_ENCRYPT 40260
33     #define ID_OE_SIGN 40299
34     #define ID_OE_SEND 40411
35     #define ID_OE_PREVMSG 40145
36     #define ID_OE_NEXTMSG 40146
37 twoaday 11
38 twoaday 12 /* Outlook select charset IDs. */
39     #define ID_OE_CP_UTF8 42540
40     #define ID_OE_CP_WEUROPE_ISO 42544
41     #define ID_OE_CP_WEUROPE_WINCP 42545
42     #define ID_OE_CP_MEUROPE_ISO 42525
43     #define ID_OE_CP_MEUROPE_WINCP 42526
44     #define ID_OE_CP_LATIN9 42535
45    
46 twoaday 1 /* Global plugin structure. */
47     static plugin_ctx_t oe_plug;
48    
49 twoaday 11 /* We show a warning for the attachment problem, but only once. */
50     static int attach_warn_shown = 0;
51 twoaday 1
52 twoaday 12 /* One time initialisation finished?. */
53     static int plugin_preload_done = 0;
54 twoaday 11
55 twoaday 12 /* Event to indicate if the plugin is active or not. */
56     HANDLE plugin_active = NULL;
57    
58    
59     /* Return the Outlook main window handle. */
60     HWND
61     outlook_get_main_window (void)
62     {
63     if (!oe_plug)
64     return GetActiveWindow ();
65     return oe_plug->main_wnd;
66     }
67    
68    
69 twoaday 11 /* Display a warning that the attachments of the mail will be
70     sent in cleartext. */
71     static void
72     show_attachment_warn (HWND hwnd)
73     {
74     if (attach_warn_shown)
75     return;
76    
77     MessageBox (hwnd, _("GPGOE is unable to secure attachments.\r\n"
78     "As a result the data attached to this mail is NOT encrypted."),
79     _("GPG Plug-in Warning"), MB_ICONWARNING|MB_OK);
80     attach_warn_shown = 1;
81     }
82    
83    
84 twoaday 1 /* Display a warning that the mail will be sent in clear. */
85     static void
86     show_plaintext_warn (HWND hwnd, int rc)
87     {
88     const char *fmt, *s;
89     char *p;
90    
91 twoaday 11 fmt = _("WARNING: This message will be sent in cleartext.\r\n\r\n"
92     "Error description: %s.");
93 twoaday 1 s = gpgme_strerror (rc);
94     p = xcalloc (1, strlen (fmt)+ strlen (s)+2);
95     sprintf (p, fmt, s);
96     MessageBox (hwnd, p, _("GPG Plug-in Warning"), MB_ICONWARNING|MB_OK);
97     free_if_alloc (p);
98     }
99    
100    
101 twoaday 12 /* Reset the plugin state. */
102 twoaday 1 static void
103     plugin_reset (plugin_ctx_t ctx)
104     {
105     if (!ctx)
106     return;
107     free_if_alloc (ctx->to);
108     free_if_alloc (ctx->cc);
109     free_if_alloc (ctx->bcc);
110     ctx->sign = ctx->encrypt = 0;
111     memset (ctx->errbuf, 0, sizeof (ctx->errbuf));
112     }
113    
114    
115 twoaday 12 /* Release plugin context. */
116 twoaday 1 static void
117     plugin_release (plugin_ctx_t ctx)
118     {
119     if (!ctx)
120     return;
121     plugin_reset (ctx);
122     free_if_alloc (ctx);
123     }
124    
125    
126 twoaday 12 /* Create new plugin context. */
127 twoaday 1 static int
128     plugin_new (plugin_ctx_t *r_ctx)
129     {
130     plugin_ctx_t ctx;
131    
132     *r_ctx = NULL;
133     ctx = xcalloc (1, sizeof *ctx);
134     *r_ctx = ctx;
135     return 0;
136     }
137    
138    
139     /* Extract the email from the given edit control @edit
140     and return it as a string. */
141     static char*
142     get_address_text (HWND main, HWND edit)
143     {
144     AttachThreadInput (GetCurrentThreadId (),
145     GetWindowThreadProcessId (main, NULL),
146     TRUE);
147    
148     SetFocus (edit);
149    
150     AttachThreadInput (GetCurrentThreadId (),
151     GetWindowThreadProcessId (main, NULL),
152     FALSE);
153    
154 twoaday 12 SendMessage (main, WM_COMMAND, MAKEWPARAM (ID_OE_SELECTALL, 0), 0);
155     SendMessage (main, WM_COMMAND, MAKEWPARAM (ID_OE_COPY, 0), 0);
156 twoaday 1
157     Sleep (200);
158    
159     return get_clip_text (NULL);;
160     }
161    
162    
163     /* Try to figure out if the message is from the inbox or
164     the outbox folder. */
165     int
166     window_is_inbox (HWND to_hwnd)
167     {
168     /*
169     XXX: we need to check the express version otherwise early
170     V6 versions will not work.
171     if (GetWindowLong (to_hwnd, GWL_STYLE) & ES_READONLY)
172     return 1;
173     */
174     if (GetDlgCtrlID (to_hwnd) == 1028)
175     return 1;
176     return 0;
177     }
178    
179    
180 twoaday 11 /* Check if the attach listview control contains at least one entry.
181 twoaday 12 Return the amount of attachments. */
182 twoaday 11 int
183 twoaday 12 mail_count_attachments (plugin_ctx_t ctx)
184 twoaday 11 {
185 twoaday 12 if (!ctx->attach)
186     return 0;
187     return ListView_GetItemCount (ctx->attach);
188 twoaday 11 }
189    
190    
191 twoaday 1 /* Initialize the plugin context:
192     Find all windows the plugin need to handle messages.
193     The text of the recipients fields is only used when the message comes
194     from the outbox, because the inbox fields are readonly.
195     >= OE 5.5 uses a newer RichEdit control! */
196     int
197     plugin_init (plugin_ctx_t ctx, HWND main, int is_inbox)
198     {
199 twoaday 11 /* store original clipboard text. */
200     free_if_alloc (ctx->orig_text);
201     ctx->orig_text = get_clip_text (NULL);
202    
203 twoaday 1 ctx->sign = 0;
204     ctx->encrypt = 0;
205    
206     ctx->main_wnd = main;
207     ctx->addr_wnd = FindWindowEx (main, NULL, "OE_Envelope", NULL);
208     ctx->to_wnd = FindWindowEx (ctx->addr_wnd, NULL, "RICHEDIT", NULL);
209     if (!ctx->to_wnd)
210     ctx->to_wnd = FindWindowEx (ctx->addr_wnd, NULL, "RichEdit20W", NULL);
211     ctx->cc_wnd = FindWindowEx (ctx->addr_wnd, ctx->to_wnd, "RICHEDIT", NULL);
212     if (!ctx->cc_wnd)
213     ctx->cc_wnd = FindWindowEx (ctx->addr_wnd, ctx->to_wnd,
214     "RichEdit20W", NULL);
215     ctx->bcc_wnd = FindWindowEx (ctx->addr_wnd, ctx->cc_wnd, "RICHEDIT", NULL);
216     if (!ctx->bcc_wnd)
217     ctx->bcc_wnd = FindWindowEx (ctx->addr_wnd, ctx->cc_wnd,
218     "RichEdit20W", NULL);
219     ctx->to = NULL;
220     ctx->cc = NULL;
221     ctx->bcc = NULL;
222    
223 twoaday 12 ctx->attach = FindWindowEx (ctx->addr_wnd, NULL, "SysListView32", NULL);
224    
225 twoaday 1 if (!is_inbox && !window_is_inbox (ctx->to_wnd)) {
226     ctx->to = get_address_text (ctx->main_wnd, ctx->to_wnd);
227     ctx->cc = get_address_text (ctx->main_wnd, ctx->cc_wnd);
228     ctx->bcc = get_address_text (ctx->main_wnd, ctx->bcc_wnd);
229     }
230    
231     return 0;
232     }
233    
234    
235 twoaday 11 /* Clear the clipboard contents. */
236 twoaday 1 static void
237     clear_clipboard (void)
238     {
239     OpenClipboard (NULL);
240     EmptyClipboard ();
241     CloseClipboard ();
242     }
243    
244    
245 twoaday 12 /* Restore the original clipboard data from the plugin context. */
246 twoaday 11 static void
247     restore_clipboard (plugin_ctx_t ctx)
248     {
249     if (!ctx->orig_text)
250     return;
251     set_clip_text (NULL, ctx->orig_text, strlen (ctx->orig_text));
252     free_if_alloc (ctx->orig_text);
253     }
254    
255    
256 twoaday 1 /* Subclass dialog procedure for the outlook message window. */
257     LRESULT CALLBACK
258     oe_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
259     {
260 twoaday 4 static int initialized = 0;
261 twoaday 1 static int encr_msg = 0;
262     static int sign_msg = 0;
263     int rc = 0;
264    
265     if (initialized == 0)
266     initialized = SetTimer (hwnd, 1, 1000, NULL);
267    
268     switch (msg) {
269 twoaday 11 case WM_CREATE:
270 twoaday 12 if (!plugin_preload_done) {
271     /* we need to load this lib here otherwise the richedit
272     control would not be displayed. */
273     LoadLibrary ("RichEd32.Dll");
274     setup_gettext();
275     plugin_active = CreateEvent (NULL, TRUE, /*TRUE*/FALSE, NULL);
276     plugin_preload_done = 1;
277     }
278     /*
279     else
280     SetEvent (plugin_active);
281     */
282 twoaday 1 initialized = 0;
283     plugin_new (&oe_plug);
284     break;
285    
286     case WM_DESTROY:
287 twoaday 12 ResetEvent (plugin_active);
288 twoaday 1 plugin_release (oe_plug);
289 twoaday 11 encr_msg = sign_msg = 0;
290 twoaday 1 break;
291    
292 twoaday 11 case WM_TIMER:
293 twoaday 1 KillTimer (hwnd, initialized);
294     plugin_reset (oe_plug);
295     plugin_init (oe_plug, hwnd, 1);
296     if (window_is_inbox (oe_plug->to_wnd)) {
297 twoaday 11 clear_clipboard ();
298 twoaday 1 rc = oe_handle_mail (oe_plug);
299     if (rc)
300     show_error (hwnd, _("GPG Plug-in Error"), MB_ICONERROR|MB_OK,
301     _("decrypt/verify: %s\n%s"),
302     gpgme_strerror (rc), oe_plug->errbuf);
303     }
304 twoaday 12 break;
305 twoaday 1
306 twoaday 12 case WM_COMMAND:
307     switch (LOWORD (wparam)) {
308     case ID_OE_PREVMSG:
309     case ID_OE_NEXTMSG:
310     SetTimer (hwnd, 1, 1000, NULL);
311     break;
312 twoaday 1
313 twoaday 12 case ID_OE_CP_UTF8:
314     oe_plug->use_utf8 = 1;
315     break;
316 twoaday 1
317 twoaday 12 case ID_OE_CP_WEUROPE_ISO:
318     case ID_OE_CP_WEUROPE_WINCP:
319     case ID_OE_CP_MEUROPE_ISO:
320     case ID_OE_CP_MEUROPE_WINCP:
321     case ID_OE_CP_LATIN9:
322     oe_plug->use_utf8 = 0;
323     break;
324 twoaday 1
325 twoaday 12 case ID_OE_ENCRYPT:
326     encr_msg ^= 1;
327     break;
328    
329     case ID_OE_SIGN:
330     sign_msg ^= 1;
331     break;
332    
333     case ID_OE_SEND:
334     if (encr_msg || sign_msg) {
335     plugin_init (oe_plug, hwnd, 0);
336     if (encr_msg) {
337     SendMessage (hwnd, WM_COMMAND, MAKEWPARAM (ID_OE_ENCRYPT, 0), 0);
338     oe_plug->encrypt = 1;
339     }
340     if (sign_msg) {
341     SendMessage (hwnd, WM_COMMAND, MAKEWPARAM (ID_OE_SIGN, 0), 0);
342     oe_plug->sign = 1;
343     }
344     rc = oe_handle_mail (oe_plug);
345     if (rc)
346     show_plaintext_warn (hwnd, rc);
347     restore_clipboard (oe_plug);
348     if (mail_count_attachments (oe_plug) > 0)
349     show_attachment_warn (hwnd);
350     }
351     break;
352     }
353     break;
354 twoaday 1 }
355    
356     return CallWindowProc (oe_proc_old, hwnd, msg, wparam, lparam);
357     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26