/[winpt]/trunk/Src/wptFileManagerDlg.cpp
ViewVC logotype

Annotation of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 214 - (hide annotations)
Sun May 14 18:40:36 2006 UTC (18 years, 9 months ago) by twoaday
File size: 28419 byte(s)
2006-05-14  Timo Schulz  <ts@g10code.de>
                                                                                
        * wptKeyCache.cpp (gpg_keycache_update_attr): Parse
        preferred keyserver URL.
        * wptHTTP.cpp (extractHostInfo): Fix segv.
        * wptGPGUtil.cpp (gpg_find_key_subpacket): Ignore default
        gpg.conf.
        * wptKeyserverSearchDlg.cpp (search_hkp_keys): Do not
        assume an existing user id.
        * wptPassphraseCB.cpp (passphrase_cb): Automatic cancel
        if no passphrase is available.

(for complete list of changes, see Src/ChangeLog)

About to release 0.12.1


1 werner 36 /* wptFileMangerDlg.cpp - File Manager
2     * Copyright (C) 2001-2005 Timo Schulz
3     *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * WinPT 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 General Public License
17     * along with WinPT; 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    
25     #include <windows.h>
26     #include <commctrl.h>
27     #include <sys/stat.h>
28 twoaday 77 #include <stdio.h>
29 werner 36
30 werner 47 #include "resource.h"
31 werner 36 #include "wptCommonCtl.h"
32     #include "wptGPG.h"
33     #include "wptW32API.h"
34     #include "wptKeylist.h"
35     #include "wptErrors.h"
36     #include "wptContext.h" /* for passphrase_s */
37     #include "wptDlgs.h"
38     #include "wptTypes.h"
39     #include "wptNLS.h"
40     #include "wptVersion.h"
41     #include "wptFileManager.h"
42     #include "wptRegistry.h"
43 werner 47 #include "wptCrypto.h"
44 werner 36
45     #define FM_SEPARATOR_ID 10001
46    
47     #define send_cmd_id(hwnd, id) \
48     PostMessage ((hwnd), WM_COMMAND, MAKEWPARAM( (id), 0), 0)
49    
50     static subclass_s filelist_proc;
51    
52     struct thread_ctx_s {
53     HWND dlg;
54     HANDLE fd;
55     char *drive;
56     };
57     typedef struct thread_ctx_s *thread_ctx_t;
58    
59    
60     /* Dialog procedure for selecting recipients for encryption. */
61     BOOL CALLBACK
62     file_encrypt_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
63     {
64     static listview_ctrl_t lv = NULL;
65     static fm_state_t c;
66     static keylist_t list = NULL;
67     gpg_keycache_t kc;
68     gpgme_ctx_t ctx;
69 twoaday 68 int force_trust = 0;
70 werner 36
71     switch (msg) {
72     case WM_INITDIALOG:
73     c = (fm_state_t)lparam;
74     if (!c)
75     dlg_fatal_error( dlg, "Could not get dialog state!" );
76     kc = keycache_get_ctx (KEYCACHE_PUB);
77 twoaday 77 SetWindowText (dlg, _("File Encrypt"));
78     SetDlgItemText (dlg, IDC_ENCRYPT_ARMOR, _("&Text Output"));
79     SetDlgItemText (dlg, IDC_ENCRYPT_WIPE, _("&Wipe Original"));
80 twoaday 99 SetDlgItemText (dlg, IDC_ENCRYPT_ANON, _("Anonymize (throw keyid)"));
81     SetDlgItemText (dlg, IDC_ENCRYPT_SIGN, _("&Select Key for signing"));
82 twoaday 209 SetDlgItemText (dlg, IDC_ENCRYPT_OPTINF, _("Options"));
83 twoaday 99 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
84 twoaday 77
85     /* XXX: support --hidden-recipient */
86     EnableWindow (GetDlgItem (dlg, IDC_ENCRYPT_ANON), FALSE);
87    
88 werner 36 if (c->req_signer) {
89     EnableWindow (GetDlgItem (dlg, IDC_ENCRYPT_SIGN), TRUE);
90     seclist_init (dlg, IDC_ENCRYPT_SECLIST, KEYLIST_FLAG_SHORT, &list);
91     }
92     lv = keylist_load (GetDlgItem (dlg, IDC_ENCRYPT_LIST), kc, NULL,
93 twoaday 176 KEYLIST_ENCRYPT_MIN|KEYLIST_FLAG_FILE,
94     KEY_SORT_USERID);
95 werner 36 SetForegroundWindow (dlg);
96     return TRUE;
97    
98     case WM_DESTROY:
99     seclist_destroy (&list);
100     if (lv) {
101     keylist_delete (lv);
102     lv = NULL;
103     }
104     return FALSE;
105    
106     case WM_NOTIFY:
107     NMHDR *notify;
108     notify = (NMHDR *)lparam;
109 twoaday 77 if (notify && notify->code == LVN_COLUMNCLICK
110     && notify->idFrom == IDC_ENCRYPT_LIST) {
111 werner 36 NMLISTVIEW *p = (LPNMLISTVIEW) lparam;
112     int sortby = 0;
113    
114 twoaday 77 switch (p->iSubItem) {
115 werner 36 case 0: sortby = KEY_SORT_USERID; break;
116     case 1: sortby = KEY_SORT_KEYID; break;
117     case 2: sortby = KEY_SORT_LEN; break;
118     case 4: sortby = KEY_SORT_VALIDITY; break;
119     default:sortby = KEY_SORT_USERID; break;
120     }
121 twoaday 77 keylist_sort (lv, sortby);
122 werner 36 }
123    
124     case WM_SYSCOMMAND:
125 twoaday 77 if (LOWORD (wparam) == SC_CLOSE) {
126 werner 36 c->cancel = 1;
127 twoaday 105 EndDialog (dlg, TRUE);
128 werner 36 }
129     return FALSE;
130    
131     case WM_COMMAND:
132     if (HIWORD (wparam) == BN_CLICKED
133     && LOWORD (wparam) == IDC_ENCRYPT_SIGN) {
134 twoaday 77 int req_signer = IsDlgButtonChecked (dlg, IDC_ENCRYPT_SIGN);
135 werner 36 EnableWindow (GetDlgItem (dlg, IDC_ENCRYPT_SECLIST),
136     req_signer? TRUE : FALSE);
137     }
138     switch( LOWORD( wparam ) ) {
139     case IDOK:
140     ctx = c->ctx;
141 twoaday 105 safe_free (c->recp);
142 werner 36 c->recp = keylist_get_recipients (lv, &force_trust, &c->n_recp);
143     if (!c->n_recp) {
144     msg_box (dlg, _("Please select at least one recipient."),
145     _("File Encrypt"), MB_ERR);
146 twoaday 105 safe_free (c->recp);
147 werner 36 c->recp = NULL;
148     c->cancel = 1;
149     return TRUE;
150     }
151     if (IsDlgButtonChecked (dlg, IDC_ENCRYPT_SIGN)) {
152     gpgme_key_t key;
153    
154     if (seclist_select_key (dlg, IDC_ENCRYPT_SECLIST, &key))
155     return TRUE;
156     else
157     gpgme_signers_add (c->ctx, key);
158     }
159    
160     if (IsDlgButtonChecked (dlg, IDC_ENCRYPT_ARMOR))
161     gpgme_set_armor (ctx, 1);
162     if (IsDlgButtonChecked (dlg, IDC_ENCRYPT_WIPE))
163     c->wipe = 1;
164     /* XXX: implement this
165     if (IsDlgButtonChecked (dlg, IDC_ENCRYPT_ANON))
166     ;
167     */
168     c->cancel = 0;
169     EndDialog (dlg, TRUE);
170     return TRUE;
171    
172     case IDCANCEL:
173     c->cancel = 1;
174     EndDialog (dlg, FALSE);
175     return TRUE;
176     }
177     return TRUE;
178     }
179    
180     return FALSE;
181 twoaday 105 }
182 werner 36
183    
184 twoaday 105 /* Dialog box procedure for importing keys. */
185 werner 36 BOOL CALLBACK
186     file_import_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
187     {
188     static listview_ctrl_t lv = NULL;
189     static fm_state_t c;
190     static int is_revcert = 0, has_seckeys = 0;
191    
192 twoaday 105 switch (msg) {
193 werner 36 case WM_INITDIALOG:
194     c = (fm_state_s *)lparam;
195     if (!c)
196     dlg_fatal_error( dlg, "Could not get dialog param!" );
197 twoaday 105 ShowWindow (GetDlgItem( dlg, IDC_IMPORT_KEYMNGT ), WS_DISABLED);
198 werner 36 implist_build (&lv, GetDlgItem (dlg, IDC_IMPORT_KEYLIST));
199 twoaday 165 implist_load (lv, c->import.is_clip? NULL: c->opaque,
200     &is_revcert, &has_seckeys);
201 werner 36 if (!listview_count_items (lv, 0)) {
202     msg_box (dlg, _("No valid OpenPGP data found."), _("Key Import"), MB_ERR);
203     c->cancel = 1;
204     EndDialog (dlg, FALSE);
205     }
206     else {
207 twoaday 165 const char *s = _("%s contain(s) %d key(s).");
208 werner 36 char *p = new char[strlen (s) + 32];
209     if (!p)
210 twoaday 105 BUG (NULL);
211 twoaday 165 sprintf (p, s, c->import.is_clip? _("Clipboard") : _("File"),
212     listview_count_items (lv, 0));
213 werner 36 SetDlgItemText (dlg, IDC_IMPORT_INFO, p);
214     free_if_alloc (p);
215     }
216 twoaday 129 SetWindowText (dlg, _("Key Import"));
217     SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
218 twoaday 188 center_window (dlg, NULL);
219 werner 36 SetForegroundWindow (dlg);
220     return TRUE;
221    
222     case WM_DESTROY:
223     if (lv) {
224     listview_release (lv);
225     lv = NULL;
226     }
227     return FALSE;
228    
229     case WM_SYSCOMMAND:
230     if (LOWORD (wparam) == SC_CLOSE) {
231     c->cancel = 1;
232     EndDialog (dlg, FALSE);
233     }
234     return FALSE;
235    
236     case WM_COMMAND:
237     switch (LOWORD (wparam)) {
238     case IDC_IMPORT_DOIT:
239 twoaday 165 if (has_seckeys > 0) {
240     msg_box (dlg, _("Some of the imported keys are secret keys.\n\n"
241     "The ownertrust values of these keys must be\n"
242     "set manually via the Key Properties dialog."),
243     _("Import"), MB_INFO);
244     }
245 werner 36 c->cancel = 0;
246     c->import.revcert = is_revcert? 1 : 0;
247     c->import.has_seckey = has_seckeys? 1 : 0;
248     EndDialog (dlg, TRUE);
249     return TRUE;
250    
251     case IDCANCEL:
252     c->cancel = 1;
253     EndDialog (dlg, FALSE);
254     return FALSE;
255     }
256     break;
257     }
258    
259     return FALSE;
260 twoaday 105 }
261 werner 36
262    
263 twoaday 105 /* Dialog box procedure for file signing. */
264 werner 36 BOOL CALLBACK
265 twoaday 105 file_sign_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
266 werner 36 {
267     static fm_state_t c;
268     static listview_ctrl_t lv;
269     gpg_keycache_t kc, sec_kc;
270     gpgme_key_t key;
271     int lv_idx;
272     char signer[32];
273    
274 twoaday 105 switch (msg) {
275 werner 36 case WM_INITDIALOG:
276     c = (fm_state_s *)lparam;
277 twoaday 105 if (c == NULL)
278     dlg_fatal_error (dlg, "Could not get dialog state!");
279 werner 36 SetWindowText (dlg, _("File Sign"));
280     SetDlgItemText (dlg, IDC_FILE_SIG_ARMOR, _("&Text Output") );
281     SetDlgItemText (dlg, IDC_FILE_SIG_NORMAL, _("&Normal Signature"));
282     SetDlgItemText (dlg, IDC_FILE_SIG_DETACH, _("&Detached Signature"));
283     SetDlgItemText (dlg, IDC_FILE_SIG_CLEAR, _("&Cleartext Signature"));
284 twoaday 129 SetDlgItemText (dlg, IDC_FILE_SIG_SIGINF, _("Signature mode"));
285     SetDlgItemText (dlg, IDC_FILE_SIG_OPTINF, _("Options"));
286 twoaday 105 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
287 werner 36 CheckDlgButton (dlg, IDC_FILE_SIG_DETACH, BST_CHECKED);
288     kc = keycache_get_ctx (KEYCACHE_PUB);
289     if (!kc)
290     BUG (dlg);
291     sec_kc = keycache_get_ctx (KEYCACHE_PRV);
292     if (!sec_kc)
293 twoaday 105 BUG (dlg);
294     lv = keylist_load (GetDlgItem (dlg, IDC_FILE_SIG_LIST), kc, sec_kc,
295     KEYLIST_SIGN, KEY_SORT_USERID);
296     SetForegroundWindow (dlg);
297 werner 36 return TRUE;
298    
299     case WM_DESTROY:
300 twoaday 105 if (lv) {
301     listview_release (lv);
302 werner 36 lv = NULL;
303     }
304     return FALSE;
305    
306     case WM_SYSCOMMAND:
307 twoaday 105 if (LOWORD (wparam) == SC_CLOSE)
308     EndDialog (dlg, TRUE);
309 werner 36 return FALSE;
310    
311     case WM_COMMAND:
312 twoaday 105 switch (LOWORD (wparam)) {
313 werner 36 case IDOK:
314 twoaday 105 if (IsDlgButtonChecked (dlg, IDC_FILE_SIG_ARMOR))
315 werner 36 gpgme_set_armor (c->ctx, 1);
316 twoaday 105 if (IsDlgButtonChecked (dlg, IDC_FILE_SIG_NORMAL))
317 werner 36 c->sigmode = GPGME_SIG_MODE_NORMAL;
318 twoaday 105 else if (IsDlgButtonChecked (dlg, IDC_FILE_SIG_DETACH))
319 werner 36 c->sigmode = GPGME_SIG_MODE_DETACH;
320 twoaday 105 else if (IsDlgButtonChecked( dlg, IDC_FILE_SIG_CLEAR))
321 werner 36 c->sigmode = GPGME_SIG_MODE_CLEAR;
322     else {
323     /* default is to produce detached signatures */
324     c->sigmode = GPGME_SIG_MODE_DETACH;
325     }
326 twoaday 193 lv_idx = listview_get_selected_item (lv);
327 werner 36 if (lv_idx == -1) {
328     if (listview_count_items (lv, 0) == 1)
329     lv_idx = 0;
330     else {
331 twoaday 105 msg_box (dlg, _("Please select a key."), _("File Sign"), MB_ERR);
332 werner 36 return FALSE;
333     }
334     }
335     listview_get_item_text( lv, lv_idx, 1, signer, sizeof signer-1 );
336     if( get_seckey( signer, &key ) )
337     BUG( NULL );
338     gpgme_signers_clear (c->ctx);
339     gpgme_signers_add (c->ctx, key);
340     free_if_alloc (c->opaque);
341     c->opaque = m_strdup (signer); /* store for later use */
342     c->cancel = 0;
343     if (!c->opaque)
344     BUG (0);
345     EndDialog (dlg, TRUE);
346     return TRUE;
347    
348     case IDCANCEL:
349     c->cancel = 1;
350     EndDialog (dlg, FALSE);
351     return FALSE;
352     }
353     break;
354     }
355    
356     return FALSE;
357 twoaday 105 }
358 werner 36
359    
360     /* Setup status bar for the main window @dlg. */
361     static HWND
362     setup_status_bar (HWND dlg)
363     {
364     HWND statbar;
365     RECT r;
366     int partpos[3];
367     int i;
368    
369     GetClientRect (dlg, &r);
370     for (i=1; i <= 3; i++)
371     partpos[i-1] = r.right/3*i;
372    
373     statbar = CreateStatusWindow (WS_CHILD | WS_VISIBLE | CCS_BOTTOM,
374     "", dlg, FM_SEPARATOR_ID);
375     ShowWindow (statbar, SW_SHOW);
376     SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
377     return statbar;
378     }
379    
380    
381     /* Refresh the status bar text with the selected item from @lv. */
382     static void
383     update_status_bar (HWND statbar, listview_ctrl_t lv)
384     {
385     struct stat st;
386     char buf[128];
387     int n;
388    
389     if (!lv) { /* flush */
390 twoaday 178 SendMessage (statbar, SB_SETTEXT, 1, (LPARAM)"0 Byte");
391 twoaday 105 SendMessage (statbar, SB_SETTEXT, 0, (LPARAM)_("0 Objects marked"));
392 werner 36 return;
393     }
394     n = listview_count_items (lv, 1);
395 twoaday 105 _snprintf (buf, sizeof (buf)-1, _("%d Object(s) marked"), n);
396 werner 36 SendMessage (statbar, SB_SETTEXT, 0, (LPARAM)buf);
397     listview_get_item_text (lv, listview_get_curr_pos (lv), 1, buf, 127);
398     if (stat (buf, &st) == 0) {
399 twoaday 178 if (st.st_size < 1024)
400     _snprintf (buf, sizeof (buf)-1, "%d Byte", st.st_size);
401     else if (st.st_size < 1048576)
402     _snprintf (buf, sizeof (buf)-1, "%d KB", st.st_size/1024);
403     else
404     _snprintf (buf, sizeof (buf)-1, "%d MB", st.st_size/1024/1024);
405 werner 36 SendMessage (statbar, SB_SETTEXT, 1, (LPARAM)buf);
406     }
407     else
408 twoaday 178 SendMessage (statbar, SB_SETTEXT, 1, (LPARAM)"0 Byte");
409 werner 36 }
410    
411    
412 twoaday 105 /* Subclass procedure to detect common hotkeys. */
413 werner 36 static BOOL CALLBACK
414     filelist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
415     {
416     switch (msg) {
417     case WM_KEYUP:
418     int virt_key = (int)wparam;
419     if (virt_key == VK_DELETE)
420     send_cmd_id (filelist_proc.dlg, ID_FILEMISC_WIPE);
421     break;
422     }
423     return CallWindowProc (filelist_proc.old, dlg, msg, wparam, lparam);
424     }
425    
426    
427 twoaday 88 /* Enable or disabled menu entries from the dialog window @hwnd.
428     @lv is used to find out the state of the selected file entry. */
429     static void
430 twoaday 214 update_ui_items (HWND hwnd, HMENU hm, bool is_popup, listview_ctrl_t lv)
431 twoaday 88 {
432 twoaday 214 int ids[2][7] = {
433     {ID_FILEMISC_SEND, ID_FILEMISC_DECRYPT, ID_FILEMISC_VERIFY,
434     ID_FILEMISC_ENCRYPT, ID_FILEMISC_SIGN, ID_FILEMISC_SIGNENC,
435     ID_FILEMISC_ENCRYPT_ZIP
436     },
437     {ID_FILECTX_SEND, ID_FILECTX_DECRYPT, ID_FILECTX_VERIFY,
438     ID_FILECTX_ENCRYPT, ID_FILECTX_SIGN, ID_FILECTX_SIGNENC,
439     ID_FILECTX_ENCRYPT_ZIP
440     }
441     };
442     enum id_type_t { SEND, DECRYPT, VERIFY, ENCR, SIGN, SIGENC, ENCRZIP };
443     int pos, idx = is_popup? 1: 0;
444 twoaday 88
445 twoaday 214 pos = listview_get_curr_pos (lv);
446     if (fm_check_file_type (lv, pos, FM_DECRYPT))
447     set_menu_state (hm, ids[idx][SEND], MF_ENABLED);
448 twoaday 88
449     if (fm_check_file_type (lv, pos, FM_ENCRYPT)) {
450 twoaday 214 set_menu_state (hm, ids[idx][DECRYPT], MF_GRAYED|MF_DISABLED);
451     set_menu_state (hm, ids[idx][VERIFY], MF_GRAYED|MF_DISABLED);
452 twoaday 88 }
453     if (fm_check_file_type (lv, pos, FM_DECRYPT)) {
454 twoaday 214 set_menu_state (hm, ids[idx][ENCR], MF_GRAYED|MF_DISABLED);
455     set_menu_state (hm, ids[idx][ENCRZIP], MF_GRAYED|MF_DISABLED);
456     set_menu_state (hm, ids[idx][SIGN], MF_GRAYED|MF_DISABLED);
457     set_menu_state (hm, ids[idx][SIGENC], MF_GRAYED|MF_DISABLED);
458 twoaday 88 }
459     if (fm_check_file_type (lv, pos, FM_VERIFY)) {
460 twoaday 214 set_menu_state (hm, ids[idx][VERIFY], MF_ENABLED);
461     set_menu_state (hm, ids[idx][SIGN], MF_GRAYED|MF_DISABLED);
462     set_menu_state (hm, ids[idx][SIGENC], MF_GRAYED|MF_DISABLED);
463 twoaday 88 }
464 twoaday 214
465     /* disable all operation which need a secret key. */
466     if (!secret_key_available ()) {
467     set_menu_state (hm, ids[idx][DECRYPT], MF_GRAYED|MF_DISABLED);
468     set_menu_state (hm, ids[idx][SIGN], MF_GRAYED|MF_DISABLED);
469     set_menu_state (hm, ids[idx][SIGENC], MF_GRAYED|MF_DISABLED);
470     }
471 twoaday 88 }
472    
473    
474 twoaday 105 /* Dialog box procedure for the File Manager. */
475 werner 36 BOOL CALLBACK
476     file_manager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
477     {
478     static HWND statbar;
479     static listview_ctrl_t lv = NULL;
480     static HMENU menu = NULL;
481 twoaday 85 static int always_ontop = 0;
482 werner 36 HWND fl;
483    
484     switch (msg) {
485     case WM_INITDIALOG:
486 twoaday 85 always_ontop = get_reg_winpt_flag ("AlwaysOnTop");
487     if (always_ontop == -1)
488     always_ontop = 0;
489     SetWindowText (dlg, _("File Manager (use drag & drop to add files)"));
490 werner 36 menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_FILEMISC);
491 twoaday 85 set_menu_text_bypos (menu, 0, _("File"));
492     set_menu_text_bypos (menu, 1, _("Edit"));
493     set_menu_text_bypos (menu, 2, _("View"));
494 werner 36 set_menu_text (menu, ID_FILEMISC_OPEN, _("&Open...") );
495     set_menu_text (menu, ID_FILEMISC_ENCRYPT, _("&Encrypt") );
496 twoaday 88 set_menu_text (menu, ID_FILEMISC_ENCRYPT_ZIP, _("Encrypt into ZIP"));
497 werner 36 set_menu_text (menu, ID_FILEMISC_DECRYPT, _("&Decrypt") );
498     set_menu_text (menu, ID_FILEMISC_SIGN, _("&Sign") );
499     set_menu_text (menu, ID_FILEMISC_SIGNENC, _("Sign && Encrypt") );
500     set_menu_text (menu, ID_FILEMISC_VERIFY, _("&Verify") );
501     set_menu_text (menu, ID_FILEMISC_SYMENC, _("S&ymmetric") );
502     set_menu_text (menu, ID_FILEMISC_IMPORT, _("&Import") );
503     set_menu_text (menu, ID_FILEMISC_EXPORT, _("E&xport") );
504     set_menu_text (menu, ID_FILEMISC_QUIT, _("Exit"));
505     set_menu_text (menu, ID_FILEMISC_CLEAR, _("&Reset") );
506     set_menu_text (menu, ID_FILEMISC_ONTOP, _("Always on Top"));
507     set_menu_text (menu, ID_FILEMISC_PASTE, _("&Paste"));
508     set_menu_text (menu, ID_FILEMISC_SELALL, _("&Select All"));
509     set_menu_text (menu, ID_FILEMISC_PREFS, _("&Preferences"));
510     set_menu_text (menu, ID_FILEMISC_SEND, _("Send as Mail"));
511     set_menu_text (menu, ID_FILEMISC_LIST, _("&List Packets"));
512     set_menu_text (menu, ID_FILEMISC_WIPE_FREES, _("Wipe Free Space"));
513     set_menu_text (menu, ID_FILEMISC_WIPE, _("&Wipe"));
514    
515     fl = GetDlgItem (dlg, IDC_FILE_LIST);
516     filelist_proc.dlg = dlg;
517     filelist_proc.current = (WNDPROC)filelist_subclass_proc;
518     filelist_proc.old = (WNDPROC)GetWindowLong (fl, GWL_WNDPROC);
519     if (filelist_proc.old) {
520     if (!SetWindowLong (fl, GWL_WNDPROC, (LONG)filelist_proc.current)) {
521 twoaday 178 msg_box (dlg, "Could not set filelist window procedure.",
522 twoaday 105 _("File Manager"), MB_ERR);
523 werner 36 BUG (NULL);
524     }
525     }
526     SetMenu (dlg, menu);
527 twoaday 85 if (!always_ontop)
528     set_menu_state (menu, ID_FILEMISC_ONTOP, MFS_UNCHECKED);
529 twoaday 197 else
530     center_window2 (dlg, NULL, HWND_TOPMOST);
531 werner 36 fm_build (&lv, GetDlgItem (dlg, IDC_FILE_LIST));
532     center_window (dlg, NULL);
533     SetForegroundWindow (dlg);
534     statbar = setup_status_bar (dlg);
535     filelist_proc.opaque = (void*)statbar;
536     return TRUE;
537    
538     case WM_DESTROY:
539     if (lv) {
540     fm_delete (lv);
541     lv = NULL;
542     }
543     if (menu) {
544     DestroyMenu (menu);
545     menu = NULL;
546     }
547 twoaday 85 set_reg_winpt_flag ("AlwaysOnTop", always_ontop);
548 werner 36 return FALSE;
549    
550     case WM_DROPFILES:
551     fm_add_dropped_files (lv, (HDROP)wparam);
552     return TRUE;
553    
554     case WM_NOTIFY:
555     NMHDR *notify;
556     int pos;
557     HMENU hm;
558    
559     notify = (NMHDR *)lparam;
560     if (notify && notify->code == NM_CLICK &&
561     notify->idFrom == IDC_FILE_LIST)
562     update_status_bar (statbar, lv);
563     if (notify && notify->code == NM_RCLICK
564     && notify->idFrom == IDC_FILE_LIST) {
565     POINT p;
566     HMENU popup;
567    
568     GetCursorPos (&p);
569     hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_FILEMISC_CTX));
570     popup = GetSubMenu (hm, 0);
571 twoaday 88 set_menu_text (popup, ID_FILECTX_ENCRYPT_ZIP, _("Encrypt into ZIP"));
572 werner 36 set_menu_text (popup, ID_FILECTX_ENCRYPT, _("Encrypt"));
573     set_menu_text (popup, ID_FILECTX_DECRYPT, _("Decrypt"));
574     set_menu_text (popup, ID_FILECTX_SIGN, _("Sign"));
575     set_menu_text (popup, ID_FILECTX_SIGNENC, _("Sign && Encrypt"));
576     set_menu_text (popup, ID_FILECTX_VERIFY, _("Verify"));
577     set_menu_text (popup, ID_FILECTX_WIPE, _("Wipe"));
578     set_menu_text (popup, ID_FILECTX_SEND, _("Send as Mail"));
579 twoaday 88 set_menu_text (popup, ID_FILECTX_LIST, _("List Packets"));
580 twoaday 214 update_ui_items (dlg, popup, true, lv);
581 twoaday 88 TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
582 werner 36 DestroyMenu (popup);
583     DestroyMenu (hm);
584     }
585     if (notify && notify->code == NM_CLICK
586     && notify->idFrom == IDC_FILE_LIST) {
587     hm = GetMenu (dlg);
588     pos = listview_get_curr_pos (lv);
589     if (!fm_check_file_type (lv, pos, FM_DECRYPT))
590     set_menu_state (hm, ID_FILEMISC_SEND, MF_GRAYED|MF_DISABLED);
591     else
592     set_menu_state (hm, ID_FILEMISC_SEND, MF_ENABLED);
593     }
594 twoaday 88 if (notify && notify->code == LVN_ITEMCHANGED &&
595     ((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */
596 twoaday 214 update_ui_items (dlg, GetMenu (dlg), false, lv);
597 werner 36 return TRUE;
598    
599     case WM_SYSCOMMAND:
600 twoaday 88 if (LOWORD (wparam) == SC_CLOSE)
601     EndDialog (dlg, TRUE);
602 werner 36 return FALSE;
603    
604 twoaday 88 case WM_INITMENUPOPUP:
605     if ((UINT)LOWORD (lparam) == 0 &&
606     GetMenuItemCount ((HMENU)wparam) == 19) /* XXX: do not hard code values */
607     set_menu_text_bypos ((HMENU)wparam, 2, _("&Calc Digest"));
608 werner 36 return FALSE;
609    
610     case WM_COMMAND:
611 twoaday 204 switch (LOWORD (wparam)) {
612     case IDCANCEL:
613     EndDialog (dlg, FALSE);
614     return TRUE;
615    
616 werner 36 case ID_FILEMISC_QUIT:
617     EndDialog (dlg, TRUE);
618     return TRUE;
619    
620     case ID_FILEMISC_WIPE_FREES:
621 twoaday 208 if (!admin_user) {
622     msg_box (dlg, _("This command requires admin privileges.\n"),
623     _("File Manager"), MB_ERR);
624     break;
625     }
626 twoaday 105 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
627     dlg, space_wipefrees_dlg_proc, 0);
628 werner 36 break;
629    
630     case ID_FILEMISC_SELALL:
631     listview_select_all (lv);
632     break;
633    
634     case ID_FILEMISC_PASTE:
635     fm_verify_pasted_detsig (lv, dlg);
636     break;
637    
638     case ID_FILEMISC_ONTOP:
639     always_ontop ^= 1;
640     set_menu_state (menu, ID_FILEMISC_ONTOP,
641     always_ontop == 0? MFS_UNCHECKED : MFS_CHECKED);
642 twoaday 105 center_window2 (dlg, NULL,
643     always_ontop == 0? HWND_NOTOPMOST : HWND_TOPMOST);
644 werner 36 break;
645    
646     case ID_FILEMISC_SEND:
647     fm_send_file (lv);
648     break;
649    
650     case ID_FILEMISC_PREFS:
651     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_FILE_PREFS, dlg,
652 twoaday 65 file_preferences_dlg_proc, 0);
653 werner 36 break;
654    
655     case ID_FILEMISC_LIST:
656     case ID_FILEMISC_ENCRYPT:
657     case ID_FILEMISC_SYMENC:
658     case ID_FILEMISC_DECRYPT:
659     case ID_FILEMISC_SIGN:
660     case ID_FILEMISC_SIGNENC:
661     case ID_FILEMISC_VERIFY:
662     case ID_FILEMISC_WIPE:
663 twoaday 77 case ID_FILEMISC_ENCRYPT_ZIP:
664 werner 36 fm_parse_files (lv, dlg, LOWORD (wparam));
665     SetForegroundWindow (dlg);
666     return TRUE;
667    
668     case ID_FILEMISC_MD_MD5:
669     case ID_FILEMISC_MD_SHA1:
670     case ID_FILEMISC_MD_RMD160:
671     case ID_FILEMISC_MD_SHA256:
672     int algo;
673    
674     switch (LOWORD (wparam)) {
675 twoaday 105 case ID_FILEMISC_MD_MD5: algo = GPGME_MD_MD5; break;
676     case ID_FILEMISC_MD_SHA1: algo = GPGME_MD_SHA1; break;
677 werner 36 case ID_FILEMISC_MD_RMD160: algo = GPGME_MD_RMD160; break;
678 twoaday 105 case ID_FILEMISC_MD_SHA256: algo = GPGME_MD_SHA256; break;
679     default: algo = GPGME_MD_SHA1; break;
680 werner 36 }
681     fm_print_md (lv, dlg, algo);
682     SetForegroundWindow (dlg);
683     return TRUE;
684    
685     case ID_FILEMISC_CLEAR:
686 twoaday 150 listview_del_all_items (lv);
687 werner 36 return TRUE;
688    
689     case ID_FILEMISC_OPEN:
690     fm_add_opened_files( lv, dlg );
691     return TRUE;
692    
693     /* context menu entries */
694 twoaday 105 case ID_FILECTX_ENCRYPT: send_cmd_id (dlg, ID_FILEMISC_ENCRYPT); break;
695     case ID_FILECTX_DECRYPT: send_cmd_id (dlg, ID_FILEMISC_DECRYPT);break;
696     case ID_FILECTX_SIGN: send_cmd_id (dlg, ID_FILEMISC_SIGN); break;
697     case ID_FILECTX_SIGNENC: send_cmd_id (dlg, ID_FILEMISC_SIGNENC);break;
698     case ID_FILECTX_VERIFY: send_cmd_id (dlg, ID_FILEMISC_VERIFY); break;
699     case ID_FILECTX_WIPE: send_cmd_id (dlg, ID_FILEMISC_WIPE); break;
700     case ID_FILECTX_LIST: send_cmd_id (dlg, ID_FILEMISC_LIST); break;
701     case ID_FILECTX_SEND: send_cmd_id (dlg, ID_FILEMISC_SEND); break;
702 twoaday 77 case ID_FILECTX_ENCRYPT_ZIP:send_cmd_id (dlg, ID_FILEMISC_ENCRYPT_ZIP); break;
703 werner 36 }
704     break;
705     }
706    
707     return FALSE;
708 twoaday 105 }
709 werner 36
710    
711 twoaday 105 /* Dialog box procedure for the FM preferences. */
712 werner 36 BOOL CALLBACK
713     file_preferences_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
714     {
715     switch (msg) {
716     case WM_INITDIALOG:
717 twoaday 105 CheckDlgButton (dlg, IDC_FPREFS_PROGRESS,
718     reg_prefs.fm.progress? BST_CHECKED : BST_UNCHECKED);
719 werner 36 SetForegroundWindow (dlg);
720     center_window (dlg, NULL);
721     break;
722    
723     case WM_COMMAND:
724     switch (LOWORD (wparam)) {
725     case IDOK:
726     reg_prefs.fm.progress = IsDlgButtonChecked (dlg, IDC_FPREFS_PROGRESS)? 1 : 0;
727     set_reg_winpt_prefs (&reg_prefs);
728     EndDialog (dlg, TRUE);
729     break;
730    
731     case IDCANCEL:
732     EndDialog (dlg, FALSE);
733     break;
734     }
735     break;
736     }
737    
738     return FALSE;
739 twoaday 105 }
740 werner 36
741    
742 twoaday 105 /* Add the selected items from @lv into the combo box. */
743 werner 36 static void
744     add_files_from_lv (HWND dlg, listview_ctrl_t lv)
745     {
746     char fname[384+1];
747     int i;
748    
749     for (i = 0; i < listview_count_items (lv, 0); i++) {
750     if (!listview_get_item_state (lv, i))
751     continue;
752     listview_get_item_text (lv, i, 1, fname, sizeof (fname)-1);
753     SendDlgItemMessage (dlg, IDC_SECDEL_FILES, LB_ADDSTRING,
754 twoaday 68 0, (WPARAM)(char *)fname);
755 werner 36 }
756     }
757    
758    
759     /* Dialog box procedure to confirm that files shall be deleted. */
760     BOOL CALLBACK
761     file_secdel_confirm_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
762     {
763     static secdel_confirm_s * ctx;
764    
765     switch (msg) {
766     case WM_INITDIALOG:
767     ctx = (struct secdel_confirm_s *)lparam;
768     if (!ctx)
769     BUG (NULL);
770     add_files_from_lv (dlg, ctx->lv_files);
771     SetWindowText (dlg, _("Are you sure you want to secure delete these files?"));
772     SetDlgItemText (dlg, IDYES, _("&Yes"));
773     SetDlgItemText (dlg, IDNO, _("&No"));
774     break;
775    
776     case WM_COMMAND:
777     switch (LOWORD (wparam)) {
778     case IDYES:
779     ctx->yes = 1;
780     EndDialog (dlg, TRUE);
781     break;
782    
783     case IDNO:
784     ctx->yes = 0;
785     EndDialog (dlg, FALSE);
786     break;
787     }
788     break;
789     }
790    
791     return FALSE;
792     }
793    
794    
795     /* Wipe callback. @ctx is a window handle @off is the current offset
796     and @n is the total size. */
797     static void
798     wipe_cb (void *ctx, ui64 off, ui64 n)
799     {
800     SendDlgItemMessage ((HWND)ctx, IDC_SPACE_PROGRESS, PBM_SETPOS,
801     (WPARAM) (off*100/n), 0);
802     SetDlgItemInt ((HWND)ctx, IDC_SPACE_OFF, (UINT)(off/1024), FALSE);
803     SetDlgItemInt ((HWND)ctx, IDC_SPACE_N, (UINT)(n/1024), FALSE);
804     }
805    
806    
807     /* Call the wipe free space method asynchron. */
808     static DWORD WINAPI
809     wipe_thread (void *ctx)
810     {
811     thread_ctx_t a = (thread_ctx_t)ctx;
812     int rc;
813    
814     rc = wipe_freespace (a->drive, &a->fd, wipe_cb, a->dlg);
815     SetDlgItemText (a->dlg, IDC_SPACE_INFO,
816     rc? _("Operation Status: Error") :
817     _("Operation Status: Done."));
818     if (rc)
819     msg_box (a->dlg, winpt_strerror (rc), _("Wipe Free Space"), MB_ERR);
820     else
821     MessageBeep (MB_OK);
822     ExitThread (0);
823     return 0;
824     }
825    
826    
827     static void
828     fill_drive_combobox (HWND dlg)
829     {
830     char buf[384], p[16];
831     int n, i, j = 0;
832    
833     n = GetLogicalDriveStrings (DIM (buf)-1, buf);
834     while (j < n) {
835     for (i = 0; buf[j] != '\0'; i++, j++)
836     p[i] = buf[j];
837     p[i] = '\0';
838     j++;
839     if (GetDriveType (p) != DRIVE_CDROM)
840     SendDlgItemMessage (dlg, IDC_SPACE_DRIVES, CB_ADDSTRING,
841     0, (LPARAM)(const char *)p);
842     }
843     SendDlgItemMessage (dlg, IDC_SPACE_DRIVES, CB_SETCURSEL, 0, 0);
844     } /* fill_drive_combobox */
845    
846    
847     static void
848     update_disc_stats (HWND dlg)
849     {
850     ULARGE_INTEGER caller = {0}, total = {0}, free = {0};
851     char buf[128], drive[32], a_total[64] = {0}, a_free[64] = {0};
852     int idx;
853    
854     idx = SendDlgItemMessage (dlg, IDC_SPACE_DRIVES, CB_GETCURSEL, 0, 0);
855     GetDlgItemText (dlg, IDC_SPACE_DRIVES, drive, DIM (drive)-1);
856     if (GetDiskFreeSpaceEx (drive, &caller, &total, &free)) {
857     _ui64toa (total.QuadPart/1024, a_total, 10);
858     _ui64toa (free.QuadPart/1024, a_free, 10);
859     }
860     _snprintf (buf, DIM (buf)-1, _("Total Capacity: %12sk\n"
861     "Free Space : %12sk"), a_total, a_free);
862     SetDlgItemText(dlg, IDC_SPACE_DISC_INFO, buf);
863     SetDlgItemInt (dlg, IDC_SPACE_OFF, 0, FALSE);
864     SetDlgItemInt (dlg, IDC_SPACE_N, 0, FALSE);
865     } /* update_disc_stats */
866    
867    
868     BOOL CALLBACK
869     space_wipefrees_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
870     {
871     static HANDLE thread_hd = NULL;
872     static thread_ctx_s ctx;
873     char drive[32], * p;
874     int idx;
875     DWORD tid;
876    
877     switch (msg) {
878     case WM_INITDIALOG:
879     fill_drive_combobox (dlg);
880     update_disc_stats (dlg);
881     center_window (dlg, NULL);
882     SetForegroundWindow (dlg);
883     break;
884    
885     case WM_DESTROY:
886     thread_hd = NULL;
887     free_if_alloc (ctx.drive);
888     memset (&ctx, 0, sizeof ctx);
889     break;
890    
891     case WM_COMMAND:
892     if (HIWORD (wparam) == CBN_SELCHANGE)
893     update_disc_stats (dlg);
894     switch (LOWORD (wparam)) {
895     case IDOK:
896     idx = SendDlgItemMessage (dlg, IDC_SPACE_DRIVES, CB_GETCURSEL, 0, 0);
897     if (idx != CB_ERR && !thread_hd) {
898     GetDlgItemText (dlg, IDC_SPACE_DRIVES, drive, DIM (drive)-1);
899     ctx.dlg = dlg;
900     ctx.drive = m_strdup (drive);
901     ctx.fd = NULL;
902     thread_hd = CreateThread (NULL, 0, wipe_thread, &ctx, 0, &tid);
903     }
904     if (WaitForSingleObject (thread_hd, 0) == WAIT_OBJECT_0) {
905     CloseHandle (thread_hd);
906     thread_hd = NULL;
907     EndDialog (dlg, TRUE);
908     }
909     break;
910    
911     case IDCANCEL:
912     if (thread_hd) {
913     WaitForSingleObject (thread_hd, 2000);
914     TerminateThread (thread_hd, 1);
915     CloseHandle (thread_hd);
916     CloseHandle (ctx.fd);
917     p = make_filename (ctx.drive, "temp_winpt.tmp", NULL);
918     if (p && !file_exist_check (p))
919 werner 47 remove (p);
920 werner 36 free_if_alloc (p);
921     }
922     EndDialog( dlg, FALSE );
923     break;
924     }
925     break;
926     }
927    
928     return FALSE;
929     } /* space_wipefrees_dlg_proc */

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26