doc/
authorMarcus Brinkmann <mb@g10code.com>
Wed, 28 May 2003 01:15:38 +0000 (01:15 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Wed, 28 May 2003 01:15:38 +0000 (01:15 +0000)
2003-05-28  Marcus Brinkmann  <marcus@g10code.de>

* gpgme.texi (Exporting Keys): Change argument type from
gpgme_recipient_t to gpgme_user_id_t.
(Encrypting a Plaintext): Likewise.
(Selecting Recipients): Rewritten.

gpgme/
2003-05-28  Marcus Brinkmann  <marcus@g10code.de>

* Makefile.am (libgpgme_la_SOURCES): Remove recipient.c, add
user-id.c.
* gpgme.h (gpgme_recipients_t): Removed.
(gpgme_recipients_new, gpgme_recipients_release,
gpgme_recipients_add_name,
gpgme_recipients_add_name_with_validity, gpgme_recipients_count,
gpgme_recipients_enum_open, gpgme_recipients_enum_read,
gpgme_recipients_enum_close): Removed.
(gpgme_op_encrypt, gpgme_op_encrypt_start, gpgme_op_encrypt_sign,
gpgme_op_encrypt_sign_start, gpgme_op_export_start,
gpgme_op_export): Change second argument to gpgme_user_id_t.
(gpgme_user_ids_release): New prototype.
(gpgme_user_ids_append): Likewise.
* ops.h (_gpgme_recipients_all_valid): Remove.
(_gpgme_user_ids_all_valid): Add.
* context.h (struct gpgme_recipients): Removed.
* user-id.c: New file.
* recipient.c: Removed file.
* rungpg.c (append_args_from_recipients): Change last arg to
gpgme_user_id_t.  Reimplement.
(gpg_encrypt): Change second arg to gpgme_user_id_t.
(gpg_encrypt_sign): Likewise.
(gpg_export): Likewise.  Rewrite user ID list code.
* engine.c (_gpgme_engine_op_encrypt): Change second arg to
gpgme_user_id_t.
(_gpgme_engine_op_encrypt_sign): Likewise.
(_gpgme_engine_op_export): Likewise.
* engine.h (_gpgme_engine_op_encrypt, _gpgme_engine_op_encrypt_sign,
_gpgme_engine_op_export): Likewise.
* engine-gpgsm.c (set_recipients): Likewise.  Rewrite loop code.
(gpgsm_encrypt): Likewise.
(gpgsm_export): Likewise.
* engine-backend.h (struct engine_ops): Likewise for members
ENCRYPT, ENCRYPT_SIGN and EXPORT.
* export.c (export_start, gpgme_op_export_start, gpgme_op_export):
Likewise.
* encrypt.c (encrypt_start): Likewise.  Don't check for count of
recipients.
(gpgme_op_encrypt_start): Likewise.
(gpgme_op_encrypt): Likewise.
* encrypt-sign.c (encrypt_sign_start): Likewise.
(gpgme_op_encrypt_sign): Likewise.
(gpgme_op_encrypt_sign_start): Likewise.

tests/
2003-05-28  Marcus Brinkmann  <marcus@g10code.de>

* gpg/t-eventloop.c (main): Rewrite recipient management.
* gpg/t-encrypt-sign.c (main): Likewise.
* gpg/t-encrypt.c (main): Likewise.
* gpg/t-export.c (main): Likewise.

25 files changed:
NEWS
TODO
doc/ChangeLog
doc/gpgme.texi
gpgme/ChangeLog
gpgme/Makefile.am
gpgme/context.h
gpgme/encrypt-sign.c
gpgme/encrypt.c
gpgme/engine-backend.h
gpgme/engine-gpgsm.c
gpgme/engine.c
gpgme/engine.h
gpgme/export.c
gpgme/gpgme.h
gpgme/ops.h
gpgme/recipient.c [deleted file]
gpgme/rungpg.c
gpgme/signers.c
gpgme/user-id.c [new file with mode: 0644]
tests/ChangeLog
tests/gpg/t-encrypt-sign.c
tests/gpg/t-encrypt.c
tests/gpg/t-eventloop.c
tests/gpg/t-export.c

diff --git a/NEWS b/NEWS
index 94122af4cd1beb83901c8c32ec2e78d732570849..71388f4e75362c66e03c9f267bbd9f218c2f7ac0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -22,7 +22,7 @@ Noteworthy changes in version 0.4.1 (unreleased)
  structs rather than by XML structs or in other ways.
 
  Objects which used to be opaque (for example a key) are now pointers
- accessible structs, so no accessor functions are necessary.
to accessible structs, so no accessor functions are necessary.
 
  Backward compatibility is provided where it was possible without too
  much effort and did not collide with the overall sanitization effort.
@@ -46,7 +46,6 @@ Noteworthy changes in version 0.4.1 (unreleased)
    Old name:           New name:
    GpgmeCtx            gpgme_ctx_t
    GpgmeData           gpgme_data_t
-   GpgmeRecipients     gpgme_recipients_t
    GpgmeError          gpgme_error_t
    GpgmeDataEncoding   gpgme_data_encoding_t
    GpgmeSigStat                gpgme_sig_stat_t
@@ -96,6 +95,37 @@ Noteworthy changes in version 0.4.1 (unreleased)
    The user is expected to write the response to the file descriptor,
    followed by a newline.
 
+ * The recipients interface has been removed and replaced by a more
+   generic and light gpgme_user_ids_* interface, which only provides
+   two functions: gpgme_user_ids_append adds a new user ID at the end
+   of the linked list, and gpgme_user_ids_release releases all user
+   IDs in the linked list.  The resulting user ID object is free for
+   the user to change (note however that gpgme_user_ids_release only
+   releases resources allocated by GPGME).
+
+   This change propagates to the prototypes of gpgme_op_encrypt,
+   gpgme_op_encrypt_start, gpgme_op_encrypt_sign and
+   gpgme_op_encrypt_sign_start.  Also the prototypes of
+   gpgme_op_export_start and gpgme_op_export finally make sense.
+
+   Here is an example how to use the new interface:
+
+   gpgme_user_id_t rset = NULL;
+   gpgme_user_id_t *rset_lastp = &rset;
+
+   err = gpgme_user_ids_append (rset_lastp, "Alpha");
+   fail_if_err (err);
+   (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
+
+   rset_lastp = &(*rset_lastp)->next;
+   err = gpgme_user_ids_append (rset_lastp, "Bob");
+   fail_if_err (err);
+   (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
+
+   [...]
+
+   gpgme_user_ids_release (rset);
+
  * gpgme_op_verify and gpgme_op_decrypt_verify don't return a status
    summary anymore.  Use gpgme_get_sig_status to retrieve the individual
    stati.
@@ -219,7 +249,6 @@ Noteworthy changes in version 0.4.1 (unreleased)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 GpgmeCtx                       DEPRECATED: Use gpgme_ctx_t.
 GpgmeData                      DEPRECATED: Use gpgme_data_t.
-GpgmeRecipients                        DEPRECATED: Use gpgme_recipients_t.
 GpgmeError                     DEPRECATED: Use gpgme_error_t.
 GpgmeDataEncoding              DEPRECATED: Use gpgme_data_encoding_t.
 GpgmeSigStat                   DEPRECATED: Use gpgme_sig_stat_t.
@@ -279,6 +308,23 @@ gpgme_op_decrypt_verify            CHANGED: Drop R_STAT argument.
 gpgme_wait                     CHANGED: Can return NULL even if hang is true.
 GpgmeIdleFunc                   REMOVED
 gpgme_register_idle             REMOVED
+GpgmeRecipients                        REMOVED: Use gpgme_user_id_t.
+gpgme_recipients_new           REMOVED: Initialize gpgme_user_id_t with NULL.
+gpgme_recipients_release       REMOVED: Use gpgme_user_ids_release.
+gpgme_recipients_add_name      REMOVED: Use gpgme_user_ids_append
+gpgme_recipients_add_name_with_validity        REMOVED: Set validity directly.
+gpgme_recipients_count         REMOVED: You can count them yourself.
+gpgme_recipients_enum_open     REMOVED: gpgme_user_id_t is a linked list.
+gpgme_recipients_enum_read     REMOVED: See gpgme_recipients_enum_open.
+gpgme_recipients_enum_close    REMOVED: See gpgme_recipients_enum_read.
+gpgme_user_ids_append          NEW
+gpgme_user_ids_release         NEW
+gpgme_op_encrypt               CHANGED: Recipients passed as gpgme_user_id_t.
+gpgme_op_encrypt_start         CHANGED: Recipients passed as gpgme_user_id_t.
+gpgme_op_encrypt_sign          CHANGED: Recipients passed as gpgme_user_id_t.
+gpgme_op_encrypt_sign_start    CHANGED: Recipients passed as gpgme_user_id_t.
+gpgme_op_export_start          CHANGED: User IDs passed as gpgme_user_id_t.
+gpgme_op_export                        CHANGED: User IDs passed as gpgme_user_id_t.
 gpgme_engine_info_t            NEW
 gpgme_get_engine_info          CHANGED: Return info structure instead XML.
 gpgme_get_protocol_name                NEW
diff --git a/TODO b/TODO
index 6e87fd5205f9202ae99ae57f589940d8b872d190..3f4d1f235914f516a6a9ebe27cd320784444ab84 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,7 @@
 Hey Emacs, this is -*- outline -*- mode!
 
 * ABI's to break:
-** Change gpgme_recipient_t stuff to gpgme_user_id_t (encrypt, export, ...).
+** Use libgpg-error.
 ** Compatibility interfaces that can be removed in future versions:
 *** gpgme_data_new_from_filepart
 *** gpgme_data_new_from_file
@@ -108,14 +108,3 @@ Hey Emacs, this is -*- outline -*- mode!
 
 * Build suite
 ** Make sure everything is cleaned correctly (esp. test area).
-
-Bugs reported by Stephane Corthesy:
-> In GpgmeRecipients, would it be possible to provide a function which  
-> would return the validity assigned to a name contained in the  
-> GpgmeRecipients instance?
-
-> passphrase callback. If I use the same GpgmeContext as the one which  
-> is currently asking for a passphrase, my app crashes: the r_hd in
-> the  
-> callback has become invalid; if I use a brand new one, the callback  
-> is called recursively, when I ask to enumerate keys.
index 0f4545cd402eb31fa2648533f486e079acadeae5..a3981108e258012a155ece55e098180c40ca71f6 100644 (file)
@@ -1,3 +1,10 @@
+2003-05-28  Marcus Brinkmann  <marcus@g10code.de>
+
+       * gpgme.texi (Exporting Keys): Change argument type from
+       gpgme_recipient_t to gpgme_user_id_t.
+       (Encrypting a Plaintext): Likewise.
+       (Selecting Recipients): Rewritten.
+
 2003-05-27  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpgme.texi (Protocol Selection): Do not use @acronym in @node
index 2866832eb19353a44ceffe759bc6e3019b665437..2513f3614167a9288d88819e4196b8c3abdc9ec3 100644 (file)
@@ -2649,27 +2649,27 @@ operation is started on the context.
 @cindex key, export
 @cindex key ring, export from
 
-@deftypefun gpgme_error_t gpgme_op_export (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{recipients}}, @w{gpgme_data_t @var{keydata}})
+@deftypefun gpgme_error_t gpgme_op_export (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{uids}}, @w{gpgme_data_t @var{keydata}})
 The function @code{gpgme_op_export} extracts the public keys of the
-user IDs in @var{recipients} and returns them in the data buffer
+user IDs in @var{uids} and returns them in the data buffer
 @var{keydata}.  The type of the public keys returned is determined by
 the @acronym{ASCII} armor attribute set for the context @var{ctx}.
 
 The function returns @code{GPGME_No_Error} if the operation completed
-successfully, @code{GPGME_Invalid_Value} if @var{recipients} is
+successfully, @code{GPGME_Invalid_Value} if @var{uids} is
 @code{NULL} or @var{keydata} is not a valid empty data buffer, and
 passes through any errors that are reported by the crypto engine
 support routines.
 @end deftypefun
 
-@deftypefun gpgme_error_t gpgme_op_export_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{recipients}}, @w{gpgme_data_t @var{keydata}})
+@deftypefun gpgme_error_t gpgme_op_export_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{uids}}, @w{gpgme_data_t @var{keydata}})
 The function @code{gpgme_op_export_start} initiates a
 @code{gpgme_op_export} operation.  It can be completed by calling
 @code{gpgme_wait} on the context.  @xref{Waiting For Completion}.
 
 The function returns @code{GPGME_No_Error} if the operation could be
 started successfully, and @code{GPGME_Invalid_Value} if
-@var{recipients} is @code{NULL} or @var{keydata} is not a valid empty
+@var{uids} is @code{NULL} or @var{keydata} is not a valid empty
 data buffer.
 @end deftypefun
 
@@ -3756,86 +3756,59 @@ and then passed to the encryption operation.
 @cindex encryption, selecting recipients
 @cindex recipients
 
-@deftp {Data type} gpgme_recipients_t
-The @code{gpgme_recipients_t} type is a handle for a set of recipients
-that can be used in an encryption process.
-@end deftp
+@deftypefun gpgme_error_t gpgme_user_ids_append (@w{gpgme_user_id_t *@var{rset_p}}, @w{const char *@var{name}})
+The function @code{gpgme_user_ids_append} creates a new
+@code{gpgme_user_id_t} object, initializes its @code{uid} member with
+a copy of the string pointed to by @var{name}, initializes its
+@code{name}, @code{email}, @code{comment} members to the empty string,
+its @code{validity} member to @code{GPGME_VALIDITY_UNKNOWN} and leaves
+all other fields to 0.
+
+It then appends the user ID at the end of the linked list of user IDs
+that starts at *@var{rset_p}, or it returns it in *@var{rset_p} if
+that is @code{NULL}.  You can then update for example the validity
+information in the user ID directly.
+
+We recommend that you keep a pointer to the last element in your
+linked list.  This is faster and allows you to easily update the
+fields of the last user ID.  Here is an example how to create a linked
+list of user IDs in @var{rset} with full validity from a
+@code{NULL}-terminated array of names:
 
-@deftypefun gpgme_error_t gpgme_recipients_new (@w{gpgme_recipients_t *@var{r_rset}})
-The function @code{gpgme_recipients_new} creates a new, empty set of
-recipients and returns a handle for it in @var{r_rset}.
+@example
+  const char *names[] = @{ "Alpha", "Bob", NULL @};
+  gpgme_error_t err;
+  gpgme_user_id_t rset = NULL;
+  gpgme_user_id_t *rset_lastp = &rset;
+
+  do
+    @{
+      err = gpgme_user_ids_append (rset_lastp, *(names++));
+      if (!err)
+        @{
+          (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
+          rset_lastp = &(*rset_lastp)->next;
+        @}
+    @}
+  while (!err && *names);
+@end example
 
 The function returns @code{GPGME_No_Error} if the recipient set could
 be created successfully, and @code{GPGME_Out_Of_Core} if not enough
 memory was available.
 @end deftypefun
 
-@deftypefun void gpgme_recipients_release (@w{gpgme_recipients_t @var{rset}})
-The function @code{gpgme_recipients_release} destroys the set of
-recipients @var{rset} and releases all associated resources.
-@end deftypefun
-
-@deftypefun gpgme_error_t gpgme_recipients_add_name (@w{gpgme_recipients_t @var{rset}}, @w{const char *@var{name}})
-The function @code{gpgme_recipients_add_name} adds the recipient
-@var{name} to the set of recipients @var{rset}.  This is equivalent to
-@code{gpgme_recipients_add_name_with_validity} with a validity of
-@code{GPGME_VALIDITY_UNKNOWN}.
-
-The function returns @code{GPGME_No_Error} if the recipient was added
-successfully, @code{GPGME_Invalid_Value} if @var{rset} or @var{name}
-is not a valid pointer, and @code{GPGME_Out_Of_Core} if not enough
-memory is available.
-@end deftypefun
-
-@deftypefun gpgme_error_t gpgme_recipients_add_name_with_validity (@w{gpgme_recipients_t @var{rset}}, @w{const char *@var{name}}, @w{gpgme_validity_t @var{val}})
-The function @code{gpgme_recipients_add_name_with_validity} adds the
-recipient @var{name} with the validity @var{val} to the set of
-recipients @var{rset}.  If the validity is not known, the function
-@code{gpgme_recipients_add_name} can be used.
-@xref{Information About Keys}, for the possible values for @var{val}.
-
-The function returns @code{GPGME_No_Error} if the recipient was added
-successfully, @code{GPGME_Invalid_Value} if @var{rset} or @var{name}
-is not a valid pointer, and @code{GPGME_Out_Of_Core} if not enough
-memory is available.
-@end deftypefun
-
-@deftypefun {unsigned int} gpgme_recipients_count (@w{const @var{gpgme_recipients_t rset}})
-The function @code{gpgme_recipients_count} returns the number of
-recipients in the set @var{rset}.
-@end deftypefun
-
-@deftypefun gpgme_error_t gpgme_recipients_enum_open (@w{const gpgme_recipients_t @var{rset}}, @w{void **@var{iter}})
-The function @code{gpgme_recipients_enum_open} creates a new iterator
-@var{iter} that can be used to walk through the set of recipients in
-@var{rset}, using @code{gpgme_recipients_enum_read}.
-
-If the iterator is not needed anymore, it can be closed with
-@code{gpgme_recipients_enum_close}.
-
-The function returns @code{GPGME_No_Error} if the enumerator was
-successfully created and @code{GPGME_Invalid_Value} if @var{rset} or
-@var{iter} is not a valid pointer.
-@end deftypefun
-
-@deftypefun {const char *} gpgme_recipients_enum_read (@w{const gpgme_recipients_t @var{rset}}, @w{void **@var{iter}})
-The function @code{gpgme_recipients_enum_read} returns a string
-containing the name of the next recipient in the set @var{rset} for
-the iterator @var{iter}.  The string is valid as long as @var{rset} is
-valid or the function is called the next time with the same recipient
-set and iterator, whatever is earlier.
-@end deftypefun
-
-@deftypefun gpgme_error_t gpgme_recipients_enum_close (@w{const gpgme_recipients_t @var{rset}}, @w{void **@var{iter}})
-The function @code{gpgme_recipients_enum_close} releases the iterator
-@var{iter} for the recipient set @var{rset}.
+@deftypefun void gpgme_user_ids_release (@w{gpgme_user_id_t @var{uids}})
+The function @code{gpgme_user_ids_release} destroys the linked list of
+user IDs @var{uids} and releases all associated resources allocated by
+@acronym{GPGME}..
 @end deftypefun
 
 
 @node Encrypting a Plaintext
 @subsubsection Encrypting a Plaintext
 
-@deftypefun gpgme_error_t gpgme_op_encrypt (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
+@deftypefun gpgme_error_t gpgme_op_encrypt (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
 The function @code{gpgme_op_encrypt} encrypts the plaintext in the data
 object @var{plain} for the recipients @var{rset} and stores the
 ciphertext in the data object @var{cipher}.  The type of the
@@ -3865,7 +3838,7 @@ the secret key could not be retrieved, and passes through any errors
 that are reported by the crypto engine support routines.
 @end deftypefun
 
-@deftypefun gpgme_error_t gpgme_op_encrypt_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
+@deftypefun gpgme_error_t gpgme_op_encrypt_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
 The function @code{gpgme_op_encrypt_start} initiates a
 @code{gpgme_op_encrypt} operation.  It can be completed by calling
 @code{gpgme_wait} on the context.  @xref{Waiting For Completion}.
@@ -3902,7 +3875,7 @@ next operation is started on the context.
 @end deftypefun
 
 
-@deftypefun gpgme_error_t gpgme_op_encrypt_sign (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
+@deftypefun gpgme_error_t gpgme_op_encrypt_sign (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
 The function @code{gpgme_op_encrypt_sign} does a combined encrypt and
 sign operation.  It is used like @code{gpgme_op_encrypt}, but the
 ciphertext also contains signatures for the signers listed in
@@ -3912,7 +3885,7 @@ The combined encrypt and sign operation is currently only available
 for the OpenPGP crypto engine.
 @end deftypefun
 
-@deftypefun gpgme_error_t gpgme_op_encrypt_sign_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_recipients_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
+@deftypefun gpgme_error_t gpgme_op_encrypt_sign_start (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_user_id_t @var{rset}}, @w{gpgme_data_t @var{plain}}, @w{gpgme_data_t @var{cipher}})
 The function @code{gpgme_op_encrypt_sign_start} initiates a
 @code{gpgme_op_encrypt_sign} operation.  It can be completed by
 calling @code{gpgme_wait} on the context.  @xref{Waiting For
index fb14e561ca2da7e3586a2542da90b056053fc76e..9b1a17f0e702a1bcc17f7115eb48e73393470b4f 100644 (file)
@@ -1,3 +1,49 @@
+2003-05-28  Marcus Brinkmann  <marcus@g10code.de>
+
+       * Makefile.am (libgpgme_la_SOURCES): Remove recipient.c, add
+       user-id.c.
+       * gpgme.h (gpgme_recipients_t): Removed.
+       (gpgme_recipients_new, gpgme_recipients_release,
+       gpgme_recipients_add_name,
+       gpgme_recipients_add_name_with_validity, gpgme_recipients_count,
+       gpgme_recipients_enum_open, gpgme_recipients_enum_read,
+       gpgme_recipients_enum_close): Removed.
+       (gpgme_op_encrypt, gpgme_op_encrypt_start, gpgme_op_encrypt_sign,
+       gpgme_op_encrypt_sign_start, gpgme_op_export_start,
+       gpgme_op_export): Change second argument to gpgme_user_id_t.
+       (gpgme_user_ids_release): New prototype.
+       (gpgme_user_ids_append): Likewise.
+       * ops.h (_gpgme_recipients_all_valid): Remove.
+       (_gpgme_user_ids_all_valid): Add.
+       * context.h (struct gpgme_recipients): Removed.
+       * user-id.c: New file.
+       * recipient.c: Removed file.
+       * rungpg.c (append_args_from_recipients): Change last arg to
+       gpgme_user_id_t.  Reimplement.
+       (gpg_encrypt): Change second arg to gpgme_user_id_t.
+       (gpg_encrypt_sign): Likewise.
+       (gpg_export): Likewise.  Rewrite user ID list code.
+       * engine.c (_gpgme_engine_op_encrypt): Change second arg to
+       gpgme_user_id_t.
+       (_gpgme_engine_op_encrypt_sign): Likewise.
+       (_gpgme_engine_op_export): Likewise.
+       * engine.h (_gpgme_engine_op_encrypt, _gpgme_engine_op_encrypt_sign,
+       _gpgme_engine_op_export): Likewise.
+       * engine-gpgsm.c (set_recipients): Likewise.  Rewrite loop code.
+       (gpgsm_encrypt): Likewise.
+       (gpgsm_export): Likewise.
+       * engine-backend.h (struct engine_ops): Likewise for members
+       ENCRYPT, ENCRYPT_SIGN and EXPORT.
+       * export.c (export_start, gpgme_op_export_start, gpgme_op_export):
+       Likewise.
+       * encrypt.c (encrypt_start): Likewise.  Don't check for count of
+       recipients.
+       (gpgme_op_encrypt_start): Likewise.
+       (gpgme_op_encrypt): Likewise.
+       * encrypt-sign.c (encrypt_sign_start): Likewise.
+       (gpgme_op_encrypt_sign): Likewise.
+       (gpgme_op_encrypt_sign_start): Likewise.
+
 2003-05-27  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpgme.h (struct _gpgme_op_import_result): Add skipped_new_keys.
index 7eecd7466a64baf5f302e8845ff8f92bfe0eefdc..d2df91aee85acf38b7d533fb1e5e176ea7b7d421 100644 (file)
@@ -72,7 +72,7 @@ libgpgme_la_SOURCES =                                                 \
        gpgme.h util.h conversion.c context.h ops.h                     \
        data.h data.c data-fd.c data-stream.c data-mem.c data-user.c    \
        data-compat.c                                                   \
-       recipient.c signers.c                                           \
+       user-id.c signers.c                                             \
        wait.c wait-global.c wait-private.c wait-user.c wait.h          \
        op-support.c                                                    \
        encrypt.c encrypt-sign.c decrypt.c decrypt-verify.c verify.c    \
index efc0d3b8c4570adb5a2a6bbb579ce3aef801b0a2..c56e5ac9948a464606ede65ec1bfd97cd608288e 100644 (file)
@@ -37,6 +37,7 @@ typedef enum
     OPDATA_VERIFY, OPDATA_TRUSTLIST
   } ctx_op_data_type;
 
+
 struct ctx_op_data
 {
   /* The next element in the linked list, or NULL if this is the last
@@ -102,12 +103,4 @@ struct gpgme_context
   struct gpgme_io_cbs io_cbs;
 };
 
-
-/* A recipient is defined by a user ID, but we define it as an opaque
-   type for the user.  */
-struct gpgme_recipients
-{
-  gpgme_user_id_t list;
-};
-
 #endif /* CONTEXT_H */
index 5d41fe96fbc7c46095ef5f3a0c17cdf3a5ea01f3..67c01c054e7f52a5abb9fa48142185c520734cbe 100644 (file)
@@ -37,7 +37,7 @@ encrypt_sign_status_handler (void *priv, gpgme_status_code_t code, char *args)
 
 
 static gpgme_error_t
-encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,
+encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_user_id_t recp,
                    gpgme_data_t plain, gpgme_data_t cipher)
 {
   gpgme_error_t err;
@@ -80,7 +80,7 @@ encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,
    store the resulting ciphertext in CIPHER.  Also sign the ciphertext
    with the signers in CTX.  */
 gpgme_error_t
-gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, gpgme_user_id_t recp,
                              gpgme_data_t plain, gpgme_data_t cipher)
 {
   return encrypt_sign_start (ctx, 0, recp, plain, cipher);
@@ -91,7 +91,7 @@ gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,
    store the resulting ciphertext in CIPHER.  Also sign the ciphertext
    with the signers in CTX.  */
 gpgme_error_t
-gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_user_id_t recp,
                       gpgme_data_t plain, gpgme_data_t cipher)
 {
   gpgme_error_t err = encrypt_sign_start (ctx, 1, recp, plain, cipher);
index 4873aaa51d7b021b92c87b88e6e3f09311d635f5..841d66ec35d72a8c3149f7d4b89a2b7a9180c6ac 100644 (file)
@@ -148,7 +148,7 @@ _gpgme_op_encrypt_init_result (gpgme_ctx_t ctx)
 
 
 static gpgme_error_t
-encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,
+encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_user_id_t recp,
               gpgme_data_t plain, gpgme_data_t cipher)
 {
   gpgme_error_t err;
@@ -164,8 +164,6 @@ encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,
 
   if (!recp)
     symmetric = 1;
-  else if (gpgme_recipients_count (recp) == 0)
-    return GPGME_No_UserID;
 
   if (!plain)
     return GPGME_No_Data;
@@ -193,7 +191,7 @@ encrypt_start (gpgme_ctx_t ctx, int synchronous, gpgme_recipients_t recp,
 
 
 gpgme_error_t
-gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_user_id_t recp,
                        gpgme_data_t plain, gpgme_data_t cipher)
 {
   return encrypt_start (ctx, 0, recp, plain, cipher);
@@ -203,7 +201,7 @@ gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,
 /* Encrypt plaintext PLAIN within CTX for the recipients RECP and
    store the resulting ciphertext in CIPHER.  */
 gpgme_error_t
-gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_user_id_t recp,
                  gpgme_data_t plain, gpgme_data_t cipher)
 {
   gpgme_error_t err = encrypt_start (ctx, 1, recp, plain, cipher);
index c6dbdcfb148f77d8735c1f7053b64e6c163820f8..490a18e5633bf6c575aa22818d5a5d20f6ab4b0a 100644 (file)
@@ -49,13 +49,13 @@ struct engine_ops
   gpgme_error_t (*delete) (void *engine, gpgme_key_t key, int allow_secret);
   gpgme_error_t (*edit) (void *engine, gpgme_key_t key, gpgme_data_t out,
                         gpgme_ctx_t ctx /* FIXME */);
-  gpgme_error_t (*encrypt) (void *engine, gpgme_recipients_t recp,
+  gpgme_error_t (*encrypt) (void *engine, gpgme_user_id_t recp,
                            gpgme_data_t plain, gpgme_data_t ciph,
                            int use_armor);
-  gpgme_error_t (*encrypt_sign) (void *engine, gpgme_recipients_t recp,
+  gpgme_error_t (*encrypt_sign) (void *engine, gpgme_user_id_t recp,
                                 gpgme_data_t plain, gpgme_data_t ciph,
                                 int use_armor, gpgme_ctx_t ctx /* FIXME */);
-  gpgme_error_t (*export) (void *engine, gpgme_recipients_t recp,
+  gpgme_error_t (*export) (void *engine, gpgme_user_id_t uids,
                           gpgme_data_t keydata, int use_armor);
   gpgme_error_t (*genkey) (void *engine, gpgme_data_t help_data, int use_armor,
                           gpgme_data_t pubkey, gpgme_data_t seckey);
index da9cdb4bf26d8a38422abe36f3e7e12f760688bb..eb5fd8262156fd48e1e9a4014644195d0fc67fdf 100644 (file)
@@ -936,13 +936,12 @@ gpgsm_delete (void *engine, gpgme_key_t key, int allow_secret)
 
 
 static gpgme_error_t
-set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp)
+set_recipients (GpgsmObject gpgsm, gpgme_user_id_t uid)
 {
   gpgme_error_t err;
   ASSUAN_CONTEXT ctx = gpgsm->assuan_ctx;
   char *line;
   int linelen;
-  gpgme_user_id_t uid;
   int invalid_recipients = 0;
 
   linelen = 10 + 40 + 1;       /* "RECIPIENT " + guess + '\0'.  */
@@ -950,7 +949,7 @@ set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp)
   if (!line)
     return GPGME_Out_Of_Core;
   strcpy (line, "RECIPIENT ");
-  for (uid = recp->list; uid; uid = uid->next)
+  while (uid)
     {
       int newlen = 11 + strlen (uid->uid);
       if (linelen < newlen)
@@ -975,6 +974,7 @@ set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp)
          free (line);
          return err;
        }
+      uid = uid->next;
     }
   free (line);
   return invalid_recipients ? GPGME_Invalid_UserID : 0;
@@ -982,7 +982,7 @@ set_recipients (GpgsmObject gpgsm, gpgme_recipients_t recp)
 
 
 static gpgme_error_t
-gpgsm_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
+gpgsm_encrypt (void *engine, gpgme_user_id_t recp, gpgme_data_t plain,
               gpgme_data_t ciph, int use_armor)
 {
   GpgsmObject gpgsm = engine;
@@ -1015,7 +1015,7 @@ gpgsm_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
 
 
 static gpgme_error_t
-gpgsm_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata,
+gpgsm_export (void *engine, gpgme_user_id_t uid, gpgme_data_t keydata,
              int use_armor)
 {
   GpgsmObject gpgsm = engine;
@@ -1033,36 +1033,27 @@ gpgsm_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata,
   strcpy (cmd, "EXPORT");
   cmdi = 6;
 
-  if (recp)
+  while (!err && uid)
     {
-      void *ec;
-      const char *s;
-
-      err = gpgme_recipients_enum_open (recp, &ec);
-      while (!err && (s = gpgme_recipients_enum_read (recp, &ec)))
+      int uidlen = strlen (uid->uid);
+      /* New string is old string + ' ' + s + '\0'.  */
+      if (cmdlen < cmdi + 1 + uidlen + 1)
        {
-         int slen = strlen (s);
-         /* New string is old string + ' ' + s + '\0'.  */
-         if (cmdlen < cmdi + 1 + slen + 1)
+         char *newcmd = realloc (cmd, cmdlen * 2);
+         if (!newcmd)
            {
-             char *newcmd = realloc (cmd, cmdlen * 2);
-             if (!newcmd)
-               {
-                 free (cmd);
-                 return GPGME_Out_Of_Core;
-               }
-             cmd = newcmd;
-             cmdlen *= 2;
+             free (cmd);
+             return GPGME_Out_Of_Core;
            }
-         cmd[cmdi++] = ' ';
-         strcpy (cmd + cmdi, s);
-         cmdi += slen;
+         cmd = newcmd;
+         cmdlen *= 2;
        }
-      if (!err)
-       err = gpgme_recipients_enum_close (recp, &ec);
-      if (err)
-       return err;
+      cmd[cmdi++] = ' ';
+      strcpy (cmd + cmdi, uid->uid);
+      cmdi += uidlen;
     }
+  if (err)
+    return err;
 
   gpgsm->output_cb.data = keydata;
   err = gpgsm_set_fd (gpgsm->assuan_ctx, "OUTPUT", gpgsm->output_fd_server,
index ed2891ee7a477643b9498b5df9981d699c01a226..deee33607a657dd9f92ce868a2589c22c9bab793 100644 (file)
@@ -289,7 +289,7 @@ _gpgme_engine_op_edit (EngineObject engine, gpgme_key_t key, gpgme_data_t out,
 
 
 gpgme_error_t
-_gpgme_engine_op_encrypt (EngineObject engine, gpgme_recipients_t recp,
+_gpgme_engine_op_encrypt (EngineObject engine, gpgme_user_id_t recp,
                          gpgme_data_t plain, gpgme_data_t ciph, int use_armor)
 {
   if (!engine)
@@ -304,7 +304,7 @@ _gpgme_engine_op_encrypt (EngineObject engine, gpgme_recipients_t recp,
 
 
 gpgme_error_t
-_gpgme_engine_op_encrypt_sign (EngineObject engine, gpgme_recipients_t recp,
+_gpgme_engine_op_encrypt_sign (EngineObject engine, gpgme_user_id_t recp,
                               gpgme_data_t plain, gpgme_data_t ciph,
                               int use_armor, gpgme_ctx_t ctx /* FIXME */)
 {
@@ -320,7 +320,7 @@ _gpgme_engine_op_encrypt_sign (EngineObject engine, gpgme_recipients_t recp,
 
 
 gpgme_error_t
-_gpgme_engine_op_export (EngineObject engine, gpgme_recipients_t recp,
+_gpgme_engine_op_export (EngineObject engine, gpgme_user_id_t uids,
                         gpgme_data_t keydata, int use_armor)
 {
   if (!engine)
@@ -329,8 +329,7 @@ _gpgme_engine_op_export (EngineObject engine, gpgme_recipients_t recp,
   if (!engine->ops->export)
     return GPGME_Not_Implemented;
 
-  return (*engine->ops->export) (engine->engine, recp, keydata,
-                                use_armor);
+  return (*engine->ops->export) (engine->engine, uids, keydata, use_armor);
 }
 
 
index 1f8e2ed7c5565f6b8b9a33c771ce05ce5a7da570..065c9067ae275b7f3358166e328e305032f539ac 100644 (file)
@@ -57,17 +57,17 @@ gpgme_error_t _gpgme_engine_op_edit (EngineObject engine, gpgme_key_t key,
                                     gpgme_data_t out,
                                     gpgme_ctx_t ctx /* FIXME */);
 gpgme_error_t _gpgme_engine_op_encrypt (EngineObject engine,
-                                       gpgme_recipients_t recp,
+                                       gpgme_user_id_t recp,
                                        gpgme_data_t plain, gpgme_data_t ciph,
                                        int use_armor);
 gpgme_error_t _gpgme_engine_op_encrypt_sign (EngineObject engine,
-                                            gpgme_recipients_t recp,
+                                            gpgme_user_id_t recp,
                                             gpgme_data_t plain,
                                             gpgme_data_t ciph,
                                             int use_armor,
                                             gpgme_ctx_t ctx /* FIXME */);
 gpgme_error_t _gpgme_engine_op_export (EngineObject engine,
-                                      gpgme_recipients_t recp,
+                                      gpgme_user_id_t uids,
                                       gpgme_data_t keydata, int use_armor);
 gpgme_error_t _gpgme_engine_op_genkey (EngineObject engine,
                                       gpgme_data_t help_data,
index bdefc29c7b6a6da048564c9a206e5669f040fdac..4958a75c31f376636ab5d2b8778e6065bb3240bc 100644 (file)
@@ -36,11 +36,11 @@ export_status_handler (void *priv, gpgme_status_code_t code, char *args)
 
 static gpgme_error_t
 export_start (gpgme_ctx_t ctx, int synchronous,
-             gpgme_recipients_t recp, gpgme_data_t keydata)
+             gpgme_user_id_t uids, gpgme_data_t keydata)
 {
   gpgme_error_t err;
 
-  if (!keydata || !recp)
+  if (!keydata || !uids)
     return GPGME_Invalid_Value;
 
   err = _gpgme_op_reset (ctx, synchronous);
@@ -49,24 +49,24 @@ export_start (gpgme_ctx_t ctx, int synchronous,
 
   _gpgme_engine_set_status_handler (ctx->engine, export_status_handler, ctx);
 
-  return _gpgme_engine_op_export (ctx->engine, recp, keydata, ctx->use_armor);
+  return _gpgme_engine_op_export (ctx->engine, uids, keydata, ctx->use_armor);
 }
 
 
 /* Export the keys listed in RECP into KEYDATA.  */
 gpgme_error_t
-gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_user_id_t uids,
                       gpgme_data_t keydata)
 {
-  return export_start (ctx, 0, recp, keydata);
+  return export_start (ctx, 0, uids, keydata);
 }
 
 
 /* Export the keys listed in RECP into KEYDATA.  */
 gpgme_error_t
-gpgme_op_export (gpgme_ctx_t ctx, gpgme_recipients_t recipients, gpgme_data_t keydata)
+gpgme_op_export (gpgme_ctx_t ctx, gpgme_user_id_t uids, gpgme_data_t keydata)
 {
-  gpgme_error_t err = export_start (ctx, 1, recipients, keydata);
+  gpgme_error_t err = export_start (ctx, 1, uids, keydata);
   if (!err)
     err = _gpgme_wait_one (ctx);
   return err;
index de4174534caaf57bd0ce7d48d79c89982b50a3f0..01e9c7879699d9e3895ccfe5a126cea0ba9b5d25 100644 (file)
@@ -75,10 +75,6 @@ typedef struct gpgme_context *gpgme_ctx_t;
 struct gpgme_data;
 typedef struct gpgme_data *gpgme_data_t;
 
-/* A list of recipients to be used in an encryption operation.  */
-struct gpgme_recipients;
-typedef struct gpgme_recipients *gpgme_recipients_t;
-
 \f
 /* Public data types provided by GPGME.  */
 
@@ -542,6 +538,14 @@ struct _gpgme_user_id
 };
 typedef struct _gpgme_user_id *gpgme_user_id_t;
 
+/* Release the user IDs in the list UID.  */
+void gpgme_user_ids_release (gpgme_user_id_t uid);
+
+/* Add the name NAME to the user ID list *UIDS_P (with unknown
+   validity).  */
+gpgme_error_t gpgme_user_ids_append (gpgme_user_id_t *uids_p,
+                                    const char *name);
+
 
 /* A key from the keyring.  */
 struct _gpgme_key
@@ -793,40 +797,6 @@ void gpgme_get_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs);
    the pending operation to finish.  */
 gpgme_ctx_t gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang);
 
-\f
-/* Functions to handle recipients.  */
-
-/* Create a new recipients set and return it in R_RSET.  */
-gpgme_error_t gpgme_recipients_new (gpgme_recipients_t *r_rset);
-
-/* Release the recipients set RSET.  */
-void gpgme_recipients_release (gpgme_recipients_t rset);
-
-/* Add NAME to the recipients set RSET.  */
-gpgme_error_t gpgme_recipients_add_name (gpgme_recipients_t rset, const char *name);
-
-/* Add NAME with validity AL to the recipients set RSET.  */
-gpgme_error_t gpgme_recipients_add_name_with_validity (gpgme_recipients_t rset,
-                                                      const char *name,
-                                                      gpgme_validity_t val);
-
-/* Return the number of recipients in RSET.  */
-unsigned int gpgme_recipients_count (const gpgme_recipients_t rset);
-
-/* Create a new enumeration handle for the recipients set RSET and
-   return it in ITER.  */
-gpgme_error_t gpgme_recipients_enum_open (const gpgme_recipients_t rset,
-                                         void **iter);
-
-/* Return the next recipient from the recipient set RSET in the
-   enumerator ITER.  */
-const char *gpgme_recipients_enum_read (const gpgme_recipients_t rset,
-                                       void **iter);
-
-/* Destroy the enumerator ITER for the recipient set RSET.  */
-gpgme_error_t gpgme_recipients_enum_close (const gpgme_recipients_t rset,
-                                          void **iter);
-
 \f
 /* Functions to handle data objects.  */
 
@@ -1011,19 +981,19 @@ gpgme_encrypt_result_t gpgme_op_encrypt_result (gpgme_ctx_t ctx);
 
 /* Encrypt plaintext PLAIN within CTX for the recipients RECP and
    store the resulting ciphertext in CIPHER.  */
-gpgme_error_t gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_error_t gpgme_op_encrypt_start (gpgme_ctx_t ctx, gpgme_user_id_t recp,
                                      gpgme_data_t plain, gpgme_data_t cipher);
-gpgme_error_t gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_error_t gpgme_op_encrypt (gpgme_ctx_t ctx, gpgme_user_id_t recp,
                                gpgme_data_t plain, gpgme_data_t cipher);
 
 /* Encrypt plaintext PLAIN within CTX for the recipients RECP and
    store the resulting ciphertext in CIPHER.  Also sign the ciphertext
    with the signers in CTX.  */
 gpgme_error_t gpgme_op_encrypt_sign_start (gpgme_ctx_t ctx,
-                                          gpgme_recipients_t recp,
+                                          gpgme_user_id_t recp,
                                           gpgme_data_t plain,
                                           gpgme_data_t cipher);
-gpgme_error_t gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_error_t gpgme_op_encrypt_sign (gpgme_ctx_t ctx, gpgme_user_id_t recp,
                                     gpgme_data_t plain, gpgme_data_t cipher);
 
 \f
@@ -1261,10 +1231,10 @@ gpgme_error_t gpgme_op_import_ext (gpgme_ctx_t ctx, gpgme_data_t keydata,
                                   int *nr) _GPGME_DEPRECATED;
 
 \f
-/* Export the keys listed in RECP into KEYDATA.  */
-gpgme_error_t gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+/* Export the keys listed in UIDS into KEYDATA.  */
+gpgme_error_t gpgme_op_export_start (gpgme_ctx_t ctx, gpgme_user_id_t uids,
                                     gpgme_data_t keydata);
-gpgme_error_t gpgme_op_export (gpgme_ctx_t ctx, gpgme_recipients_t recp,
+gpgme_error_t gpgme_op_export (gpgme_ctx_t ctx, gpgme_user_id_t uids,
                               gpgme_data_t keydata);
 
 \f
@@ -1442,7 +1412,6 @@ gpgme_error_t gpgme_engine_check_version (gpgme_protocol_t proto);
 /* Deprecated types.  */
 typedef gpgme_ctx_t GpgmeCtx _GPGME_DEPRECATED;
 typedef gpgme_data_t GpgmeData _GPGME_DEPRECATED;
-typedef gpgme_recipients_t GpgmeRecipients _GPGME_DEPRECATED;
 typedef gpgme_error_t GpgmeError _GPGME_DEPRECATED;
 typedef gpgme_data_encoding_t GpgmeDataEncoding _GPGME_DEPRECATED;
 typedef gpgme_pubkey_algo_t GpgmePubKeyAlgo _GPGME_DEPRECATED;
index 121de1e7e0e927bca6e2a2ebbe0b3b5adae323f0..07e602fb5ed03f3b936839bf2e4973b258e5d8bb 100644 (file)
@@ -33,8 +33,9 @@ void _gpgme_release_result (gpgme_ctx_t ctx);
 gpgme_error_t _gpgme_wait_one (gpgme_ctx_t ctx);
 gpgme_error_t _gpgme_wait_on_condition (gpgme_ctx_t ctx, volatile int *cond);
 
-/* From recipient.c.  */
-int _gpgme_recipients_all_valid ( const gpgme_recipients_t rset );
+\f
+/* From user-id.c.  */
+int _gpgme_user_ids_all_valid (gpgme_user_id_t uid);
 
 \f
 /* From data.c.  */
@@ -144,5 +145,4 @@ const char *_gpgme_compare_versions (const char *my_version,
                                     const char *req_version);
 char *_gpgme_get_program_version (const char *const path);
 
-
 #endif /* OPS_H */
diff --git a/gpgme/recipient.c b/gpgme/recipient.c
deleted file mode 100644 (file)
index e592b4b..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/* recipient.c - mainatin recipient sets
-   Copyright (C) 2000 Werner Koch (dd9jn)
-   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
-   This file is part of GPGME.
-   GPGME is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-   GPGME is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-   You should have received a copy of the GNU General Public License
-   along with GPGME; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-
-#include "context.h"
-
-\f
-/* Create a new uninitialized recipient object and return it in R_RSET.  */
-gpgme_error_t
-gpgme_recipients_new (gpgme_recipients_t *r_rset)
-{
-  gpgme_recipients_t rset;
-    
-  rset = calloc (1, sizeof *rset);
-  if (!rset)
-    return GPGME_Out_Of_Core;
-  *r_rset = rset;
-  return 0;
-}
-
-
-/* Release the recipient object RSET.  */
-void
-gpgme_recipients_release (gpgme_recipients_t rset)
-{
-  gpgme_user_id_t uid = rset->list;
-
-  while (uid)
-    {
-      gpgme_user_id_t next_uid = uid->next;
-
-      free (uid);
-      uid = next_uid;
-    }
-  free (rset);
-}
-
-
-/* Add the name NAME to the recipient set RSET with the given key
-   validity VALIDITY.  */
-gpgme_error_t
-gpgme_recipients_add_name_with_validity (gpgme_recipients_t rset,
-                                        const char *name,
-                                         gpgme_validity_t validity)
-{
-  gpgme_user_id_t uid;
-
-  if (!name || !rset)
-    return GPGME_Invalid_Value;
-  uid = malloc (sizeof (*uid) + strlen (name) + 1);
-  if (!uid)
-    return GPGME_Out_Of_Core;
-  uid->validity = validity;
-  uid->name = "";
-  uid->email = "";
-  uid->comment = "";
-  uid->uid = ((char *) uid) + sizeof (*uid);
-  strcpy (uid->uid, name);
-  uid->next = rset->list;
-  rset->list = uid;
-  return 0;
-}
-
-
-/* Add the name NAME to the recipient set RSET.  Same as
-   gpgme_recipients_add_name_with_validity with validitiy
-   GPGME_VALIDITY_UNKNOWN.  */
-gpgme_error_t
-gpgme_recipients_add_name (gpgme_recipients_t rset, const char *name)
-{
-  return gpgme_recipients_add_name_with_validity (rset, name,
-                                                 GPGME_VALIDITY_UNKNOWN);
-}
-
-
-/* Return the number of recipients in the set.  */
-unsigned int 
-gpgme_recipients_count (const gpgme_recipients_t rset)
-{
-  gpgme_user_id_t uid = rset->list;
-  unsigned int count = 0;
-    
-  while (uid)
-    {
-      count++;
-      uid = uid->next;
-    }
-
-  return count;
-}
-
-
-/* Start an enumeration on the recipient set RSET.  The caller must
-   pass the address of a void pointer which is used as the iterator
-   object.  */
-gpgme_error_t
-gpgme_recipients_enum_open (const gpgme_recipients_t rset, void **iter)
-{
-  *iter = rset->list;
-  return 0;
-}
-
-/* Return the name of the next recipient in the set RSET.  */
-const char *
-gpgme_recipients_enum_read (const gpgme_recipients_t rset, void **iter)
-{
-  gpgme_user_id_t uid;
-
-  uid = *iter;
-  if (!uid)
-    return NULL;
-
-  *iter = uid->next;
-  return uid->name;
-}
-
-/* Release the iterator for this object.  */
-gpgme_error_t
-gpgme_recipients_enum_close (const gpgme_recipients_t rset, void **iter)
-{
-  /* Not really needed, but might catch the occasional mistake.  */
-  *iter = NULL;
-
-  return 0;
-}
-
-
-int
-_gpgme_recipients_all_valid (const gpgme_recipients_t rset)
-{
-  gpgme_user_id_t uid = rset->list;
-
-  while (uid)
-    {
-      if (uid->validity != GPGME_VALIDITY_FULL
-         && uid->validity != GPGME_VALIDITY_ULTIMATE )
-       return 0;
-      uid = uid->next;
-    }
-  return 1;
-}
index 8e7665923aeb90943185787df5e89c46a592a28c..f9fa4c570a24e4859098012fb4fcdb901d9cd621 100644 (file)
@@ -1235,26 +1235,25 @@ gpg_edit (void *engine, gpgme_key_t key, gpgme_data_t out,
 
 
 static gpgme_error_t
-append_args_from_recipients (GpgObject gpg, const gpgme_recipients_t rset)
+append_args_from_recipients (GpgObject gpg, gpgme_user_id_t uid)
 {
   gpgme_error_t err = 0;
-  gpgme_user_id_t uid;
 
-  assert (rset);
-  for (uid = rset->list; uid; uid = uid->next)
+  while (uid)
     {
       err = add_arg (gpg, "-r");
       if (!err)
        err = add_arg (gpg, uid->uid);
       if (err)
        break;
+      uid = uid->next;
     }    
   return err;
 }
 
 
 static gpgme_error_t
-gpg_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
+gpg_encrypt (void *engine, gpgme_user_id_t recp, gpgme_data_t plain,
             gpgme_data_t ciph, int use_armor)
 {
   GpgObject gpg = engine;
@@ -1270,7 +1269,7 @@ gpg_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
     {
       /* If we know that all recipients are valid (full or ultimate trust)
         we can suppress further checks.  */
-      if (!err && !symmetric && _gpgme_recipients_all_valid (recp))
+      if (!err && !symmetric && _gpgme_user_ids_all_valid (recp))
        err = add_arg (gpg, "--always-trust");
 
       if (!err)
@@ -1297,7 +1296,7 @@ gpg_encrypt (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
 
 
 static gpgme_error_t
-gpg_encrypt_sign (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
+gpg_encrypt_sign (void *engine, gpgme_user_id_t recp, gpgme_data_t plain,
                  gpgme_data_t ciph, int use_armor,
                  gpgme_ctx_t ctx /* FIXME */)
 {
@@ -1312,7 +1311,7 @@ gpg_encrypt_sign (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
 
   /* If we know that all recipients are valid (full or ultimate trust)
    * we can suppress further checks */
-  if (!err && _gpgme_recipients_all_valid (recp))
+  if (!err && _gpgme_user_ids_all_valid (recp))
     err = add_arg (gpg, "--always-trust");
 
   if (!err)
@@ -1341,7 +1340,7 @@ gpg_encrypt_sign (void *engine, gpgme_recipients_t recp, gpgme_data_t plain,
 
 
 static gpgme_error_t
-gpg_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata,
+gpg_export (void *engine, gpgme_user_id_t uids, gpgme_data_t keydata,
            int use_armor)
 {
   GpgObject gpg = engine;
@@ -1355,16 +1354,10 @@ gpg_export (void *engine, gpgme_recipients_t recp, gpgme_data_t keydata,
   if (!err)
     err = add_arg (gpg, "--");
 
-  if (!err)
+  while (!err && uids)
     {
-      void *ec;
-      const char *s;
-
-      err = gpgme_recipients_enum_open (recp, &ec);
-      while (!err && (s = gpgme_recipients_enum_read (recp, &ec)))
-       err = add_arg (gpg, s);
-      if (!err)
-       err = gpgme_recipients_enum_close (recp, &ec);
+      err = add_arg (gpg, uids->uid);
+      uids = uids->next;
     }
 
   if (!err)
index 4ed384bdc64e53cf84085172c5abeadbbc1d2b72..5dcfc481a7b3eb13d35ae5993386e04fa1a97d90 100644 (file)
 #include "util.h"
 #include "context.h"
 
-/* The signers are directly stored in the context.  So this is quite
-   different to a recipient set.  */
-
-
+\f
 /* Delete all signers from CTX.  */
 void
 gpgme_signers_clear (gpgme_ctx_t ctx)
diff --git a/gpgme/user-id.c b/gpgme/user-id.c
new file mode 100644 (file)
index 0000000..460f3af
--- /dev/null
@@ -0,0 +1,91 @@
+/* user-id.c - Managing user IDs.
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+\f
+/* Release the user IDs in the list UID.  */
+void
+gpgme_user_ids_release (gpgme_user_id_t uid)
+{
+  while (uid)
+    {
+      gpgme_user_id_t next_uid = uid->next;
+
+      free (uid);
+      uid = next_uid;
+    }
+}
+
+
+/* Add the name NAME to the user ID list *UIDS_P (with unknown
+   validity).  */
+gpgme_error_t
+gpgme_user_ids_append (gpgme_user_id_t *uids_p, const char *name)
+{
+  gpgme_user_id_t uids;
+  gpgme_user_id_t uid;
+
+  if (!name || !uids_p)
+    return GPGME_Invalid_Value;
+
+  uid = calloc (1, sizeof (*uid) + strlen (name) + 1);
+  if (!uid)
+    return GPGME_Out_Of_Core;
+
+  uid->uid = ((char *) uid) + sizeof (*uid);
+  strcpy (uid->uid, name);
+  uid->name = uid->uid + strlen (name);
+  uid->email = uid->name;
+  uid->comment = uid->name;
+  uid->validity = GPGME_VALIDITY_UNKNOWN;
+  
+  uids = *uids_p;
+  if (uids)
+    {
+      while (uids->next)
+       uids = uids->next;
+      uids->next = uid;
+    }
+  else
+    *uids_p = uid;
+
+  return 0;
+}
+
+
+int
+_gpgme_user_ids_all_valid (gpgme_user_id_t uid)
+{
+  while (uid)
+    {
+      if (uid->validity != GPGME_VALIDITY_FULL
+         && uid->validity != GPGME_VALIDITY_ULTIMATE)
+       return 0;
+      uid = uid->next;
+    }
+  return 1;
+}
index 883ec7fa138b4c31b7614c6fbce779acbf408421..35d02861d1f48408079d3c6e63b28bda6765611f 100644 (file)
@@ -1,3 +1,10 @@
+2003-05-28  Marcus Brinkmann  <marcus@g10code.de>
+
+       * gpg/t-eventloop.c (main): Rewrite recipient management.
+       * gpg/t-encrypt-sign.c (main): Likewise.
+       * gpg/t-encrypt.c (main): Likewise.
+       * gpg/t-export.c (main): Likewise.
+       
 2003-05-27  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpg/Makefile.am (TESTS): Order t-keylist and t-keylist-sig after
index 7e8fc3f90cb33b5be3e335fdc65937251297e6e8..8dd8235d7b85d98d55081f86062460f8c880b180 100644 (file)
@@ -117,7 +117,8 @@ main (int argc, char **argv)
   gpgme_ctx_t ctx;
   gpgme_error_t err;
   gpgme_data_t in, out;
-  gpgme_recipients_t rset;
+  gpgme_user_id_t rset = NULL;
+  gpgme_user_id_t *rset_lastp = &rset;
   gpgme_encrypt_result_t result;
   gpgme_sign_result_t sign_result;
   char *agent_info;
@@ -139,15 +140,15 @@ main (int argc, char **argv)
 
   err = gpgme_data_new (&out);
   fail_if_err (err);
-    
-  err = gpgme_recipients_new (&rset);
-  fail_if_err (err);
-  err = gpgme_recipients_add_name_with_validity (rset, "Bob",
-                                                GPGME_VALIDITY_FULL);
+
+  err = gpgme_user_ids_append (rset_lastp, "Alpha");
   fail_if_err (err);
-  err = gpgme_recipients_add_name_with_validity (rset, "Alpha",
-                                                GPGME_VALIDITY_FULL);
+  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
+
+  rset_lastp = &(*rset_lastp)->next;
+  err = gpgme_user_ids_append (rset_lastp, "Bob");
   fail_if_err (err);
+  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
 
   err = gpgme_op_encrypt_sign (ctx, rset, in, out);
   fail_if_err (err);
@@ -162,11 +163,9 @@ main (int argc, char **argv)
   check_result (sign_result, GPGME_SIG_MODE_NORMAL);
   print_data (out);
 
-  gpgme_recipients_release (rset);
+  gpgme_user_ids_release (rset);
   gpgme_data_release (in);
   gpgme_data_release (out);
   gpgme_release (ctx);
   return 0;
 }
-
-
index 1bd7bbf6ac76df58fd15c2c52c2828d851be2ddc..0e41eb3787104644dae4337482396307096bfd73 100644 (file)
@@ -60,7 +60,8 @@ main (int argc, char **argv)
   gpgme_ctx_t ctx;
   gpgme_error_t err;
   gpgme_data_t in, out;
-  gpgme_recipients_t rset;
+  gpgme_user_id_t rset = NULL;
+  gpgme_user_id_t *rset_lastp = &rset;
   gpgme_encrypt_result_t result;
 
   err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);
@@ -76,14 +77,14 @@ main (int argc, char **argv)
   err = gpgme_data_new (&out);
   fail_if_err (err);
     
-  err = gpgme_recipients_new (&rset);
+  err = gpgme_user_ids_append (rset_lastp, "Alpha");
   fail_if_err (err);
-  err = gpgme_recipients_add_name_with_validity (rset, "Bob",
-                                                GPGME_VALIDITY_FULL);
-  fail_if_err (err);
-  err = gpgme_recipients_add_name_with_validity (rset, "Alpha",
-                                                GPGME_VALIDITY_FULL);
+  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
+
+  rset_lastp = &(*rset_lastp)->next;
+  err = gpgme_user_ids_append (rset_lastp, "Bob");
   fail_if_err (err);
+  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
 
   err = gpgme_op_encrypt (ctx, rset, in, out);
   fail_if_err (err);
@@ -96,7 +97,7 @@ main (int argc, char **argv)
     }
   print_data (out);
 
-  gpgme_recipients_release (rset);
+  gpgme_user_ids_release (rset);
   gpgme_data_release (in);
   gpgme_data_release (out);
   gpgme_release (ctx);
index 66dce7fced7e64e200db551cd57b16214bc9b5ea..597da1c16f48a89f0526353e133a84032d0fb142 100644 (file)
 
 #include <gpgme.h>
 
-#define fail_if_err(a) do { if(a) {                                       \
-                               fprintf (stderr, "%s:%d: gpgme_error_t %s\n", \
-                                __FILE__, __LINE__, gpgme_strerror(a));   \
-                                exit (1); }                               \
-                             } while(0)
+#define fail_if_err(err)                                       \
+  do                                                           \
+    {                                                          \
+      if (err)                                                 \
+        {                                                      \
+          fprintf (stderr, "%s:%d: gpgme_error_t %s\n",                \
+                   __FILE__, __LINE__, gpgme_strerror (err));   \
+          exit (1);                                            \
+        }                                                      \
+    }                                                          \
+  while (0)
+
 
 static void
 print_data (gpgme_data_t dh)
@@ -114,6 +121,7 @@ io_event (void *data, gpgme_event_io_t type, void *type_data)
     }
 }
 
+
 int
 do_select (void)
 {
@@ -166,6 +174,7 @@ my_wait (void)
   return 0;
 }
 
+
 struct gpgme_io_cbs io_cbs =
   {
     add_io_cb,
@@ -175,13 +184,15 @@ struct gpgme_io_cbs io_cbs =
     &op_result
   };
 
+
 int 
 main (int argc, char *argv[])
 {
   gpgme_ctx_t ctx;
   gpgme_error_t err;
   gpgme_data_t in, out;
-  gpgme_recipients_t rset;
+  gpgme_user_id_t rset = NULL;
+  gpgme_user_id_t *rset_lastp = &rset;
   int i;
 
   for (i = 0; i < FDLIST_MAX; i++)
@@ -190,49 +201,43 @@ main (int argc, char *argv[])
   err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);
   fail_if_err (err);
 
-  do
-    {
-      err = gpgme_new (&ctx);
-      fail_if_err (err);
-      gpgme_set_armor (ctx, 1);
-      gpgme_set_io_cbs (ctx, &io_cbs);
-      op_result.done = 0;
-
-      err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0);
-      fail_if_err (err);
-
-      err = gpgme_data_new (&out);
-      fail_if_err (err);
-
-      err = gpgme_recipients_new (&rset);
-      fail_if_err (err);
-      err = gpgme_recipients_add_name_with_validity (rset, "Bob",
-                                                    GPGME_VALIDITY_FULL);
-      fail_if_err (err);
-      err = gpgme_recipients_add_name_with_validity (rset, "Alpha",
-                                                    GPGME_VALIDITY_FULL);
-      fail_if_err (err);
-
-      err = gpgme_op_encrypt_start (ctx, rset, in, out);
-      fail_if_err (err);
-
-      my_wait ();
-      fail_if_err (op_result.err);
-      fail_if_err (err);
-
-      fflush (NULL);
-      fputs ("Begin Result:\n", stdout);
-      print_data (out);
-      fputs ("End Result.\n", stdout);
+  err = gpgme_new (&ctx);
+  fail_if_err (err);
+  gpgme_set_armor (ctx, 1);
+  gpgme_set_io_cbs (ctx, &io_cbs);
+  op_result.done = 0;
+
+  err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0);
+  fail_if_err (err);
+
+  err = gpgme_data_new (&out);
+  fail_if_err (err);
+
+  err = gpgme_user_ids_append (rset_lastp, "Alpha");
+  fail_if_err (err);
+  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
+
+  rset_lastp = &(*rset_lastp)->next;
+  err = gpgme_user_ids_append (rset_lastp, "Bob");
+  fail_if_err (err);
+  (*rset_lastp)->validity = GPGME_VALIDITY_FULL;
+
+  err = gpgme_op_encrypt_start (ctx, rset, in, out);
+  fail_if_err (err);
+
+  my_wait ();
+  fail_if_err (op_result.err);
+  fail_if_err (err);
+
+  fflush (NULL);
+  fputs ("Begin Result:\n", stdout);
+  print_data (out);
+  fputs ("End Result.\n", stdout);
    
-      gpgme_recipients_release (rset);
-      gpgme_data_release (in);
-      gpgme_data_release (out);
-      gpgme_release (ctx);
-    }
-  while (argc > 1 && !strcmp (argv[1], "--loop"));
+  gpgme_user_ids_release (rset);
+  gpgme_data_release (in);
+  gpgme_data_release (out);
+  gpgme_release (ctx);
 
   return 0;
 }
-
-
index 520a3d335ff1375257c9be06fd06aadb8cae577b..d36dbb2bbd1f4c089756eede171c7e6c5d6b3fe8 100644 (file)
@@ -1,23 +1,22 @@
-/* t-export.c  - regression test
- *     Copyright (C) 2000 Werner Koch (dd9jn)
- *      Copyright (C) 2001 g10 Code GmbH
- *
- * This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * GPGME is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
+/* t-export.c - Regression test.
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <gpgme.h>
 
-#define fail_if_err(a) do { if(a) {                                       \
-                               fprintf (stderr, "%s:%d: gpgme_error_t %s\n", \
-                                __FILE__, __LINE__, gpgme_strerror(a));   \
-                                exit (1); }                               \
-                             } while(0)
+#define fail_if_err(err)                                       \
+  do                                                           \
+    {                                                          \
+      if (err)                                                 \
+        {                                                      \
+          fprintf (stderr, "%s:%d: gpgme_error_t %s\n",                \
+                   __FILE__, __LINE__, gpgme_strerror (err));   \
+          exit (1);                                            \
+        }                                                      \
+    }                                                          \
+  while (0)
 
 
 static void
@@ -48,43 +53,43 @@ print_data (gpgme_data_t dh)
     fail_if_err (GPGME_File_Error);
 }
 
+
 int 
-main (int argc, char **argv )
+main (int argc, char **argv)
 {
-    gpgme_ctx_t ctx;
-    gpgme_error_t err;
-    gpgme_data_t  out;
-    gpgme_recipients_t rset;
-
-  do {
-    err = gpgme_new (&ctx);
-    fail_if_err (err);
-
-    err = gpgme_data_new ( &out );
-    fail_if_err (err);
-
-    err = gpgme_recipients_new (&rset);
-    fail_if_err (err);
-    err = gpgme_recipients_add_name (rset, "Bob");
-    fail_if_err (err);
-    err = gpgme_recipients_add_name (rset, "Alpha");
-    fail_if_err (err);
-
-    gpgme_set_armor (ctx, 1 );
-    err = gpgme_op_export (ctx, rset, out );
-    fail_if_err (err);
-
-    fflush (NULL);
-    fputs ("Begin Result:\n", stdout );
-    print_data (out);
-    fputs ("End Result.\n", stdout );
+  gpgme_ctx_t ctx;
+  gpgme_error_t err;
+  gpgme_data_t  out;
+  gpgme_user_id_t uids = NULL;
+  gpgme_user_id_t *uids_lastp = &uids;
+
+  err = gpgme_new (&ctx);
+  fail_if_err (err);
+
+  err = gpgme_data_new (&out);
+  fail_if_err (err);
+
+  err = gpgme_user_ids_append (uids_lastp, "Alpha");
+  fail_if_err (err);
+  uids_lastp = &(*uids_lastp)->next;
+
+  err = gpgme_user_ids_append (uids_lastp, "Bob");
+  fail_if_err (err);
+
+  gpgme_set_armor (ctx, 1);
+  err = gpgme_op_export (ctx, uids, out);
+  fail_if_err (err);
+
+  fflush (NULL);
+  fputs ("Begin Result:\n", stdout);
+  print_data (out);
+  fputs ("End Result.\n", stdout);
    
-    gpgme_recipients_release (rset);
-    gpgme_data_release (out);
-    gpgme_release (ctx);
-  } while ( argc > 1 && !strcmp( argv[1], "--loop" ) );
+  gpgme_user_ids_release (uids);
+  gpgme_data_release (out);
+  gpgme_release (ctx);
    
-    return 0;
+  return 0;
 }