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

Legend:
Removed from v.65  
changed lines
  Added in v.205

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26