text: #ifndef PKGLIB_IPROGRESS_H
  #define PKGLIB_IPROGRESS_H
  
  #include <apt-pkg/macros.h>
  
  #include <string>
  #include <vector>
  #include <signal.h>
  #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);
      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 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);
      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 APT_PUBLIC 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 APT_PUBLIC 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
  