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

Annotation of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (hide annotations)
Fri Sep 30 10:10:16 2005 UTC (19 years, 5 months ago) by twoaday
File size: 23496 byte(s)
Almost finished phase 1 of the WinPT GPGME port.
Still need more cleanup, comments and tests.


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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26