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

Contents of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26