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:
trunk/NEWS
trunk/TODO
trunk/doc/ChangeLog
trunk/doc/gpgme.texi
trunk/gpgme/ChangeLog
trunk/gpgme/Makefile.am
trunk/gpgme/context.h
trunk/gpgme/encrypt-sign.c
trunk/gpgme/encrypt.c
trunk/gpgme/engine-backend.h
trunk/gpgme/engine-gpgsm.c
trunk/gpgme/engine.c
trunk/gpgme/engine.h
trunk/gpgme/export.c
trunk/gpgme/gpgme.h
trunk/gpgme/ops.h
trunk/gpgme/recipient.c [deleted file]
trunk/gpgme/rungpg.c
trunk/gpgme/signers.c
trunk/gpgme/user-id.c [new file with mode: 0644]
trunk/tests/ChangeLog
trunk/tests/gpg/t-encrypt-sign.c
trunk/tests/gpg/t-encrypt.c
trunk/tests/gpg/t-eventloop.c
trunk/tests/gpg/t-export.c

index 94122af4cd1beb83901c8c32ec2e78d732570849..71388f4e75362c66e03c9f267bbd9f218c2f7ac0 100644 (file)
@@ -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
index 6e87fd5205f9202ae99ae57f589940d8b872d190..3f4d1f235914f516a6a9ebe27cd320784444ab84 100644 (file)
@@ -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/trunk/gpgme/recipient.c b/trunk/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/trunk/gpgme/user-id.c b/trunk/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;
 }