/[winpt]/trunk/Src/wptKeyManagerDlg.cpp
ViewVC logotype

Diff of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26