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

Annotation of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 278 - (hide annotations)
Mon Jan 15 22:02:04 2007 UTC (18 years, 1 month ago) by twoaday
File size: 29839 byte(s)
See ChangeLog.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26