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

Diff of /trunk/Src/wptFileManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.35  
changed lines
  Added in v.36

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26