1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
#ifndef PKGLIB_IPROGRESS_H
#define PKGLIB_IPROGRESS_H
#include <apt-pkg/macros.h>
#include <csignal>
#include <string>
#include <vector>
#include <unistd.h>
namespace APT {
namespace Progress {
class PackageManager;
APT_PUBLIC PackageManager* PackageManagerProgressFactory();
class APT_PUBLIC PackageManager
{
private:
/** \brief dpointer placeholder */
void * const d;
protected:
std::string progress_str;
float percentage;
int last_reported_progress;
public:
PackageManager();
virtual ~PackageManager();
/* Global Start/Stop */
virtual void Start(int /*child_pty*/=-1) {};
virtual void Stop() {};
/* When dpkg is invoked (may happen multiple times for each
* install/remove block
*/
virtual void StartDpkg() {};
virtual pid_t fork() {return ::fork(); };
virtual void Pulse() {};
virtual long GetPulseInterval() {
return 50000000;
};
virtual bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string HumanReadableAction);
virtual void Error(std::string /*PackageName*/,
unsigned int /*StepsDone*/,
unsigned int /*TotalSteps*/,
std::string /*ErrorMessage*/) {}
virtual void ConffilePrompt(std::string /*PackageName*/,
unsigned int /*StepsDone*/,
unsigned int /*TotalSteps*/,
std::string /*ConfMessage*/) {}
};
class APT_PUBLIC PackageManagerProgressFd : public PackageManager
{
void * const d;
protected:
int OutStatusFd;
int StepsDone;
int StepsTotal;
void WriteToStatusFd(std::string msg);
public:
explicit PackageManagerProgressFd(int progress_fd);
~PackageManagerProgressFd() override;
void StartDpkg() override;
void Stop() override;
bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string HumanReadableAction) override;
void Error(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string ErrorMessage) override;
void ConffilePrompt(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string ConfMessage) override;
};
class APT_PUBLIC PackageManagerProgressDeb822Fd : public PackageManager
{
void * const d;
protected:
int OutStatusFd;
int StepsDone;
int StepsTotal;
void WriteToStatusFd(std::string msg);
public:
explicit PackageManagerProgressDeb822Fd(int progress_fd);
~PackageManagerProgressDeb822Fd() override;
void StartDpkg() override;
void Stop() override;
bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string HumanReadableAction) override;
void Error(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string ErrorMessage) override;
void ConffilePrompt(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string ConfMessage) override;
};
class APT_PUBLIC PackageManagerFancy : public PackageManager
{
void * const d;
private:
APT_HIDDEN static void staticSIGWINCH(int);
static std::vector<PackageManagerFancy*> instances;
static sighandler_t SIGWINCH_orig;
static volatile sig_atomic_t SIGWINCH_flag;
APT_HIDDEN void CheckSIGWINCH();
APT_HIDDEN bool DrawStatusLine();
protected:
void SetupTerminalScrollArea(int nr_rows);
void HandleSIGWINCH(int); // for abi compatibility, do not use
typedef struct {
int rows;
int columns;
} TermSize;
TermSize GetTerminalSize();
sighandler_t old_SIGWINCH; // for abi compatibility, do not use
int child_pty;
public:
PackageManagerFancy();
~PackageManagerFancy() override;
void Pulse() override;
void Start(int child_pty = -1) override;
void Stop() override;
bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string HumanReadableAction) override;
// return a progress bar of the given size for the given progress
// percent between 0.0 and 1.0 in the form "[####...]"
static std::string GetTextProgressStr(float percent, int OutputSize);
};
class APT_PUBLIC PackageManagerText : public PackageManager
{
void * const d;
public:
bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
std::string HumanReadableAction) override;
PackageManagerText();
~PackageManagerText() override;
};
} // namespace Progress
} // namespace APT
#endif
|