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

Legend:
Removed from v.48  
changed lines
  Added in v.218

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26