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

Annotation of /trunk/src/OEProc.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (hide annotations)
Mon Apr 3 17:10:15 2006 UTC (19 years, 1 month ago) by twoaday
File MIME type: text/plain
File size: 7733 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 11
32 twoaday 1 /* Global plugin structure. */
33     static plugin_ctx_t oe_plug;
34    
35 twoaday 11 /* We show a warning for the attachment problem, but only once. */
36     static int attach_warn_shown = 0;
37 twoaday 1
38 twoaday 11
39     /* Display a warning that the attachments of the mail will be
40     sent in cleartext. */
41     static void
42     show_attachment_warn (HWND hwnd)
43     {
44     if (attach_warn_shown)
45     return;
46    
47     MessageBox (hwnd, _("GPGOE is unable to secure attachments.\r\n"
48     "As a result the data attached to this mail is NOT encrypted."),
49     _("GPG Plug-in Warning"), MB_ICONWARNING|MB_OK);
50     attach_warn_shown = 1;
51     }
52    
53    
54 twoaday 1 /* Display a warning that the mail will be sent in clear. */
55     static void
56     show_plaintext_warn (HWND hwnd, int rc)
57     {
58     const char *fmt, *s;
59     char *p;
60    
61 twoaday 11 fmt = _("WARNING: This message will be sent in cleartext.\r\n\r\n"
62     "Error description: %s.");
63 twoaday 1 s = gpgme_strerror (rc);
64     p = xcalloc (1, strlen (fmt)+ strlen (s)+2);
65     sprintf (p, fmt, s);
66     MessageBox (hwnd, p, _("GPG Plug-in Warning"), MB_ICONWARNING|MB_OK);
67     free_if_alloc (p);
68     }
69    
70    
71     /* Reset the plugin. */
72     static void
73     plugin_reset (plugin_ctx_t ctx)
74     {
75     if (!ctx)
76     return;
77     free_if_alloc (ctx->to);
78     free_if_alloc (ctx->cc);
79     free_if_alloc (ctx->bcc);
80     ctx->sign = ctx->encrypt = 0;
81     memset (ctx->errbuf, 0, sizeof (ctx->errbuf));
82     }
83    
84    
85     static void
86     plugin_release (plugin_ctx_t ctx)
87     {
88     if (!ctx)
89     return;
90     plugin_reset (ctx);
91     free_if_alloc (ctx);
92     }
93    
94    
95     static int
96     plugin_new (plugin_ctx_t *r_ctx)
97     {
98     plugin_ctx_t ctx;
99    
100     *r_ctx = NULL;
101     ctx = xcalloc (1, sizeof *ctx);
102     *r_ctx = ctx;
103     return 0;
104     }
105    
106    
107     /* Extract the email from the given edit control @edit
108     and return it as a string. */
109     static char*
110     get_address_text (HWND main, HWND edit)
111     {
112     AttachThreadInput (GetCurrentThreadId (),
113     GetWindowThreadProcessId (main, NULL),
114     TRUE);
115    
116     SetFocus (edit);
117    
118     AttachThreadInput (GetCurrentThreadId (),
119     GetWindowThreadProcessId (main, NULL),
120     FALSE);
121    
122     SendMessage (main, WM_COMMAND, MAKEWPARAM (ID_OE5_SELECTALL, 0), 0);
123     SendMessage (main, WM_COMMAND, MAKEWPARAM (ID_OE5_COPY, 0), 0);
124    
125     Sleep (200);
126    
127     return get_clip_text (NULL);;
128     }
129    
130    
131     /* Try to figure out if the message is from the inbox or
132     the outbox folder. */
133     int
134     window_is_inbox (HWND to_hwnd)
135     {
136     /*
137     XXX: we need to check the express version otherwise early
138     V6 versions will not work.
139     if (GetWindowLong (to_hwnd, GWL_STYLE) & ES_READONLY)
140     return 1;
141     */
142     if (GetDlgCtrlID (to_hwnd) == 1028)
143     return 1;
144     return 0;
145     }
146    
147    
148 twoaday 11 /* Check if the attach listview control contains at least one entry.
149     Return 1 if the mail has attachments. */
150     int
151     mail_has_attachments (plugin_ctx_t ctx)
152     {
153     HWND attach;
154    
155     attach = FindWindowEx (ctx->addr_wnd, NULL, "SysListView32", NULL);
156     return attach && ListView_GetItemCount (attach) > 0;
157     }
158    
159    
160 twoaday 1 /* Initialize the plugin context:
161     Find all windows the plugin need to handle messages.
162     The text of the recipients fields is only used when the message comes
163     from the outbox, because the inbox fields are readonly.
164     >= OE 5.5 uses a newer RichEdit control! */
165     int
166     plugin_init (plugin_ctx_t ctx, HWND main, int is_inbox)
167     {
168 twoaday 11 /* store original clipboard text. */
169     free_if_alloc (ctx->orig_text);
170     ctx->orig_text = get_clip_text (NULL);
171    
172 twoaday 1 ctx->sign = 0;
173     ctx->encrypt = 0;
174    
175     ctx->main_wnd = main;
176     ctx->addr_wnd = FindWindowEx (main, NULL, "OE_Envelope", NULL);
177     ctx->to_wnd = FindWindowEx (ctx->addr_wnd, NULL, "RICHEDIT", NULL);
178     if (!ctx->to_wnd)
179     ctx->to_wnd = FindWindowEx (ctx->addr_wnd, NULL, "RichEdit20W", NULL);
180     ctx->cc_wnd = FindWindowEx (ctx->addr_wnd, ctx->to_wnd, "RICHEDIT", NULL);
181     if (!ctx->cc_wnd)
182     ctx->cc_wnd = FindWindowEx (ctx->addr_wnd, ctx->to_wnd,
183     "RichEdit20W", NULL);
184     ctx->bcc_wnd = FindWindowEx (ctx->addr_wnd, ctx->cc_wnd, "RICHEDIT", NULL);
185     if (!ctx->bcc_wnd)
186     ctx->bcc_wnd = FindWindowEx (ctx->addr_wnd, ctx->cc_wnd,
187     "RichEdit20W", NULL);
188     ctx->to = NULL;
189     ctx->cc = NULL;
190     ctx->bcc = NULL;
191    
192     if (!is_inbox && !window_is_inbox (ctx->to_wnd)) {
193     ctx->to = get_address_text (ctx->main_wnd, ctx->to_wnd);
194     ctx->cc = get_address_text (ctx->main_wnd, ctx->cc_wnd);
195     ctx->bcc = get_address_text (ctx->main_wnd, ctx->bcc_wnd);
196     }
197    
198     return 0;
199     }
200    
201    
202 twoaday 11 /* Clear the clipboard contents. */
203 twoaday 1 static void
204     clear_clipboard (void)
205     {
206     OpenClipboard (NULL);
207     EmptyClipboard ();
208     CloseClipboard ();
209     }
210    
211    
212 twoaday 11 /* Restore the clipboard data. */
213     static void
214     restore_clipboard (plugin_ctx_t ctx)
215     {
216     if (!ctx->orig_text)
217     return;
218     set_clip_text (NULL, ctx->orig_text, strlen (ctx->orig_text));
219     free_if_alloc (ctx->orig_text);
220     }
221    
222    
223 twoaday 1 /* Subclass dialog procedure for the outlook message window. */
224     LRESULT CALLBACK
225     oe_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
226     {
227 twoaday 4 static int initialized = 0;
228 twoaday 1 static int encr_msg = 0;
229     static int sign_msg = 0;
230     int rc = 0;
231    
232     if (initialized == 0)
233     initialized = SetTimer (hwnd, 1, 1000, NULL);
234    
235     switch (msg) {
236 twoaday 11 case WM_CREATE:
237     /* we need to load this lib here otherwise the richedit
238     control would not be displayed. */
239     LoadLibrary ("RichEd32.Dll");
240 twoaday 1 initialized = 0;
241     plugin_new (&oe_plug);
242     break;
243    
244     case WM_DESTROY:
245     plugin_release (oe_plug);
246 twoaday 11 encr_msg = sign_msg = 0;
247 twoaday 1 break;
248    
249 twoaday 11 case WM_TIMER:
250 twoaday 1 KillTimer (hwnd, initialized);
251     plugin_reset (oe_plug);
252     plugin_init (oe_plug, hwnd, 1);
253     if (window_is_inbox (oe_plug->to_wnd)) {
254 twoaday 11 clear_clipboard ();
255 twoaday 1 rc = oe_handle_mail (oe_plug);
256     if (rc)
257     show_error (hwnd, _("GPG Plug-in Error"), MB_ICONERROR|MB_OK,
258     _("decrypt/verify: %s\n%s"),
259     gpgme_strerror (rc), oe_plug->errbuf);
260     }
261     break;
262     }
263    
264     switch (LOWORD (wparam)) {
265     case ID_OE5_PREVMSG:
266     case ID_OE5_NEXTMSG:
267     SetTimer (hwnd, 1, 1000, NULL);
268     break;
269    
270     case ID_OE5_ENCRYPT:
271     encr_msg ^= 1;
272     break;
273    
274     case ID_OE5_SIGN:
275     sign_msg ^= 1;
276     break;
277    
278     case ID_OE5_SEND:
279     if (encr_msg || sign_msg) {
280     plugin_init (oe_plug, hwnd, 0);
281     if (encr_msg) {
282 twoaday 11 SendMessage (hwnd, WM_COMMAND, MAKEWPARAM (ID_OE5_ENCRYPT, 0), 0);
283 twoaday 1 oe_plug->encrypt = 1;
284     }
285     if (sign_msg) {
286 twoaday 11 SendMessage (hwnd, WM_COMMAND, MAKEWPARAM (ID_OE5_SIGN, 0), 0);
287 twoaday 1 oe_plug->sign = 1;
288     }
289     rc = oe_handle_mail (oe_plug);
290     if (rc)
291     show_plaintext_warn (hwnd, rc);
292 twoaday 11 restore_clipboard (oe_plug);
293     if (mail_has_attachments (oe_plug))
294     show_attachment_warn (hwnd);
295 twoaday 1 }
296     break;
297     }
298    
299     return CallWindowProc (oe_proc_old, hwnd, msg, wparam, lparam);
300     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26