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

Contents of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (show annotations)
Sun Feb 6 11:11:40 2005 UTC (20 years ago) by twoaday
File size: 21993 byte(s)
2005-02-02  Timo Schulz  <twoaday@freakmail.de>
                                                                                                                            
        * wptPassphraseDlg.cpp (passwd_dlg_proc): use center_window2, otherwise
        it is invisible.
        * wptPassphraseCB.cpp (passphrase_callback_proc): Do not cache symmetric
        passphrases.
        * Enable the progress dialog for symmetric encryption.
        * wptFileManager.cpp (fm_check_file_type): Also check for 'SYMKEYENC' in
        FM_ENCRYPT mode.
        * WinPT.cpp (WinMain): SETUP_EXISTING implemented.
        * wptGPGPrefsDlg.cpp (gpgprefs_dlg_proc): Reset 'Locale directory' when
        no value is entered.
                                                                                                                            
2005-02-04  Timo Schulz  <twoaday@freakmail.de>
                                                                                                                            
        * wptProgressDlg.cpp (progress_cb_thread): Set root window if available.
        If the progress window survives by accident, it will be closed when the
        File Manager (root window) is closed.
                                                                                                                            


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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26