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

Diff of /trunk/Src/wptSigList.cpp

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

revision 69 by twoaday, Sat Nov 5 12:28:12 2005 UTC revision 150 by twoaday, Wed Jan 18 11:52:45 2006 UTC
# Line 1  Line 1 
1  /* wptSigList.cpp - Listview for key signatures  /* wptSigList.cpp - Listview for key signatures
2   *      Copyright (C) 2001-2005 Timo Schulz   *      Copyright (C) 2001-2006 Timo Schulz
3   *      Copyright (C) 2005 g10 Code GmbH   *      Copyright (C) 2005, 2006 g10 Code GmbH
4   *   *
5   * This file is part of WinPT.   * This file is part of WinPT.
6   *   *
# Line 50  siglist_build (listview_ctrl_t * lv, HWN Line 50  siglist_build (listview_ctrl_t * lv, HWN
50      struct listview_column_s implist[] = {      struct listview_column_s implist[] = {
51          {0, 240, (char *)_("User ID")},          {0, 240, (char *)_("User ID")},
52          {1,  50, (char *)_("Valid")},          {1,  50, (char *)_("Valid")},
53          {2,  40, (char *)_("Class")},          {2,  44, (char *)_("Class")},
54          {3,  68, (char *)_("Creation")},          {3,  68, (char *)_("Creation")},
55          {4,  80, (char *)_("Key ID")},          {4,  80, (char *)_("Key ID")},
56          {5,  68, (char *)_("Expiration")},          {5,  68, (char *)_("Expiration")},
# Line 63  siglist_build (listview_ctrl_t * lv, HWN Line 63  siglist_build (listview_ctrl_t * lv, HWN
63      if (rc)      if (rc)
64          return rc;          return rc;
65      c->ctrl = ctrl;      c->ctrl = ctrl;
66      for ( j=0; implist[j].fieldname != NULL; j++ )      for  (j=0; implist[j].fieldname != NULL; j++)
67          listview_add_column( c, &implist[j] );          listview_add_column (c, &implist[j]);
68      listview_set_ext_style( c );      listview_set_ext_style (c);
69        listview_del_all_items (c);
70      *lv = c;      *lv = c;
71      return 0;      return 0;
72  }  }
# Line 75  siglist_build (listview_ctrl_t * lv, HWN Line 76  siglist_build (listview_ctrl_t * lv, HWN
76  void  void
77  siglist_delete( listview_ctrl_t lv )  siglist_delete( listview_ctrl_t lv )
78  {  {
79      if( lv ) {      if (lv) {
80          listview_release( lv );          listview_release (lv);
81      }      }
82  }  }
83    
# Line 99  indent_string (const char * old, int ilv Line 100  indent_string (const char * old, int ilv
100  }  }
101    
102    
103    /* Add an item at the given pos @pos with the opaque param @ks. */
104    int
105    add_keysig_item (listview_ctrl_t ctx, int pos, gpgme_key_sig_t ks)
106    {
107        LV_ITEM lvi;
108    
109        memset (&lvi, 0, sizeof lvi);
110        lvi.iItem = pos;
111        lvi.lParam = (LPARAM)ks;
112        lvi.mask = LVIF_PARAM;
113        if (ListView_InsertItem (ctx->ctrl, &lvi) != pos)
114            return -1;
115        return 0;
116    }
117    
118    
119  /* Add an userid signature @ks from the userid @uid to the sig list  /* Add an userid signature @ks from the userid @uid to the sig list
120     control @lv.     control @lv.
121     Return value: 0 on success. */     Return value: 0 on success. */
122  static int  static int
123  siglist_add_key (listview_ctrl_t lv, gpgme_user_id_t uid, gpgme_key_sig_t ks)  siglist_add_key (listview_ctrl_t lv, gpgme_user_id_t uid,
124                     gpgme_key_sig_t ks, int pos)
125  {  {
126      gpgme_key_t key=NULL;      gpgme_key_t key=NULL;
127      char t[128];      char t[128];
128      const char *attr;      const char *attr;
129      const char *s;      const char *s;
130      int rc = 0, key_attr;      int key_attr, no_uid = 0;
131        int rc = 0;
132    
133      if (ks && !IS_UID_CERT (ks->sig_class))      if (ks && !IS_UID_CERT (ks->sig_class))
134          return 0;          return 0;
135        
136      rc = listview_add_item (lv, " ");      rc = add_keysig_item (lv, pos, ks);
137      if( rc )          if (rc)
138          return rc;          return rc;
139    
140      attr = NULL;      attr = NULL;
# Line 129  siglist_add_key (listview_ctrl_t lv, gpg Line 148  siglist_add_key (listview_ctrl_t lv, gpg
148      if (attr && strlen (attr)) {      if (attr && strlen (attr)) {
149          char *uid_utf8 = utf8_to_wincp (attr, strlen (attr));          char *uid_utf8 = utf8_to_wincp (attr, strlen (attr));
150          char *p = uid? m_strdup (uid_utf8) : indent_string (uid_utf8, 2);          char *p = uid? m_strdup (uid_utf8) : indent_string (uid_utf8, 2);
151          listview_add_sub_item (lv, 0, 0, p);          listview_add_sub_item (lv, pos, 0, p);
152          free (uid_utf8);          free (uid_utf8);
153          free_if_alloc (p);          free_if_alloc (p);
154      }      }
155      else      else {
156          listview_add_sub_item (lv, 0, 0, _("  user ID not found"));          listview_add_sub_item (lv, pos, 0, _("  user ID not found"));
157            no_uid = 1;
158        }
159    
160      if (uid)      if (uid)
161          return 0;          return 0;
# Line 145  siglist_add_key (listview_ctrl_t lv, gpg Line 166  siglist_add_key (listview_ctrl_t lv, gpg
166      case GPG_ERR_BAD_SIGNATURE:s = "NO";    break;      case GPG_ERR_BAD_SIGNATURE:s = "NO";    break;
167      default:                   s = "ERROR"; break;      default:                   s = "ERROR"; break;
168      }      }
169      listview_add_sub_item( lv, 0, 1, s );      if (no_uid)
170            s = "NOKEY";
171        listview_add_sub_item (lv, pos, 1, s);
172    
173      switch (ks->sig_class) {      switch (ks->sig_class) {
174      case 0x10: strcpy (t, " "); break;      case 0x10: strcpy (t, " "); break;
# Line 159  siglist_add_key (listview_ctrl_t lv, gpg Line 182  siglist_add_key (listview_ctrl_t lv, gpg
182          strcat (t, "L");          strcat (t, "L");
183      /*if (key_attr & GPGME_SIGF_NREV)      /*if (key_attr & GPGME_SIGF_NREV)
184          strcat (t, "R");*/          strcat (t, "R");*/
185      listview_add_sub_item (lv, 0, 2, t);      listview_add_sub_item (lv, pos, 2, t);
186    
187      key_attr = ks->timestamp;      key_attr = ks->timestamp;
188      if( key_attr ) {      if( key_attr ) {
189          s = get_key_created( key_attr );          s = get_key_created (key_attr);
190          listview_add_sub_item( lv, 0, 3, s );          listview_add_sub_item (lv, pos, 3, s);
191      }      }
192            
193      attr = ks->keyid;      attr = ks->keyid;
194      if( attr && strlen( attr ) == 16 ) {      if (attr && strlen (attr) == 16) {
195          _snprintf (t, sizeof t -1, "0x%s", attr + 8);          _snprintf (t, sizeof (t) -1, "0x%s", attr + 8);
196          listview_add_sub_item( lv, 0, 4, t );          listview_add_sub_item (lv, pos, 4, t);
197      }      }
198    
199      key_attr = ks->expires;      key_attr = ks->expires;
200      if (key_attr) {      if (key_attr) {
201          s = get_key_created (key_attr);          s = get_key_created (key_attr);
202          listview_add_sub_item (lv, 0, 5, s);          listview_add_sub_item (lv, pos, 5, s);
203      }      }
204    
205      attr = get_key_pubalgo (ks->pubkey_algo);      attr = get_key_pubalgo (ks->pubkey_algo);
206      if( attr )      if (attr)
207          listview_add_sub_item( lv, 0, 6, (char *)attr );          listview_add_sub_item (lv, pos, 6, (char *)attr);
208        
209      return 0;      return 0;
210  }  }
211    
# Line 197  siglist_load (HWND ctrl, const char *key Line 220  siglist_load (HWND ctrl, const char *key
220      gpgme_user_id_t u;      gpgme_user_id_t u;
221      gpgme_key_sig_t s;      gpgme_key_sig_t s;
222      listview_ctrl_t lv;      listview_ctrl_t lv;
223        int pos = 0;
224      int rc;      int rc;
225    
226      if (siglist_build (&lv, ctrl))      if (siglist_build (&lv, ctrl))
# Line 205  siglist_load (HWND ctrl, const char *key Line 229  siglist_load (HWND ctrl, const char *key
229      if (rc)      if (rc)
230          BUG (NULL);          BUG (NULL);
231    
     /* XXX: the root item is at the end but should come first. */  
232      for (u=key->uids; u; u = u->next) {      for (u=key->uids; u; u = u->next) {
233          siglist_add_key (lv, u, NULL);          siglist_add_key (lv, u, NULL, pos++);
234          for (s = u->signatures; s; s = s->next) {          for (s = u->signatures; s; s = s->next) {
235              rc = siglist_add_key (lv, NULL, s);              if (!IS_UID_CERT (s->sig_class))
236                    continue;
237                rc = siglist_add_key (lv, NULL, s, pos++);
238              if (rc)              if (rc)
239                  break;                  break;
240          }          }
# Line 220  siglist_load (HWND ctrl, const char *key Line 245  siglist_load (HWND ctrl, const char *key
245      }      }
246      return lv;      return lv;
247  }  }
248    
249    
250    /* Integer comparsion of @a and @b.
251       Return values: same as in strcmp. */
252    static inline int
253    int_cmp (int a, int b)
254    {
255        if (a == b) return 0;      
256        else if (a > b) return 1;
257        else return -1;
258        return 0;
259    }
260    
261    
262    /* Sorting callback for the signature list. */
263    static int CALLBACK
264    siglist_cmp_cb (LPARAM first, LPARAM second, LPARAM sortby)
265    {
266        gpgme_key_sig_t a, b;
267        int cmpresult=0;
268    
269        a = (gpgme_key_sig_t)first;
270        b = (gpgme_key_sig_t)second;
271        if (!a || !b)
272            return -1; /* this indicates that one item is a root item. */
273    
274        switch (sortby) {
275        case KEY_SORT_KEYID:
276            cmpresult = strcmp (a->keyid, b->keyid);
277            break;
278    
279        case KEY_SORT_CREATED:
280            cmpresult = int_cmp (a->timestamp, b->timestamp);
281            break;
282    
283        case KEY_SORT_ALGO:
284            cmpresult = int_cmp (a->pubkey_algo, b->pubkey_algo);
285            break;
286    
287        case KEY_SORT_VALIDITY:
288            cmpresult = int_cmp (a->status, b->status);
289            break;
290    
291        case SIG_SORT_EXPIRE:
292            cmpresult = int_cmp (a->expires, a->expires);
293            break;
294    
295        case SIG_SORT_CLASS:
296            cmpresult = int_cmp (a->sig_class, b->sig_class);
297            break;
298        }
299        return cmpresult;
300    }
301    
302    
303    /* Sort the signature list @sigl by @sortby. */
304    void
305    siglist_sort (listview_ctrl_t sigl, int sortby)
306    {
307        listview_sort_items (sigl, sortby, siglist_cmp_cb);
308    }

Legend:
Removed from v.69  
changed lines
  Added in v.150

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26