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

Diff of /trunk/Src/wptKeyManagerDlg.cpp

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

revision 36 by werner, Thu Oct 27 15:25:13 2005 UTC revision 166 by twoaday, Tue Jan 24 10:17:47 2006 UTC
# Line 1  Line 1 
1  /* wptKeyManagerDlg.cpp - WinPT Key Manager  /* wptKeyManagerDlg.cpp - WinPT Key Manager
2   *      Copyright (C) 2000-2005 Timo Schulz   *      Copyright (C) 2000-2006 Timo Schulz
3   *      Copyright (C) 2004 Andreas Jobs   *      Copyright (C) 2004 Andreas Jobs
4   *   *
5   * This file is part of WinPT.   * This file is part of WinPT.
# Line 18  Line 18 
18   * along with WinPT; if not, write to the Free Software Foundation,   * along with WinPT; if not, write to the Free Software Foundation,
19   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20   */   */
   
21  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
22  #include <config.h>  #include <config.h>
23  #endif  #endif
24    
25  #include <windows.h>  #include <windows.h>
 #include <windows.h>  
26  #include <commctrl.h>  #include <commctrl.h>
27    
28  #include "../resource.h"  #include "resource.h"
29  #include "wptTypes.h"  #include "wptTypes.h"
30  #include "wptGPG.h"  #include "wptGPG.h"
31  #include "wptCommonCtl.h"  #include "wptCommonCtl.h"
# Line 43  Line 41 
41  #include "wptKeyserver.h"  #include "wptKeyserver.h"
42  #include "wptKeyEdit.h"  #include "wptKeyEdit.h"
43  #include "wptRegistry.h"  #include "wptRegistry.h"
44    #include "wptUTF8.h"
45    
46  #define KM_SEPARATOR_ID                10000  /* Name and ID of the separator window. */
47  #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"  #define KM_SEPARATOR_ID                 10000
48  //#define KM_SEPARATOR_HEIGHT            5  #define WINDOWCLASS_SEPARATOR_CHILD     "WINPT_SEP_CHILD"
49    
50    /* Virtual key codes. */
51    #ifndef VK_F
52    #define VK_F 70
53    #endif
54    #ifndef VK_A
55    #define VK_A 65
56    #endif
57    #ifndef VK_C
58    #define VK_C 67
59    #endif
60    #ifndef VK_P
61    #define VK_P 80
62    #endif
63    
64  static subclass_s keylist_proc;  static subclass_s keylist_proc;
 static int km_index = -1;  
65    
66  HIMAGELIST glob_imagelist;  HIMAGELIST glob_imagelist;
67    
68  struct km_info {  struct km_info_s {
69      /* Window positions */      /* Window positions */
70      int pos_x, pos_y;      int pos_x, pos_y;
71      int ypos_sep;      int ypos_sep;
72      int ypercent_sep;      int ypercent_sep;
73    
74        HWND dlg;
75      HWND hwnd_sep;      HWND hwnd_sep;
76      HWND toolbar;      HWND toolbar;
77      HWND statbar;      HWND statbar;
78    
79      listview_ctrl_t lv;      listview_ctrl_t lv;
80        int             lv_idx;
81      int keylist_sortby;      int keylist_sortby;
82  };  };
83    
84    /* Toolbar button structure. */
85  struct mybuttons {  struct mybuttons {
86      long icon;      long icon;
87      long command;      long command;
# Line 83  struct mybuttons myb[] = { Line 97  struct mybuttons myb[] = {
97  };  };
98    
99    
100  #ifndef VK_F  static void km_gui_import (struct km_info_s *kmi, int cmd_id, void *param);
 #define VK_F 70  
 #endif  
 #ifndef VK_A  
 #define VK_A 65  
 #endif  
 #ifndef VK_C  
 #define VK_C 67  
 #endif  
 #ifndef VK_P  
 #define VK_P 80  
 #endif  
101    
102    /* Subclass the keylist listview control to allow extended commands. */
103  static BOOL CALLBACK  static BOOL CALLBACK
104  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
105  {  {
106      struct listview_ctrl_s lv;      struct listview_ctrl_s lv;
107        struct km_info_s *kmi;
108    
109      switch (msg) {      switch (msg) {
110        case WM_DROPFILES:
111            kmi = (km_info_s *)keylist_proc.opaque;
112            km_gui_import (kmi, WM_DROPFILES, (void*)wparam);
113            break;
114    
115      case WM_LBUTTONDBLCLK:      case WM_LBUTTONDBLCLK:
116          send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);          send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
117          break;          break;
# Line 110  keylist_subclass_proc (HWND dlg, UINT ms Line 120  keylist_subclass_proc (HWND dlg, UINT ms
120          int virt_key = (int)wparam;          int virt_key = (int)wparam;
121          switch (virt_key) {          switch (virt_key) {
122          case VK_SPACE:          case VK_SPACE:
123              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_PROPS );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
124              break;              break;
125                    
126          case VK_DELETE:          case VK_DELETE:
127              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_DELETE );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
128              break;              break;
129                    
130          case VK_INSERT:          case VK_INSERT:
# Line 131  keylist_subclass_proc (HWND dlg, UINT ms Line 141  keylist_subclass_proc (HWND dlg, UINT ms
141          case VK_C:          case VK_C:
142              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL)) {
143                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);
                 km_index = listview_get_curr_pos (&lv);  
144                  km_clip_export (keylist_proc.dlg, &lv);                  km_clip_export (keylist_proc.dlg, &lv);
145              }              }
146              break;              break;
147    
148          case VK_P:          case VK_P:
149              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL))
150                  km_index = -1;                  send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PASTE);
                 km_clip_import (keylist_proc.dlg);  
             }  
151              break;              break;
152    
153          case VK_F:          case VK_F:
# Line 153  keylist_subclass_proc (HWND dlg, UINT ms Line 160  keylist_subclass_proc (HWND dlg, UINT ms
160          break;          break;
161      }      }
162            
163      return CallWindowProc( keylist_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
164  } /* keylist_subclass_proc */  }
165    
166    
167    #define ico2idx(ico) imagelist_getindex((ico))
168    
169  static HWND  static HWND
170  load_toolbar (HWND dlg, struct km_info * kmi)  load_toolbar (HWND dlg, struct km_info_s *kmi)
171  {  {
172      HWND tbwnd;      HWND tbwnd;
173      TBSAVEPARAMS tbsp;      TBSAVEPARAMS tbsp;
174      TBBUTTON tb_buttons[] = {      TBBUTTON tb_buttons[] = {
175          /*{imagelist_getindex(IMI_EXIT),       ID_KEYMISC_QUIT,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0L, 0},*/          {ico2idx (IMI_KEY_NEW),    ID_KEYMISC_KEYWIZARD, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L},
176          {imagelist_getindex(IMI_KEY_DELETE), ID_KEYMISC_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_DELETE), ID_KEYMISC_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
177          {imagelist_getindex(IMI_KEY_PROPS),  ID_KEYMISC_PROPS,  TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_PROPS),  ID_KEYMISC_PROPS,  TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
178          {imagelist_getindex(IMI_KEY_SIGN),   ID_KEYMISC_SIGN,   TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_SIGN),   ID_KEYMISC_SIGN,   TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
179            {ico2idx (IMI_KEY_SEARCH), ID_KEYMISC_SENDRECV, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
180          {0,                                  0,                 0,               TBSTYLE_SEP,    {0}, 0L, 0},          {0,                                  0,                 0,               TBSTYLE_SEP,    {0}, 0L, 0},
181          {imagelist_getindex(IMI_KEY_IMPORT), ID_KEYMISC_IMPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_FILE_IMPORT), ID_KEYMISC_IMPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
182          {imagelist_getindex(IMI_KEY_EXPORT), ID_KEYMISC_EXPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_FILE_EXPORT), ID_KEYMISC_EXPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
183            {ico2idx (IMI_KEY_IMPORT), ID_KEYCTX_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
184            {ico2idx (IMI_KEY_EXPORT), ID_KEYCTX_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
185       };       };
186            
187      tbwnd = CreateWindowEx (0, TOOLBARCLASSNAME, NULL,      tbwnd = CreateWindowEx (0, TOOLBARCLASSNAME, NULL,
188                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,
189                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);
190      if (tbwnd) {      if (tbwnd) {
191          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
192          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);
193                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);
194          ShowWindow (tbwnd, SW_SHOW);          ShowWindow (tbwnd, SW_SHOW);
# Line 186  load_toolbar (HWND dlg, struct km_info * Line 198  load_toolbar (HWND dlg, struct km_info *
198          tbsp.pszSubKey = "Software\\WinPT";          tbsp.pszSubKey = "Software\\WinPT";
199          tbsp.pszValueName = "KM_toolbar";          tbsp.pszValueName = "KM_toolbar";
200          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)
201              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]), (LONG)&tb_buttons[0]);              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]),
202                             (LONG)&tb_buttons[0]);
203       }       }
204       return tbwnd;       return tbwnd;
205  } /* load_toolbar */  }
206    
207    
208    /* Restore the width of the columns from the registry.
209       If no bitstring was found, the default size is used. */
210    int
211    restore_column_info (listview_ctrl_t hd)
212    {
213        WORD *buf;
214        HKEY root;
215        DWORD type;
216        DWORD size = hd->cols*sizeof (WORD), i;
217        LONG ec;
218    
219        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
220                           KEY_ALL_ACCESS, &root);
221        if (ec != ERROR_SUCCESS)
222            return -1;
223    
224        buf = new WORD[size/2];
225        if (!buf)
226            BUG (NULL);
227        ec = RegQueryValueEx (root, "KMColumnSize", NULL, &type,
228                              (BYTE*)buf, &size);
229        RegCloseKey (root);
230        if (ec != ERROR_SUCCESS) {
231            free_if_alloc (buf);
232            return -1;
233        }
234    
235        /* check for garbled values. */
236        for (i=0; i < size/2; i++) {
237            if (buf[i] == 0 || buf[i] > 512) {
238                free_if_alloc (buf);
239                return -1;
240            }
241        }
242        for (i=0; i < size/2; i++) {
243            LVCOLUMN lvc;
244    
245            memset (&lvc, 0, sizeof (lvc));
246            lvc.mask = LVCF_WIDTH;
247            lvc.cx = buf[i];
248            ListView_SetColumn (hd->ctrl, i, &lvc);
249        }
250        free_if_alloc (buf);
251        return 0;
252    }
253    
254    
255    /* Save the current column width to the registry. */
256    int
257    save_column_info (listview_ctrl_t hd)
258    {
259        WORD *buf;
260        HKEY root;
261        LONG ec;
262        int i;
263    
264        buf = new WORD[hd->cols];
265        if (!buf)
266            BUG (NULL);
267        for (i=0; i < hd->cols; i++) {
268            LVCOLUMN lvc;
269    
270            memset (&lvc, 0, sizeof (lvc));
271            lvc.mask = LVCF_WIDTH;
272            ListView_GetColumn (hd->ctrl, i, &lvc);
273            buf[i] = lvc.cx;
274        }
275    
276        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
277                           KEY_ALL_ACCESS, &root);
278        if (ec != ERROR_SUCCESS) {
279            free_if_alloc (buf);
280            return -1;
281        }
282    
283        ec = RegSetValueEx (root, "KMColumnSize", 0, REG_BINARY,
284                            (const BYTE*)buf, 2*hd->cols);
285        RegCloseKey (root);
286        free_if_alloc (buf);
287        return ec == ERROR_SUCCESS? 0 : -1;
288    }
289    
290    
291    /* Center window @dlg. */
292  static void  static void
293  do_center_window (HWND dlg, struct km_info * kmi)  do_center_window (HWND dlg, struct km_info_s *kmi)
294  {  {
295      RECT rect;      RECT rect;
296      char * p;      char *p;
297      int pos_x = 0, pos_y = 0;      int pos_x = 0;
298        int pos_y = 0;
299                    
300      /* Find bottom of keylist */      /* Find bottom of keylist */
301      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);
# Line 205  do_center_window (HWND dlg, struct km_in Line 303  do_center_window (HWND dlg, struct km_in
303    
304      kmi->ypos_sep = rect.bottom;      kmi->ypos_sep = rect.bottom;
305    
306      p = get_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X" );      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
307      if( p && !strcmp( p, " " ) ) {      if (p && !strcmp (p, " ")) {
308          free_if_alloc( p );              free_if_alloc (p);      
309          center_window( dlg, NULL );          center_window (dlg, NULL);
310          return;          return;
311      }      }
312      else if( p )      else if (p)
313          pos_x = atol( p );          pos_x = atol (p);
314    
315      p = get_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y" );      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
316      if( p && !strcmp( p, " " ) ) {      if (p && !strcmp (p, " ")) {
317          free_if_alloc( p );          free_if_alloc (p);
318          center_window( dlg, NULL );          center_window (dlg, NULL);
319          return;          return;
320      }      }
321      else if( p )      else if (p)
322          pos_y = atol( p );          pos_y = atol (p);
323    
324      if( !pos_y && !pos_x ) {      if (!pos_y && !pos_x) {
325          center_window( dlg, NULL );          center_window (dlg, NULL);
326          return;          return;
327      }      }
328            
329      if( pos_x > GetSystemMetrics( SM_CXSCREEN )      if (pos_x < 0 || pos_y < 0)
330          || pos_y > GetSystemMetrics( SM_CYSCREEN ) ) {          pos_x = pos_y = 0;
331        if (pos_x > GetSystemMetrics (SM_CXSCREEN)
332            || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
333          pos_x = pos_y = 0;          pos_x = pos_y = 0;
334      }      }
335      GetClientRect( dlg, &rect );      GetClientRect (dlg, &rect);
336      MoveWindow( dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE );      MoveWindow (dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE);
337  }  }
338    
339    
340    /* Resize the key manager window with the information from @kmi. */
341  static void  static void
342  do_resize_window( HWND dlg, struct km_info *kmi)  do_resize_window (HWND dlg, struct km_info_s *kmi)
343  {  {
344      HWND h;      HWND h;
345      RECT rclient, rect;      RECT rclient, rect;
346      BOOL bRepaint = FALSE;      BOOL bRepaint = FALSE;
347    
348      /* Get rect of client area and make life easier */      /* Get rect of client area and make life easier */
349      GetClientRect( dlg, &rclient );      GetClientRect (dlg, &rclient);
350    
351      /* Move toolbar to the top of the window */      /* Move toolbar to the top of the window */
352      if (kmi->toolbar) {      if (kmi->toolbar) {
353          GetWindowRect(kmi->toolbar, &rect);          GetWindowRect (kmi->toolbar, &rect);
354          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
355          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
356    
357          rclient.top += rect.bottom - rect.top;          rclient.top += rect.bottom - rect.top;
358          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,
# Line 260  do_resize_window( HWND dlg, struct km_in Line 361  do_resize_window( HWND dlg, struct km_in
361    
362      /* Move statusbar to the bottom of the window */      /* Move statusbar to the bottom of the window */
363      if (kmi->statbar) {      if (kmi->statbar) {
364          GetWindowRect( kmi->statbar, &rect );          GetWindowRect (kmi->statbar, &rect);
365          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
366          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
367    
368          rclient.bottom -= rect.bottom - rect.top;          rclient.bottom -= rect.bottom - rect.top;
369          MoveWindow (kmi->statbar, 0, rclient.bottom, rclient.right - rclient.left,          MoveWindow (kmi->statbar, 0, rclient.bottom,
370                        rclient.right - rclient.left,
371                      rect.bottom - rect.top, bRepaint);                      rect.bottom - rect.top, bRepaint);
372      }      }
373    
374      // Obtain separator information and move it to the desired posistion      /* Obtain separator information and move it to the desired posistion */
375      if (kmi->ypercent_sep)      if (kmi->ypercent_sep)
376          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;
377      else      else
378          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);
379                    
380      // Don't move away      /* Don't move away */
381      if (kmi->ypos_sep+5 > rclient.bottom)      if (kmi->ypos_sep+5 > rclient.bottom)
382          kmi->ypos_sep = rclient.bottom - 5;          kmi->ypos_sep = rclient.bottom - 5;
383      if (kmi->ypos_sep < rclient.top)      if (kmi->ypos_sep < rclient.top)
384          kmi->ypos_sep = rclient.top;          kmi->ypos_sep = rclient.top;
385      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep, (rclient.right - rclient.left), 5, bRepaint);      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
386                    (rclient.right - rclient.left), 5, bRepaint);
387                    
388      // Place the keylist above the separator      /* Place the keylist above the separator */
389      h = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
390      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
391                  kmi->ypos_sep - rclient.top, bRepaint);                  kmi->ypos_sep - rclient.top, bRepaint);
392      rclient.top = kmi->ypos_sep + 5 + 8;      rclient.top = kmi->ypos_sep + 5 + 8;
393    
394    #if 0 /* Disable the code until we support groups again. */
395      /* Place the group text and the group box below the separator */      /* Place the group text and the group box below the separator */
396      h = GetDlgItem( dlg, IDC_KEYMISC_GTEXT );      h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
397      MoveWindow( h, rclient.left, rclient.top, 100, 14, bRepaint);      MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
398      rclient.top += 18;      rclient.top += 18;
399    
400      h = GetDlgItem( dlg, IDC_KEYMISC_GROUP );      h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
401      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
402                  (rclient.bottom < rclient.top) ? 0 : rclient.bottom - rclient.top, bRepaint);                  (rclient.bottom < rclient.top) ?
403                    0 : rclient.bottom - rclient.top, bRepaint);
404    #endif
405            
406      /* Repaint the whole thing */      /* Repaint the whole thing */
407      InvalidateRect (dlg, NULL, TRUE);      InvalidateRect (dlg, NULL, TRUE);
408  } /* do_resize_window */  }
409    
410    
411    /* Return true if the clipboard contains an OpenPGP key. */
412    static bool
413    clip_contains_pgpkey (void)
414    {
415        char *ctxt;
416        bool val = false;
417    
418        ctxt = get_clip_text (NULL);
419        if (!ctxt || strlen (ctxt) < 512)
420            val = false;
421        else if (strstr (ctxt, "BEGIN PGP") && strstr (ctxt, "KEY BLOCK") &&
422                 strstr (ctxt, "END PGP"))
423            val = true;
424        free_if_alloc (ctxt);
425        return val;
426    }
427    
428    
429    /* Show a mini popup menu to import keys. */
430  static void  static void
431  do_create_minpopup (HWND dlg)  do_create_minpopup (HWND dlg)
432  {  {
# Line 310  do_create_minpopup (HWND dlg) Line 435  do_create_minpopup (HWND dlg)
435      char * s;      char * s;
436      POINT p;      POINT p;
437            
438      if (gpg_read_only)      if (gpg_read_only || !clip_contains_pgpkey ())
439          return;          return;
440      hm = CreatePopupMenu ();      hm = CreatePopupMenu ();
441      if (!hm)      if (!hm)
# Line 327  do_create_minpopup (HWND dlg) Line 452  do_create_minpopup (HWND dlg)
452      GetCursorPos (&p);      GetCursorPos (&p);
453      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);
454      DestroyMenu (hm);      DestroyMenu (hm);
455  } /* do_create_minpopup */  }
456    
457    
458  static void  /* Update the default key entry in the status bar for dialog @dlg. */
459  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)  void
460    update_default_key_str (HWND dlg)
461    {
462        const char *fmt;
463        char *keyid;
464        char defkeyinf[128];
465        
466        /* XXX: also show the name? */
467        keyid = get_gnupg_default_key ();
468        if (!keyid)
469            return;
470        if ((keyid[0] >= 'A' && keyid[0] <= 'Z') ||
471            (keyid[0] >= 'a' && keyid[0] <= 'z') ||
472            (keyid[0] == '0' && keyid[1] == 'x'))
473            fmt = _("Default Key: %s");
474        else
475            fmt = _("Default Key: 0x%s");
476        _snprintf (defkeyinf, sizeof (defkeyinf) - 1, fmt, keyid);
477        SendMessage (dlg, SB_SETTEXT, 0, (LPARAM)defkeyinf);
478        free_if_alloc (keyid);
479    }
480    
481    
482    /* Count all keys and show from @lv results in the status bar @sb. */
483    void
484    update_status_bar (HWND sb, listview_ctrl_t lv)
485  {  {
486      gpg_keycache_t cache;      char txt_sec[128], txt_pub[128];
487        int nkeys = 0, nsec = 0;
488        int i;
489    
490      if( keycache_get_reload( ) ) {      nkeys = listview_count_items (lv, 0);
491          keycache_reload( dlg );      for (i = 0; i < nkeys; i++) {
492          keycache_set_reload( 0 );          if (km_check_for_seckey (lv, i, NULL))
493          cache = keycache_get_ctx( 1 );              nsec++;
         if( !cache )  
             BUG( dlg );  
         keylist_reload( lv, cache, KEYLIST_LIST, KEY_SORT_USERID );  
         km_complete_status_bar (sb, lv);  
494      }      }
495  } /* do_check_cache */      _snprintf (txt_sec, sizeof (txt_sec)-1, _("%d secret keys"), nsec);
496        _snprintf (txt_pub, sizeof (txt_pub)-1, _("%d keys"), nkeys);
497        SendMessage (sb, SB_SETTEXT, 1, (LPARAM)txt_sec);
498        SendMessage (sb, SB_SETTEXT, 2, (LPARAM)txt_pub);
499    }
500    
501    
502  long CALLBACK  long CALLBACK
503  separator_wnd_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )  separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
504  {  {
505      static POINT last_mouse_pos;      static POINT last_mouse_pos;
506    
507      if (msg == WM_CREATE)      if (msg == WM_CREATE)
508          SetWindowLong (hwnd, GWL_USERDATA, (long)(((CREATESTRUCT*)lparam)->lpCreateParams));          SetWindowLong (hwnd, GWL_USERDATA,
509                           (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
510    
511      switch (msg) {      switch (msg) {
512      case WM_PAINT:      case WM_PAINT:
# Line 364  separator_wnd_proc( HWND hwnd, UINT msg, Line 517  separator_wnd_proc( HWND hwnd, UINT msg,
517          GetClientRect (hwnd, &rect);          GetClientRect (hwnd, &rect);
518          BeginPaint (hwnd, &ps);          BeginPaint (hwnd, &ps);
519    
520          // Background          /* Background */
521          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
522    
523          // The lines from the light into the dark          /* The lines from the light into the dark */
524          MoveToEx(ps.hdc, 0,0, NULL);          MoveToEx(ps.hdc, 0,0, NULL);
525          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {
526              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
527              LineTo(ps.hdc, rect.right, 0);              LineTo (ps.hdc, rect.right, 0);
528              DeleteObject(hpen);              DeleteObject (hpen);
529          }          }
530          MoveToEx(ps.hdc, 0, 1, NULL);          MoveToEx(ps.hdc, 0, 1, NULL);
531          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {
532               SelectObject(ps.hdc, (LPVOID)hpen);               SelectObject (ps.hdc, (LPVOID)hpen);
533               LineTo(ps.hdc, rect.right, rect.bottom);               LineTo (ps.hdc, rect.right, rect.bottom);
534               DeleteObject(hpen);               DeleteObject (hpen);
535           }           }
536    
537          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);
538          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {
539              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
540              LineTo(ps.hdc, rect.right, rect.bottom-1);              LineTo (ps.hdc, rect.right, rect.bottom-1);
541              DeleteObject(hpen);              DeleteObject (hpen);
542          }          }
543          MoveToEx(ps.hdc, 0, rect.bottom, NULL);          MoveToEx(ps.hdc, 0, rect.bottom, NULL);
544          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {
545              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
546              LineTo(ps.hdc, rect.right, rect.bottom);              LineTo (ps.hdc, rect.right, rect.bottom);
547              DeleteObject(hpen);              DeleteObject (hpen);
548          }          }
549    
550          EndPaint (hwnd, &ps);          EndPaint (hwnd, &ps);
551          return 0;          return 0;
552    
553      case WM_LBUTTONDOWN:      case WM_LBUTTONDOWN:
554          last_mouse_pos.x = LOWORD(lparam);          last_mouse_pos.x = LOWORD (lparam);
555          last_mouse_pos.y = HIWORD(lparam);          last_mouse_pos.y = HIWORD (lparam);
556          ClientToScreen (hwnd, &last_mouse_pos);          ClientToScreen (hwnd, &last_mouse_pos);
557          SetCapture (hwnd);          SetCapture (hwnd);
558          return 0;          return 0;
# Line 410  separator_wnd_proc( HWND hwnd, UINT msg, Line 563  separator_wnd_proc( HWND hwnd, UINT msg,
563    
564      case WM_MOUSEMOVE:      case WM_MOUSEMOVE:
565          if (wparam == MK_LBUTTON) {          if (wparam == MK_LBUTTON) {
566              struct km_info *kmi;              struct km_info_s *kmi;
567              POINT p;              POINT p;
568              RECT rect;              RECT r;
569    
570              if ((kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA)) == NULL)              kmi = (struct km_info_s *)GetWindowLong (hwnd, GWL_USERDATA);
571                if (kmi == NULL)
572                  break;                  break;
573    
574              // Calculate mouse movement              /* Calculate mouse movement */
575              p.x = LOWORD(lparam);              p.x = LOWORD(lparam);
576              p.y = HIWORD(lparam);              p.y = HIWORD(lparam);
577              ClientToScreen (hwnd, &p);              ClientToScreen (hwnd, &p);
578    
579              GetWindowRect (hwnd, &rect);              GetWindowRect (hwnd, &r);
580              rect.top += (short)(p.y - last_mouse_pos.y);              r.top += (short)(p.y - last_mouse_pos.y);
581              rect.bottom += (short)(p.y - last_mouse_pos.y);              r.bottom += (short)(p.y - last_mouse_pos.y);
582    
583              last_mouse_pos.y = p.y;              last_mouse_pos.y = p.y;
584    
585              // Apply mouse movement to window. Beware the MoveWindow is relaive              /* Apply mouse movement to window. Beware the MoveWindow is relaive
586              // to parent NOT screen                 to parent NOT screen */
587              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&rect, 2);              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
588              kmi->ypos_sep = rect.top;              kmi->ypos_sep = r.top;
589              kmi->ypercent_sep = 0; // This forces do_resize_window to use abs. position              kmi->ypercent_sep = 0; /* This forces do_resize_window to use abs. position */
590              do_resize_window (GetParent(hwnd), kmi);              do_resize_window (GetParent(hwnd), kmi);
591              return 0;              return 0;
592          }          }
# Line 442  separator_wnd_proc( HWND hwnd, UINT msg, Line 596  separator_wnd_proc( HWND hwnd, UINT msg,
596  }  }
597    
598    
599    /* Register the separator window with @dlg as the parent window. */
600  static HWND  static HWND
601  regist_sep_wnd (HWND dlg, struct km_info * kmi)  regist_sep_wnd (HWND dlg, struct km_info_s *kmi)
602  {  {
603      WNDCLASS wndclass;      WNDCLASS wndclass;
604      HWND h;      HWND h;
# Line 465  regist_sep_wnd (HWND dlg, struct km_info Line 620  regist_sep_wnd (HWND dlg, struct km_info
620                          0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);                              0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);    
621      ShowWindow (h, SW_SHOW);      ShowWindow (h, SW_SHOW);
622      return h;      return h;
623  } /* regist_sep_wnd */  }
   
624    
625    
626  #define enable_button(hwnd, cid) \  #define enable_button(hwnd, cid, item_selected) \
627      SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG (key_selected, 0))      SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG ((item_selected), 0))
628    
629    
630  /* Interactive modification of the dialog item which depend if an item  /* Interactive modification of the dialog item which depend if an item
# Line 479  regist_sep_wnd (HWND dlg, struct km_info Line 633  regist_sep_wnd (HWND dlg, struct km_info
633  void  void
634  update_ui_items (HWND hwnd, listview_ctrl_t lv)  update_ui_items (HWND hwnd, listview_ctrl_t lv)
635  {  {
636      int key_selected = 0, key_has_sec = 0;      HWND tb_hwnd;
     int i, key_inv = 0;  
     HWND hwnd_child;  
637      HMENU hmenu;      HMENU hmenu;
638            int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
639                             ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
640        int key_selected = 0;
641        int key_has_sec = 0;
642        int key_inv = 0;
643        int i, state=0;
644    
645      /* Get some states */      /* Get some states */
646      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),
647                                             LVM_GETSELECTEDCOUNT, 0, 0)                                             LVM_GETSELECTEDCOUNT, 0, 0)
# Line 492  update_ui_items (HWND hwnd, listview_ctr Line 650  update_ui_items (HWND hwnd, listview_ctr
650      if (key_selected) {      if (key_selected) {
651          i = listview_get_curr_pos (lv);          i = listview_get_curr_pos (lv);
652          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;
653          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED;          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
654                      km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
655      }      }
656    
657      /* Enable / disable toolbar buttons */      /* Enable / disable toolbar buttons */
658      hwnd_child = GetDlgItem (hwnd, IDR_WINPT_KMTB);      tb_hwnd = GetDlgItem (hwnd, IDR_WINPT_KMTB);
659      enable_button (hwnd_child, ID_KEYMISC_DELETE);      enable_button (tb_hwnd, ID_KEYMISC_DELETE, key_selected);
660      enable_button (hwnd_child, ID_KEYMISC_PROPS);      enable_button (tb_hwnd, ID_KEYMISC_PROPS, key_selected);
661      enable_button (hwnd_child, ID_KEYMISC_SIGN);      enable_button (tb_hwnd, ID_KEYMISC_SIGN, key_selected && !key_inv);
662      enable_button (hwnd_child, ID_KEYMISC_EXPORT);      enable_button (tb_hwnd, ID_KEYMISC_EXPORT, key_selected);
663        enable_button (tb_hwnd, ID_KEYCTX_COPY, key_selected);
664        enable_button (tb_hwnd, ID_KEYCTX_PASTE, clip_contains_pgpkey ());
665    
666      /* Enable / disable menu items */      /* Enable / disable menu items */
667        state = key_selected? MF_ENABLED : MF_DISABLED|MF_GRAYED;
668      hmenu = GetMenu (hwnd);      hmenu = GetMenu (hwnd);
669      set_menu_state (hmenu, ID_KEYMISC_EXPORT, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT, state);
670      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_DELETE, state);
671      set_menu_state (hmenu, ID_KEYMISC_REVCERT, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_PROPS, state);
672      set_menu_state (hmenu, ID_KEYMISC_DELETE, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, state);
673      set_menu_state (hmenu, ID_KEYMISC_PROPS, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, state);
674      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_SIGN,
675      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);                      key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);
676      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY,
677                        key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
678        set_menu_state (hmenu, ID_KEYMISC_REVCERT,
679                        key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
680    
681        /* Disable some menu items when multiple keys are selected. */
682        if (listview_count_items (lv, 1) > 1) {
683            for (i=0; mult_resids[i] != 0; i++)
684                set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
685        }
686    
687        /* Disable all secret-key functions when no secret key is available. */
688        {
689            gpg_keycache_t sec = keycache_get_ctx (0);
690            if (gpg_keycache_get_size (sec) == 0) {
691                enable_button (tb_hwnd, ID_KEYMISC_SIGN, FALSE);
692                set_menu_state (hmenu, ID_KEYMISC_SIGN, MF_GRAYED);
693            }
694        }
695    }
696    
697    
698    /* Disable some context menu items when multiple keys are selected. */
699    static void
700    popup_multiple (HWND dlg, HMENU hm)
701    {
702        int resids[] = {
703            ID_KEYCTX_EDIT,
704            ID_KEYCTX_SIGN,
705            ID_KEYCTX_REV,
706            ID_KEYCTX_ENABLE,
707            ID_KEYCTX_DISABLE,
708            ID_KEYCTX_ADDKEY,
709            ID_KEYCTX_ADDPHOTO,
710            ID_KEYCTX_ADDUID,
711            ID_KEYCTX_ADDREV,
712            ID_KEYCTX_LISTSIGS,
713            ID_KEYCTX_MAXTRUST,
714            ID_KEYCTX_PROPS,
715            ID_KEYCTX_SENDMAIL,
716            0};
717        int i;
718        for (i=0; i < resids[i] != 0; i++)
719            set_menu_state (hm, resids[i], MF_GRAYED);
720  }  }
721    
722    
# Line 543  popup_gpg_readonly (HWND dlg, HMENU hm) Line 748  popup_gpg_readonly (HWND dlg, HMENU hm)
748  }  }
749    
750    
751    /* Change the 'Edit' menu based on the current state. */
752  static void  static void
753  menu_gpg_readonly (HWND dlg, HMENU hm, int id)  change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
754    {
755        enum item { EDIT_MENU = 1 };
756        int no_sel;
757    
758        if (id != EDIT_MENU)
759            return;
760    
761        if (!clip_contains_pgpkey ())
762            set_menu_state (hm, ID_KEYMISC_PASTE, MF_GRAYED);
763        else
764            set_menu_state (hm, ID_KEYMISC_PASTE, MF_ENABLED);
765        no_sel = listview_get_curr_pos (lv) == -1? 1 : 0;
766        set_menu_state (hm, ID_KEYMISC_DELETE2, no_sel? MF_GRAYED: MF_ENABLED);
767        set_menu_state (hm, ID_KEYMISC_COPY, no_sel? MF_GRAYED : MF_ENABLED);
768    }
769    
770    
771    
772    /* Show limited key menu entries when GPG is in read-only mode. */
773    static void
774    change_key_menu (HMENU hm, int id)
775  {  {
776      int key_resids[] = {      int key_resids[] = {
777          ID_KEYMISC_SIGN,          ID_KEYMISC_SIGN,
# Line 565  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 792  menu_gpg_readonly (HWND dlg, HMENU hm, i
792          ID_KEYMISC_EDITKEY,          ID_KEYMISC_EDITKEY,
793          0          0
794      };      };
795      int * resids;      int *resids;
796      int i;      int i;
797    
798            
# Line 575  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 802  menu_gpg_readonly (HWND dlg, HMENU hm, i
802      case 0: return;      case 0: return;
803      case 3: resids = key_resids; break;      case 3: resids = key_resids; break;
804      case 1: resids = edit_resids;break;      case 1: resids = edit_resids;break;
805        default:resids = edit_resids; break;
806      }      }
807    
808      for (i=0; resids[i] != 0; i++)      for (i=0; resids[i] != 0; i++)
# Line 582  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 810  menu_gpg_readonly (HWND dlg, HMENU hm, i
810  }  }
811    
812    
813  static char*  /* Reload a single key in the cache. */
 gen_export_filename (const char *keyid, int is_secret)  
 {  
     gpgme_key_t key;  
     const char *s;  
     char *p;  
   
     if (get_pubkey (keyid, &key))  
         return m_strdup (keyid);  
     s = key->uids->name;  
     if (!s)  
         return m_strdup (keyid);  
     p = new char[strlen (s) + 8 + 16];  
     if (!p)  
         BUG (0);  
     sprintf (p, "%s%s.asc", s, is_secret? "_sec" : "");  
     for (size_t i=0; i < strlen (p); i++) {  
         if (p[i] == ' ' || p[i] == ':' || p[i] == '?' || p[i] == '|')  
             p[i] = '_';  
     }  
     return p;  
 }  
   
   
814  static void  static void
815  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)
816  {  {
# Line 619  update_key (listview_ctrl_t lv, int pos, Line 824  update_key (listview_ctrl_t lv, int pos,
824         address of the pointer in the ListView control. */         address of the pointer in the ListView control. */
825      get_pubkey (keyid, &key);      get_pubkey (keyid, &key);
826      keylist_upd_key (lv, pos, key);      keylist_upd_key (lv, pos, key);
827        keyring_check_last_access ();
828  }  }
829    
830    
# Line 626  update_key (listview_ctrl_t lv, int pos, Line 832  update_key (listview_ctrl_t lv, int pos,
832  static HWND  static HWND
833  setup_status_bar (HWND dlg, listview_ctrl_t lv)  setup_status_bar (HWND dlg, listview_ctrl_t lv)
834  {        {      
835      HWND statbar;          HWND statbar;
836      RECT r;      RECT r;
837      int partpos[3];      int partpos[3];
838      int i;      int i;
# Line 640  setup_status_bar (HWND dlg, listview_ctr Line 846  setup_status_bar (HWND dlg, listview_ctr
846      ShowWindow (statbar, SW_SHOW);      ShowWindow (statbar, SW_SHOW);
847      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
848    
849      km_update_default_key_str (statbar);      update_default_key_str (statbar);
850      km_complete_status_bar (statbar, lv);      update_status_bar (statbar, lv);
851    
852      return statbar;      return statbar;
853  }  }
854    
855    
856    /* Remove or add columns which depends on the state of @checked. */
857    void
858    modify_listview_columns (km_info_s *kmi, UINT m_uid, BOOL checked)
859    {
860        UINT resids[] = {
861            0,
862            ID_KEYMISC_VIEWKEYID,
863            ID_KEYMISC_VIEWTYPE,
864            0,
865            ID_KEYMISC_VIEWCIPHER,
866            0,
867            0,
868            ID_KEYMISC_VIEWCREAT,
869            -1
870        };
871        listview_column_s cols[] = {
872        {0, 240, (char *)_("User ID")},
873        {1, 78, (char *)_("Key ID")},
874        {2, 52, (char *)_("Type")},    
875        {3, 66, (char *)_("Size")},
876        {4, 60, (char *)_("Cipher")},
877        {5, 66, (char *)_("Validity")},
878        {6, 58, (char *)_("Trust")},
879        {7, 72, (char *)_("Creation")},
880        {0, 0, NULL}
881        };
882        UINT pos;
883    
884        for (pos=0; resids[pos] != -1; pos++) {
885            if (m_uid == resids[pos])
886                break;
887        }
888        if (!checked)
889            listview_del_column (kmi->lv, (int)pos);
890        else {      
891            listview_add_column (kmi->lv, &cols[pos]);
892            keylist_upd_col (kmi->lv, pos);
893        }
894    }
895    
896    
897    /* Helper to handle the help file. If @check is 1
898       the existence of the file is checked.
899       Otherwise the help file will be loaded. */
900    static bool
901    start_help (HWND dlg, int check)
902    {
903        DWORD n;
904        char path[MAX_PATH+1+32];
905    
906        n = GetModuleFileName (NULL, path, sizeof (path)-1-32);
907        if (!n)
908            return false;
909        path[n] = 0;
910        while (n-- && path[n] != '\\')
911            ;
912        path[n+1] = 0;
913        strcat (path, "winpt.chm");
914        if (!check)
915            ShellExecute (dlg, "open", path, NULL, NULL, SW_SHOW);
916        return file_exist_check (path) == 0? true : false;
917    }
918    
919    /* Translate all menu strings. */
920    static void
921    translate_menu_strings (HWND dlg)
922    {
923        HMENU menu;
924    
925        menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
926        set_menu_text_bypos (menu, 0, _("File"));
927        set_menu_text_bypos (menu, 1, _("Edit"));
928        set_menu_text_bypos (menu, 2, _("View"));
929        set_menu_text_bypos (menu, 3, _("Key"));
930        set_menu_text_bypos (menu, 4, _("Groups"));
931    
932        set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
933        set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));
934        set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */
935        set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));
936        set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));
937        set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));
938        set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));
939        set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));
940        set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));
941        set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));
942        set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));
943        set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));
944        set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));
945        set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));
946        set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
947        set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke Cert"));
948        set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));
949        set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));
950        set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));
951        set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));
952        set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));
953        set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));
954        set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));
955        set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
956        set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));
957        set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));
958        set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));
959        set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));
960        set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );
961        set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));
962    
963        set_menu_text (menu, ID_KEYMISC_VIEWKEYID, _("Key ID"));
964        set_menu_text (menu, ID_KEYMISC_VIEWCIPHER, _("Cipher"));
965        set_menu_text (menu, ID_KEYMISC_VIEWTYPE, _("Type"));
966        set_menu_text (menu, ID_KEYMISC_VIEWCREAT, _("Creation"));
967    
968        if (!start_help (NULL, 1))
969            set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
970    
971        SetMenu (dlg, menu);
972    }
973    
974    
975    /* Translate popup menu strings. */
976    static void
977    translate_popupmenu_strings (HMENU popup)
978    {
979        set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));
980        set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));
981        set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));
982        set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));
983        set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));
984        set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));
985        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));
986        set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));
987        set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));
988        set_menu_text (popup, ID_KEYCTX_PROPS, _("&Properties"));
989        set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));
990        set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));
991        set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke Cert"));
992        set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));
993        set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));
994        set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));
995        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));
996        set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));
997        set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));
998        set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));
999    
1000        set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
1001        set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
1002        set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
1003        set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
1004    
1005        /* change popup texts */
1006        set_menu_text_bypos (popup, 0, _("Key Attributes"));
1007        set_menu_text_bypos (popup, 6, _("Add"));
1008        set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
1009    }
1010    
1011    
1012    /* Return true if the cache contain marked keys. */
1013    static bool
1014    updated_keys_avail (void)
1015    {
1016        gpg_keycache_t kc = keycache_get_ctx (1);
1017        struct keycache_s *k;
1018    
1019        for (k = kc->item; k; k = k->next) {
1020            if (k->flags)
1021                return true;
1022        }
1023        return false;
1024    }
1025    
1026    
1027    /* Find the index of the key identified by @key. */
1028    static int
1029    find_keypos (listview_ctrl_t lv, gpgme_key_t key)
1030    {
1031        char keyid[16+1];
1032        int i;
1033    
1034        for (i=0; i < listview_count_items (lv, 0); i++) {
1035            listview_get_item_text (lv, i, KM_COL_KEYID, keyid, sizeof (keyid)-1);
1036            if (!strcmp (key->subkeys->keyid+8, keyid+2))
1037                return i;
1038        }
1039        return -1;
1040    }
1041    
1042    
1043    /* Add all recently updated keys in the cache to the list
1044       and refresh all GUI elements. */
1045    static void
1046    refresh_keylist (struct km_info_s *kmi)
1047    {
1048        struct keycache_s *ctx;
1049        gpg_keycache_t kc;
1050        int status=0, pos;
1051    
1052        kc = keycache_get_ctx (1);
1053        while (!gpg_keycache_next_updated_key (kc, &ctx, &status)) {
1054            if (status == KC_FLAG_ADD)
1055                keylist_add_key (kmi->lv, KEYLIST_LIST, ctx->key);
1056            else {
1057                pos = find_keypos (kmi->lv, ctx->key);
1058                if (pos != -1)
1059                    keylist_upd_key (kmi->lv, pos, ctx->key);
1060            }
1061        }
1062        keylist_sort (kmi->lv, KEY_SORT_USERID);
1063        update_status_bar (kmi->statbar, kmi->lv);
1064        keyring_check_last_access ();
1065    }
1066    
1067    
1068    static void
1069    reload_keylist (struct km_info_s *kmi)
1070    {
1071        keycache_reload (kmi->dlg);
1072        keylist_reload (kmi->lv, keycache_get_ctx (1),
1073                        KEYLIST_LIST, KEY_SORT_USERID);
1074        update_status_bar (kmi->statbar, kmi->lv);
1075        keyring_check_last_access ();
1076    }
1077    
1078    
1079    /* Reload the entire key cache and update the listview. */
1080    static void
1081    reload_keycache (struct km_info_s *kmi)
1082    {
1083        refresh_cache_s rcs = {0};
1084        gpg_keycache_t c;
1085    
1086        rcs.kr_reload = rcs.kr_update = 1;
1087        rcs.tr_update = 0;
1088        DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, kmi->dlg,
1089                        keycache_dlg_proc, (LPARAM)&rcs);
1090        c = keycache_get_ctx (1);
1091        if (!c)
1092            BUG (0);
1093        keylist_reload (kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID);
1094        update_status_bar (kmi->statbar, kmi->lv);
1095        SetForegroundWindow (kmi->dlg);
1096    }
1097    
1098    
1099    /* Handle all import request. */
1100    static void
1101    km_gui_import (struct km_info_s *kmi, int cmd_id, void *param)
1102    {
1103        int newkeys=0, newsks=0;
1104        int err = 0;
1105    
1106        switch (cmd_id) {
1107        case ID_KEYMISC_PASTE:
1108            err = km_clip_import (kmi->dlg, &newkeys, &newsks);
1109            break;
1110    
1111        case ID_KEYMISC_IMPORT:
1112            err = km_file_import (kmi->dlg, NULL, &newkeys, &newsks);
1113            break;
1114    
1115        case WM_DROPFILES:
1116            err = km_dropped_file_import (kmi->dlg, (HDROP)param,
1117                                          &newkeys, &newsks);
1118            break;
1119    
1120        default:
1121            err = 1;
1122            break;
1123        }
1124    
1125        if (!err && !newsks && (newkeys > 0 && newkeys < KM_PRELOAD_KEYS))
1126            refresh_keylist (kmi);
1127        else if (!err) /* avoid to spawn too much processes. */
1128            reload_keylist (kmi);
1129    
1130        SetForegroundWindow (kmi->dlg);
1131        center_window (kmi->dlg, NULL);
1132    }
1133    
1134    
1135    /* Dialog box procedure for the Key Manager. */
1136  BOOL CALLBACK  BOOL CALLBACK
1137  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1138  {  {
1139      struct km_info *kmi;      struct km_info_s *kmi;
     static km_group_s *gc = NULL;  
     static HMENU menu = NULL;  
     static int refresh_keys = 0;      
1140      INITCOMMONCONTROLSEX icex;      INITCOMMONCONTROLSEX icex;
1141      HWND kl;      HWND kl;
1142      HMENU hm;      HMENU hm;
1143      gpg_keycache_t c;      gpg_keycache_t c;
1144      gpgme_key_t key;      gpgme_key_t key;
     /*km_group_cb_s gcb; XXX */  
1145      struct genkey_s genkey;      struct genkey_s genkey;
1146      struct winpt_key_s k = {0};      struct winpt_key_s k = {0};
1147      struct URL_ctx_s *url;      struct URL_ctx_s *url;
1148      refresh_cache_s rcs = {0};      char type[32], *name;
1149      char keyid[48], uid[128], type[32], *name;      const char *t, *host;
1150      const char *t, * host;      WORD port = 0;
1151      u16 port = 0;      int l_idx = 0, i=0, rc;
     int idx = 0, i=0, rc;  
     size_t size = 0;  
1152    
1153      if ((msg != WM_INITDIALOG)      if ((msg != WM_INITDIALOG)
1154          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))          && ((kmi = (struct km_info_s*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
1155          return FALSE;          return FALSE;
1156    
1157      switch (msg) {      switch (msg) {
1158      case WM_INITDIALOG:      case WM_INITDIALOG:
1159          kmi = new struct km_info;          kmi = new struct km_info_s;
1160          memset (kmi, 0, sizeof (struct km_info));          memset (kmi, 0, sizeof (struct km_info_s));
1161            kmi->lv_idx = -1;
1162          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
1163          icex.dwICC  = ICC_BAR_CLASSES;          icex.dwICC  = ICC_BAR_CLASSES;
1164          InitCommonControlsEx (&icex);          InitCommonControlsEx (&icex);
1165          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
1166          imagelist_load (dlg);          imagelist_load (dlg);
1167            translate_menu_strings (dlg);
1168            SetWindowText (dlg, _("Key Manager"));
1169    
1170  #ifndef LANG_DE          c = keycache_get_ctx (KEYCACHE_PUB);
1171          SetWindowText( dlg, _("Key Manager") );          if (!c)
1172  #endif                      BUG (NULL);
1173          menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );          kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
 #ifndef LANG_DE  
         set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));  
         set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */  
         set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));  
         set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));  
         set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));  
         set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));  
         set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));  
         set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));  
         set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));  
         set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));  
         set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));  
         set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));  
         set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));  
         set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke"));  
         set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));  
         set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));  
         set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));  
         set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));  
         set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));  
         set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));  
         set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));  
         set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );  
         set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));  
         set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));  
         set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));  
         set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));  
         set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );  
         set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));  
           
 #endif  
         SetMenu (dlg, menu);  
         if( keyring_check_last_access() )  
             keycache_set_reload( 1 );  
         if( keycache_get_reload( ) )  
             keycache_reload( dlg );  
         c = keycache_get_ctx( KEYCACHE_PUB );  
         if( !c )  
             BUG( NULL );  
1174          kmi->keylist_sortby = KEY_SORT_USERID;          kmi->keylist_sortby = KEY_SORT_USERID;
1175          Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),          Header_SetImageList(ListView_GetHeader (kl), glob_imagelist);
1176                              glob_imagelist);          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
1177          kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);
                                 NULL, KEYLIST_LIST, kmi->keylist_sortby );  
1178          /* init subclassing for the listview */          /* init subclassing for the listview */
1179          kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );          keylist_proc.opaque = kmi;
1180          keylist_proc.dlg = dlg;          keylist_proc.dlg = dlg;
1181          keylist_proc.current = (WNDPROC)keylist_subclass_proc;          keylist_proc.current = (WNDPROC)keylist_subclass_proc;
1182          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );          keylist_proc.old = (WNDPROC)GetWindowLong(kl, GWL_WNDPROC);
1183          if( keylist_proc.old ) {          if (keylist_proc.old) {
1184              if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {              if( !SetWindowLong (kl, GWL_WNDPROC, (LONG)keylist_proc.current)) {
1185                  msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("Could not set keylist window procedure."),
1186                  BUG( NULL );                           _("Key Manager"), MB_ERR);
1187                    BUG (NULL);
1188              }              }
1189          }          }
         #if 0  
         km_groups_new( &gc, GetDlgItem( dlg, IDC_KEYMISC_GROUP ) );  
         km_groups_load( gc );  
         #endif  
         SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst, (LPCTSTR)IDI_WINPT));  
         SetForegroundWindow (dlg);  
   
1190          kmi->statbar = setup_status_bar (dlg, kmi->lv);          kmi->statbar = setup_status_bar (dlg, kmi->lv);
   
1191          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
1192          kmi->toolbar = load_toolbar (dlg, kmi);          kmi->toolbar = load_toolbar (dlg, kmi);
1193            kmi->dlg = dlg;
1194    
1195          do_center_window (dlg, kmi);          do_center_window (dlg, kmi);
1196          do_resize_window (dlg, kmi);          do_resize_window (dlg, kmi);
1197          update_ui_items (dlg, kmi->lv);          update_ui_items (dlg, kmi->lv);
1198            restore_column_info (kmi->lv);
1199    
1200            SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
1201            SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
1202                          (LPCTSTR)IDI_WINPT));
1203            SetForegroundWindow (dlg);
1204            force_foreground_window (dlg, 1000);
1205          return TRUE;          return TRUE;
1206                    
1207      case WM_DESTROY:      case WM_DESTROY:
1208            save_column_info (kmi->lv);
1209          if (kmi->lv) {          if (kmi->lv) {
1210              keylist_delete (kmi->lv);              keylist_delete (kmi->lv);
1211              kmi->lv = NULL;                    kmi->lv = NULL;      
1212                    }
1213           /*          imagelist_destroy ();
1214           if (gc) {  
1215              km_groups_release (gc);          ltoa (kmi->pos_x, type, 10);
1216              gc = NULL;          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
1217          }*/          ltoa (kmi->pos_y, type, 10);
1218         imagelist_destroy ();          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
1219            /* XXX: store window size. */
1220         char buf[32];          
1221         ltoa (kmi->pos_x, buf, 10);          /* Remove runtime information. This should be the last action taken here. */
1222         set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );          delete kmi; kmi = NULL;
1223         ltoa (kmi->pos_y, buf, 10);          SetWindowLong (dlg, GWL_USERDATA, 0);
1224         set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);          return FALSE;
1225         /* Remove runtime information. This should be the last action taken here. */  
1226         delete kmi; kmi = NULL;      case WM_SHOWWINDOW:
1227         SetWindowLong (dlg, GWL_USERDATA, NULL);              /*refresh_keylist (kmi);*/
1228         keycache_set_reload (refresh_keys);          break;
1229         return FALSE;  
1230        case WM_MOVE:
     case WM_MOVE:        
         /* kmi->pos_x = (int)(short)LOWORD(lparam);  
            kmi->pos_y = (int)(short)HIWORD(lparam); */  
1231          RECT r;          RECT r;
1232          GetWindowRect (dlg, &r);          GetWindowRect (dlg, &r);
1233          kmi->pos_x = r.left;          kmi->pos_x = r.left;
# Line 798  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1240  keymanager_dlg_proc (HWND dlg, UINT msg,
1240          break;          break;
1241    
1242      case WM_NOTIFY:                  case WM_NOTIFY:            
1243          NMHDR * notify;          NMHDR *notify;
1244          POINT p;          POINT p;
1245          HMENU popup;          HMENU popup;
1246                    
1247          notify = (NMHDR *)lparam;          notify = (NMHDR *)lparam;
1248          if (notify == NULL)          if (!notify)
1249              break;              break;
1250          switch (notify->code)          switch (notify->code) {
         {  
1251          case TBN_QUERYDELETE:          case TBN_QUERYDELETE:
1252              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1253              return TRUE;              return TRUE;
1254                    
1255          case TBN_QUERYINSERT:          case TBN_QUERYINSERT:
1256              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1257              return TRUE;              return TRUE;
1258    
1259          case TBN_GETBUTTONINFO:          case TBN_GETBUTTONINFO:
1260              LPTBNOTIFY lpTbNotify;              LPTBNOTIFY lpTbNotify;
1261              lpTbNotify = (LPTBNOTIFY)lparam;              lpTbNotify = (LPTBNOTIFY)lparam;
1262              if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {              if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {
1263                  lpTbNotify->tbButton.iBitmap = imagelist_getindex(myb[lpTbNotify->iItem].icon);                  lpTbNotify->tbButton.iBitmap = imagelist_getindex (myb[lpTbNotify->iItem].icon);
1264                  lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;                  lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;
1265                  lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;                  lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;
1266                  lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;                  lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;
# Line 858  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1299  keymanager_dlg_proc (HWND dlg, UINT msg,
1299    
1300              lpttt->hinst = NULL;              lpttt->hinst = NULL;
1301              switch (lpttt->hdr.idFrom) {              switch (lpttt->hdr.idFrom) {
1302                case ID_KEYMISC_KEYWIZARD:
1303                    lpttt->lpszText = (char*)_("Generate new key pair");
1304                    break;
1305    
1306                case ID_KEYMISC_SENDRECV:
1307                    lpttt->lpszText = (char*)_("Search for a specific key");
1308                    break;
1309    
1310              case ID_KEYMISC_DELETE:              case ID_KEYMISC_DELETE:
1311                  lpttt->lpszText = (char *)_("Delete key from keyring");                  lpttt->lpszText = (char *)_("Delete key from keyring");
1312                  break;                  break;
# Line 870  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1319  keymanager_dlg_proc (HWND dlg, UINT msg,
1319                  lpttt->lpszText = (char *)_("Sign key");                  lpttt->lpszText = (char *)_("Sign key");
1320                  break;                  break;
1321    
1322                case ID_KEYCTX_COPY:
1323                    lpttt->lpszText = (char *)_("Copy key to clipboard");
1324                    break;
1325    
1326                case ID_KEYCTX_PASTE:
1327                    lpttt->lpszText = (char*)_("Paste key from clipboard");
1328                    break;
1329    
1330              case ID_KEYMISC_IMPORT:              case ID_KEYMISC_IMPORT:
1331                  lpttt->lpszText = (char *)_("Import key to keyring");                  lpttt->lpszText = (char *)_("Import key to keyring");
1332                  break;                  break;
# Line 881  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1338  keymanager_dlg_proc (HWND dlg, UINT msg,
1338              return TRUE;              return TRUE;
1339                            
1340          case LVN_ITEMCHANGED:          case LVN_ITEMCHANGED:
1341              if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */              if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
1342              {                  kmi->lv_idx = listview_get_curr_pos (kmi->lv);
1343                  update_ui_items (dlg, kmi->lv);                  update_ui_items (dlg, kmi->lv);
1344                  return TRUE;                  return TRUE;
1345              }              }
# Line 890  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1347  keymanager_dlg_proc (HWND dlg, UINT msg,
1347    
1348          case NM_RCLICK:          case NM_RCLICK:
1349              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1350                  if (listview_get_curr_pos (kmi->lv) == -1)                  l_idx =listview_get_curr_pos (kmi->lv);
1351                      return TRUE; /* Popup only when a item was selected */                  if (l_idx == -1)
1352                  do_check_cache (kmi->lv, dlg, kmi->statbar);                      return TRUE; /* Popup only when a item was selected */              
1353                  GetCursorPos (&p);                  GetCursorPos (&p);
1354                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
1355                  popup = GetSubMenu (hm, 0);                  popup = GetSubMenu (hm, 0);
1356              #ifndef LANG_DE                  translate_popupmenu_strings (popup);
1357                  set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));  
1358                  set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));                  if (km_check_for_seckey (kmi->lv, l_idx, &i))
                 set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));  
                 set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));  
                 set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));  
                 set_menu_text (popup, ID_KEYCTX_PROPS, _("&Key Properties"));  
                 set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));  
                 set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));  
                 set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke"));  
                 set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));  
                 set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));  
                 set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));  
                 set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));  
                 set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));  
                 set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));  
                 set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));  
                 /* change popup texts */  
                 set_menu_text_bypos (popup, 0, _("Key Attributes"));  
                 set_menu_text_bypos (popup, 6, _("Add"));  
                 set_menu_text_bypos (popup, 19, _("Send to Keyserver"));  
             #endif  
                 idx = listview_get_curr_pos (kmi->lv);  
                 if (km_check_for_seckey (kmi->lv, idx, &i))  
1359                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1360                  if (i == 0)                  if (i == 0)
1361                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1362                  if (!km_check_for_seckey (kmi->lv, idx, NULL)) {                  if (!km_check_for_seckey (kmi->lv, l_idx, NULL) ||
1363                      set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );                      (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED)) {
1364                      set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
1365                      set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1366                      set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);
1367                      set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1368                        set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
1369                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1370                  }                  }
1371                  else if( km_check_for_seckey (kmi->lv, idx, NULL)                  else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1372                        && km_key_is_v3 (kmi->lv, idx)) {                           km_key_is_v3 (kmi->lv, l_idx)) {
1373                      /* PGP 2 keys, version 3 have no no support for photo-id's,                      /* PGP 2 keys, version 3 have no no support for photo-id's,
1374                         designated revokers and secondary keys. */                         designated revokers and secondary keys. */
1375                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1376                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1377                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
1378                  }                  }
1379                  if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )                  if (km_get_key_status( kmi->lv, l_idx ) & KM_FLAG_DISABLED)
1380                      set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED);
1381                  else                  else
1382                      set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED);
1383                  if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)                  if (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED ||
1384                        km_get_key_status (kmi->lv, l_idx) & KM_FLAG_EXPIRED)
1385                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1386                  if (mapi_init())                  if (!clip_contains_pgpkey ())
1387                        set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1388                    if (mapi_init ())
1389                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1390                  /* Override 'Default Keyserver' with the actual name. */                  /* Override 'Default Keyserver' with the actual name. */
1391                  host = kserver_get_hostname (0, -1, &port);                  host = kserver_get_hostname (0, -1, &port);
1392                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);
1393                  popup_gpg_readonly (dlg, popup);                  popup_gpg_readonly (dlg, popup);
1394                    if (listview_count_items (kmi->lv, 1) > 1)
1395                        popup_multiple (dlg, popup);
1396                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
1397                  DestroyMenu (popup);                  DestroyMenu (popup);
1398                  DestroyMenu (hm);                  DestroyMenu (hm);
1399                  return TRUE;                  return TRUE;
1400              }              }
             #if 0 /* XXX */  
             if( notify->idFrom == IDC_KEYMISC_GROUP ) {  
                 HWND tree = GetDlgItem( dlg, IDC_KEYMISC_GROUP );  
                 if( TreeView_GetSelection( tree ) ) {  
                     GetCursorPos( &p );  
                     hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );  
                     popup = GetSubMenu( hm, 0 );  
                     if( km_index == -1 )  
                         set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );  
                     set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );  
                     set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );  
                     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );  
                     DestroyMenu( popup );  
                     DestroyMenu( hm );  
                     return TRUE;  
                 }  
             }  
             #endif  
1401              break;              break;
1402    
1403          case LVN_COLUMNCLICK:          case LVN_COLUMNCLICK:
1404              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1405                  NMLISTVIEW * p = (LPNMLISTVIEW) lparam;                  NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1406                  int sortby = 0;                  int sortby = 0;
1407                  switch (p->iSubItem) {                  switch (nft->iSubItem) {
1408                  case 0:  sortby = KEY_SORT_USERID; break;                  case 0:  sortby = KEY_SORT_USERID; break;
1409                  case 1:  sortby = KEY_SORT_KEYID; break;                  case 1:  sortby = KEY_SORT_KEYID; break;
1410                  case 2:  sortby = KEY_SORT_IS_SECRET; break;                  case 2:  sortby = KEY_SORT_IS_SECRET; break;
# Line 1006  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1426  keymanager_dlg_proc (HWND dlg, UINT msg,
1426              break;              break;
1427          }          }
1428          break;          break;
         }  
1429    
1430      case WM_WINDOWPOSCHANGING:      case WM_WINDOWPOSCHANGING:
1431          if (((WINDOWPOS*)lparam)->cx < 400)          if (((WINDOWPOS*)lparam)->cx < 400)
# Line 1020  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1439  keymanager_dlg_proc (HWND dlg, UINT msg,
1439          return TRUE;          return TRUE;
1440                    
1441      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
1442          if( LOWORD (wparam) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
1443              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1444          return FALSE;          return FALSE;
1445                    
1446      case WM_MENUSELECT:      case WM_MENUSELECT:
1447          menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));          change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1448            change_key_menu ((HMENU)lparam, LOWORD (wparam));
1449          break;          break;
1450    
1451      case WM_INITMENUPOPUP:      case WM_INITMENUPOPUP:
1452          if ((UINT)LOWORD (lparam) == 3) {          if ((UINT)LOWORD (lparam) == 3) {
1453              HMENU hm = (HMENU)wparam;              HMENU h = (HMENU)wparam;
1454              set_menu_text_bypos (hm, 0, _("New"));              set_menu_text_bypos (h, 0, _("New"));
1455          }          }
1456            /* XXX: before we can use it, we need to find a way to
1457                    update the gpg access timestamp after each operation.
1458            if (keyring_check_last_access ())
1459                reload_keylist (kmi);
1460            */
1461          return FALSE;          return FALSE;
1462    
1463      case WM_COMMAND:      case WM_COMMAND:
1464          if( gnupg_access_keyring( 1 ) ) {          /* Allow at least 'Exit' in such a case. */
1465              msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1466                msg_box (dlg, _("Could not access public keyring"),
1467                         _("Key Manager"), MB_ERR);
1468              return FALSE;              return FALSE;
1469          }          }
1470          do_check_cache( kmi->lv, dlg, kmi->statbar );  
1471          switch( LOWORD( wparam ) ) {          switch (LOWORD (wparam)) {
1472          case ID_KEYMISC_QUIT:          case ID_KEYMISC_QUIT:
1473              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1474              return TRUE;              return TRUE;
               
         case ID_KEYMISC_MAIL:  
             /* XXX  
             DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_MAIL, GetDesktopWindow (),  
                             winpt_mail_proc, NULL);*/  
             break;  
1475                    
1476          case ID_KEYMISC_FIND:          case ID_KEYMISC_FIND:
1477              km_find_key (dlg, kmi->lv);              km_find_key (dlg, kmi->lv);
1478              break;              break;
1479    
1480          case ID_KEYMISC_DELETE:          case ID_KEYMISC_DELETE:
1481              km_delete_keys (kmi->lv, dlg);          case ID_KEYMISC_DELETE2:
1482                if (!km_delete_keys (kmi->lv, dlg))
1483                    update_status_bar (kmi->statbar, kmi->lv);
1484              return TRUE;              return TRUE;
1485                            
1486          case ID_KEYMISC_SIGN:                  case ID_KEYMISC_SIGN:
1487              if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {              if (kmi->lv_idx == -1) {
1488                  msg_box( dlg, _("Please select a key."),  _("Key Manager"),                  msg_box (dlg, _("Please select a key."),  
1489                           MB_ERR );                           _("Key Manager"), MB_ERR);
1490                  return TRUE;;                  return TRUE;
1491              }              }
1492              if (km_check_key_status (kmi->lv, idx))              if (km_check_key_status (kmi->lv, kmi->lv_idx))
1493                  return TRUE;                  return TRUE;
1494              key = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1495              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1496                strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1497              k.ctx = key;              k.ctx = key;
1498              k.keyid = keyid;              k.keyid = key->subkeys->keyid;
1499              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
1500                                keysign_dlg_proc, (LPARAM)&k,                                keysign_dlg_proc, (LPARAM)&k,
1501                                _("Key Signing"), IDS_WINPT_KEYSIGN);                                _("Key Signing"), IDS_WINPT_KEYSIGN);
1502              if (k.update)              if (k.update)
1503                  update_key (kmi->lv, idx, k.keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
1504              return TRUE;              return TRUE;
1505                            
1506          case ID_KEYMISC_REVCERT:          case ID_KEYMISC_REVCERT:
1507              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1508              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1509                  return TRUE;                  return TRUE;
1510              }              }
1511              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1512              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );              if (!key)
1513              if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {                  BUG (NULL);
1514                  msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );              if (!km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)) {
1515                    msg_box (dlg, _("There is no secret key available!"),
1516                            _("Key Manager"), MB_ERR);
1517                  return TRUE;                  return TRUE;
1518              }              }
1519                            
1520              {              {
1521                  char t[128];                  char state[64];
1522                  listview_get_item_text( kmi->lv, idx, 5, t, sizeof t -1 );                  listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1523                  if( strchr( t, 'R' ) ) {                                          state, sizeof (state) -1);
1524                      msg_box( dlg, _("Key already revoked!"), _("Key Manager"), MB_INFO );                  if (strchr (state, 'R' )) {
1525                        msg_box (dlg, _("Key already revoked!"),
1526                                 _("Key Manager"), MB_INFO);
1527                      return TRUE;                      return TRUE;
1528                  }                  }
1529              }              }
1530                            
1531              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1532              k.key_pair = 1;              k.key_pair = 1;
1533              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1534              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1535              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
1536                               key_revoke_dlg_proc, (LPARAM)&k,                               key_revoke_dlg_proc, (LPARAM)&k,
1537                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);                               _("Key Revocation Cert"), IDS_WINPT_KEYREVOKE);
1538              return TRUE;              return TRUE;
1539                            
1540          case ID_KEYMISC_TRUSTPATH:          case ID_KEYMISC_TRUSTPATH:
1541              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1542              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1543                  return TRUE;                  return TRUE;
1544              }              }
1545              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1546              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );              if (km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)) {
1547              if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {                  msg_box (dlg, _("It does not make any sense with a key pair!"),
1548                  msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );                           _("Key Manager"), MB_ERR);
1549                  return FALSE;                  return TRUE;
1550              }              }
1551              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1552              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1553              k.uid = uid;              k.uid = key->uids->uid;
1554              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,
1555                                keytrust_dlg_proc, (LPARAM)&k,                                keytrust_dlg_proc, (LPARAM)&k,
1556                                _("List Trust Path"), IDS_WINPT_KEYTRUST );                                _("List Trust Path"), IDS_WINPT_KEYTRUST);
1557              return TRUE;              return TRUE;
1558                            
1559          case ID_KEYMISC_CHECKSIGS:          case ID_KEYMISC_CHECKSIGS:          
1560              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1561              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1562                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1563              }              }
1564              listview_get_item_text (kmi->lv, idx, 0, uid, DIM (uid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1565              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1566                    BUG (NULL);
1567              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1568              k.keyid = keyid;              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1569              k.uid = uid;              k.keyid = k.tmp_keyid;
1570              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              k.uid = key->uids->uid;
1571                k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1572              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
1573                                keysig_dlg_proc, (LPARAM)&k,                                keysig_dlg_proc, (LPARAM)&k,
1574                                _("Key Signature List" ), IDS_WINPT_KEYSIG);                                _("Key Signature List" ), IDS_WINPT_KEYSIG);
1575                if (k.update)
1576                    update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
1577              return TRUE;              return TRUE;
1578                            
1579          case ID_KEYMISC_PROPS:          case ID_KEYMISC_PROPS:      
1580              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1581              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1582                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1583              }              }
1584              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1585              listview_get_item_text (kmi->lv, idx, 2, type, DIM (type)-1);              if (!key)
1586                    BUG (NULL);
1587              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1588              k.key_pair = 0;              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1589              k.keyid = keyid;              k.keyid = k.tmp_keyid;
1590              if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)? 1 : 0;
                 k.key_pair = 1;  
1591              k.callback.ctl = kmi->lv;              k.callback.ctl = kmi->lv;
1592              k.callback.idx = idx;              k.callback.idx = kmi->lv_idx;
1593              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1594              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
1595                                keyprops_dlg_proc, (LPARAM)&k,                                keyprops_dlg_proc, (LPARAM)&k,
1596                                _("Key Properties"), IDS_WINPT_KEYPROPS );                                _("Key Properties"), IDS_WINPT_KEYPROPS);
1597              if (k.callback.new_val != 0) {              if (k.update)
1598                  t = get_key_trust_str (k.callback.new_val);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, k.key_pair);
                 listview_add_sub_item (kmi->lv, idx, 6, t);  
             }  
1599              return TRUE;              return TRUE;
1600                            
1601          case ID_KEYMISC_RECACHE:          case ID_KEYMISC_RECACHE:
1602              /* If there is already a reload request, don't bother the user with a message. */              if (updated_keys_avail ())
1603              if( keycache_get_reload() == 1 )                  l_idx = IDYES;
                 idx = IDYES;  
1604              else {              else {
1605                  char t[256];                  char inf[256];
1606                  _snprintf( t, sizeof t -1,                  _snprintf (inf, sizeof (inf) -1,
1607                             _("This is only useful when the keyring has been "                             _("This is only useful when the keyring has been "
1608                               "modified (sign a key...).\n"                               "modified (sign a key...).\n"
1609                               "Do you really want to reload the keycache?") );                               "Do you really want to reload the keycache?"));
1610                  idx = msg_box( dlg, t, _("Key Manager"), MB_YESNO );                  l_idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);
             }  
             if( idx == IDYES ) {  
                 rcs.kr_reload = rcs.kr_update = 1;  
                 rcs.tr_update = 0;  
                 DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,  
                                 keycache_dlg_proc, (LPARAM)&rcs );  
                 c = keycache_get_ctx( 1 );  
                 if( !c )  
                     BUG( dlg );  
                 keylist_reload( kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID );  
                 refresh_keys = 0;  
1611              }              }
1612                if (l_idx == IDYES)
1613                    reload_keycache (kmi);
1614              return TRUE;              return TRUE;
1615                            
1616          case ID_KEYMISC_REBUILD:          case ID_KEYMISC_REBUILD:
1617              name=NULL;              name = NULL;
1618              gpg_rebuild_cache (&name);              gpg_rebuild_cache (&name);
1619              if (name) {              if (name != NULL) {
1620                  char *p = strchr (name, '\n');                  char *line = strchr (name, '\n');
1621                  show_msg (dlg, 2000, p? name + (p-name)+1 : name);                  show_msg (dlg, 2000, line? name + (line-name)+1 : name);
1622                  free (name);                  safe_free (name);
1623              }              }
1624                SetForegroundWindow (dlg);
1625              return TRUE;              return TRUE;
1626                            
1627          case ID_KEYMISC_NEWKEY:          case ID_KEYMISC_NEWKEY:
1628              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1629              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1630                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1631                                IDS_WINPT_KEYGEN);                                IDS_WINPT_KEYGEN);
1632              if (genkey.newkey != NULL)              if (genkey.cancel == 0)
1633                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  refresh_keylist (kmi);
1634              return TRUE;              return TRUE;
1635    
1636          case ID_KEYMISC_CARDNEW:          case ID_KEYMISC_CARDNEW:
1637              if( !scard_support ) {              if (!scard_support) {
1638                  msg_box( dlg, _("Smart Card support is not available."), _("Key Manager"), MB_INFO );                  msg_box (dlg, _("Smart Card support is not available."),
1639                             _("Key Manager"), MB_INFO);
1640                  return TRUE;                  return TRUE;
1641              }              }
1642              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1643                                card_keygen_dlg_proc, NULL, _("Card Key Generation"),                                card_keygen_dlg_proc, 0, _("Card Key Generation"),
1644                                IDS_WINPT_CARD_KEYGEN );                                IDS_WINPT_CARD_KEYGEN);
1645              /* XXX: use new code */              if (updated_keys_avail ())
1646              if( keycache_get_reload() )                  send_cmd_id (dlg, ID_KEYMISC_RECACHE);
                 send_cmd_id( dlg, ID_KEYMISC_RECACHE );  
1647              return TRUE;              return TRUE;
1648    
1649          case ID_KEYMISC_KEYWIZARD:          case ID_KEYMISC_KEYWIZARD:
1650              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1651              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1652                                keygen_wizard_dlg_proc, (LPARAM)&genkey, _("Key Generation Wizard"),                                keygen_wizard_dlg_proc, (LPARAM)&genkey,
1653                                  _("Key Generation Wizard"),
1654                                IDS_WINPT_KEYWIZARD);                                IDS_WINPT_KEYWIZARD);
1655              if (genkey.newkey != NULL)              if (genkey.cancel == 0)
1656                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  refresh_keylist (kmi);
1657              return TRUE;              return TRUE;
1658                            
1659          case ID_KEYMISC_SENDRECV:          case ID_KEYMISC_SENDRECV:
1660              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1661                                keyserver_dlg_proc, NULL, _("Keyserver Access"),                                keyserver_dlg_proc, 0, _("Keyserver Access"),
1662                                IDS_WINPT_KEYSERVER );                                IDS_WINPT_KEYSERVER);
1663                refresh_keylist (kmi);
1664              return TRUE;              return TRUE;
1665                            
1666          case ID_KEYMISC_GPGPREFS:          case ID_KEYMISC_GPGPREFS:
1667              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,              rc = dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS,
1668                                gpgprefs_dlg_proc, NULL, _("GnuPG Preferences"),                                     dlg, gpgprefs_dlg_proc, 0,
1669                                IDS_WINPT_GPGPREFS );                                     _("GnuPG Preferences"), IDS_WINPT_GPGPREFS);
1670                if (rc == TRUE) {
1671                    /* XXX: TRUE should indicate a value changed. */
1672                    reload_keycache (kmi);
1673                }
1674              return TRUE;              return TRUE;
1675                            
1676          case ID_KEYMISC_GPGOPT:          case ID_KEYMISC_GPGOPT:
1677              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1678                                gpgopt_dlg_proc, NULL, _("GnuPG Options" ),                                gpgopt_dlg_proc, 0, _("GnuPG Options"),
1679                                IDS_WINPT_GPGOPT );                                IDS_WINPT_GPGOPT);
1680              return TRUE;              return TRUE;
1681                            
1682          case ID_KEYMISC_IMPORT:          case ID_KEYMISC_IMPORT:
1683              t = get_filename_dlg (dlg, FILE_OPEN, _("Choose Name of the Key File"), NULL, NULL);              km_gui_import (kmi, LOWORD (wparam), NULL);
             if (t)  
                 km_file_import (dlg, t);  
1684              return TRUE;              return TRUE;
1685    
1686          case ID_KEYMISC_IMPORT_HTTP:          case ID_KEYMISC_IMPORT_HTTP:
1687              url = (struct URL_ctx_s*)get_http_file_dlg (dlg);              url = (struct URL_ctx_s*)get_http_file_dlg (dlg);
1688              if (url->cancel == 0)              if (url->cancel == 0) {
1689                  km_http_import (dlg, url->url);                  km_http_import (dlg, url->url);
1690              delete url; url=NULL;                  refresh_keylist (kmi);
1691                }
1692                free_if_alloc (url);
1693              break;              break;
1694                            
1695          case ID_KEYMISC_EXPORT:          case ID_KEYMISC_EXPORT:
1696              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1697              if (idx == -1) {                  msg_box (dlg, _("Please select a key."),
1698                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1699                  return TRUE;                  return TRUE;
1700              }              }
1701              if (listview_count_items (kmi->lv, 1) > 1)              if (listview_count_items (kmi->lv, 1) > 1)
1702                  name = m_strdup ("Exported_GPG_Keys.asc");                  name = m_strdup ("Exported_GPG_Keys.asc");
1703              else {              else {
1704                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);          
1705                  name = gen_export_filename (keyid, 0);                  name = km_gen_export_filename (key->subkeys->keyid+8, 0);
1706              }              }
1707              t = get_filename_dlg (dlg, FILE_SAVE, _("Choose Name for Key File"), NULL, name);              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1708              free_if_alloc (name);              free_if_alloc (name);
1709              if (t == NULL)              if (t == NULL)
1710                  return TRUE;                  return TRUE;
# Line 1290  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1712  keymanager_dlg_proc (HWND dlg, UINT msg,
1712              return TRUE;              return TRUE;
1713                            
1714          case ID_KEYMISC_EXPORT_PRIVKEY:          case ID_KEYMISC_EXPORT_PRIVKEY:
1715              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1716              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1717                  return TRUE;                  return TRUE;
1718              }              }
1719              if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1720                  msg_box( dlg, _("There is no corresponding secret key for this key."),                  msg_box (dlg, _("There is no corresponding secret key for this key."),
1721                          _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1722                  return TRUE;                  return TRUE;
1723              }              }
1724              if( listview_count_items( kmi->lv, 1 ) > 1 ) {              if (listview_count_items (kmi->lv, 1) > 1) {
1725                  msg_box( dlg, _("You can only export one secret key."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("You can only export one secret key."),
1726                             _("Key Manager"), MB_ERR);
1727                  return TRUE;                  return TRUE;
1728              }              }
1729              idx = msg_box( dlg,              i = msg_box (dlg,
1730                            _("This operation will export your *SECRET* key!\n\n"                            _("This operation will export your *SECRET* key!\n\n"
1731                              "Never send this key to ANYONE, it should be available\n"                              "Never send this key to ANYONE, it should be available\n"
1732                              "ONLY on your machine and you may use this function\n"                              "ONLY on your machine and you may use this function\n"
1733                              "to copy the key to a safe place.\n\n"                              "to copy the key to a safe place.\n\n"
1734                              "Do you really want to export the key?"),                              "Do you really want to export the key?"),
1735                            _("WARNING"), MB_INFO|MB_YESNO );                            _("WARNING"), MB_INFO|MB_YESNO);
1736              if( idx == IDYES ) {              if (i == IDYES) {
1737                  idx = listview_get_curr_pos( kmi->lv );                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1738                  listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof (keyid)-8 );                  if (!key)
1739                  name = gen_export_filename (keyid, 1);                      BUG (NULL);
1740                  t = get_filename_dlg (dlg, FILE_SAVE, _("Choose Name for Key File"), NULL, name);                  name = km_gen_export_filename (key->subkeys->keyid+8, 1);
1741                    t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1742                  if (t != NULL)                            if (t != NULL)          
1743                      km_privkey_export (dlg, kmi->lv, t);                      km_privkey_export (dlg, kmi->lv, t);
1744              }              }
1745              break;              return TRUE;
1746    
1747          case ID_KEYMISC_INFO:          case ID_KEYMISC_INFO:
1748              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1749                                about_winpt_dlg_proc, NULL, _("About WinPT"),                                about_winpt_dlg_proc, 0, _("About WinPT"),
1750                                IDS_WINPT_ABOUT );                                IDS_WINPT_ABOUT);
1751                break;
1752    
1753            case ID_KEYMISC_WEBSITE:
1754                ShellExecute (dlg, "open", "http://www.winpt.org",
1755                              NULL, NULL, SW_SHOW);
1756              break;              break;
1757    
1758          case ID_KEYMISC_HELP:          case ID_KEYMISC_HELP:
1759              ShellExecute (dlg, "open", "winpt.chm", NULL, NULL, SW_SHOW);              start_help (dlg, 0);
1760              break;              break;
1761    
1762          case ID_KEYMISC_OT:          case ID_KEYMISC_OT:
1763              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST,
1764                                ownertrust_dlg_proc, NULL,                                glob_hwnd, ownertrust_dlg_proc, 0,
1765                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );                                _("Ownertrust"), IDS_WINPT_OWNERTRUST);
1766              break;              break;
1767    
1768          case ID_KEYMISC_EDITKEY:          case ID_KEYMISC_EDITKEY:
1769              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1)
             if (idx == -1)  
1770                  break;                  break;
1771              listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1772                if (!key)
1773                    BUG (NULL);
1774              /* XXX: pub/crd = secret key does not work */              /* XXX: pub/crd = secret key does not work */
1775              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1776              k.is_protected = km_check_if_protected (kmi->lv, idx);              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1777              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.keyid = k.tmp_keyid;
1778              k.keyid = keyid;              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1779              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1780              k.flags = km_get_key_status (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1781                k.flags = km_get_key_status (kmi->lv, kmi->lv_idx);
1782              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1783                                keyedit_main_dlg_proc, (LPARAM)&k,                                keyedit_main_dlg_proc, (LPARAM)&k,
1784                                _("Key Edit"), IDS_KEYCTX_EDIT);                                _("Key Edit"), IDS_KEYCTX_EDIT);
1785              if (k.update)              if (k.update)
1786                  update_key (kmi->lv,  idx, keyid, 1);                  update_key (kmi->lv,  kmi->lv_idx, k.tmp_keyid, 1);
1787              break;              break;
1788                            
1789          case ID_KEYMISC_COPY:          case ID_KEYMISC_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1790              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1791              break;              break;
1792                            
# Line 1366  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1795  keymanager_dlg_proc (HWND dlg, UINT msg,
1795              break;              break;
1796    
1797          case ID_KEYMISC_PASTE:          case ID_KEYMISC_PASTE:
1798              km_index = -1;              km_gui_import (kmi, LOWORD (wparam), NULL);
             km_clip_import (dlg);  
1799              break;              break;
1800                            
1801          case ID_KEYCTX_SETPREFKS:          case ID_KEYCTX_SETPREFKS:
1802              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM(keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1803                if (!key)
1804                    BUG (NULL);
1805              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1806              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1807              keyedit_set_pref_keyserver (&k, dlg);              keyedit_set_pref_keyserver (&k, dlg);
1808              break;              break;
1809    
1810          case ID_KEYMISC_REFRESH_KEYS:          case ID_KEYMISC_REFRESH_KEYS:
1811              if (listview_count_items (kmi->lv, 1) == 0) {              if (listview_count_items (kmi->lv, 1) == 0) {
1812                  msg_box (dlg, _("No key was selected, select all by default."), _("Key Manager"), MB_INFO);                  msg_box (dlg, _("No key was selected, select all by default."),
1813                             _("Key Manager"), MB_INFO);
1814                  listview_select_all (kmi->lv);                  listview_select_all (kmi->lv);
1815              }              }
1816              km_refresh_from_keyserver (kmi->lv, dlg);              km_refresh_from_keyserver (kmi->lv, dlg);
# Line 1420  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1851  keymanager_dlg_proc (HWND dlg, UINT msg,
1851              break;              break;
1852    
1853          case ID_KEYCTX_ADDKEY:          case ID_KEYCTX_ADDKEY:
1854              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1855              listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1856                    BUG (NULL);
1857              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1858              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1859              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1860              k.keyid = keyid;              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1861                k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1862              keyedit_add_subkey (&k, dlg, NULL);              keyedit_add_subkey (&k, dlg, NULL);
1863              if (k.update)              if (k.update)
1864                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1865              break;              break;
1866    
1867          case ID_KEYCTX_ADDUID:          case ID_KEYCTX_ADDUID:
1868              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1869              listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1870                    BUG (NULL);
1871              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1872              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1873              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1874              k.keyid = keyid;              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1875                k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1876              keyedit_add_userid (&k, dlg, NULL);              keyedit_add_userid (&k, dlg, NULL);
1877              if (k.update)              if (k.update)
1878                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1879              break;              break;
1880    
1881          case ID_KEYCTX_ADDREV:          case ID_KEYCTX_ADDREV:
1882              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1883              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1884                    BUG (NULL);
1885              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1886              k.keyid = keyid;              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1887              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1888              k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1889                k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1890              keyedit_add_revoker (&k, dlg);              keyedit_add_revoker (&k, dlg);
1891              if (k.update)              if (k.update)
1892                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1893              break;              break;
1894    
1895          case ID_KEYCTX_ADDPHOTO:          case ID_KEYCTX_ADDPHOTO:
1896              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1897              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1898                    BUG (NULL);
1899              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1900              k.keyid = keyid;              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1901              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1902              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1903                k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1904              keyedit_add_photo (&k, dlg);              keyedit_add_photo (&k, dlg);
1905              if (k.update)              if (k.update)
1906                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1907              break;              break;
1908    
1909          case ID_KEYCTX_KS_NL:          case ID_KEYCTX_KS_NL:
# Line 1479  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1918  keymanager_dlg_proc (HWND dlg, UINT msg,
1918              km_send_to_keyserver (kmi->lv, dlg, host, port);              km_send_to_keyserver (kmi->lv, dlg, host, port);
1919              break;              break;
1920    
1921          case ID_KEYCTX_RECVFROM:          case ID_KEYCTX_RECVFROM:
1922              km_refresh_from_keyserver (kmi->lv, dlg);              km_refresh_from_keyserver (kmi->lv, dlg);
1923                if (updated_keys_avail ())
1924                    refresh_keylist (kmi);
1925                else
1926                    msg_box (NULL, "no updates", "", MB_OK);
1927              break;              break;
1928    
1929          case ID_KEYCTX_UID_COPY:          case ID_KEYCTX_UID_COPY:
1930              /* XXX: add generic function to support multiple selection              /* XXX: add generic function to support multiple selection
1931                      with a callback */                      with a callback */
1932              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1933              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );              name = utf8_to_wincp2 (key->uids->uid);
1934              set_clip_text( NULL, uid, strlen( uid ) );              set_clip_text (NULL, name, strlen (name));
1935                safe_free (name);
1936              break;              break;
1937    
1938          case ID_KEYCTX_KEYID_COPY:          case ID_KEYCTX_KEYID_COPY:
1939              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1940              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              set_clip_text (NULL, key->subkeys->keyid+8,
1941              set_clip_text( NULL, uid, strlen( uid ) );                             strlen (key->subkeys->keyid+8));
1942              break;              break;
1943    
1944          case ID_KEYCTX_FPR_COPY:          case ID_KEYCTX_FPR_COPY:
1945              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1946              key = (gpgme_key_t) listview_get_item2 (kmi->lv, idx);                      t = key->subkeys->fpr;
1947              if (key) {              set_clip_text (NULL, t? t : "", t? strlen (t): 0);
                 const char * s = get_key_fpr (key);  
                 set_clip_text (NULL, s? s : "", s? strlen (s): 0);  
             }  
1948              break;              break;
1949    
1950          case ID_KEYCTX_KINFO_COPY:          case ID_KEYCTX_KINFO_COPY:
1951              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1952              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              if (!key)
1953              km_set_clip_info( uid );                          BUG (NULL);
1954                km_set_clip_info (key->subkeys->keyid+8);
1955              break;              break;
1956    
1957          case ID_KEYCTX_COPY:          case ID_KEYCTX_COPY:
1958              km_index = listview_get_curr_pos (kmi->lv);              send_cmd_id (dlg, ID_KEYMISC_COPY);
             km_clip_export (dlg, kmi->lv);  
1959              break;              break;
1960    
1961          case ID_KEYCTX_PASTE:            case ID_KEYCTX_PASTE:
1962              km_index = -1;              send_cmd_id (dlg, ID_KEYMISC_PASTE);
             km_clip_import (dlg);  
1963              break;              break;
1964    
1965          case ID_KEYCTX_DISABLE:          case ID_KEYCTX_DISABLE:
             idx = listview_get_curr_pos (kmi->lv);  
             km_enable_disable_key (kmi->lv, dlg, idx, 0);  
             break;  
   
1966          case ID_KEYCTX_ENABLE:          case ID_KEYCTX_ENABLE:
1967              idx = listview_get_curr_pos (kmi->lv);              i = LOWORD (wparam) == ID_KEYCTX_ENABLE? 1 : 0;
1968              km_enable_disable_key (kmi->lv, dlg, idx, 1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1969                if (!key)
1970                    BUG (NULL);
1971                rc = km_enable_disable_key (kmi->lv, dlg, kmi->lv_idx, i);
1972                if (!rc)
1973                    update_key (kmi->lv, kmi->lv_idx, key->subkeys->keyid+8, 0);
1974                /* XXX: switching a key from disabled -> enabled. does not
1975                   change the validity field in the KM. */
1976              break;              break;
1977    
1978          case ID_KEYCTX_LISTSIGS:          case ID_KEYCTX_LISTSIGS:
# Line 1537  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1980  keymanager_dlg_proc (HWND dlg, UINT msg,
1980              break;              break;
1981    
1982          case ID_KEYCTX_MAXTRUST:          case ID_KEYCTX_MAXTRUST:
1983              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1984              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1985              rc = km_set_implicit_trust (dlg, kmi->lv, idx);                  BUG (NULL);
1986                rc = km_set_implicit_trust (dlg, kmi->lv, kmi->lv_idx);
1987              if (!rc)              if (!rc)
1988                  update_key (kmi->lv, idx, keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, key->subkeys->keyid+8, 0);
1989              break;              break;
1990    
1991          case ID_KEYCTX_SETDEFKEY:          case ID_KEYCTX_SETDEFKEY:
1992              idx = listview_get_curr_pos (kmi->lv);              if (!km_check_key_status (kmi->lv, kmi->lv_idx)) {
1993              if (!km_check_key_status (kmi->lv, idx)) {                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1994                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  rc = set_gnupg_default_key (key->subkeys->keyid+8);
                 rc = set_gnupg_default_key (keyid);  
1995                  if (rc)                  if (rc)
1996                      msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);                      msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1997                  km_update_default_key_str (kmi->statbar);                  update_default_key_str (kmi->statbar);
1998              }              }
1999              break;              break;
2000    
2001          #if 0 /* XXX */          case ID_KEYMISC_VIEWKEYID:
2002            case ID_KEYMISC_VIEWCIPHER:
2003            case ID_KEYMISC_VIEWTYPE:
2004            case ID_KEYMISC_VIEWCREAT:
2005                DWORD n;
2006    
2007                hm = GetMenu (dlg);
2008                n = get_menu_state (hm, LOWORD (wparam));
2009                set_menu_state (hm, LOWORD (wparam),
2010                                n & MFS_CHECKED? MFS_UNCHECKED : MFS_CHECKED);
2011                modify_listview_columns (kmi, LOWORD (wparam), !(n & MFS_CHECKED));
2012                break;
2013    
2014          case ID_GROUP_NEW:          case ID_GROUP_NEW:
             memset (&gcb, 0, sizeof (gcb));  
             gcb.gc = gc;  
             dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GROUP, glob_hwnd,  
                              group_manager_dlg_proc, (LPARAM)&gcb, _("New Group"),  
                              IDS_WINPT_GROUP);  
             if( gcb.use_name )  
                 treeview_add_item( GetDlgItem(dlg, IDC_KEYMISC_GROUP), NULL, gcb.name );  
             return TRUE;  
               
2015          case ID_GROUP_PASTE:          case ID_GROUP_PASTE:
             km_groups_add (gc, kmi->lv, km_index);  
             break;  
               
2016          case ID_GROUP_DELETE:          case ID_GROUP_DELETE:
2017              km_groups_del (gc);              /* XXX: Implement group manager. */
2018              break;              return TRUE;
2019          #endif  
2020            case IDCANCEL:
2021                EndDialog (dlg, TRUE);
2022                return TRUE;
2023          }          }
2024                    
2025          break;          break;
# Line 1581  keymanager_dlg_proc (HWND dlg, UINT msg, Line 2027  keymanager_dlg_proc (HWND dlg, UINT msg,
2027            
2028      return FALSE;      return FALSE;
2029  }  }
   
   
   

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26