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

Annotation of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 244 - (hide annotations)
Mon Jul 3 14:10:21 2006 UTC (18 years, 8 months ago) by twoaday
File size: 29003 byte(s)


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26