* Makefile.am (AM_CFLAGS): Make use of AM_CFLAGS and AM_LDFLAGS.
[gnupg.git] / g10 / progress.c
1 /* progress.c
2  * Copyright (C) 2003 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23
24 #include "iobuf.h"
25 #include "filter.h"
26 #include "status.h"
27 #include "options.h"
28
29 /****************
30  * The filter is used to report progress to the user.
31  */
32 int
33 progress_filter (void *opaque, int control,
34                  IOBUF a, byte *buf, size_t *ret_len)
35 {
36   int rc = 0;
37   progress_filter_context_t *pfx = opaque;
38
39   if (control == IOBUFCTRL_INIT)
40     {
41       char buffer[50];
42
43       pfx->last = 0;
44       pfx->offset = 0;
45       pfx->last_time = make_timestamp ();
46
47       sprintf (buffer, "%.20s ? %lu %lu", pfx->what, pfx->offset,
48                pfx->total);
49       write_status_text (STATUS_PROGRESS, buffer);
50     }
51   else if (control == IOBUFCTRL_UNDERFLOW)
52     {
53       u32 timestamp = make_timestamp ();
54       int len = iobuf_read (a, buf, *ret_len);
55
56       if (len >= 0)
57         {
58           pfx->offset += len;
59           *ret_len = len;
60         }
61       else
62         {
63           *ret_len = 0;
64           rc = -1;
65         }
66       if ((len == -1 && pfx->offset != pfx->last)
67           || timestamp - pfx->last_time > 0)
68         {
69           char buffer[50];
70           
71           sprintf (buffer, "%.20s ? %lu %lu", pfx->what, pfx->offset,
72                    pfx->total);
73           write_status_text (STATUS_PROGRESS, buffer);
74
75           pfx->last = pfx->offset;
76           pfx->last_time = timestamp;
77         }
78     }
79   else if (control == IOBUFCTRL_DESC)
80     *(char**)buf = "progress_filter";
81   return rc;
82 }
83
84 void
85 handle_progress (progress_filter_context_t *pfx, IOBUF inp, char *name)
86 {
87   off_t filesize = 0;
88
89   if (!opt.enable_progress_filter)
90     return;
91
92   if (!is_status_enabled ())
93     return;
94
95   if (name)
96     filesize = iobuf_get_filelength (inp);
97   else if (opt.set_filesize)
98     filesize = opt.set_filesize;
99
100   /* register the progress filter */
101   pfx->what = name ? name : "stdin";
102   pfx->total = filesize;
103   iobuf_push_filter (inp, progress_filter, pfx);
104 }