- initial import of revision 374 from cnc
[apt.git] / apt-pkg / rpm / rpmshowprogress.h
1 //
2 // This code was originally from rpm 4.0.3.
3 //
4 static int hashesPrinted = 0;
5 static int packagesTotal = 0;
6 static int progressTotal = 0;
7 static int progressCurrent = 0;
8
9 static void printHash(const unsigned long amount, const unsigned long total)
10 {
11     int hashesNeeded;
12     int hashesTotal = 50;
13
14     if (isatty (STDOUT_FILENO))
15         hashesTotal = 44;
16
17     if (hashesPrinted != hashesTotal) {
18         hashesNeeded = (int)(hashesTotal*(total?(((float)amount)/total):1));
19         while (hashesNeeded > hashesPrinted) {
20             if (isatty (STDOUT_FILENO)) {
21                 int i;
22                 for (i = 0; i < hashesPrinted; i++) (void) putchar ('#');
23                 for (; i < hashesTotal; i++) (void) putchar (' ');
24                 fprintf(stdout, "(%3d%%)",
25                         (int)(100 * (total ? (((float) amount) / total) : 1)));
26                 for (i = 0; i < (hashesTotal + 6); i++) (void) putchar ('\b');
27             } else
28                 fprintf(stdout, "#");
29
30             hashesPrinted++;
31         }
32         (void) fflush(stdout);
33         hashesPrinted = hashesNeeded;
34
35         if (hashesPrinted == hashesTotal) {
36             int i;
37             progressCurrent++;
38             if (isatty(STDOUT_FILENO)) {
39                 for (i = 1; i < hashesPrinted; i++) (void) putchar ('#');
40                 fprintf(stdout, " [%3d%%]", (int)(100 * (progressTotal ?
41                         (((float) progressCurrent) / progressTotal) : 1)));
42             }
43             fprintf(stdout, "\n");
44         }
45         (void) fflush(stdout);
46     }
47 }
48
49 void * rpmShowProgress(const Header h,
50                         const rpmCallbackType what,
51                         const unsigned long amount,
52                         const unsigned long total,
53                         const void * pkgKey, void * data)
54 {
55     char * s;
56     int flags = (int) ((long)data);
57     void * rc = NULL;
58     const char * filename = (const char *) pkgKey;
59     static FD_t fd = NULL;
60
61     switch (what) {
62     case RPMCALLBACK_INST_OPEN_FILE:
63         if (filename == NULL || filename[0] == '\0')
64             return NULL;
65         fd = Fopen(filename, "r.ufdio");
66         if (fd)
67             fd = fdLink(fd, "persist (showProgress)");
68         return fd;
69         /*@notreached@*/ break;
70
71     case RPMCALLBACK_INST_CLOSE_FILE:
72         fd = fdFree(fd, "persist (showProgress)");
73         if (fd) {
74             (void) Fclose(fd);
75             fd = NULL;
76         }
77         break;
78
79     case RPMCALLBACK_INST_START:
80         hashesPrinted = 0;
81         if (h == NULL || !(flags & INSTALL_LABEL))
82             break;
83         if (flags & INSTALL_HASH) {
84             s = headerSprintf(h, "%{NAME}",
85                                 rpmTagTable, rpmHeaderFormats, NULL);
86             if (isatty (STDOUT_FILENO))
87                 fprintf(stdout, "%4d:%-23.23s", progressCurrent + 1, s);
88             else
89                 fprintf(stdout, "%-28.28s", s);
90             (void) fflush(stdout);
91             free(s);
92             s = NULL;
93         } else {
94             s = headerSprintf(h, "%{NAME}-%{VERSION}-%{RELEASE}",
95                                   rpmTagTable, rpmHeaderFormats, NULL);
96             fprintf(stdout, "%s\n", s);
97             (void) fflush(stdout);
98             free(s);
99             s = NULL;
100         }
101         break;
102
103     case RPMCALLBACK_TRANS_PROGRESS:
104     case RPMCALLBACK_INST_PROGRESS:
105         if (flags & INSTALL_PERCENT)
106             fprintf(stdout, "%%%% %f\n", (double) (total
107                                 ? ((((float) amount) / total) * 100)
108                                 : 100.0));
109         else if (flags & INSTALL_HASH)
110             printHash(amount, total);
111         (void) fflush(stdout);
112         break;
113
114     case RPMCALLBACK_TRANS_START:
115         hashesPrinted = 0;
116         progressTotal = 1;
117         progressCurrent = 0;
118         if (!(flags & INSTALL_LABEL))
119             break;
120         if (flags & INSTALL_HASH)
121             fprintf(stdout, "%-28s", _("Preparing..."));
122         else
123             fprintf(stdout, "%s\n", _("Preparing..."));
124         (void) fflush(stdout);
125         break;
126
127     case RPMCALLBACK_TRANS_STOP:
128         if (flags & INSTALL_HASH)
129             printHash(1, 1);    /* Fixes "preparing..." progress bar */
130         progressTotal = packagesTotal;
131         progressCurrent = 0;
132         break;
133
134     case RPMCALLBACK_UNINST_PROGRESS:
135     case RPMCALLBACK_UNINST_START:
136     case RPMCALLBACK_UNINST_STOP:
137         /* ignore */
138         break;
139     }
140
141     return rc;
142 }       
143