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

Annotation of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 65 - (hide annotations)
Thu Nov 3 16:55:25 2005 UTC (19 years, 3 months ago) by twoaday
File size: 25135 byte(s)
Minor changes to avoid GCC warnings.


1 werner 36 /* wptFileMangerDlg.cpp - File Manager
2     * Copyright (C) 2001-2005 Timo Schulz
3     *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20    
21     #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24    
25     #include <windows.h>
26     #include <commctrl.h>
27     #include <sys/stat.h>
28    
29 werner 47 #include "resource.h"
30 werner 36 #include "wptCommonCtl.h"
31     #include "wptGPG.h"
32     #include "wptW32API.h"
33     #include "wptKeylist.h"
34     #include "wptErrors.h"
35     #include "wptContext.h" /* for passphrase_s */
36     #include "wptDlgs.h"
37     #include "wptTypes.h"
38     #include "wptNLS.h"
39     #include "wptVersion.h"
40     #include "wptFileManager.h"
41     #include "wptRegistry.h"
42 werner 47 #include "wptCrypto.h"
43 werner 36
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 twoaday 65 space_wipefrees_dlg_proc, 0);
555 werner 36 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 twoaday 65 file_preferences_dlg_proc, 0);
579 werner 36 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 werner 47 remove (p);
840 werner 36 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