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

Legend:
Removed from v.119  
changed lines
  Added in v.207

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26