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

Annotation of /trunk/src/OEProc.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 24 - (hide annotations)
Tue Dec 13 10:40:30 2011 UTC (13 years, 4 months ago) by twoaday
File MIME type: text/plain
File size: 8252 byte(s)
Commit code for backup purposes.


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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26