299 |
static gpgme_error_t |
static gpgme_error_t |
300 |
list_handler (void *opaque, gpgme_status_code_t code, const char *key, int fd) |
list_handler (void *opaque, gpgme_status_code_t code, const char *key, int fd) |
301 |
{ |
{ |
302 |
|
static int wait_card=0; |
303 |
GpgCardEdit *ce = (GpgCardEdit *)opaque; |
GpgCardEdit *ce = (GpgCardEdit *)opaque; |
304 |
const char *s=""; |
const char *s=""; |
305 |
DWORD n; |
DWORD n; |
306 |
|
|
307 |
|
|
308 |
if (code == GPGME_STATUS_CARDCTRL && *key == '5') |
if (code == GPGME_STATUS_CARDCTRL) { |
309 |
ce->setResult (GPG_CARDRES_NOCARD); |
if (!strcmp (key, "5")) |
310 |
|
ce->setResult (GPG_CARDRES_NOCARD); |
311 |
|
else if (!strcmp (key, "1")) |
312 |
|
wait_card = 1; |
313 |
|
} |
314 |
|
if (wait_card && !strcmp (key, "cardctrl.insert_card.okay")) { |
315 |
|
n = MessageBox (NULL, _("Please insert the card and click OK or Cancel to abort."), |
316 |
|
_("GPG Card Status"), MB_ICONQUESTION|MB_OKCANCEL); |
317 |
|
if (n == IDCANCEL) { |
318 |
|
ce->setResult (GPG_CARDRES_CANCEL); |
319 |
|
WriteFile ((HANDLE)fd, "c\n", 2, &n, NULL); |
320 |
|
wait_card = 0; |
321 |
|
} |
322 |
|
} |
323 |
if (!strcmp (key, "cardedit.prompt")) { |
if (!strcmp (key, "cardedit.prompt")) { |
324 |
s = "quit\n"; |
s = "quit\n"; |
325 |
if (!WriteFile ((HANDLE)fd, s, strlen (s), &n, NULL)) |
if (!WriteFile ((HANDLE)fd, s, strlen (s), &n, NULL)) |
326 |
log_debug ("list_handler: WriteFile() failed ec=%d\r\n", |
log_debug ("list_handler: WriteFile() failed ec=%d\r\n", |
327 |
(int)GetLastError ()); |
(int)GetLastError ()); |
328 |
|
wait_card = 0; |
329 |
} |
} |
330 |
return 0; |
return 0; |
331 |
} |
} |
417 |
GpgCardEdit::getCardStatus (gpg_card_t *r_card) |
GpgCardEdit::getCardStatus (gpg_card_t *r_card) |
418 |
{ |
{ |
419 |
gpgme_data_t out = NULL; |
gpgme_data_t out = NULL; |
|
gpgme_key_t key=NULL; |
|
420 |
gpgme_error_t err; |
gpgme_error_t err; |
421 |
gpg_card_t card=NULL; |
gpg_card_t card=NULL; |
422 |
char buf[200]; |
char buf[200]; |
424 |
if (!r_card) |
if (!r_card) |
425 |
return gpg_error (GPG_ERR_INV_ARG); |
return gpg_error (GPG_ERR_INV_ARG); |
426 |
|
|
|
/* XXX: dummy key */ |
|
|
key = (gpgme_key_t)calloc (1, sizeof *key); |
|
|
key->subkeys = (gpgme_subkey_t)calloc (1, sizeof *key->subkeys); |
|
|
key->subkeys->fpr = strdup ("foo"); |
|
|
|
|
427 |
err = gpg_card_new (&card); |
err = gpg_card_new (&card); |
428 |
if (err) |
if (err) |
429 |
return err; |
return err; |
434 |
return err; |
return err; |
435 |
} |
} |
436 |
|
|
437 |
err = gpgme_op_card_edit (ctx, key, list_handler, this, out); |
err = gpgme_op_card_edit (ctx, NULL, list_handler, this, out); |
438 |
gpgme_data_rewind (out); |
gpgme_data_rewind (out); |
439 |
if (err) { |
if (err) { |
440 |
gpgme_data_release (out); |
gpgme_data_release (out); |
441 |
gpg_card_release (card); |
gpg_card_release (card); |
442 |
return err; |
return err; |
443 |
} |
} |
444 |
if (getResult () & GPG_CARDRES_NOCARD) { |
if (getResult () & GPG_CARDRES_NOCARD || |
445 |
|
getResult () & GPG_CARDRES_CANCEL) { |
446 |
gpg_card_release (card); |
gpg_card_release (card); |
447 |
gpgme_data_release (out); |
gpgme_data_release (out); |
448 |
return gpg_error (GPG_ERR_CARD_REMOVED); |
return gpg_error (GPG_ERR_CARD_NOT_PRESENT); |
449 |
} |
} |
450 |
|
|
451 |
*r_card = card; |
*r_card = card; |
456 |
} |
} |
457 |
gpgme_data_release (out); |
gpgme_data_release (out); |
458 |
|
|
|
if (key) { /* XXX */ |
|
|
free (key->subkeys->keyid); |
|
|
free (key->subkeys); |
|
|
free (key); |
|
|
} |
|
|
|
|
459 |
return err; |
return err; |
460 |
} |
} |
461 |
|
|