indicates if a key can be used for qualified signatures according
to local government regulations.
+ * You can associate a filename with a data object using the new
+ gpgme_data_set_filename() function. This filename will be stored
+ in the output when encrypting or signing the data and will be
+ returned when decrypting or verifying the output data.
+
* Interface changes relative to the 1.0.3 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gpgme_set_engine_info NEW
gpgme_recipient_t NEW
gpgme_decrypt_result_t EXTENDED: New field recipients.
gpgme_verify_result_t EXTENDED: New fields pubkey_algo, hash_algo.
-gpgme_decrypt_result_t EXTENDED: New field file_name.
-gpgme_verify_result_t EXTENDED: New field file_name.
+gpgme_decrypt_result_t EXTENDED: New field plaintext_filename.
+gpgme_verify_result_t EXTENDED: New field plaintext_filename.
GPGME_STATUS_PLAINTEXT NEW
gpgme_key_t EXTENDED: New field is_qualified.
gpgme_subkey_t EXTENDED: New field is_qualified.
+gpgme_data_set_filename NEW
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2005-09-30 Marcus Brinkmann <marcus@g10code.de>
+ * gpgme.texi (Data Buffer I/O Operations, Data Buffer Meta-Data):
+ New subsections.
+
* gpgme.texi: Replace plaintext_filename with file_name.
* gpgme.texi (Key Management): Document is_qualified.
* File Based Data Buffers:: Creating file based data buffers.
* Callback Based Data Buffers:: Creating callback based data buffers.
+Manipulating Data Buffers
+
+* Data Buffer I/O Operations:: I/O operations on data buffers.
+* Data Buffer Meta-Data:: Meta-data manipulation of data buffers.
+
Contexts
* Creating Contexts:: Creating new @acronym{GPGME} contexts.
@node Manipulating Data Buffers
@section Manipulating Data Buffers
-@cindex data buffere, manipulation
+@cindex data buffer, manipulation
+
+Data buffers contain data and meta-data. The following operations can
+be used to manipulate both.
+
+
+@menu
+* Data Buffer I/O Operations:: I/O operations on data buffers.
+* Data Buffer Meta-Data:: Meta-data manipulation of data buffers.
+@end menu
+
+
+@node Data Buffer I/O Operations
+@subsection Data Buffer I/O Operations
+@cindex data buffer, I/O operations
+@cindex data buffer, read
+@cindex data buffer, write
+@cindex data buffer, seek
@deftypefun ssize_t gpgme_data_read (@w{gpgme_data_t @var{dh}}, @w{void *@var{buffer}}, @w{size_t @var{length}})
The function @code{gpgme_data_read} reads up to @var{length} bytes
@end example
@end deftypefun
-@c
-@c gpgme_data_encoding_t
-@c
+
+
+
+@node Data Buffer Meta-Data
+@subsection Data Buffer Meta-Data
+@cindex data buffer, meta-data
+@cindex data buffer, file name
+@cindex data buffer, encoding
+
+@deftypefun char *gpgme_data_get_file_name (@w{gpgme_data_t @var{dh}})
+The function @code{gpgme_data_get_file_name} returns a pointer to a
+string containing the file name associated with the data object. The
+file name will be stored in the output when encrypting or signing the
+data and will be returned to the user when decrypting or verifying the
+output data.
+
+If no error occurs, the string containing the file name is returned.
+Otherwise, @code{NULL} will be returned.
+@end deftypefun
+
+
+@deftypefun gpgme_error_t gpgme_data_set_file_name (@w{gpgme_data_t @var{dh}}, @w{const char *@var{file_name}})
+The function @code{gpgme_data_set_file_name} sets the file name
+associated with the data object. The file name will be stored in the
+output when encrypting or signing the data and will be returned to the
+user when decrypting or verifying the output data.
+
+The function returns the error code @code{GPG_ERR_INV_VALUE} if
+@var{dh} is not a valid pointer and @code{GPG_ERR_ENOMEM} if not
+enough memory is available.
+@end deftypefun
+
+
@deftp {Data type} {enum gpgme_data_encoding_t}
@tindex gpgme_data_encoding_t
The @code{gpgme_data_encoding_t} type specifies the encoding of a
2005-09-30 Marcus Brinkmann <marcus@g10code.de>
+ * data.h (struct gpgme_data): New member file_name.
+ * data.c (gpgme_data_set_filename): New function.
+ (_gpgme_data_release): Free DH->filename if necessary.
+ (gpgme_data_get_filename): New function.
+ * rungpg.c (gpg_encrypt): Set filename option.
+ (gpg_encrypt_sign): Likewise.
+ (gpg_sign): Likewise.
+ * libgpgme.vers (GPGME_1.1): Add gpgme_data_set_file_name and
+ gpgme_data_get_file_name.
+
* decrpyt.c, verify.c, gpgme.h: Replace plaintext_filename with
file_name.
void
_gpgme_data_release (gpgme_data_t dh)
{
- if (dh)
- free (dh);
+ if (!dh)
+ return;
+
+ if (dh->file_name)
+ free (dh->file_name);
+ free (dh);
}
\f
return 0;
}
+
+/* Set the file name associated with the data object with handle DH to
+ FILE_NAME. */
+gpgme_error_t
+gpgme_data_set_file_name (gpgme_data_t dh, const char *file_name)
+{
+ if (!dh)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
+ if (dh->file_name)
+ free (dh->file_name);
+
+ dh->file_name = strdup (file_name);
+ if (!dh->file_name)
+ return gpg_error_from_errno (errno);
+
+ return 0;
+}
+
+/* Get the file name associated with the data object with handle DH,
+ or NULL if there is none. */
+char *
+gpgme_data_get_file_name (gpgme_data_t dh)
+{
+ if (!dh)
+ return NULL;
+
+ return dh->file_name;
+}
+
\f
/* Functions to support the wait interface. */
char pending[BUFFER_SIZE];
int pending_len;
+ /* File name of the data object. */
+ char *file_name;
+
union
{
/* For gpgme_data_new_from_fd. */
gpgme_error_t gpgme_data_set_encoding (gpgme_data_t dh,
gpgme_data_encoding_t enc);
+/* Get the filename associated with the data object with handle DH, or
+ NULL if there is none. */
+char *gpgme_data_get_file_name (gpgme_data_t dh);
+
+/* Set the filename associated with the data object with handle DH to
+ FILE_NAME. */
+gpgme_error_t gpgme_data_set_file_name (gpgme_data_t dh,
+ const char *file_name);
/* Create a new data buffer which retrieves the data from the callback
gpgme_ctx_get_engine_info;
gpgme_ctx_set_engine_info;
+
+ gpgme_data_set_file_name;
+ gpgme_data_get_file_name;
};
err = add_arg (gpg, "-");
if (!err)
err = add_data (gpg, ciph, 1, 1);
+ if (gpgme_data_get_file_name (plain))
+ {
+ if (!err)
+ err = add_arg (gpg, "--set-filename");
+ if (!err)
+ err = add_arg (gpg, gpgme_data_get_file_name (plain));
+ }
if (!err)
err = add_arg (gpg, "--");
if (!err)
err = add_arg (gpg, "-");
if (!err)
err = add_data (gpg, ciph, 1, 1);
+ if (gpgme_data_get_file_name (plain))
+ {
+ if (!err)
+ err = add_arg (gpg, "--set-filename");
+ if (!err)
+ err = add_arg (gpg, gpgme_data_get_file_name (plain));
+ }
if (!err)
err = add_arg (gpg, "--");
if (!err)
if (!err)
err = append_args_from_signers (gpg, ctx);
+ if (gpgme_data_get_file_name (in))
+ {
+ if (!err)
+ err = add_arg (gpg, "--set-filename");
+ if (!err)
+ err = add_arg (gpg, gpgme_data_get_file_name (in));
+ }
+
/* Tell the gpg object about the data. */
if (!err)
err = add_data (gpg, in, 0, 0);
+2005-09-30 Marcus Brinkmann <marcus@g10code.de>
+
+ * gpg/Makefile.am (TESTS): Add t-filename.
+ * gpg/t-filename.c: New file.
+
2005-09-23 Werner Koch <wk@g10code.com>
* gpg/t-support.h (init_gpgme) [W32]: Don't use LC_MESSAGES.
TESTS = t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers \
t-decrypt t-verify t-decrypt-verify \
t-export t-import t-trustlist t-eventloop t-edit \
- t-keylist t-keylist-sig t-thread1 t-wait t-encrypt-large
+ t-keylist t-keylist-sig t-thread1 t-wait t-encrypt-large \
+ t-file-name
CLEANFILES = secring.gpg pubring.gpg trustdb.gpg
DISTCLEANFILES = pubring.gpg~ random_seed
--- /dev/null
+/* t-file-name.c - Regression test.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2002, 2003, 2004 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 Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser 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. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+#define TESTNAME "abcde12345"
+
+\f
+int
+main (int argc, char *argv[])
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t in, out;
+ gpgme_key_t key[2] = { NULL, NULL };
+ gpgme_decrypt_result_t result;
+ char *agent_info;
+
+ init_gpgme (GPGME_PROTOCOL_OpenPGP);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+ gpgme_set_armor (ctx, 1);
+
+ agent_info = getenv("GPG_AGENT_INFO");
+ if (!(agent_info && strchr (agent_info, ':')))
+ gpgme_set_passphrase_cb (ctx, passphrase_cb, NULL);
+
+ err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0);
+ fail_if_err (err);
+
+ err = gpgme_data_set_file_name (in, TESTNAME);
+ fail_if_err (err);
+
+ err = gpgme_data_new (&out);
+ fail_if_err (err);
+
+ err = gpgme_get_key (ctx, "A0FF4590BB6122EDEF6E3C542D727CC768697734",
+ &key[0], 0);
+ fail_if_err (err);
+
+ err = gpgme_op_encrypt (ctx, key, GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
+ fail_if_err (err);
+
+ gpgme_data_release (in);
+ err = gpgme_data_new (&in);
+ fail_if_err (err);
+
+ err = gpgme_data_seek (out, 0, SEEK_SET);
+ fail_if_err (err);
+
+ err = gpgme_op_decrypt (ctx, out, in);
+ fail_if_err (err);
+ result = gpgme_op_decrypt_result (ctx);
+
+ if (strcmp (TESTNAME, result->file_name))
+ {
+ fprintf (stderr, "%s:%i: Unexpected result file name: %s\n",
+ __FILE__, __LINE__,
+ result->file_name ? "(null)" : result->file_name);
+ exit (1);
+ }
+
+ gpgme_key_unref (key[0]);
+ gpgme_data_release (in);
+ gpgme_data_release (out);
+ gpgme_release (ctx);
+ return 0;
+}