#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 *d;
+ void * const d;
protected:
std::string progress_str;
int last_reported_progress;
public:
- PackageManager()
- : percentage(0.0), last_reported_progress(-1) {};
- virtual ~PackageManager() {};
+ PackageManager();
+ virtual ~PackageManager();
- virtual void Start() {};
+ /* Global Start/Stop */
+ virtual void Start(int /*child_pty*/=-1) {};
virtual void Stop() {};
- virtual pid_t fork() {return fork(); };
+ /* 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 500000;
+ return 50000000;
};
- virtual bool StatusChanged(std::string PackageName,
+ 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) {};
+ 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;
void WriteToStatusFd(std::string msg);
public:
- PackageManagerProgressFd(int progress_fd);
+ explicit PackageManagerProgressFd(int progress_fd);
+ virtual ~PackageManagerProgressFd();
- virtual void Start();
- virtual void Stop();
+ virtual void StartDpkg() APT_OVERRIDE;
+ virtual void Stop() APT_OVERRIDE;
- virtual bool StatusChanged(std::string PackageName,
+ virtual bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
- std::string HumanReadableAction);
- virtual void Error(std::string PackageName,
+ std::string HumanReadableAction) APT_OVERRIDE;
+ virtual void Error(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
- std::string ErrorMessage);
+ std::string ErrorMessage) APT_OVERRIDE;
virtual void ConffilePrompt(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
- std::string ConfMessage);
+ std::string ConfMessage) APT_OVERRIDE;
};
class PackageManagerProgressDeb822Fd : public PackageManager
{
+ void * const d;
protected:
int OutStatusFd;
int StepsDone;
void WriteToStatusFd(std::string msg);
public:
- PackageManagerProgressDeb822Fd(int progress_fd);
+ explicit PackageManagerProgressDeb822Fd(int progress_fd);
+ virtual ~PackageManagerProgressDeb822Fd();
- virtual void Start();
- virtual void Stop();
+ virtual void StartDpkg() APT_OVERRIDE;
+ virtual void Stop() APT_OVERRIDE;
- virtual bool StatusChanged(std::string PackageName,
+ virtual bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
- std::string HumanReadableAction);
- virtual void Error(std::string PackageName,
+ std::string HumanReadableAction) APT_OVERRIDE;
+ virtual void Error(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
- std::string ErrorMessage);
+ std::string ErrorMessage) APT_OVERRIDE;
virtual void ConffilePrompt(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
- std::string ConfMessage);
+ 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:
- int nr_terminal_rows;
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 void Start();
- virtual void Stop();
- virtual bool StatusChanged(std::string PackageName,
+ 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);
+ 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,
+ virtual bool StatusChanged(std::string PackageName,
unsigned int StepsDone,
unsigned int TotalSteps,
- std::string HumanReadableAction);
+ std::string HumanReadableAction) APT_OVERRIDE;
+
+ PackageManagerText();
+ virtual ~PackageManagerText();
};
-}; // namespace Progress
-}; // namespace APT
+} // namespace Progress
+} // namespace APT
#endif