Imported Upstream version 1.8.0
[platform/upstream/gpgme.git] / tests / opassuan / t-command.c
1 /* t-command.c - Regression test.
2    Copyright (C) 2009 g10 Code GmbH
3
4    This file is part of GPGME.
5
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Lesser General Public License as
8    published by the Free Software Foundation; either version 2.1 of
9    the License, or (at your option) any later version.
10
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with this program; if not, see <https://www.gnu.org/licenses/>.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 #include <stdlib.h>
25 #include <string.h>
26 #include <locale.h>
27 #include <assert.h>
28
29 #include <gpgme.h>
30
31 #define fail_if_err(err)                                        \
32   do                                                            \
33     {                                                           \
34       if (err)                                                  \
35         {                                                       \
36           fprintf (stderr, "%s:%d: %s: %s (%d.%d)\n",           \
37                    __FILE__, __LINE__, gpgme_strsource (err),   \
38                    gpgme_strerror (err),                        \
39                    gpgme_err_source (err), gpgme_err_code (err)); \
40           exit (1);                                             \
41         }                                                       \
42     }                                                           \
43   while (0)
44
45
46 static gpgme_error_t
47 data_cb (void *opaque, const void *data, size_t datalen)
48 {
49   (void)opaque;
50   (void)data;
51
52   printf ("DATA_CB: datalen=%d\n", (int)datalen);
53   return 0;
54 }
55
56
57 static gpgme_error_t
58 inq_cb (void *opaque, const char *name, const char *args,
59         gpgme_data_t *r_data)
60 {
61   gpgme_data_t data;
62   gpgme_error_t err;
63
64   (void)opaque;
65
66   if (name)
67     {
68       printf ("INQ_CB: name=`%s' args=`%s'\n", name, args);
69       /* There shall be no data object.  */
70       assert (!*r_data);
71
72       err = gpgme_data_new (&data);
73       fail_if_err (err);
74       *r_data = data;
75       printf ("        sending data object %p\n", data);
76     }
77   else /* Finished using the formerly returned data object.  */
78     {
79       printf ("INQ_CB: data object %p finished\n", *r_data);
80       /* There shall be a data object so that it can be cleaned up. */
81       assert (r_data);
82
83       gpgme_data_release (*r_data);
84     }
85
86   /* Uncomment the next lines and send a "SCD LEARN" to test sending
87      cancel from in inquiry.  */
88   /* if (name && !strcmp (name, "KNOWNCARDP")) */
89   /*   return gpgme_error (GPG_ERR_ASS_CANCELED); */
90
91
92   return 0;
93 }
94
95
96 static gpgme_error_t
97 status_cb (void *opaque, const char *status, const char *args)
98 {
99   (void)opaque;
100
101   printf ("STATUS_CB: status=`%s'  args=`%s'\n", status, args);
102   return 0;
103 }
104
105
106
107 int
108 main (int argc, char **argv)
109 {
110   gpgme_error_t err;
111   gpgme_error_t op_err;
112   gpgme_ctx_t ctx;
113   const char *command;
114
115   gpgme_check_version (NULL);
116 #ifndef HAVE_W32_SYSTEM
117   setlocale (LC_ALL, "");
118   gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL));
119   gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL));
120 #endif
121
122   if (argc)
123     {
124       argc--;
125       argv++;
126     }
127   command = argc? *argv : "NOP";
128
129
130   err = gpgme_new (&ctx);
131   fail_if_err (err);
132
133   err = gpgme_set_protocol (ctx, GPGME_PROTOCOL_ASSUAN);
134   fail_if_err (err);
135
136   err = gpgme_op_assuan_transact_ext (ctx, command, data_cb, NULL,
137                                   inq_cb, NULL, status_cb, NULL, &op_err);
138   fail_if_err (err || op_err);
139
140   gpgme_release (ctx);
141
142   return 0;
143 }
144