/[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 211 by twoaday, Sun May 7 12:36:48 2006 UTC revision 226 by twoaday, Mon Jun 12 13:40:21 2006 UTC
# Line 85  struct km_info_s { Line 85  struct km_info_s {
85    
86      unsigned int enable_groups:1;      unsigned int enable_groups:1;
87  };  };
88    typedef struct km_info_s *km_info_t;
89    
90  /* Toolbar button structure. */  /* Toolbar button structure. */
91  struct mybuttons {  struct mybuttons {
# Line 103  struct mybuttons myb[] = { Line 104  struct mybuttons myb[] = {
104    
105    
106  static void km_gui_import (struct km_info_s *kmi, int cmd_id, void *param);  static void km_gui_import (struct km_info_s *kmi, int cmd_id, void *param);
107    void key_get_clip_info (const char *keyid, char *buf, size_t buflen);
108    
109    
110  /* Subclass the keylist listview control to allow extended commands. */  /* Subclass the keylist listview control to allow extended commands. */
# Line 300  save_column_info (struct km_info_s *kmi) Line 302  save_column_info (struct km_info_s *kmi)
302  }  }
303    
304    
305    /* Restore the original size of the dialog. */
306    static void
307    restore_window_size (HWND dlg, struct km_info_s *kmi)
308    {
309        char *p;
310        int height = 0, width = 0;
311    
312        /* Restore the original window size. */
313        p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Width");
314        if (p) {
315            width = atoi (p);
316            free_if_alloc (p);
317        }
318        p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Height");
319        if (p) {
320            height = atoi (p);
321            free_if_alloc (p);
322        }
323        if (height > 0 && width > 0)
324            SetWindowPos (dlg, HWND_TOP, kmi->pos_x, kmi->pos_y,
325                          height, width, SWP_SHOWWINDOW);
326    }
327    
328    
329  /* Center window @dlg. */  /* Center window @dlg. */
330  static void  static void
331  do_center_window (HWND dlg, struct km_info_s *kmi)  do_center_window (HWND dlg, struct km_info_s *kmi)
# Line 322  do_center_window (HWND dlg, struct km_in Line 348  do_center_window (HWND dlg, struct km_in
348          return;          return;
349      }      }
350      else if (p)      else if (p)
351          pos_x = atol (p);          pos_x = atoi (p);
352    
353      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
354      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
# Line 331  do_center_window (HWND dlg, struct km_in Line 357  do_center_window (HWND dlg, struct km_in
357          return;          return;
358      }      }
359      else if (p)      else if (p)
360          pos_y = atol (p);          pos_y = atoi (p);
361    
362      if (!pos_y && !pos_x) {      if (!pos_y && !pos_x) {
363          center_window (dlg, NULL);          center_window (dlg, NULL);
# Line 344  do_center_window (HWND dlg, struct km_in Line 370  do_center_window (HWND dlg, struct km_in
370          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
371          pos_x = pos_y = 0;          pos_x = pos_y = 0;
372      }      }
373        kmi->pos_x = pos_x;
374        kmi->pos_y = pos_y;
375    
376      GetClientRect (dlg, &rect);      GetClientRect (dlg, &rect);
377      MoveWindow (dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE);      MoveWindow (dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE);
378  }  }
# Line 399  do_resize_window (HWND dlg, struct km_in Line 428  do_resize_window (HWND dlg, struct km_in
428                    
429      /* Place the keylist above the separator */      /* Place the keylist above the separator */
430      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
431      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
432                  kmi->ypos_sep - rclient.top, bRepaint);                  kmi->ypos_sep - rclient.top, bRepaint);
433      rclient.top = kmi->ypos_sep + 5 + 8;      rclient.top = kmi->ypos_sep + 5 + 8;
434    
# Line 524  separator_wnd_proc (HWND hwnd, UINT msg, Line 553  separator_wnd_proc (HWND hwnd, UINT msg,
553          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
554    
555          /* The lines from the light into the dark */          /* The lines from the light into the dark */
556          MoveToEx(ps.hdc, 0,0, NULL);          MoveToEx (ps.hdc, 0,0, NULL);
557          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {          hpen = CreatePen (PS_SOLID, 0, GetSysColor (COLOR_3DHILIGHT));
558            if (hpen != NULL) {
559              SelectObject (ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
560              LineTo (ps.hdc, rect.right, 0);              LineTo (ps.hdc, rect.right, 0);
561              DeleteObject (hpen);              DeleteObject (hpen);
562          }          }
563          MoveToEx(ps.hdc, 0, 1, NULL);          MoveToEx (ps.hdc, 0, 1, NULL);
564          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {          hpen = CreatePen (PS_SOLID, 0, GetSysColor (COLOR_3DLIGHT));
565            if (hpen != NULL) {
566               SelectObject (ps.hdc, (LPVOID)hpen);               SelectObject (ps.hdc, (LPVOID)hpen);
567               LineTo (ps.hdc, rect.right, rect.bottom);               LineTo (ps.hdc, rect.right, rect.bottom);
568               DeleteObject (hpen);               DeleteObject (hpen);
569           }           }
570    
571          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);          MoveToEx (ps.hdc, 0, rect.bottom-1, NULL);
572          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {          hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW));
573            if (hpen != NULL) {
574              SelectObject (ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
575              LineTo (ps.hdc, rect.right, rect.bottom-1);              LineTo (ps.hdc, rect.right, rect.bottom-1);
576              DeleteObject (hpen);              DeleteObject (hpen);
577          }          }
578          MoveToEx(ps.hdc, 0, rect.bottom, NULL);          MoveToEx (ps.hdc, 0, rect.bottom, NULL);
579          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {          hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW));
580            if (hpen != NULL) {
581              SelectObject (ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
582              LineTo (ps.hdc, rect.right, rect.bottom);              LineTo (ps.hdc, rect.right, rect.bottom);
583              DeleteObject (hpen);              DeleteObject (hpen);
# Line 575  separator_wnd_proc (HWND hwnd, UINT msg, Line 608  separator_wnd_proc (HWND hwnd, UINT msg,
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, &r);              GetWindowRect (hwnd, &r);
# Line 590  separator_wnd_proc (HWND hwnd, UINT msg, Line 623  separator_wnd_proc (HWND hwnd, UINT msg,
623              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
624              kmi->ypos_sep = r.top;              kmi->ypos_sep = r.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 688  update_ui_items (HWND hwnd, listview_ctr Line 721  update_ui_items (HWND hwnd, listview_ctr
721      }      }
722    
723      /* Disable all secret-key functions when no secret key is available. */      /* Disable all secret-key functions when no secret key is available. */
724      {      if (!secret_key_available ()) {
725          gpg_keycache_t sec = keycache_get_ctx (0);          enable_button (tb_hwnd, ID_KEYMISC_SIGN, FALSE);
726          if (gpg_keycache_get_size (sec) == 0) {          set_menu_state (hmenu, ID_KEYMISC_SIGN, MF_GRAYED);
             enable_button (tb_hwnd, ID_KEYMISC_SIGN, FALSE);  
             set_menu_state (hmenu, ID_KEYMISC_SIGN, MF_GRAYED);  
         }  
727      }      }
728  }  }
729    
# Line 1071  refresh_keylist (struct km_info_s *kmi) Line 1101  refresh_keylist (struct km_info_s *kmi)
1101  }  }
1102    
1103    
1104    /* Reload the key cache. */
1105    static void
1106    keycache_reload (HWND dlg)
1107    {      
1108        refresh_cache_s rcs;
1109    
1110        memset (&rcs, 0, sizeof rcs);
1111        rcs.kr_reload = rcs.kr_update = 1;
1112        rcs.tr_update = 0;
1113        DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,                                        
1114                        keycache_dlg_proc, (LPARAM)&rcs);
1115    }
1116    
1117    
1118    /* Check if the secret keyring contains at least one
1119       key with ultimate trust.
1120       Return value: 0 on success. */
1121    int
1122    check_ultimate_trusted_key (gpg_keycache_t _sec)
1123    {
1124        struct keycache_s *n;
1125        int nkeys = 0;
1126    
1127        for (n = _sec->item; n; n = n->next) {
1128            if (n->pubpart &&
1129                n->pubpart->key->owner_trust == GPGME_VALIDITY_ULTIMATE)
1130                return 0;
1131            nkeys++;
1132        }
1133    
1134        /* if we do not have any secret keys, it does not make sense
1135           to return an error. */
1136        if (nkeys == 0)
1137            return 0;
1138        return -1;
1139    }
1140    
1141    
1142  static void  static void
1143  reload_keylist (struct km_info_s *kmi)  reload_keylist (struct km_info_s *kmi)
1144  {  {
# Line 1137  km_gui_import (struct km_info_s *kmi, in Line 1205  km_gui_import (struct km_info_s *kmi, in
1205  }  }
1206    
1207    
1208    /* Copy the requested key information (@what) to the clipboard.
1209       If multiple items were selected, each key info is copied to
1210       the clipboard. The data is separated by \r\n. */
1211    static void
1212    copy_key_info (int what, struct km_info_s *kmi)
1213    {
1214        gpgme_data_t out;
1215        gpgme_key_t key;
1216        struct keycache_s *kci = NULL;
1217        size_t n=0;
1218        char *p, tmp[256];
1219        int i=0, end = listview_count_items (kmi->lv, 0);
1220        bool single = false;
1221    
1222        /* Do not iterate over the entire list if just one item is selected. */
1223        n = listview_count_items (kmi->lv, 1);
1224        if (n == 1) {
1225            i = kmi->lv_idx;
1226            end = i+1;
1227            single = true;
1228        }
1229    
1230        gpgme_data_new (&out);
1231        for (; i < end; i++) {
1232            if (!listview_get_item_state (kmi->lv, i))
1233                continue;
1234            switch (what) {
1235            case ID_KEYCTX_UID_COPY:
1236                key = km_get_key_ptr (kmi->lv, i, &kci);
1237                gpgme_data_write (out, kci->uids->uid, strlen (kci->uids->uid));
1238                if (!single) gpgme_data_write (out, "\r\n", 2);
1239                break;
1240    
1241            case ID_KEYCTX_KEYID_COPY:
1242                key = km_get_key_ptr (kmi->lv, i, NULL);
1243                gpgme_data_write (out, "0x", 2);
1244                gpgme_data_write (out, key->subkeys->keyid+8, 8);
1245                if (!single) gpgme_data_write (out, "\r\n", 2);
1246                break;
1247    
1248            case ID_KEYCTX_FPR_COPY:
1249                key = km_get_key_ptr (kmi->lv, i, NULL);
1250                gpgme_data_write (out, key->subkeys->fpr, strlen (key->subkeys->fpr));
1251                if (!single) gpgme_data_write (out, "\r\n", 2);
1252                break;
1253    
1254            case ID_KEYCTX_KINFO_COPY:
1255                key = km_get_key_ptr (kmi->lv, i, NULL);
1256                key_get_clip_info (key->subkeys->keyid+8, tmp, sizeof (tmp)-1);
1257                gpgme_data_write (out, tmp, strlen (tmp));
1258                if (!single) gpgme_data_write (out, "\r\n", 2);
1259                break;
1260            }
1261        }
1262        gpgme_data_write (out, "\0", 1);
1263        p = gpgme_data_release_and_get_mem (out, &n);
1264        set_clip_text (NULL, p, n);
1265        gpgme_free (p);
1266    }
1267    
1268    
1269  /* Dialog box procedure for the Key Manager. */  /* Dialog box procedure for the Key Manager. */
1270  BOOL CALLBACK  BOOL CALLBACK
1271  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1272  {  {
     struct km_info_s *kmi = NULL;  
1273      HWND kl;      HWND kl;
1274      HMENU hm;      HMENU hm;
1275      struct keycache_s *kci;      RECT r;
1276      gpg_keycache_t c;      gpg_keycache_t c;
1277      gpgme_key_t key;      gpgme_key_t key;
1278        km_info_t kmi = NULL;    
1279      struct genkey_s genkey;      struct genkey_s genkey;
1280      struct winpt_key_s k = {0};      struct winpt_key_s k = {0};
1281      struct URL_ctx_s *url;      struct URL_ctx_s *url;
# Line 1156  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1285  keymanager_dlg_proc (HWND dlg, UINT msg,
1285      int l_idx = 0, i=0, rc;      int l_idx = 0, i=0, rc;
1286    
1287      if ((msg != WM_INITDIALOG)      if ((msg != WM_INITDIALOG)
1288          && ((kmi = (struct km_info_s*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))          && ((kmi = (km_info_t)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
1289          return FALSE;          return FALSE;
1290            
1291      /* handle dynamic popup items in the keyserver menu. */      /* handle dynamic popup items in the keyserver menu. */
# Line 1182  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1311  keymanager_dlg_proc (HWND dlg, UINT msg,
1311          SetWindowText (dlg, _("Key Manager"));          SetWindowText (dlg, _("Key Manager"));
1312    
1313          c = keycache_get_ctx (KEYCACHE_PUB);          c = keycache_get_ctx (KEYCACHE_PUB);
         if (!c)  
             BUG (NULL);  
1314          kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);          kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
1315          kmi->keylist_sortby = KEY_SORT_USERID;          kmi->keylist_sortby = KEY_SORT_USERID;
1316          Header_SetImageList(ListView_GetHeader (kl), glob_imagelist);          Header_SetImageList(ListView_GetHeader (kl), glob_imagelist);
1317          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
1318                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);
1319          if (check_ultimate_trusted_key ()) {          if (check_ultimate_trusted_key (keycache_get_ctx (0))) {
1320              msg_box (dlg, _("No ultimately trusted key found.\n"              msg_box (dlg, _("No ultimately trusted key found.\n"
1321                              "Please set at least one secret key to ultimate trust."),                              "Please set at least one secret key to ultimate trust."),
1322                              _("Key Manager"), MB_WARN);                              _("Key Manager"), MB_WARN);
# Line 1213  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1340  keymanager_dlg_proc (HWND dlg, UINT msg,
1340    
1341          do_center_window (dlg, kmi);          do_center_window (dlg, kmi);
1342          do_resize_window (dlg, kmi);          do_resize_window (dlg, kmi);
1343            restore_window_size (dlg, kmi);
1344          update_ui_items (dlg, kmi->lv);          update_ui_items (dlg, kmi->lv);
1345          restore_column_info (kmi);          restore_column_info (kmi);
1346          keylist_sort (kmi->lv, kmi->keylist_sortby);          keylist_sort (kmi->lv, kmi->keylist_sortby);
# Line 1243  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1371  keymanager_dlg_proc (HWND dlg, UINT msg,
1371          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
1372          ltoa (kmi->pos_y, type, 10);          ltoa (kmi->pos_y, type, 10);
1373          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
1374          /* XXX: store window size. */  
1375                    GetWindowRect (dlg, &r);
1376            sprintf (type, "%d", (int)(r.bottom-r.top));
1377            set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Width",
1378                               type);
1379            sprintf (type, "%d", (int)(r.right-r.left));
1380            set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Height",
1381                            type);
1382    
1383          /* Remove runtime information. This should be the last action taken here. */          /* Remove runtime information. This should be the last action taken here. */
1384          delete kmi;          delete kmi;
1385          kmi = NULL;          kmi = NULL;
# Line 1252  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1387  keymanager_dlg_proc (HWND dlg, UINT msg,
1387          return FALSE;          return FALSE;
1388    
1389      case WM_MOVE:      case WM_MOVE:
         RECT r;  
1390          GetWindowRect (dlg, &r);          GetWindowRect (dlg, &r);
1391          kmi->pos_x = r.left;          kmi->pos_x = r.left;
1392          kmi->pos_y = r.top;              kmi->pos_y = r.top;    
# Line 1411  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1545  keymanager_dlg_proc (HWND dlg, UINT msg,
1545                      set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1546                  if (mapi_init ())                  if (mapi_init ())
1547                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1548                    if (!secret_key_available ())
1549                        set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1550    
1551                  /* Override 'Default Keyserver' with the actual name. */                  /* Override 'Default Keyserver' with the actual name. */
1552                  host = kserver_get_hostname (0, -1, &port);                  host = kserver_get_hostname (0, -1, &port);
# Line 1586  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1722  keymanager_dlg_proc (HWND dlg, UINT msg,
1722                                _("Key Signature List"), IDS_WINPT_KEYSIG);                                _("Key Signature List"), IDS_WINPT_KEYSIG);
1723              if (k.update)              if (k.update)
1724                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
1725                if (updated_keys_avail ())
1726                    refresh_keylist (kmi);
1727              return TRUE;              return TRUE;
1728                            
1729          case ID_KEYMISC_PROPS:                case ID_KEYMISC_PROPS:      
# Line 1874  keymanager_dlg_proc (HWND dlg, UINT msg, Line 2012  keymanager_dlg_proc (HWND dlg, UINT msg,
2012              break;              break;
2013    
2014          case ID_KEYCTX_UID_COPY:          case ID_KEYCTX_UID_COPY:
             /* XXX: add generic function to support multiple selection  
                     with a callback */  
             key = km_get_key_ptr (kmi->lv, kmi->lv_idx, &kci);  
             name = kci->uids->name;  
             set_clip_text (NULL, name, strlen (name));  
             break;  
   
2015          case ID_KEYCTX_KEYID_COPY:          case ID_KEYCTX_KEYID_COPY:
             key = km_get_key_ptr (kmi->lv, kmi->lv_idx, NULL);  
             memset (type, 0, sizeof (type));  
             type[0] = '0'; type[1] = 'x';  
             memcpy (type+2, key->subkeys->keyid+8, 8);  
             set_clip_text (NULL, type, strlen (type));  
             break;  
   
2016          case ID_KEYCTX_FPR_COPY:          case ID_KEYCTX_FPR_COPY:
             key = km_get_key_ptr (kmi->lv, kmi->lv_idx, NULL);  
             t = key->subkeys->fpr;  
             set_clip_text (NULL, t? t : "", t? strlen (t): 0);  
             break;  
   
2017          case ID_KEYCTX_KINFO_COPY:          case ID_KEYCTX_KINFO_COPY:
2018              key = km_get_key_ptr (kmi->lv, kmi->lv_idx, NULL);              copy_key_info (LOWORD (wparam), kmi);
             km_set_clip_info (key->subkeys->keyid+8);  
2019              break;              break;
2020    
2021          case ID_KEYCTX_COPY:          case ID_KEYCTX_COPY:
# Line 1959  keymanager_dlg_proc (HWND dlg, UINT msg, Line 2077  keymanager_dlg_proc (HWND dlg, UINT msg,
2077              /* XXX: Implement group manager. */              /* XXX: Implement group manager. */
2078              return TRUE;              return TRUE;
2079    
2080                /*
2081          case IDCANCEL:          case IDCANCEL:
2082              EndDialog (dlg, TRUE);              EndDialog (dlg, TRUE);
2083              return TRUE;              return TRUE;
2084                */
2085          }          }
2086                    
2087          break;          break;

Legend:
Removed from v.211  
changed lines
  Added in v.226

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26