- cast to avoid compiler warning
[apt.git] / apt-pkg / rpm / rpmshowprogress.cc
1
2 #include <stdio.h>
3 #include <rpm/rpmlib.h>
4 #include <apti18n.h>
5
6 #include "rpmshowprogress.h"
7
8 int packagesTotal;
9
10 static void printHash(const unsigned long amount, const unsigned long total)
11 {
12     int hashesNeeded;
13
14     hashesTotal = (isatty (STDOUT_FILENO) ? 44 : 50);
15
16     if (hashesCurrent != hashesTotal) {
17         float pct = (total ? (((float) amount) / total) : 1.0);
18         hashesNeeded = (int) ((hashesTotal * pct) + 0.5);
19         while (hashesNeeded > hashesCurrent) {
20             if (isatty (STDOUT_FILENO)) {
21                 int i;
22                 for (i = 0; i < hashesCurrent; i++)
23                     (void) putchar ('#');
24                 for (; i < hashesTotal; i++)
25                     (void) putchar (' ');
26                 fprintf(stdout, "(%3d%%)", (int)((100 * pct) + 0.5));
27                 for (i = 0; i < (hashesTotal + 6); i++)
28                     (void) putchar ('\b');
29             } else
30                 fprintf(stdout, "#");
31
32             hashesCurrent++;
33         }
34         (void) fflush(stdout);
35
36         if (hashesCurrent == hashesTotal) {
37             int i;
38             progressCurrent++;
39             if (isatty(STDOUT_FILENO)) {
40                 for (i = 1; i < hashesCurrent; i++)
41                     (void) putchar ('#');
42                 pct = (progressTotal
43                     ? (((float) progressCurrent) / progressTotal)
44                     : 1);
45                 fprintf(stdout, " [%3d%%]", (int)((100 * pct) + 0.5));
46             }
47             fprintf(stdout, "\n");
48         }
49         (void) fflush(stdout);
50     }
51 }
52
53 #if RPM_VERSION < 0x040000
54 void * rpmpmShowProgress(const Header h,
55 #else
56 void * rpmpmShowProgress(const void * arg, 
57 #endif
58                         const rpmCallbackType what,
59                         const unsigned long amount,
60                         const unsigned long total,
61                         const void * pkgKey, void * data)
62 {
63 #if RPM_VERSION >= 0x040000
64     Header h = (Header) arg;
65 #endif
66
67     char * s;
68     int flags = (int) ((long)data);
69     void * rc = NULL;
70     const char * filename = (const char *) pkgKey;
71     static FD_t fd = NULL;
72     static rpmCallbackType state;
73
74     switch (what) {
75     case RPMCALLBACK_INST_OPEN_FILE:
76         if (filename == NULL || filename[0] == '\0')
77             return NULL;
78         fd = Fopen(filename, "r.ufdio");
79         if (fd)
80             fd = fdLink(fd, "persist (showProgress)");
81         return fd;
82         /*@notreached@*/ break;
83
84     case RPMCALLBACK_INST_CLOSE_FILE:
85         fd = fdFree(fd, "persist (showProgress)");
86         if (fd) {
87             (void) Fclose(fd);
88             fd = NULL;
89         }
90         break;
91
92     case RPMCALLBACK_INST_START:
93         hashesCurrent = 0;
94         if (h == NULL || !(flags & INSTALL_LABEL))
95             break;
96
97         if (state != what) {
98             state = what;
99             fprintf(stdout, "%s\n", _("Installing / Updating..."));
100             (void) fflush(stdout);
101         }
102
103         if (flags & INSTALL_HASH) {
104             s = headerSprintf(h, "%{NAME}.%{ARCH}",
105                                 rpmTagTable, rpmHeaderFormats, NULL);
106             if (isatty (STDOUT_FILENO))
107                 fprintf(stdout, "%4d:%-23.23s", progressCurrent + 1, s);
108             else
109                 fprintf(stdout, "%-28.28s", s);
110             (void) fflush(stdout);
111             free(s);
112             s = NULL;
113         } else {
114             s = headerSprintf(h, "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}",
115                                   rpmTagTable, rpmHeaderFormats, NULL);
116             fprintf(stdout, "%s\n", s);
117             (void) fflush(stdout);
118             free(s);
119             s = NULL;
120         }
121         break;
122
123     case RPMCALLBACK_TRANS_PROGRESS:
124     case RPMCALLBACK_INST_PROGRESS:
125         if (flags & INSTALL_PERCENT)
126             fprintf(stdout, "%%%% %f\n", (double) (total
127                                 ? ((((float) amount) / total) * 100)
128                                 : 100.0));
129         else if (flags & INSTALL_HASH)
130             printHash(amount, total);
131         (void) fflush(stdout);
132         break;
133
134     case RPMCALLBACK_TRANS_START:
135         state = what;
136         hashesCurrent = 0;
137         progressTotal = 1;
138         progressCurrent = 0;
139         if (!(flags & INSTALL_LABEL))
140             break;
141         if (flags & INSTALL_HASH)
142             fprintf(stdout, "%-28s", _("Preparing..."));
143         else
144             fprintf(stdout, "%s\n", _("Preparing..."));
145         (void) fflush(stdout);
146         break;
147
148     case RPMCALLBACK_TRANS_STOP:
149         if (flags & INSTALL_HASH)
150             printHash(1, 1);    /* Fixes "preparing..." progress bar */
151         progressTotal = packagesTotal;
152         progressCurrent = 0;
153         break;
154
155     case RPMCALLBACK_REPACKAGE_START:
156         hashesCurrent = 0;
157         progressTotal = total;
158         progressCurrent = 0;
159         if (!(flags & INSTALL_LABEL))
160             break;
161         if (flags & INSTALL_HASH)
162             fprintf(stdout, "%-28s\n", _("Repackaging..."));
163         else
164             fprintf(stdout, "%s\n", _("Repackaging..."));
165         (void) fflush(stdout);
166         break;
167
168     case RPMCALLBACK_REPACKAGE_PROGRESS:
169         if (amount && (flags & INSTALL_HASH))
170             printHash(1, 1);    /* Fixes "preparing..." progress bar */
171         break;
172
173     case RPMCALLBACK_REPACKAGE_STOP:
174         progressTotal = total;
175         progressCurrent = total;
176         if (flags & INSTALL_HASH)
177             printHash(1, 1);    /* Fixes "preparing..." progress bar */
178         progressTotal = packagesTotal;
179         progressCurrent = 0;
180         if (!(flags & INSTALL_LABEL))
181             break;
182         if (flags & INSTALL_HASH)
183             fprintf(stdout, "%-28s\n", _("Upgrading..."));
184         else
185             fprintf(stdout, "%s\n", _("Upgrading..."));
186         (void) fflush(stdout);
187         break;
188
189     case RPMCALLBACK_UNINST_PROGRESS:
190         break;
191     case RPMCALLBACK_UNINST_START:
192         hashesCurrent = 0;
193         if (!(flags & INSTALL_LABEL))
194             break;
195         if (state != what) {
196             state = what;
197             fprintf(stdout, "%s\n", _("Removing / Cleaning up..."));
198             (void) fflush(stdout);
199         }
200         break;
201
202     case RPMCALLBACK_UNINST_STOP:
203         if (h == NULL || !(flags & INSTALL_LABEL))
204             break;
205         s = headerSprintf(h, "%{NAME}.%{ARCH}", rpmTagTable, rpmHeaderFormats, NULL);
206         if (flags & INSTALL_HASH) {
207             fprintf(stdout, "%4d:%-23.23s", progressCurrent + 1, s);
208             printHash(1, 1);
209         } else {
210             fprintf(stdout, "%-28.28s", s);
211         }
212         fflush(stdout);
213         s = NULL;
214         break;
215     }
216  
217     return rc;
218 }       
219