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

Annotation of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 88 - (hide annotations)
Mon Nov 21 12:06:59 2005 UTC (19 years, 3 months ago) by twoaday
File size: 27072 byte(s)
2005-11-21  Timo Schulz  <ts@g10code.com>
 
        * WinPT.cpp (WinMain): Implement --stop switch.
        * wptClipEditDlg.cpp (clip_edit_dlg_proc): Localize
        missing string.
        * wptPreferencesDlg.cpp (prefs_dlg_proc): Likewise.
        * wptKeygenDlg.cpp (keygen_dlg_proc): Verify valid context
        first. Thanks to Ralf.
        * wptFileManagerDlg.cpp (update_ui_items): New.
        * wptFileManager.cpp (fm_set_status): New sigmode param.
        Changed all callers.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26