qt: Handle diagnostic audit log for CMS
[gpgme.git] / src / progress.c
1 /* progress.c -  status handler for progress status
2  * Copyright (C) 2000 Werner Koch (dd9jn)
3  * Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
4  *
5  * This file is part of GPGME.
6  *
7  * GPGME is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as
9  * published by the Free Software Foundation; either version 2.1 of
10  * the License, or (at your option) any later version.
11  *
12  * GPGME is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program; if not, see <https://gnu.org/licenses/>.
19  * SPDX-License-Identifier: LGPL-2.1-or-later
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 #include <stdlib.h>
26 #include <string.h>
27 #include <errno.h>
28
29 #include "util.h"
30 #include "context.h"
31 #include "debug.h"
32
33
34 /* The status handler for progress status lines which also monitors
35  * the PINENTRY_LAUNCHED status.  */
36 gpgme_error_t
37 _gpgme_progress_status_handler (void *priv, gpgme_status_code_t code,
38                                 char *args)
39 {
40   gpgme_ctx_t ctx = (gpgme_ctx_t) priv;
41   char *p;
42   char *args_cpy;
43   int type = 0;
44   int current = 0;
45   int total = 0;
46
47   if (code == GPGME_STATUS_PINENTRY_LAUNCHED)
48     {
49       ctx->redraw_suggested = 1;
50       return 0;
51     }
52
53   if (code != GPGME_STATUS_PROGRESS || !*args || !ctx->progress_cb)
54     return 0;
55
56   args_cpy = strdup (args);
57   if (!args_cpy)
58     return gpg_error_from_syserror ();
59
60   p = strchr (args_cpy, ' ');
61   if (p)
62     {
63       *p++ = 0;
64       if (*p)
65         {
66           type = *(unsigned char *)p;
67           p = strchr (p+1, ' ');
68           if (p)
69             {
70               *p++ = 0;
71               if (*p)
72                 {
73                   current = atoi (p);
74                   p = strchr (p+1, ' ');
75                   if (p)
76                     {
77                       *p++ = 0;
78                       total = atoi (p);
79                     }
80                 }
81             }
82         }
83     }
84
85   if (type != 'X')
86     ctx->progress_cb (ctx->progress_cb_value, args_cpy, type, current, total);
87
88   free (args_cpy);
89   return 0;
90 }