/[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 121 by twoaday, Mon Dec 12 11:19:56 2005 UTC revision 129 by twoaday, Fri Dec 30 13:56:10 2005 UTC
# 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
# Line 42  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;
# Line 64  struct km_info { Line 76  struct km_info {
76      HWND statbar;      HWND statbar;
77    
78      listview_ctrl_t lv;      listview_ctrl_t lv;
79        int             lv_idx;
80      int keylist_sortby;      int keylist_sortby;
81  };  };
82    
83    /* Toolbar button structure. */
84  struct mybuttons {  struct mybuttons {
85      long icon;      long icon;
86      long command;      long command;
# Line 82  struct mybuttons myb[] = { Line 96  struct mybuttons myb[] = {
96  };  };
97    
98    
99  #ifndef VK_F  /* Subclass the keylist listview control to allow extended commands. */
 #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  
   
100  static BOOL CALLBACK  static BOOL CALLBACK
101  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
102  {  {
# Line 109  keylist_subclass_proc (HWND dlg, UINT ms Line 111  keylist_subclass_proc (HWND dlg, UINT ms
111          int virt_key = (int)wparam;          int virt_key = (int)wparam;
112          switch (virt_key) {          switch (virt_key) {
113          case VK_SPACE:          case VK_SPACE:
114              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_PROPS );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
115              break;              break;
116                    
117          case VK_DELETE:          case VK_DELETE:
118              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_DELETE );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
119              break;              break;
120                    
121          case VK_INSERT:          case VK_INSERT:
# Line 130  keylist_subclass_proc (HWND dlg, UINT ms Line 132  keylist_subclass_proc (HWND dlg, UINT ms
132          case VK_C:          case VK_C:
133              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL)) {
134                  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);  
135                  km_clip_export (keylist_proc.dlg, &lv);                  km_clip_export (keylist_proc.dlg, &lv);
136              }              }
137              break;              break;
138    
139          case VK_P:          case VK_P:
140              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL))          
                 km_index = -1;  
141                  km_clip_import (keylist_proc.dlg);                  km_clip_import (keylist_proc.dlg);
             }  
142              break;              break;
143    
144          case VK_F:          case VK_F:
# Line 152  keylist_subclass_proc (HWND dlg, UINT ms Line 151  keylist_subclass_proc (HWND dlg, UINT ms
151          break;          break;
152      }      }
153            
154      return CallWindowProc( keylist_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
155  } /* keylist_subclass_proc */  }
156    
157    
158  static HWND  static HWND
159  load_toolbar (HWND dlg, struct km_info * kmi)  load_toolbar (HWND dlg, struct km_info_s *kmi)
160  {  {
161      HWND tbwnd;      HWND tbwnd;
162      TBSAVEPARAMS tbsp;      TBSAVEPARAMS tbsp;
# Line 175  load_toolbar (HWND dlg, struct km_info * Line 174  load_toolbar (HWND dlg, struct km_info *
174                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,
175                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);
176      if (tbwnd) {      if (tbwnd) {
177          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
178          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);
179                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);
180          ShowWindow (tbwnd, SW_SHOW);          ShowWindow (tbwnd, SW_SHOW);
# Line 185  load_toolbar (HWND dlg, struct km_info * Line 184  load_toolbar (HWND dlg, struct km_info *
184          tbsp.pszSubKey = "Software\\WinPT";          tbsp.pszSubKey = "Software\\WinPT";
185          tbsp.pszValueName = "KM_toolbar";          tbsp.pszValueName = "KM_toolbar";
186          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)
187              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]),
188                             (LONG)&tb_buttons[0]);
189       }       }
190       return tbwnd;       return tbwnd;
191  } /* load_toolbar */  }
192    
193    
194    /* Restore the width of the columns from the registry.
195       If no bitstring was found, the default size is used. */
196    int
197    restore_column_info (listview_ctrl_t hd)
198    {
199        WORD *buf;
200        HKEY root;
201        DWORD type;
202        DWORD size = hd->cols*sizeof (WORD), i;
203        LONG ec;
204    
205        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
206                           KEY_ALL_ACCESS, &root);
207        if (ec != ERROR_SUCCESS)
208            return -1;
209    
210        buf = new WORD[size/2];
211        if (!buf)
212            BUG (NULL);
213        ec = RegQueryValueEx (root, "KMColumnSize", NULL, &type,
214                              (BYTE*)buf, &size);
215        RegCloseKey (root);
216        if (ec != ERROR_SUCCESS) {
217            free_if_alloc (buf);
218            return -1;
219        }
220    
221        /* check for garbled values. */
222        for (i=0; i < size/2; i++) {
223            if (buf[i] == 0 || buf[i] > 512) {
224                free_if_alloc (buf);
225                return -1;
226            }
227        }
228        for (i=0; i < size/2; i++) {
229            LVCOLUMN lvc;
230    
231            memset (&lvc, 0, sizeof (lvc));
232            lvc.mask = LVCF_WIDTH;
233            lvc.cx = buf[i];
234            ListView_SetColumn (hd->ctrl, i, &lvc);
235        }
236        free_if_alloc (buf);
237        return 0;
238    }
239    
240    
241    /* Save the current column width to the registry. */
242    int
243    save_column_info (listview_ctrl_t hd)
244    {
245        WORD *buf;
246        HKEY root;
247        LONG ec;
248        int i;
249    
250        buf = new WORD[hd->cols];
251        if (!buf)
252            BUG (NULL);
253        for (i=0; i < hd->cols; i++) {
254            LVCOLUMN lvc;
255    
256            memset (&lvc, 0, sizeof (lvc));
257            lvc.mask = LVCF_WIDTH;
258            ListView_GetColumn (hd->ctrl, i, &lvc);
259            buf[i] = lvc.cx;
260        }
261    
262        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
263                           KEY_ALL_ACCESS, &root);
264        if (ec != ERROR_SUCCESS) {
265            free_if_alloc (buf);
266            return -1;
267        }
268    
269        ec = RegSetValueEx (root, "KMColumnSize", 0, REG_BINARY,
270                            (const BYTE*)buf, 2*hd->cols);
271        RegCloseKey (root);
272        free_if_alloc (buf);
273        return ec == ERROR_SUCCESS? 0 : -1;
274    }
275    
276    
277  /* Center window @dlg. */  /* Center window @dlg. */
278  static void  static void
279  do_center_window (HWND dlg, struct km_info * kmi)  do_center_window (HWND dlg, struct km_info_s *kmi)
280  {  {
281      RECT rect;      RECT rect;
282      char * p;      char *p;
283      int pos_x = 0, pos_y = 0;      int pos_x = 0;
284        int pos_y = 0;
285                    
286      /* Find bottom of keylist */      /* Find bottom of keylist */
287      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);
# Line 207  do_center_window (HWND dlg, struct km_in Line 291  do_center_window (HWND dlg, struct km_in
291    
292      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
293      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
294          free_if_alloc (p);          free_if_alloc (p);      
295          center_window (dlg, NULL);          center_window (dlg, NULL);
296          return;          return;
297      }      }
# Line 217  do_center_window (HWND dlg, struct km_in Line 301  do_center_window (HWND dlg, struct km_in
301      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
302      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
303          free_if_alloc (p);          free_if_alloc (p);
304          center_window(dlg, NULL);          center_window (dlg, NULL);
305          return;          return;
306      }      }
307      else if (p)      else if (p)
# Line 230  do_center_window (HWND dlg, struct km_in Line 314  do_center_window (HWND dlg, struct km_in
314            
315      if (pos_x < 0 || pos_y < 0)      if (pos_x < 0 || pos_y < 0)
316          pos_x = pos_y = 0;          pos_x = pos_y = 0;
317      if (pos_x > GetSystemMetrics (SM_CXSCREEN)      if (pos_x > GetSystemMetrics (SM_CXSCREEN)
318          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
319          pos_x = pos_y = 0;          pos_x = pos_y = 0;
320      }      }
# Line 239  do_center_window (HWND dlg, struct km_in Line 323  do_center_window (HWND dlg, struct km_in
323  }  }
324    
325    
326    /* Resize the key manager window with the information from @kmi. */
327  static void  static void
328  do_resize_window( HWND dlg, struct km_info *kmi)  do_resize_window (HWND dlg, struct km_info_s *kmi)
329  {  {
330      HWND h;      HWND h;
331      RECT rclient, rect;      RECT rclient, rect;
332      BOOL bRepaint = FALSE;      BOOL bRepaint = FALSE;
333    
334      /* Get rect of client area and make life easier */      /* Get rect of client area and make life easier */
335      GetClientRect( dlg, &rclient );      GetClientRect (dlg, &rclient);
336    
337      /* Move toolbar to the top of the window */      /* Move toolbar to the top of the window */
338      if (kmi->toolbar) {      if (kmi->toolbar) {
339          GetWindowRect(kmi->toolbar, &rect);          GetWindowRect (kmi->toolbar, &rect);
340          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
341          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
342    
343          rclient.top += rect.bottom - rect.top;          rclient.top += rect.bottom - rect.top;
344          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,
# Line 262  do_resize_window( HWND dlg, struct km_in Line 347  do_resize_window( HWND dlg, struct km_in
347    
348      /* Move statusbar to the bottom of the window */      /* Move statusbar to the bottom of the window */
349      if (kmi->statbar) {      if (kmi->statbar) {
350          GetWindowRect( kmi->statbar, &rect );          GetWindowRect (kmi->statbar, &rect);
351          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
352          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
353    
354          rclient.bottom -= rect.bottom - rect.top;          rclient.bottom -= rect.bottom - rect.top;
355          MoveWindow (kmi->statbar, 0, rclient.bottom, rclient.right - rclient.left,          MoveWindow (kmi->statbar, 0, rclient.bottom,
356                        rclient.right - rclient.left,
357                      rect.bottom - rect.top, bRepaint);                      rect.bottom - rect.top, bRepaint);
358      }      }
359    
360      // Obtain separator information and move it to the desired posistion      /* Obtain separator information and move it to the desired posistion */
361      if (kmi->ypercent_sep)      if (kmi->ypercent_sep)
362          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;
363      else      else
364          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);
365                    
366      // Don't move away      /* Don't move away */
367      if (kmi->ypos_sep+5 > rclient.bottom)      if (kmi->ypos_sep+5 > rclient.bottom)
368          kmi->ypos_sep = rclient.bottom - 5;          kmi->ypos_sep = rclient.bottom - 5;
369      if (kmi->ypos_sep < rclient.top)      if (kmi->ypos_sep < rclient.top)
370          kmi->ypos_sep = rclient.top;          kmi->ypos_sep = rclient.top;
371      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep, (rclient.right - rclient.left), 5, bRepaint);      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
372                    (rclient.right - rclient.left), 5, bRepaint);
373                    
374      // Place the keylist above the separator      /* Place the keylist above the separator */
375      h = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
376      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
377                  kmi->ypos_sep - rclient.top, bRepaint);                  kmi->ypos_sep - rclient.top, bRepaint);
378      rclient.top = kmi->ypos_sep + 5 + 8;      rclient.top = kmi->ypos_sep + 5 + 8;
379    
380      /* Place the group text and the group box below the separator */      /* Place the group text and the group box below the separator */
381      h = GetDlgItem( dlg, IDC_KEYMISC_GTEXT );      h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
382      MoveWindow( h, rclient.left, rclient.top, 100, 14, bRepaint);      MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
383      rclient.top += 18;      rclient.top += 18;
384    
385      h = GetDlgItem( dlg, IDC_KEYMISC_GROUP );      h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
386      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
387                  (rclient.bottom < rclient.top) ? 0 : rclient.bottom - rclient.top, bRepaint);                  (rclient.bottom < rclient.top) ?
388                    0 : rclient.bottom - rclient.top, bRepaint);
389            
390      /* Repaint the whole thing */      /* Repaint the whole thing */
391      InvalidateRect (dlg, NULL, TRUE);      InvalidateRect (dlg, NULL, TRUE);
392  } /* do_resize_window */  }
393    
394    
395    /* Return true if the clipboard contains an OpenPGP key. */
396    static bool
397    clip_contains_pgpkey (void)
398    {
399        char *ctxt;
400        bool val = false;
401    
402        ctxt = get_clip_text (NULL);
403        if (!ctxt || strlen (ctxt) < 512)
404            val = false;
405        else if (strstr (ctxt, "BEGIN PGP") && strstr (ctxt, "KEY BLOCK") &&
406                 strstr (ctxt, "END PGP"))
407            val = true;
408        free_if_alloc (ctxt);
409        return val;
410    }
411    
412    
413    /* Show a mini popup menu to import keys. */
414  static void  static void
415  do_create_minpopup (HWND dlg)  do_create_minpopup (HWND dlg)
416  {  {
# Line 312  do_create_minpopup (HWND dlg) Line 419  do_create_minpopup (HWND dlg)
419      char * s;      char * s;
420      POINT p;      POINT p;
421            
422      if (gpg_read_only)      if (gpg_read_only || !clip_contains_pgpkey ())
423          return;          return;
424      hm = CreatePopupMenu ();      hm = CreatePopupMenu ();
425      if (!hm)      if (!hm)
# Line 329  do_create_minpopup (HWND dlg) Line 436  do_create_minpopup (HWND dlg)
436      GetCursorPos (&p);      GetCursorPos (&p);
437      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);
438      DestroyMenu (hm);      DestroyMenu (hm);
439  } /* do_create_minpopup */  }
440    
441    
442    /* Update the default key entry in the status bar for dialog @dlg. */
443    void
444    update_default_key_str (HWND dlg)
445    {
446        const char *fmt;
447        char *keyid;
448        char defkeyinf[128];
449        
450        /* XXX: also show the name? */
451        keyid = get_gnupg_default_key ();
452        if (!keyid)
453            return;
454        if ((keyid[0] >= 'A' && keyid[0] <= 'Z') ||
455            (keyid[0] >= 'a' && keyid[0] <= 'z') ||
456            (keyid[0] == '0' && keyid[1] == 'x'))
457            fmt = _("Default Key: %s");
458        else
459            fmt = _("Default Key: 0x%s");
460        _snprintf (defkeyinf, sizeof (defkeyinf) - 1, fmt, keyid);
461        SendMessage (dlg, SB_SETTEXT, 0, (LPARAM)defkeyinf);
462        free_if_alloc (keyid);
463    }
464    
465    
466    /* Count all keys and show from @lv results in the status bar @sb. */
467    void
468    update_status_bar (HWND sb, listview_ctrl_t lv)
469    {
470        char txt_sec[128], txt_pub[128];
471        int nkeys = 0, nsec = 0;
472        int i;
473    
474        nkeys = listview_count_items (lv, 0);
475        for (i = 0; i < nkeys; i++) {
476            if (km_check_for_seckey (lv, i, NULL))
477                nsec++;
478        }
479        _snprintf (txt_sec, sizeof (txt_sec)-1, _("%d secret keys"), nsec);
480        _snprintf (txt_pub, sizeof (txt_pub)-1, _("%d keys"), nkeys);
481        SendMessage (sb, SB_SETTEXT, 1, (LPARAM)txt_sec);
482        SendMessage (sb, SB_SETTEXT, 2, (LPARAM)txt_pub);
483    }
484    
485    
486    
487    /* Reload the key cache if requested. */
488  static void  static void
489  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)
490  {  {
491      gpg_keycache_t cache;      gpg_keycache_t cache;
492    
493      if( keycache_get_reload( ) ) {      if (keycache_get_reload ()) {
494          keycache_reload( dlg );          keycache_reload (dlg);
495          keycache_set_reload( 0 );          keycache_set_reload (0);
496          cache = keycache_get_ctx( 1 );          cache = keycache_get_ctx (1);
497          if( !cache )          if (!cache)
498              BUG( dlg );              BUG (dlg);
499          keylist_reload( lv, cache, KEYLIST_LIST, KEY_SORT_USERID );          keylist_reload (lv, cache, KEYLIST_LIST, KEY_SORT_USERID);
500          km_update_status_bar (sb, lv);          update_status_bar (sb, lv);
501      }      }
502  } /* do_check_cache */  }
503    
504    
505  long CALLBACK  long CALLBACK
506  separator_wnd_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )  separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
507  {  {
508      static POINT last_mouse_pos;      static POINT last_mouse_pos;
509      RECT rect;  
       
510      if (msg == WM_CREATE)      if (msg == WM_CREATE)
511          SetWindowLong (hwnd, GWL_USERDATA, (long)(((CREATESTRUCT*)lparam)->lpCreateParams));          SetWindowLong (hwnd, GWL_USERDATA,
512                           (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
513    
514      switch (msg) {      switch (msg) {
515      case WM_PAINT:      case WM_PAINT:
516          PAINTSTRUCT ps;          PAINTSTRUCT ps;
517            RECT rect;
518          HPEN hpen;          HPEN hpen;
519    
520          GetClientRect (hwnd, &rect);          GetClientRect (hwnd, &rect);
521          BeginPaint (hwnd, &ps);          BeginPaint (hwnd, &ps);
522    
523          // Background          /* Background */
524          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
525    
526          // The lines from the light into the dark          /* The lines from the light into the dark */
527          MoveToEx(ps.hdc, 0,0, NULL);          MoveToEx(ps.hdc, 0,0, NULL);
528          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {
529              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
530              LineTo(ps.hdc, rect.right, 0);              LineTo (ps.hdc, rect.right, 0);
531              DeleteObject(hpen);              DeleteObject (hpen);
532          }          }
533          MoveToEx(ps.hdc, 0, 1, NULL);          MoveToEx(ps.hdc, 0, 1, NULL);
534          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {
535               SelectObject(ps.hdc, (LPVOID)hpen);               SelectObject (ps.hdc, (LPVOID)hpen);
536               LineTo(ps.hdc, rect.right, rect.bottom);               LineTo (ps.hdc, rect.right, rect.bottom);
537               DeleteObject(hpen);               DeleteObject (hpen);
538           }           }
539    
540          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);
541          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {
542              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
543              LineTo(ps.hdc, rect.right, rect.bottom-1);              LineTo (ps.hdc, rect.right, rect.bottom-1);
544              DeleteObject(hpen);              DeleteObject (hpen);
545          }          }
546          MoveToEx(ps.hdc, 0, rect.bottom, NULL);          MoveToEx(ps.hdc, 0, rect.bottom, NULL);
547          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {
548              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
549              LineTo(ps.hdc, rect.right, rect.bottom);              LineTo (ps.hdc, rect.right, rect.bottom);
550              DeleteObject(hpen);              DeleteObject (hpen);
551          }          }
552    
553          EndPaint (hwnd, &ps);          EndPaint (hwnd, &ps);
554          return 0;          return 0;
555    
556      case WM_LBUTTONDOWN:      case WM_LBUTTONDOWN:
557          last_mouse_pos.x = LOWORD(lparam);          last_mouse_pos.x = LOWORD (lparam);
558          last_mouse_pos.y = HIWORD(lparam);          last_mouse_pos.y = HIWORD (lparam);
559          ClientToScreen (hwnd, &last_mouse_pos);          ClientToScreen (hwnd, &last_mouse_pos);
560          SetCapture (hwnd);          SetCapture (hwnd);
561          return 0;          return 0;
# Line 412  separator_wnd_proc( HWND hwnd, UINT msg, Line 566  separator_wnd_proc( HWND hwnd, UINT msg,
566    
567      case WM_MOUSEMOVE:      case WM_MOUSEMOVE:
568          if (wparam == MK_LBUTTON) {          if (wparam == MK_LBUTTON) {
569              struct km_info *kmi;              struct km_info_s *kmi;
570              POINT p;              POINT p;
571                RECT r;
572    
573              if ((kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA)) == NULL)              kmi = (struct km_info_s *)GetWindowLong (hwnd, GWL_USERDATA);
574                if (kmi == NULL)
575                  break;                  break;
576    
577              // Calculate mouse movement              /* Calculate mouse movement */
578              p.x = LOWORD(lparam);              p.x = LOWORD(lparam);
579              p.y = HIWORD(lparam);              p.y = HIWORD(lparam);
580              ClientToScreen (hwnd, &p);              ClientToScreen (hwnd, &p);
581    
582              GetWindowRect (hwnd, &rect);              GetWindowRect (hwnd, &r);
583              rect.top += (short)(p.y - last_mouse_pos.y);              r.top += (short)(p.y - last_mouse_pos.y);
584              rect.bottom += (short)(p.y - last_mouse_pos.y);              r.bottom += (short)(p.y - last_mouse_pos.y);
585    
586              last_mouse_pos.y = p.y;              last_mouse_pos.y = p.y;
587    
588              // Apply mouse movement to window. Beware the MoveWindow is relaive              /* Apply mouse movement to window. Beware the MoveWindow is relaive
589              // to parent NOT screen                 to parent NOT screen */
590              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&rect, 2);              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
591              kmi->ypos_sep = rect.top;              kmi->ypos_sep = r.top;
592              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 */
593              do_resize_window (GetParent(hwnd), kmi);              do_resize_window (GetParent(hwnd), kmi);
594              return 0;              return 0;
595          }          }
# Line 443  separator_wnd_proc( HWND hwnd, UINT msg, Line 599  separator_wnd_proc( HWND hwnd, UINT msg,
599  }  }
600    
601    
602    /* Register the separator window with @dlg as the parent window. */
603  static HWND  static HWND
604  regist_sep_wnd (HWND dlg, struct km_info * kmi)  regist_sep_wnd (HWND dlg, struct km_info_s *kmi)
605  {  {
606      WNDCLASS wndclass;      WNDCLASS wndclass;
607      HWND h;      HWND h;
# Line 466  regist_sep_wnd (HWND dlg, struct km_info Line 623  regist_sep_wnd (HWND dlg, struct km_info
623                          0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);                              0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);    
624      ShowWindow (h, SW_SHOW);      ShowWindow (h, SW_SHOW);
625      return h;      return h;
626  } /* regist_sep_wnd */  }
   
627    
628    
629  #define enable_button(hwnd, cid) \  #define enable_button(hwnd, cid) \
# Line 486  update_ui_items (HWND hwnd, listview_ctr Line 642  update_ui_items (HWND hwnd, listview_ctr
642      int key_has_sec = 0;      int key_has_sec = 0;
643      int key_inv = 0;      int key_inv = 0;
644      int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,      int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
645                           ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};                           ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
646      int i;      int i, state=0;
647            
648      /* Get some states */      /* Get some states */
649      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),
# Line 497  update_ui_items (HWND hwnd, listview_ctr Line 653  update_ui_items (HWND hwnd, listview_ctr
653      if (key_selected) {      if (key_selected) {
654          i = listview_get_curr_pos (lv);          i = listview_get_curr_pos (lv);
655          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;
656          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED;          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
657                      km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
658      }      }
659    
660      /* Enable / disable toolbar buttons */      /* Enable / disable toolbar buttons */
# Line 508  update_ui_items (HWND hwnd, listview_ctr Line 665  update_ui_items (HWND hwnd, listview_ctr
665      enable_button (hwnd_child, ID_KEYMISC_EXPORT);      enable_button (hwnd_child, ID_KEYMISC_EXPORT);
666    
667      /* Enable / disable menu items */      /* Enable / disable menu items */
668        state = key_selected? MF_ENABLED : MF_DISABLED|MF_GRAYED;
669      hmenu = GetMenu (hwnd);      hmenu = GetMenu (hwnd);
670      set_menu_state (hmenu, ID_KEYMISC_EXPORT, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT, state);
671      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_DELETE, state);
672      set_menu_state (hmenu, ID_KEYMISC_REVCERT, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_PROPS, state);
673      set_menu_state (hmenu, ID_KEYMISC_DELETE, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, state);
674      set_menu_state (hmenu, ID_KEYMISC_PROPS, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, state);
675      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_SIGN,
676      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);                      key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);
677      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY,
678                            key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
679        set_menu_state (hmenu, ID_KEYMISC_REVCERT,
680                        key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
681    
682      /* Disable some menu items when multiple keys are selected. */      /* Disable some menu items when multiple keys are selected. */
683      if (listview_count_items (lv, 1) > 1) {      if (listview_count_items (lv, 1) > 1) {
684          for (i=0; mult_resids[i] != 0; i++)          for (i=0; mult_resids[i] != 0; i++)
685              set_menu_state (hmenu, mult_resids[i], MF_GRAYED);              set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
686      }          }
687  }  }
688    
689    
690  /* Disable some context menu items when multiple keys are selected. */  /* Disable some context menu items when multiple keys are selected. */
691  static void  static void
692  popup_multiple (HWND dlg, HMENU hm)  popup_multiple (HWND dlg, HMENU hm)
# Line 533  popup_multiple (HWND dlg, HMENU hm) Line 695  popup_multiple (HWND dlg, HMENU hm)
695          ID_KEYCTX_EDIT,          ID_KEYCTX_EDIT,
696          ID_KEYCTX_SIGN,          ID_KEYCTX_SIGN,
697          ID_KEYCTX_REV,          ID_KEYCTX_REV,
698          ID_KEYCTX_ENABLE,          ID_KEYCTX_ENABLE,
699          ID_KEYCTX_DISABLE,          ID_KEYCTX_DISABLE,
700          ID_KEYCTX_ADDKEY,          ID_KEYCTX_ADDKEY,
701          ID_KEYCTX_ADDPHOTO,          ID_KEYCTX_ADDPHOTO,
702          ID_KEYCTX_ADDUID,          ID_KEYCTX_ADDUID,
703          ID_KEYCTX_ADDREV,          ID_KEYCTX_ADDREV,
704          ID_KEYCTX_LISTSIGS,          ID_KEYCTX_LISTSIGS,
705          ID_KEYCTX_MAXTRUST,          ID_KEYCTX_MAXTRUST,
706          ID_KEYCTX_PROPS,          ID_KEYCTX_PROPS,
707          ID_KEYCTX_SENDMAIL,          ID_KEYCTX_SENDMAIL,
708          0          0};
     };  
709      int i;      int i;
710      for (i=0; i < resids[i] != 0; i++)      for (i=0; i < resids[i] != 0; i++)
711          set_menu_state (hm, resids[i], MF_GRAYED);          set_menu_state (hm, resids[i], MF_GRAYED);
712  }  }
713    
714    
715  /* The items which are shown when GPG is in read-only mode. */  /* The items which are shown when GPG is in read-only mode. */
716  static void  static void
# Line 579  popup_gpg_readonly (HWND dlg, HMENU hm) Line 740  popup_gpg_readonly (HWND dlg, HMENU hm)
740  }  }
741    
742    
743    /* Change the 'Edit' menu based on the current state. */
744  static void  static void
745  menu_gpg_readonly (HWND dlg, HMENU hm, int id)  change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
746    {
747        enum item { EDIT_MENU = 1 };
748        int no_sel;
749    
750        if (id != EDIT_MENU)
751            return;
752    
753        if (!clip_contains_pgpkey ())
754            set_menu_state (hm, ID_KEYMISC_PASTE, MF_GRAYED);
755        else
756            set_menu_state (hm, ID_KEYMISC_PASTE, MF_ENABLED);
757        no_sel = listview_get_curr_pos (lv) == -1? 1 : 0;
758        set_menu_state (hm, ID_KEYMISC_DELETE2, no_sel? MF_GRAYED: MF_ENABLED);
759        set_menu_state (hm, ID_KEYMISC_COPY, no_sel? MF_GRAYED : MF_ENABLED);
760    }
761    
762    
763    
764    /* Show limited key menu entries when GPG is in read-only mode. */
765    static void
766    change_key_menu (HMENU hm, int id)
767  {  {
768      int key_resids[] = {      int key_resids[] = {
769          ID_KEYMISC_SIGN,          ID_KEYMISC_SIGN,
# Line 611  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 794  menu_gpg_readonly (HWND dlg, HMENU hm, i
794      case 0: return;      case 0: return;
795      case 3: resids = key_resids; break;      case 3: resids = key_resids; break;
796      case 1: resids = edit_resids;break;      case 1: resids = edit_resids;break;
797      default: resids = edit_resids; return;      default:resids = edit_resids; break;
798      }      }
799    
800      for (i=0; resids[i] != 0; i++)      for (i=0; resids[i] != 0; i++)
# Line 619  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 802  menu_gpg_readonly (HWND dlg, HMENU hm, i
802  }  }
803    
804    
805  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;  
 }  
   
   
806  static void  static void
807  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)
808  {  {
# Line 663  update_key (listview_ctrl_t lv, int pos, Line 823  update_key (listview_ctrl_t lv, int pos,
823  static HWND  static HWND
824  setup_status_bar (HWND dlg, listview_ctrl_t lv)  setup_status_bar (HWND dlg, listview_ctrl_t lv)
825  {        {      
826      HWND statbar;          HWND statbar;
827      RECT r;      RECT r;
828      int partpos[3];      int partpos[3];
829      int i;      int i;
# Line 677  setup_status_bar (HWND dlg, listview_ctr Line 837  setup_status_bar (HWND dlg, listview_ctr
837      ShowWindow (statbar, SW_SHOW);      ShowWindow (statbar, SW_SHOW);
838      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
839    
840      km_update_default_key_str (statbar);      update_default_key_str (statbar);
841      km_update_status_bar (statbar, lv);      update_status_bar (statbar, lv);
842    
843      return statbar;      return statbar;
844  }  }
845    
846    
847    /* Remove or add columns which depends on the state of @checked. */
848    void
849    modify_listview_columns (km_info_s *kmi, UINT m_uid, BOOL checked)
850    {
851        UINT resids[] = {
852            0,
853            ID_KEYMISC_VIEWKEYID,
854            ID_KEYMISC_VIEWTYPE,
855            0,
856            ID_KEYMISC_VIEWCIPHER,
857            0,
858            0,
859            ID_KEYMISC_VIEWCREAT,
860            -1
861        };
862        listview_column_s cols[] = {
863        {0, 240, (char *)_("User ID")},
864        {1, 78, (char *)_("Key ID")},
865        {2, 52, (char *)_("Type")},    
866        {3, 66, (char *)_("Size")},
867        {4, 60, (char *)_("Cipher")},
868        {5, 66, (char *)_("Validity")},
869        {6, 58, (char *)_("Trust")},
870        {7, 72, (char *)_("Creation")},
871        {0, 0, NULL}
872        };
873        UINT pos;
874    
875        for (pos=0; resids[pos] != -1; pos++) {
876            if (m_uid == resids[pos])
877                break;
878        }
879        if (!checked)
880            listview_del_column (kmi->lv, (int)pos);
881        else {      
882            listview_add_column (kmi->lv, &cols[pos]);
883            keylist_upd_col (kmi->lv, pos);
884        }
885    }
886    
887    
888    /* Translate all menu strings. */
889    static void
890    translate_menu_strings (HWND dlg)
891    {
892        HMENU menu;
893    
894        menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
895        set_menu_text_bypos (menu, 0, _("File"));
896        set_menu_text_bypos (menu, 1, _("Edit"));
897        set_menu_text_bypos (menu, 2, _("View"));
898        set_menu_text_bypos (menu, 3, _("Key"));
899        set_menu_text_bypos (menu, 4, _("Groups"));
900    
901        set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
902        set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));
903        set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */
904        set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));
905        set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));
906        set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));
907        set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));
908        set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));
909        set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));
910        set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));
911        set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));
912        set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));
913        set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));
914        set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));
915        set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
916        set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke Cert"));
917        set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));
918        set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));
919        set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));
920        set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));
921        set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));
922        set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));
923        set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));
924        set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
925        set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));
926        set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));
927        set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));
928        set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));
929        set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );
930        set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));
931    
932        set_menu_text (menu, ID_KEYMISC_VIEWKEYID, _("Key ID"));
933        set_menu_text (menu, ID_KEYMISC_VIEWCIPHER, _("Cipher"));
934        set_menu_text (menu, ID_KEYMISC_VIEWTYPE, _("Type"));
935        set_menu_text (menu, ID_KEYMISC_VIEWCREAT, _("Creation"));
936    
937        /* XXX: implement help code. */
938        set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
939    
940        SetMenu (dlg, menu);
941    }
942    
943    
944    /* Translate popup menu strings. */
945    static void
946    translate_popupmenu_strings (HMENU popup)
947    {
948        set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));
949        set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));
950        set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));
951        set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));
952        set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));
953        set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));
954        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));
955        set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));
956        set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));
957        set_menu_text (popup, ID_KEYCTX_PROPS, _("&Properties"));
958        set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));
959        set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));
960        set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke Cert"));
961        set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));
962        set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));
963        set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));
964        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));
965        set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));
966        set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));
967        set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));
968    
969        set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
970        set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
971        set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
972        set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
973    
974        /* change popup texts */
975        set_menu_text_bypos (popup, 0, _("Key Attributes"));
976        set_menu_text_bypos (popup, 6, _("Add"));
977        set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
978    }
979    
980    
981    /* Dialog box procedure for the Key Manager. */
982  BOOL CALLBACK  BOOL CALLBACK
983  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
984  {  {
985      struct km_info *kmi;      struct km_info_s *kmi;
     /*static km_group_s *gc = NULL;*/  
     static HMENU menu = NULL;  
986      static int refresh_keys = 0;          static int refresh_keys = 0;    
987      INITCOMMONCONTROLSEX icex;      INITCOMMONCONTROLSEX icex;
988      HWND kl;      HWND kl;
989      HMENU hm;      HMENU hm;
990      gpg_keycache_t c;      gpg_keycache_t c;
991      gpgme_key_t key;      gpgme_key_t key;
     /*km_group_cb_s gcb; XXX */  
992      struct genkey_s genkey;      struct genkey_s genkey;
993      struct winpt_key_s k = {0};      struct winpt_key_s k = {0};
994      struct URL_ctx_s *url;      struct URL_ctx_s *url;
995      refresh_cache_s rcs = {0};      refresh_cache_s rcs = {0};
996      char keyid[48], uid[128], type[32], *name;      char type[32], *name;
997      const char *t, * host;      const char *t, *host;
998      u16 port = 0;      WORD port = 0;
999      int idx = 0, i=0, rc;      int l_idx = 0, i=0, rc;
1000    
1001      if ((msg != WM_INITDIALOG)      if ((msg != WM_INITDIALOG)
1002          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))          && ((kmi = (struct km_info_s*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
1003          return FALSE;          return FALSE;
1004    
1005      switch (msg) {      switch (msg) {
1006      case WM_INITDIALOG:      case WM_INITDIALOG:
1007          kmi = new struct km_info;          kmi = new struct km_info_s;
1008          memset (kmi, 0, sizeof (struct km_info));          memset (kmi, 0, sizeof (struct km_info_s));
1009            kmi->lv_idx = -1;
1010          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
1011          icex.dwICC  = ICC_BAR_CLASSES;          icex.dwICC  = ICC_BAR_CLASSES;
1012          InitCommonControlsEx (&icex);          InitCommonControlsEx (&icex);
1013          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
1014          imagelist_load (dlg);          imagelist_load (dlg);
1015            translate_menu_strings (dlg);
1016            SetWindowText (dlg, _("Key Manager"));
1017    
1018          SetWindowText( dlg, _("Key Manager") );          if (keyring_check_last_access ())
1019          menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );              keycache_set_reload (1);
1020          set_menu_text_bypos (menu, 0, _("File"));          if (keycache_get_reload ())
1021          set_menu_text_bypos (menu, 1, _("Edit"));              keycache_reload (dlg);
1022          set_menu_text_bypos (menu, 2, _("View"));          c = keycache_get_ctx (KEYCACHE_PUB);
1023          set_menu_text_bypos (menu, 3, _("Key"));          if (!c)
1024          set_menu_text_bypos (menu, 4, _("Groups"));              BUG (NULL);
1025                    kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
         set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));  
         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"));  
   
         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 );  
1026          kmi->keylist_sortby = KEY_SORT_USERID;          kmi->keylist_sortby = KEY_SORT_USERID;
1027          Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),          Header_SetImageList(ListView_GetHeader (kl), glob_imagelist);
1028                              glob_imagelist);          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
1029          kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);
                                 NULL, KEYLIST_LIST, kmi->keylist_sortby );  
1030          /* init subclassing for the listview */          /* init subclassing for the listview */
         kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );  
1031          keylist_proc.dlg = dlg;          keylist_proc.dlg = dlg;
1032          keylist_proc.current = (WNDPROC)keylist_subclass_proc;          keylist_proc.current = (WNDPROC)keylist_subclass_proc;
1033          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );          keylist_proc.old = (WNDPROC)GetWindowLong(kl, GWL_WNDPROC);
1034          if( keylist_proc.old ) {          if (keylist_proc.old) {
1035              if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {              if( !SetWindowLong (kl, GWL_WNDPROC, (LONG)keylist_proc.current)) {
1036                  msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("Could not set keylist window procedure."),
1037                  BUG( NULL );                           _("Key Manager"), MB_ERR);
1038                    BUG (NULL);
1039              }              }
1040          }          }
         #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));  
   
1041          kmi->statbar = setup_status_bar (dlg, kmi->lv);          kmi->statbar = setup_status_bar (dlg, kmi->lv);
1042          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
1043          kmi->toolbar = load_toolbar (dlg, kmi);          kmi->toolbar = load_toolbar (dlg, kmi);
# Line 795  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1045  keymanager_dlg_proc (HWND dlg, UINT msg,
1045          do_center_window (dlg, kmi);          do_center_window (dlg, kmi);
1046          do_resize_window (dlg, kmi);          do_resize_window (dlg, kmi);
1047          update_ui_items (dlg, kmi->lv);          update_ui_items (dlg, kmi->lv);
1048                    restore_column_info (kmi->lv);
1049    
1050          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
1051            SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
1052                          (LPCTSTR)IDI_WINPT));
1053          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
1054            force_foreground_window (dlg, 1000);
1055          return TRUE;          return TRUE;
1056                    
1057      case WM_DESTROY:      case WM_DESTROY:
1058            save_column_info (kmi->lv);
1059          if (kmi->lv) {          if (kmi->lv) {
1060              keylist_delete (kmi->lv);              keylist_delete (kmi->lv);
1061              kmi->lv = NULL;                    kmi->lv = NULL;      
1062                    }
1063           /*          imagelist_destroy ();
1064           if (gc) {  
1065              km_groups_release (gc);          ltoa (kmi->pos_x, type, 10);
1066              gc = NULL;          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
1067          }*/          ltoa (kmi->pos_y, type, 10);
1068         imagelist_destroy ();          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
1069            
1070         char buf[32];          /* Remove runtime information. This should be the last action taken here. */
1071         ltoa (kmi->pos_x, buf, 10);          delete kmi; kmi = NULL;
1072         set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );          SetWindowLong (dlg, GWL_USERDATA, 0);
1073         ltoa (kmi->pos_y, buf, 10);          keycache_set_reload (refresh_keys);
1074         set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);          return FALSE;
1075         /* Remove runtime information. This should be the last action taken here. */  
1076         delete kmi; kmi = NULL;      case WM_MOVE:
        SetWindowLong (dlg, GWL_USERDATA, 0);  
        keycache_set_reload (refresh_keys);  
        return FALSE;  
   
     case WM_MOVE:        
         /* kmi->pos_x = (int)(short)LOWORD(lparam);  
            kmi->pos_y = (int)(short)HIWORD(lparam); */  
1077          RECT r;          RECT r;
1078          GetWindowRect (dlg, &r);          GetWindowRect (dlg, &r);
1079          kmi->pos_x = r.left;          kmi->pos_x = r.left;
# Line 838  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1086  keymanager_dlg_proc (HWND dlg, UINT msg,
1086          break;          break;
1087    
1088      case WM_NOTIFY:                  case WM_NOTIFY:            
1089          NMHDR * notify;          NMHDR *notify;
1090          POINT p;          POINT p;
1091          HMENU popup;          HMENU popup;
1092                    
1093          notify = (NMHDR *)lparam;          notify = (NMHDR *)lparam;
1094          if (notify == NULL)          if (!notify)
1095              break;              break;
1096          switch (notify->code)          switch (notify->code) {
         {  
1097          case TBN_QUERYDELETE:          case TBN_QUERYDELETE:
1098              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1099              return TRUE;              return TRUE;
1100                    
1101          case TBN_QUERYINSERT:          case TBN_QUERYINSERT:
1102              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1103              return TRUE;              return TRUE;
1104    
1105          case TBN_GETBUTTONINFO:          case TBN_GETBUTTONINFO:
# Line 921  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1168  keymanager_dlg_proc (HWND dlg, UINT msg,
1168              return TRUE;              return TRUE;
1169                            
1170          case LVN_ITEMCHANGED:          case LVN_ITEMCHANGED:
1171              if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */              if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
1172              {                  kmi->lv_idx = listview_get_curr_pos (kmi->lv);
1173                  update_ui_items (dlg, kmi->lv);                  update_ui_items (dlg, kmi->lv);
1174                  return TRUE;                  return TRUE;
1175              }              }
# Line 930  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1177  keymanager_dlg_proc (HWND dlg, UINT msg,
1177    
1178          case NM_RCLICK:          case NM_RCLICK:
1179              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1180                  if (listview_get_curr_pos (kmi->lv) == -1)                  l_idx =listview_get_curr_pos (kmi->lv);
1181                    if (l_idx == -1)
1182                      return TRUE; /* Popup only when a item was selected */                      return TRUE; /* Popup only when a item was selected */
1183                  do_check_cache (kmi->lv, dlg, kmi->statbar);                  do_check_cache (kmi->lv, dlg, kmi->statbar);
1184                  GetCursorPos (&p);                  GetCursorPos (&p);
1185                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
1186                  popup = GetSubMenu (hm, 0);                  popup = GetSubMenu (hm, 0);
1187                    translate_popupmenu_strings (popup);
1188    
1189                  set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));                  if (km_check_for_seckey (kmi->lv, l_idx, &i))
                 set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));  
                 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"));  
                   
                 set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));  
                   
                 idx = listview_get_curr_pos (kmi->lv);  
                 if (km_check_for_seckey (kmi->lv, idx, &i))  
1190                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1191                  if (i == 0)                  if (i == 0)
1192                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1193                  if (!km_check_for_seckey (kmi->lv, idx, NULL)) {                  if (!km_check_for_seckey (kmi->lv, l_idx, NULL)) {
1194                      set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
1195                      set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1196                      set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);
1197                      set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1198                      set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
1199                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1200                  }                  }
1201                  else if( km_check_for_seckey (kmi->lv, idx, NULL)                  else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1202                        && km_key_is_v3 (kmi->lv, idx)) {                           km_key_is_v3 (kmi->lv, l_idx)) {
1203                      /* 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,
1204                         designated revokers and secondary keys. */                         designated revokers and secondary keys. */
1205                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1206                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1207                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
1208                  }                  }
1209                  if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )                  if (km_get_key_status( kmi->lv, l_idx ) & KM_FLAG_DISABLED)
1210                      set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED);
1211                  else                  else
1212                      set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED);
1213                  if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)                  if (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED ||
1214                        km_get_key_status (kmi->lv, l_idx) & KM_FLAG_EXPIRED)
1215                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1216                  if (mapi_init())                  if (!clip_contains_pgpkey ())
1217                        set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1218                    if (mapi_init ())
1219                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1220                  /* Override 'Default Keyserver' with the actual name. */                  /* Override 'Default Keyserver' with the actual name. */
1221                  host = kserver_get_hostname (0, -1, &port);                  host = kserver_get_hostname (0, -1, &port);
1222                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);
1223                  popup_gpg_readonly (dlg, popup);                  popup_gpg_readonly (dlg, popup);
1224                  if (listview_count_items (kmi->lv, 1) > 1)                  if (listview_count_items (kmi->lv, 1) > 1)
1225                      popup_multiple (dlg, popup);                                      popup_multiple (dlg, popup);
1226                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
1227                  DestroyMenu (popup);                  DestroyMenu (popup);
1228                  DestroyMenu (hm);                  DestroyMenu (hm);
1229                  return TRUE;                  return TRUE;
1230              }              }
             #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  
1231              break;              break;
1232    
1233          case LVN_COLUMNCLICK:          case LVN_COLUMNCLICK:
1234              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1235                  NMLISTVIEW * nml = (LPNMLISTVIEW) lparam;                  NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1236                  int sortby = 0;                  int sortby = 0;
1237                  switch (nml->iSubItem) {                  switch (nft->iSubItem) {
1238                  case 0:  sortby = KEY_SORT_USERID; break;                  case 0:  sortby = KEY_SORT_USERID; break;
1239                  case 1:  sortby = KEY_SORT_KEYID; break;                  case 1:  sortby = KEY_SORT_KEYID; break;
1240                  case 2:  sortby = KEY_SORT_IS_SECRET; break;                  case 2:  sortby = KEY_SORT_IS_SECRET; break;
# Line 1053  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1256  keymanager_dlg_proc (HWND dlg, UINT msg,
1256              break;              break;
1257          }          }
1258          break;          break;
         }  
1259    
1260      case WM_WINDOWPOSCHANGING:      case WM_WINDOWPOSCHANGING:
1261          if (((WINDOWPOS*)lparam)->cx < 400)          if (((WINDOWPOS*)lparam)->cx < 400)
# Line 1067  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1269  keymanager_dlg_proc (HWND dlg, UINT msg,
1269          return TRUE;          return TRUE;
1270                    
1271      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
1272          if( LOWORD (wparam) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
1273              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1274          return FALSE;          return FALSE;
1275                    
1276      case WM_MENUSELECT:      case WM_MENUSELECT:
1277          menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));          change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1278            change_key_menu ((HMENU)lparam, LOWORD (wparam));
1279          break;          break;
1280    
1281      case WM_INITMENUPOPUP:      case WM_INITMENUPOPUP:
1282          if ((UINT)LOWORD (lparam) == 3) {          if ((UINT)LOWORD (lparam) == 3) {
1283              HMENU m = (HMENU)wparam;              HMENU h = (HMENU)wparam;
1284              set_menu_text_bypos (m, 0, _("New"));              set_menu_text_bypos (h, 0, _("New"));
1285          }          }
1286          return FALSE;          return FALSE;
1287    
1288      case WM_COMMAND:      case WM_COMMAND:
1289            /* Allow at least 'Exit' in such a case. */
1290          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1291              msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );              msg_box (dlg, _("Could not access public keyring"),
1292                         _("Key Manager"), MB_ERR);
1293              return FALSE;              return FALSE;
1294          }          }
1295          do_check_cache( kmi->lv, dlg, kmi->statbar );          do_check_cache (kmi->lv, dlg, kmi->statbar);
1296          switch( LOWORD( wparam ) ) {          switch( LOWORD (wparam)) {
1297          case ID_KEYMISC_QUIT:          case ID_KEYMISC_QUIT:
1298              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1299              return TRUE;              return TRUE;
1300                            
1301          case ID_KEYMISC_MAIL:          case ID_KEYMISC_MAIL:
# Line 1104  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1309  keymanager_dlg_proc (HWND dlg, UINT msg,
1309              break;              break;
1310    
1311          case ID_KEYMISC_DELETE:          case ID_KEYMISC_DELETE:
1312              km_delete_keys (kmi->lv, dlg);          case ID_KEYMISC_DELETE2:
1313                if (!km_delete_keys (kmi->lv, dlg))
1314                    update_status_bar (kmi->statbar, kmi->lv);
1315              return TRUE;              return TRUE;
1316                            
1317          case ID_KEYMISC_SIGN:                  case ID_KEYMISC_SIGN:
1318              if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {              if (kmi->lv_idx == -1) {
1319                  msg_box( dlg, _("Please select a key."),  _("Key Manager"),                  msg_box (dlg, _("Please select a key."),  
1320                           MB_ERR );                           _("Key Manager"), MB_ERR);
1321                  return TRUE;;                  return TRUE;
1322              }              }
1323              if (km_check_key_status (kmi->lv, idx))              if (km_check_key_status (kmi->lv, kmi->lv_idx))
1324                  return TRUE;                  return TRUE;
1325              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);  
1326              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1327              k.ctx = key;              k.ctx = key;
1328              k.keyid = keyid;              k.keyid = key->subkeys->keyid;
1329              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
1330                                keysign_dlg_proc, (LPARAM)&k,                                keysign_dlg_proc, (LPARAM)&k,
1331                                _("Key Signing"), IDS_WINPT_KEYSIGN);                                _("Key Signing"), IDS_WINPT_KEYSIGN);
1332              if (k.update)              if (k.update)
1333                  update_key (kmi->lv, idx, k.keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.keyid, 0);
1334              return TRUE;              return TRUE;
1335                            
1336          case ID_KEYMISC_REVCERT:          case ID_KEYMISC_REVCERT:
1337              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1338              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 );  
1339                  return TRUE;                  return TRUE;
1340              }              }
1341              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1342              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );              if (!key)
1343              if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {                  BUG (NULL);
1344                  msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );              if (!km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)) {
1345                    msg_box (dlg, _("There is no secret key available!"),
1346                            _("Key Manager"), MB_ERR);
1347                  return TRUE;                  return TRUE;
1348              }              }
1349                            
1350              {              {
1351                  char rinf[128];                  char state[64];
1352                  listview_get_item_text (kmi->lv, idx, 5, rinf, sizeof (rinf) -1);                  listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1353                  if (strchr (rinf, 'R')) {                                          state, sizeof (state) -1);
1354                    if (strchr (state, 'R' )) {
1355                      msg_box (dlg, _("Key already revoked!"),                      msg_box (dlg, _("Key already revoked!"),
1356                               _("Key Manager"), MB_INFO);                               _("Key Manager"), MB_INFO);
1357                      return TRUE;                      return TRUE;
# Line 1152  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1360  keymanager_dlg_proc (HWND dlg, UINT msg,
1360                            
1361              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1362              k.key_pair = 1;              k.key_pair = 1;
1363              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1364              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1365              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
1366                               key_revoke_dlg_proc, (LPARAM)&k,                               key_revoke_dlg_proc, (LPARAM)&k,
1367                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);                               _("Key Revocation Cert"), IDS_WINPT_KEYREVOKE);
1368              return TRUE;              return TRUE;
1369                            
1370          case ID_KEYMISC_TRUSTPATH:          case ID_KEYMISC_TRUSTPATH:
1371              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1372              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 );  
1373                  return TRUE;                  return TRUE;
1374              }              }
1375              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1376              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );              if (km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)) {
1377              if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {                  msg_box (dlg, _("It does not make any sense with a key pair!"),
1378                  msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );                           _("Key Manager"), MB_ERR);
1379                  return FALSE;                  return TRUE;
1380              }              }
1381              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1382              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1383              k.uid = uid;              k.uid = key->uids->uid;
1384              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,
1385                                keytrust_dlg_proc, (LPARAM)&k,                                keytrust_dlg_proc, (LPARAM)&k,
1386                                _("List Trust Path"), IDS_WINPT_KEYTRUST );                                _("List Trust Path"), IDS_WINPT_KEYTRUST);
1387              return TRUE;              return TRUE;
1388                            
1389          case ID_KEYMISC_CHECKSIGS:          case ID_KEYMISC_CHECKSIGS:          
1390              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1391              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1392                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1393              }              }
1394              listview_get_item_text (kmi->lv, idx, 0, uid, DIM (uid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1395              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1396                    BUG (NULL);
1397              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1398              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1399              k.uid = uid;              k.uid = key->uids->uid;
1400              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1401              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
1402                                keysig_dlg_proc, (LPARAM)&k,                                keysig_dlg_proc, (LPARAM)&k,
1403                                _("Key Signature List" ), IDS_WINPT_KEYSIG);                                _("Key Signature List" ), IDS_WINPT_KEYSIG);
1404              return TRUE;              return TRUE;
1405                            
1406          case ID_KEYMISC_PROPS:          case ID_KEYMISC_PROPS:      
1407              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
             if( idx == -1 ) {  
1408                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1409                  return FALSE;                  return TRUE;
1410              }              }
1411              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1412              listview_get_item_text (kmi->lv, idx, 2, type, DIM (type)-1);              if (!key)
1413                    BUG (NULL);
1414              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1415              k.key_pair = 0;              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)? 1 : 0;
1416              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
             if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )  
                 k.key_pair = 1;  
1417              k.callback.ctl = kmi->lv;              k.callback.ctl = kmi->lv;
1418              k.callback.idx = idx;              k.callback.idx = kmi->lv_idx;
1419              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1420              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
1421                                keyprops_dlg_proc, (LPARAM)&k,                                keyprops_dlg_proc, (LPARAM)&k,
1422                                _("Key Properties"), IDS_WINPT_KEYPROPS );                                _("Key Properties"), IDS_WINPT_KEYPROPS );
1423              if (k.callback.new_val != 0) {              if (k.callback.new_val != 0) {
1424                  t = get_key_trust_str (k.callback.new_val);                  t = get_key_trust_str (k.callback.new_val);
1425                  listview_add_sub_item (kmi->lv, idx, 6, t);                  listview_add_sub_item (kmi->lv, kmi->lv_idx, 6, t);
1426              }              }
1427              return TRUE;              return TRUE;
1428                            
1429          case ID_KEYMISC_RECACHE:          case ID_KEYMISC_RECACHE:
1430              /* If there is already a reload request, don't bother the user with a message. */              /* If there is already a reload request,
1431              if (keycache_get_reload () == 1)                  don't bother the user with a message. */
1432                  idx = IDYES;              if (keycache_get_reload() == 1)
1433                    l_idx = IDYES;
1434              else {              else {
1435                  char inf[256];                  char inf[256];
1436                  _snprintf (inf, sizeof (inf) -1,                  _snprintf (inf, sizeof (inf) -1,
1437                             _("This is only useful when the keyring has been "                             _("This is only useful when the keyring has been "
1438                               "modified (sign a key...).\n"                               "modified (sign a key...).\n"
1439                               "Do you really want to reload the keycache?"));                               "Do you really want to reload the keycache?"));
1440                  idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);                  l_idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);
1441              }              }
1442              if( idx == IDYES ) {              if (l_idx == IDYES) {
1443                  rcs.kr_reload = rcs.kr_update = 1;                  rcs.kr_reload = rcs.kr_update = 1;
1444                  rcs.tr_update = 0;                  rcs.tr_update = 0;
1445                  DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,                  DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
1446                                  keycache_dlg_proc, (LPARAM)&rcs );                                  keycache_dlg_proc, (LPARAM)&rcs);
1447                  c = keycache_get_ctx( 1 );                  c = keycache_get_ctx (1);
1448                  if( !c )                  if (!c)
1449                      BUG( dlg );                      BUG (dlg);
1450                  keylist_reload( kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID );                  keylist_reload (kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID);
1451                  refresh_keys = 0;                  refresh_keys = 0;
1452              }              }
1453              return TRUE;              return TRUE;
1454                            
1455          case ID_KEYMISC_REBUILD:          case ID_KEYMISC_REBUILD:
1456              name=NULL;              name = NULL;
1457              gpg_rebuild_cache (&name);              gpg_rebuild_cache (&name);
1458              if (name) {              if (name != NULL) {
1459                  char *p = strchr (name, '\n');                  char *line = strchr (name, '\n');
1460                  show_msg (dlg, 2000, p? name + (p-name)+1 : name);                  show_msg (dlg, 2000, line? name + (line-name)+1 : name);
1461                  free (name);                  safe_free (name);
1462              }              }
1463              return TRUE;              return TRUE;
1464                            
1465          case ID_KEYMISC_NEWKEY:          case ID_KEYMISC_NEWKEY:
1466              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1467              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1468                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1469                                IDS_WINPT_KEYGEN);                                IDS_WINPT_KEYGEN);
1470              if (genkey.newkey != NULL) {              if (genkey.newkey != NULL) {
1471                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
# Line 1268  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1474  keymanager_dlg_proc (HWND dlg, UINT msg,
1474              return TRUE;              return TRUE;
1475    
1476          case ID_KEYMISC_CARDNEW:          case ID_KEYMISC_CARDNEW:
1477              if( !scard_support ) {              if (!scard_support) {
1478                  msg_box( dlg, _("Smart Card support is not available."), _("Key Manager"), MB_INFO );                  msg_box (dlg, _("Smart Card support is not available."),
1479                             _("Key Manager"), MB_INFO);
1480                  return TRUE;                  return TRUE;
1481              }              }
1482              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1483                                card_keygen_dlg_proc, 0, _("Card Key Generation"),                                card_keygen_dlg_proc, 0, _("Card Key Generation"),
1484                                IDS_WINPT_CARD_KEYGEN );                                IDS_WINPT_CARD_KEYGEN);
1485              /* XXX: use new code */              /* XXX: use new code */
1486              if( keycache_get_reload() )              if (keycache_get_reload ())
1487                  send_cmd_id( dlg, ID_KEYMISC_RECACHE );                  send_cmd_id (dlg, ID_KEYMISC_RECACHE);
1488              return TRUE;              return TRUE;
1489    
1490          case ID_KEYMISC_KEYWIZARD:          case ID_KEYMISC_KEYWIZARD:
1491              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1492              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1493                                keygen_wizard_dlg_proc, (LPARAM)&genkey, _("Key Generation Wizard"),                                keygen_wizard_dlg_proc, (LPARAM)&genkey,
1494                                  _("Key Generation Wizard"),
1495                                IDS_WINPT_KEYWIZARD);                                IDS_WINPT_KEYWIZARD);
1496              if (genkey.newkey != NULL) {              if (genkey.newkey != NULL) {
1497                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
# Line 1293  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1501  keymanager_dlg_proc (HWND dlg, UINT msg,
1501                            
1502          case ID_KEYMISC_SENDRECV:          case ID_KEYMISC_SENDRECV:
1503              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1504              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1505                                keyserver_dlg_proc, (LPARAM)&genkey,                                keyserver_dlg_proc, (LPARAM)&genkey, _("Keyserver Access"),
1506                                _("Keyserver Access"), IDS_WINPT_KEYSERVER);                                IDS_WINPT_KEYSERVER);
1507              if (genkey.newkey != NULL) {              if (genkey.newkey != NULL) {
1508                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1509                  keylist_sort (kmi->lv, KEY_SORT_USERID);                  keylist_sort (kmi->lv, KEY_SORT_USERID);
# Line 1303  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1511  keymanager_dlg_proc (HWND dlg, UINT msg,
1511              return TRUE;              return TRUE;
1512                            
1513          case ID_KEYMISC_GPGPREFS:          case ID_KEYMISC_GPGPREFS:
1514              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,
1515                                gpgprefs_dlg_proc, 0, _("GnuPG Preferences"),                                gpgprefs_dlg_proc, 0, _("GnuPG Preferences"),
1516                                IDS_WINPT_GPGPREFS );                                IDS_WINPT_GPGPREFS);
1517              return TRUE;              return TRUE;
1518                            
1519          case ID_KEYMISC_GPGOPT:          case ID_KEYMISC_GPGOPT:
1520              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1521                                gpgopt_dlg_proc, 0, _("GnuPG Options" ),                                gpgopt_dlg_proc, 0, _("GnuPG Options"),
1522                                IDS_WINPT_GPGOPT );                                IDS_WINPT_GPGOPT);
1523              return TRUE;              return TRUE;
1524                            
1525          case ID_KEYMISC_IMPORT:          case ID_KEYMISC_IMPORT:
1526              t = get_fileopen_dlg (dlg, _("Choose Name of the Key File"), NULL, NULL);              t = get_fileopen_dlg (dlg, _("Choose Name of the Key File"),
1527                                      NULL, NULL);
1528              if (t)              if (t)
1529                  km_file_import (dlg, t);                  km_file_import (dlg, t);
1530              return TRUE;              return TRUE;
# Line 1328  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1537  keymanager_dlg_proc (HWND dlg, UINT msg,
1537              break;              break;
1538                            
1539          case ID_KEYMISC_EXPORT:          case ID_KEYMISC_EXPORT:
1540              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1541              if (idx == -1) {                  msg_box (dlg, _("Please select a key."),
1542                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1543                  return TRUE;                  return TRUE;
1544              }              }
1545              if (listview_count_items (kmi->lv, 1) > 1)              if (listview_count_items (kmi->lv, 1) > 1)
1546                  name = m_strdup ("Exported_GPG_Keys.asc");                  name = m_strdup ("Exported_GPG_Keys.asc");
1547              else {              else {
1548                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);          
1549                  name = gen_export_filename (keyid, 0);                  name = km_gen_export_filename (key->subkeys->keyid+8, 0);
1550              }              }
1551              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1552              free_if_alloc (name);              free_if_alloc (name);
# Line 1347  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1556  keymanager_dlg_proc (HWND dlg, UINT msg,
1556              return TRUE;              return TRUE;
1557                            
1558          case ID_KEYMISC_EXPORT_PRIVKEY:          case ID_KEYMISC_EXPORT_PRIVKEY:
1559              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1560              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 );  
1561                  return TRUE;                  return TRUE;
1562              }              }
1563              if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1564                  msg_box( dlg, _("There is no corresponding secret key for this key."),                  msg_box (dlg, _("There is no corresponding secret key for this key."),
1565                          _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1566                  return TRUE;                  return TRUE;
1567              }              }
1568              if( listview_count_items( kmi->lv, 1 ) > 1 ) {              if (listview_count_items (kmi->lv, 1) > 1) {
1569                  msg_box( dlg, _("You can only export one secret key."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("You can only export one secret key."),
1570                             _("Key Manager"), MB_ERR);
1571                  return TRUE;                  return TRUE;
1572              }              }
1573              idx = msg_box( dlg,              i = msg_box (dlg,
1574                            _("This operation will export your *SECRET* key!\n\n"                            _("This operation will export your *SECRET* key!\n\n"
1575                              "Never send this key to ANYONE, it should be available\n"                              "Never send this key to ANYONE, it should be available\n"
1576                              "ONLY on your machine and you may use this function\n"                              "ONLY on your machine and you may use this function\n"
1577                              "to copy the key to a safe place.\n\n"                              "to copy the key to a safe place.\n\n"
1578                              "Do you really want to export the key?"),                              "Do you really want to export the key?"),
1579                            _("WARNING"), MB_INFO|MB_YESNO );                            _("WARNING"), MB_INFO|MB_YESNO);
1580              if( idx == IDYES ) {              if (i == IDYES) {
1581                  idx = listview_get_curr_pos( kmi->lv );                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1582                  listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof (keyid)-8 );                  if (!key)
1583                  name = gen_export_filename (keyid, 1);                      BUG (NULL);
1584                    name = km_gen_export_filename (key->subkeys->keyid+8, 1);
1585                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1586                  if (t != NULL)                            if (t != NULL)          
1587                      km_privkey_export (dlg, kmi->lv, t);                      km_privkey_export (dlg, kmi->lv, t);
1588              }              }
1589              return TRUE;              return TRUE;
1590    
1591          case ID_KEYMISC_INFO:          case ID_KEYMISC_INFO:
1592              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1593                                about_winpt_dlg_proc, 0, _("About WinPT"),                                about_winpt_dlg_proc, 0, _("About WinPT"),
1594                                IDS_WINPT_ABOUT );                                IDS_WINPT_ABOUT);
1595              break;              break;
1596    
1597          case ID_KEYMISC_HELP:          case ID_KEYMISC_HELP:
# Line 1389  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1599  keymanager_dlg_proc (HWND dlg, UINT msg,
1599              break;              break;
1600    
1601          case ID_KEYMISC_OT:          case ID_KEYMISC_OT:
1602              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST,
1603                                ownertrust_dlg_proc, 0,                                glob_hwnd, ownertrust_dlg_proc, 0,
1604                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );                                _("Ownertrust"), IDS_WINPT_OWNERTRUST);
1605              break;              break;
1606    
1607          case ID_KEYMISC_EDITKEY:          case ID_KEYMISC_EDITKEY:
1608              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1)
             if (idx == -1)  
1609                  break;                  break;
1610              listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1611                if (!key)
1612                    BUG (NULL);
1613              /* XXX: pub/crd = secret key does not work */              /* XXX: pub/crd = secret key does not work */
1614              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1615              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1616              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1617              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1618              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1619              k.flags = km_get_key_status (kmi->lv, idx);              k.flags = km_get_key_status (kmi->lv, kmi->lv_idx);
1620              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1621                                keyedit_main_dlg_proc, (LPARAM)&k,                                keyedit_main_dlg_proc, (LPARAM)&k,
1622                                _("Key Edit"), IDS_KEYCTX_EDIT);                                _("Key Edit"), IDS_KEYCTX_EDIT);
1623              if (k.update)              if (k.update)
1624                  update_key (kmi->lv,  idx, keyid, 1);                  update_key (kmi->lv,  kmi->lv_idx, k.keyid, 1);
1625              break;              break;
1626                            
1627          case ID_KEYMISC_COPY:          case ID_KEYMISC_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1628              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1629              break;              break;
1630                            
# Line 1423  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1633  keymanager_dlg_proc (HWND dlg, UINT msg,
1633              break;              break;
1634    
1635          case ID_KEYMISC_PASTE:          case ID_KEYMISC_PASTE:
             km_index = -1;  
1636              km_clip_import (dlg);              km_clip_import (dlg);
1637              break;              break;
1638                            
1639          case ID_KEYCTX_SETPREFKS:          case ID_KEYCTX_SETPREFKS:
1640              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM(keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1641                if (!key)
1642                    BUG (NULL);
1643              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1644              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1645              keyedit_set_pref_keyserver (&k, dlg);              keyedit_set_pref_keyserver (&k, dlg);
1646              break;              break;
1647    
1648          case ID_KEYMISC_REFRESH_KEYS:          case ID_KEYMISC_REFRESH_KEYS:
1649              if (listview_count_items (kmi->lv, 1) == 0) {              if (listview_count_items (kmi->lv, 1) == 0) {
1650                  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."),
1651                             _("Key Manager"), MB_INFO);
1652                  listview_select_all (kmi->lv);                  listview_select_all (kmi->lv);
1653              }              }
1654              km_refresh_from_keyserver (kmi->lv, dlg);              km_refresh_from_keyserver (kmi->lv, dlg);
# Line 1477  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1689  keymanager_dlg_proc (HWND dlg, UINT msg,
1689              break;              break;
1690    
1691          case ID_KEYCTX_ADDKEY:          case ID_KEYCTX_ADDKEY:
1692              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1693              listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1694                    BUG (NULL);
1695              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1696              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1697              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1698              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1699              keyedit_add_subkey (&k, dlg, NULL);              keyedit_add_subkey (&k, dlg, NULL);
1700              if (k.update)              if (k.update)
1701                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.keyid, 1);
1702              break;              break;
1703    
1704          case ID_KEYCTX_ADDUID:          case ID_KEYCTX_ADDUID:
1705              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1706              listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1707                    BUG (NULL);
1708              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1709              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1710              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1711              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1712              keyedit_add_userid (&k, dlg, NULL);              keyedit_add_userid (&k, dlg, NULL);
1713              if (k.update)              if (k.update)
1714                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.keyid, 1);
1715              break;              break;
1716    
1717          case ID_KEYCTX_ADDREV:          case ID_KEYCTX_ADDREV:
1718              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1719              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1720                    BUG (NULL);
1721              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1722              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1723              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1724              k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1725              keyedit_add_revoker (&k, dlg);              keyedit_add_revoker (&k, dlg);
1726              if (k.update)              if (k.update)
1727                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.keyid, 1);
1728              break;              break;
1729    
1730          case ID_KEYCTX_ADDPHOTO:          case ID_KEYCTX_ADDPHOTO:
1731              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1732              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1733                    BUG (NULL);
1734              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1735              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1736              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1737              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1738              keyedit_add_photo (&k, dlg);              keyedit_add_photo (&k, dlg);
1739              if (k.update)              if (k.update)
1740                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.keyid, 1);
1741              break;              break;
1742    
1743          case ID_KEYCTX_KS_NL:          case ID_KEYCTX_KS_NL:
# Line 1543  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1759  keymanager_dlg_proc (HWND dlg, UINT msg,
1759          case ID_KEYCTX_UID_COPY:          case ID_KEYCTX_UID_COPY:
1760              /* XXX: add generic function to support multiple selection              /* XXX: add generic function to support multiple selection
1761                      with a callback */                      with a callback */
1762              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1763              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );              name = utf8_to_wincp2 (key->uids->uid);
1764              set_clip_text( NULL, uid, strlen( uid ) );              set_clip_text (NULL, name, strlen (name));
1765                safe_free (name);
1766              break;              break;
1767    
1768          case ID_KEYCTX_KEYID_COPY:          case ID_KEYCTX_KEYID_COPY:
1769              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1770              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              set_clip_text (NULL, key->subkeys->keyid+8,
1771              set_clip_text( NULL, uid, strlen( uid ) );                             strlen (key->subkeys->keyid+8));
1772              break;              break;
1773    
1774          case ID_KEYCTX_FPR_COPY:          case ID_KEYCTX_FPR_COPY:
1775              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1776              key = (gpgme_key_t) listview_get_item2 (kmi->lv, idx);                      //t = get_key_fpr (key);
1777              if (key) {              t = key->subkeys->fpr;
1778                  const char * s = get_key_fpr (key);              set_clip_text (NULL, t? t : "", t? strlen (t): 0);
                 set_clip_text (NULL, s? s : "", s? strlen (s): 0);  
             }  
1779              break;              break;
1780    
1781          case ID_KEYCTX_KINFO_COPY:          case ID_KEYCTX_KINFO_COPY:
1782              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1783              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              if (!key)
1784              km_set_clip_info( uid );                          BUG (NULL);
1785                km_set_clip_info (key->subkeys->keyid+8);
1786              break;              break;
1787    
1788          case ID_KEYCTX_COPY:          case ID_KEYCTX_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1789              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1790              break;              break;
1791    
1792          case ID_KEYCTX_PASTE:            case ID_KEYCTX_PASTE:
             km_index = -1;  
1793              km_clip_import (dlg);              km_clip_import (dlg);
1794              break;              break;
1795    
1796          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;  
   
1797          case ID_KEYCTX_ENABLE:          case ID_KEYCTX_ENABLE:
1798              idx = listview_get_curr_pos (kmi->lv);              i = LOWORD (wparam) == ID_KEYCTX_ENABLE? 1 : 0;
1799              km_enable_disable_key (kmi->lv, dlg, idx, 1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1800                if (!key)
1801                    BUG (NULL);
1802                rc = km_enable_disable_key (kmi->lv, dlg, kmi->lv_idx, i);
1803                if (!rc)
1804                    update_key (kmi->lv, kmi->lv_idx, key->subkeys->keyid+8, 0);
1805                /* XXX: switching a key from disabled -> enabled. does not
1806                   change the validity field in the KM. */
1807              break;              break;
1808    
1809          case ID_KEYCTX_LISTSIGS:          case ID_KEYCTX_LISTSIGS:
# Line 1594  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1811  keymanager_dlg_proc (HWND dlg, UINT msg,
1811              break;              break;
1812    
1813          case ID_KEYCTX_MAXTRUST:          case ID_KEYCTX_MAXTRUST:
1814              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1815              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1816              rc = km_set_implicit_trust (dlg, kmi->lv, idx);                  BUG (NULL);
1817                rc = km_set_implicit_trust (dlg, kmi->lv, kmi->lv_idx);
1818              if (!rc)              if (!rc)
1819                  update_key (kmi->lv, idx, keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, key->subkeys->keyid+8, 0);
1820              break;              break;
1821    
1822          case ID_KEYCTX_SETDEFKEY:          case ID_KEYCTX_SETDEFKEY:
1823              idx = listview_get_curr_pos (kmi->lv);              if (!km_check_key_status (kmi->lv, kmi->lv_idx)) {
1824              if (!km_check_key_status (kmi->lv, idx)) {                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1825                  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);  
1826                  if (rc)                  if (rc)
1827                      msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);                      msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1828                  km_update_default_key_str (kmi->statbar);                  update_default_key_str (kmi->statbar);
1829              }              }
1830              break;              break;
1831    
1832          #if 0 /* XXX */          case ID_KEYMISC_VIEWKEYID:
1833            case ID_KEYMISC_VIEWCIPHER:
1834            case ID_KEYMISC_VIEWTYPE:
1835            case ID_KEYMISC_VIEWCREAT:
1836                DWORD n;
1837    
1838                hm = GetMenu (dlg);
1839                n = get_menu_state (hm, LOWORD (wparam));
1840                set_menu_state (hm, LOWORD (wparam),
1841                                n & MFS_CHECKED? MFS_UNCHECKED : MFS_CHECKED);
1842                modify_listview_columns (kmi, LOWORD (wparam), !(n & MFS_CHECKED));
1843                break;
1844    
1845          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;  
               
1846          case ID_GROUP_PASTE:          case ID_GROUP_PASTE:
             km_groups_add (gc, kmi->lv, km_index);  
             break;  
               
1847          case ID_GROUP_DELETE:          case ID_GROUP_DELETE:
1848              km_groups_del (gc);              /* XXX: Implement group manager. */
1849              break;              return TRUE;
         #endif  
1850          }          }
1851                    
1852          break;          break;
# Line 1638  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1854  keymanager_dlg_proc (HWND dlg, UINT msg,
1854            
1855      return FALSE;      return FALSE;
1856  }  }
   
   
   

Legend:
Removed from v.121  
changed lines
  Added in v.129

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26