]> git.saurik.com Git - apt.git/blob - apt-pkg/install-progress.h
first proof-of-concept for a fix for #731738
[apt.git] / apt-pkg / install-progress.h
1 #ifndef PKGLIB_IPROGRESS_H
2 #define PKGLIB_IPROGRESS_H
3
4 #include <string>
5 #include <unistd.h>
6 #include <signal.h>
7
8 namespace APT {
9 namespace Progress {
10
11 class PackageManager;
12 PackageManager* PackageManagerProgressFactory();
13
14 class PackageManager
15 {
16 private:
17 /** \brief dpointer placeholder */
18 void *d;
19
20 protected:
21 std::string progress_str;
22 float percentage;
23 int last_reported_progress;
24
25 public:
26 PackageManager()
27 : percentage(0.0), last_reported_progress(-1) {};
28 virtual ~PackageManager() {};
29
30 /* Global Start/Stop */
31 virtual void Start(int child_pty=-1) {};
32 virtual void Stop() {};
33
34 /* When dpkg is invoked (may happen multiple times for each
35 * install/remove block
36 */
37 virtual void StartDpkg() {};
38
39 virtual pid_t fork() {return fork(); };
40
41 virtual void Pulse() {};
42 virtual long GetPulseInterval() {
43 return 500000;
44 };
45
46 virtual bool StatusChanged(std::string PackageName,
47 unsigned int StepsDone,
48 unsigned int TotalSteps,
49 std::string HumanReadableAction) ;
50 virtual void Error(std::string PackageName,
51 unsigned int StepsDone,
52 unsigned int TotalSteps,
53 std::string ErrorMessage) {};
54 virtual void ConffilePrompt(std::string PackageName,
55 unsigned int StepsDone,
56 unsigned int TotalSteps,
57 std::string ConfMessage) {};
58 };
59
60 class PackageManagerProgressFd : public PackageManager
61 {
62 protected:
63 int OutStatusFd;
64 int StepsDone;
65 int StepsTotal;
66 void WriteToStatusFd(std::string msg);
67
68 public:
69 PackageManagerProgressFd(int progress_fd);
70
71 virtual void StartDpkg();
72 virtual void Stop();
73
74 virtual bool StatusChanged(std::string PackageName,
75 unsigned int StepsDone,
76 unsigned int TotalSteps,
77 std::string HumanReadableAction);
78 virtual void Error(std::string PackageName,
79 unsigned int StepsDone,
80 unsigned int TotalSteps,
81 std::string ErrorMessage);
82 virtual void ConffilePrompt(std::string PackageName,
83 unsigned int StepsDone,
84 unsigned int TotalSteps,
85 std::string ConfMessage);
86
87 };
88
89 class PackageManagerProgressDeb822Fd : public PackageManager
90 {
91 protected:
92 int OutStatusFd;
93 int StepsDone;
94 int StepsTotal;
95 void WriteToStatusFd(std::string msg);
96
97 public:
98 PackageManagerProgressDeb822Fd(int progress_fd);
99
100 virtual void StartDpkg();
101 virtual void Stop();
102
103 virtual bool StatusChanged(std::string PackageName,
104 unsigned int StepsDone,
105 unsigned int TotalSteps,
106 std::string HumanReadableAction);
107 virtual void Error(std::string PackageName,
108 unsigned int StepsDone,
109 unsigned int TotalSteps,
110 std::string ErrorMessage);
111 virtual void ConffilePrompt(std::string PackageName,
112 unsigned int StepsDone,
113 unsigned int TotalSteps,
114 std::string ConfMessage);
115 };
116
117 class PackageManagerFancy : public PackageManager
118 {
119 protected:
120 static void SetupTerminalScrollArea(int nr_rows);
121 static int GetNumberTerminalRows();
122 static void HandleSIGWINCH(int);
123 sighandler_t old_SIGWINCH;
124
125 public:
126 PackageManagerFancy();
127 ~PackageManagerFancy();
128 virtual void Start(int child_pty=-1);
129 virtual void Stop();
130 virtual bool StatusChanged(std::string PackageName,
131 unsigned int StepsDone,
132 unsigned int TotalSteps,
133 std::string HumanReadableAction);
134 };
135
136 class PackageManagerText : public PackageManager
137 {
138 public:
139 virtual bool StatusChanged(std::string PackageName,
140 unsigned int StepsDone,
141 unsigned int TotalSteps,
142 std::string HumanReadableAction);
143 };
144
145
146 }; // namespace Progress
147 }; // namespace APT
148
149 #endif