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

Legend:
Removed from v.47  
changed lines
  Added in v.208

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26