2011-01-03 16 views
0

Ich arbeite mit GPGME ... Ich brauche ein Beispiel für die Verwendung von gpgme_passphrase_cb_t und gpgme_set_passphrase_cb Funktion, weil ich nicht verstehe, wie man eine gpgme_passphrase_cb_t erstellen. Hilfe mit gpgme_passphrase_cb_t

Antwort

1

Dies ist der Code von GPGME ++, die die Callback-basierte hüllt Schnittstelle in ein C++ Schnittstelle:

Die Schnittstelle:

class PassphraseProvider { 
public: 
    virtual ~PassphraseProvider() {} 

    virtual char * getPassphrase(const char * useridHint, 
           const char * description, 
           bool previousWasBad, 
           bool & canceled) = 0; 
}; 

Die Funktion soll description als Eingabeaufforderung angezeigt wird, und kehrt die Passphrase eingegeben (der Puffer muss malloc() ed sein). Es kann auch canceled auf true setzen, um anzuzeigen, dass der Benutzer abgebrochen wurde. Die Parameter useridHint und previousWasBad sind nur zusätzliche Informationen.

Und das dies die allgemeine Rückruf:

gpgme_set_passphrase_cb(ctx, &passphrase_callback, pp); 
:

// Code taken from gpgme++, license: LGPLv2+ 
static 
gpgme_error_t passphrase_callback(void * opaque, const char * uid_hint, const char * desc, 
            int prev_was_bad, int fd) { 
    PassphraseProvider * provider = static_cast<PassphraseProvider*>(opaque); 
    bool canceled = false; 
    gpgme_error_t err = GPG_ERR_NO_ERROR; 
    char * passphrase = provider ? provider->getPassphrase(uid_hint, desc, prev_was_bad, canceled) : 0 ; 
    if (canceled) 
    err = make_error(GPG_ERR_CANCELED); 
    else 
    if (passphrase && *passphrase) { 
     size_t passphrase_length = std::strlen(passphrase); 
     size_t written = 0; 
     do { 
#ifdef HAVE_GPGME_IO_READWRITE 
     ssize_t now_written = gpgme_io_write(fd, passphrase + written, passphrase_length - written); 
#else 
     ssize_t now_written = write(fd, passphrase + written, passphrase_length - written); 
#endif 
     if (now_written < 0) { 
      err = make_err_from_syserror(); 
      break; 
     } 
     written += now_written; 
     } while (written < passphrase_length); 
    } 

    free(passphrase); 
#ifdef HAVE_GPGME_IO_READWRITE 
    gpgme_io_write(fd, "\n", 1); 
#else 
    write(fd, "\n", 1); 
#endif 
    return err; 
} 

eine Implementierung pp der PassphraseProvider Schnittstelle gegeben, würden Sie alles zusammen wie diese binden