summaryrefslogtreecommitdiff
path: root/apt-pkg/install-progress.h
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg/install-progress.h')
-rw-r--r--apt-pkg/install-progress.h176
1 files changed, 176 insertions, 0 deletions
diff --git a/apt-pkg/install-progress.h b/apt-pkg/install-progress.h
new file mode 100644
index 000000000..b5c133676
--- /dev/null
+++ b/apt-pkg/install-progress.h
@@ -0,0 +1,176 @@
+#ifndef PKGLIB_IPROGRESS_H
+#define PKGLIB_IPROGRESS_H
+
+#include <apt-pkg/macros.h>
+
+#include <string>
+#include <unistd.h>
+#include <signal.h>
+#include <vector>
+
+namespace APT {
+namespace Progress {
+
+ class PackageManager;
+ PackageManager* PackageManagerProgressFactory();
+
+ class 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 PackageManagerProgressFd : public PackageManager
+ {
+ void * const d;
+ protected:
+ int OutStatusFd;
+ int StepsDone;
+ int StepsTotal;
+ void WriteToStatusFd(std::string msg);
+
+ public:
+ explicit PackageManagerProgressFd(int progress_fd);
+ virtual ~PackageManagerProgressFd();
+
+ virtual void StartDpkg() APT_OVERRIDE;
+ virtual void Stop() APT_OVERRIDE;
+
+ virtual bool StatusChanged(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string HumanReadableAction) APT_OVERRIDE;
+ virtual void Error(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string ErrorMessage) APT_OVERRIDE;
+ virtual void ConffilePrompt(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string ConfMessage) APT_OVERRIDE;
+
+ };
+
+ class PackageManagerProgressDeb822Fd : public PackageManager
+ {
+ void * const d;
+ protected:
+ int OutStatusFd;
+ int StepsDone;
+ int StepsTotal;
+ void WriteToStatusFd(std::string msg);
+
+ public:
+ explicit PackageManagerProgressDeb822Fd(int progress_fd);
+ virtual ~PackageManagerProgressDeb822Fd();
+
+ virtual void StartDpkg() APT_OVERRIDE;
+ virtual void Stop() APT_OVERRIDE;
+
+ virtual bool StatusChanged(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string HumanReadableAction) APT_OVERRIDE;
+ virtual void Error(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string ErrorMessage) APT_OVERRIDE;
+ virtual void ConffilePrompt(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string ConfMessage) APT_OVERRIDE;
+ };
+
+ class PackageManagerFancy : public PackageManager
+ {
+ void * const d;
+ private:
+ APT_HIDDEN static void staticSIGWINCH(int);
+ static std::vector<PackageManagerFancy*> instances;
+ APT_HIDDEN bool DrawStatusLine();
+
+ protected:
+ void SetupTerminalScrollArea(int nr_rows);
+ void HandleSIGWINCH(int);
+
+ typedef struct {
+ int rows;
+ int columns;
+ } TermSize;
+ TermSize GetTerminalSize();
+
+ sighandler_t old_SIGWINCH;
+ int child_pty;
+
+ public:
+ PackageManagerFancy();
+ virtual ~PackageManagerFancy();
+ virtual void Start(int child_pty=-1) APT_OVERRIDE;
+ virtual void Stop() APT_OVERRIDE;
+ virtual bool StatusChanged(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string HumanReadableAction) APT_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 PackageManagerText : public PackageManager
+ {
+ void * const d;
+ public:
+ virtual bool StatusChanged(std::string PackageName,
+ unsigned int StepsDone,
+ unsigned int TotalSteps,
+ std::string HumanReadableAction) APT_OVERRIDE;
+
+ PackageManagerText();
+ virtual ~PackageManagerText();
+ };
+
+
+} // namespace Progress
+} // namespace APT
+
+#endif