]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/install-progress.h
count strings more accurately for stats
[apt.git] / apt-pkg / install-progress.h
index 9c31eac928ebf0c7ad0f0e70dcdcf571a582a0a7..5d1a20e9bb814c765fa92b91908714e5472befe6 100644 (file)
@@ -1,13 +1,19 @@
 #ifndef PKGLIB_IPROGRESS_H
 #define PKGLIB_IPROGRESS_H
 
 #ifndef PKGLIB_IPROGRESS_H
 #define PKGLIB_IPROGRESS_H
 
+#include <apt-pkg/macros.h>
+
 #include <string>
 #include <unistd.h>
 #include <string>
 #include <unistd.h>
-
+#include <signal.h>
+#include <vector>
 
 namespace APT {
 namespace Progress {
 
 
 namespace APT {
 namespace Progress {
 
+ class PackageManager;
+ PackageManager* PackageManagerProgressFactory();
+
  class PackageManager
  {
  private:
  class PackageManager
  {
  private:
@@ -20,13 +26,19 @@ namespace Progress {
     int last_reported_progress;
 
  public:
     int last_reported_progress;
 
  public:
-    PackageManager() 
+    PackageManager()
        : percentage(0.0), last_reported_progress(-1) {};
     virtual ~PackageManager() {};
 
        : percentage(0.0), last_reported_progress(-1) {};
     virtual ~PackageManager() {};
 
-    virtual void Start() {};
+    /* Global Start/Stop */
+    virtual void Start(int /*child_pty*/=-1) {};
     virtual void Stop() {};
 
     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 pid_t fork() {return fork(); };
 
     virtual void Pulse() {};
@@ -34,18 +46,18 @@ namespace Progress {
          return 500000;
     };
 
          return 500000;
     };
 
-    virtual bool StatusChanged(std::string PackageName, 
+    virtual bool StatusChanged(std::string PackageName,
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                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
  };
 
  class PackageManagerProgressFd : public PackageManager
@@ -59,14 +71,14 @@ namespace Progress {
  public:
     PackageManagerProgressFd(int progress_fd);
 
  public:
     PackageManagerProgressFd(int progress_fd);
 
-    virtual void Start();
+    virtual void StartDpkg();
     virtual void Stop();
 
     virtual void Stop();
 
-    virtual bool StatusChanged(std::string PackageName, 
+    virtual bool StatusChanged(std::string PackageName,
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
-    virtual void Error(std::string PackageName,                                
+    virtual void Error(std::string PackageName,
                        unsigned int StepsDone,
                        unsigned int TotalSteps,
                           std::string ErrorMessage);
                        unsigned int StepsDone,
                        unsigned int TotalSteps,
                           std::string ErrorMessage);
@@ -88,14 +100,14 @@ namespace Progress {
  public:
     PackageManagerProgressDeb822Fd(int progress_fd);
 
  public:
     PackageManagerProgressDeb822Fd(int progress_fd);
 
-    virtual void Start();
+    virtual void StartDpkg();
     virtual void Stop();
 
     virtual void Stop();
 
-    virtual bool StatusChanged(std::string PackageName, 
+    virtual bool StatusChanged(std::string PackageName,
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
-    virtual void Error(std::string PackageName,                                
+    virtual void Error(std::string PackageName,
                        unsigned int StepsDone,
                        unsigned int TotalSteps,
                           std::string ErrorMessage);
                        unsigned int StepsDone,
                        unsigned int TotalSteps,
                           std::string ErrorMessage);
@@ -107,31 +119,50 @@ namespace Progress {
 
  class PackageManagerFancy : public PackageManager
  {
 
  class PackageManagerFancy : public PackageManager
  {
+ private:
+    static void staticSIGWINCH(int);
+    static std::vector<PackageManagerFancy*> instances;
+    APT_HIDDEN bool DrawStatusLine();
+
  protected:
  protected:
-    int nr_terminal_rows;
     void SetupTerminalScrollArea(int nr_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();
 
  public:
     PackageManagerFancy();
-    virtual void Start();
+    ~PackageManagerFancy();
+    virtual void Start(int child_pty=-1);
     virtual void Stop();
     virtual void Stop();
-    virtual bool StatusChanged(std::string PackageName, 
+    virtual bool StatusChanged(std::string PackageName,
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
+
+    // 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
  {
  public:
  };
 
  class PackageManagerText : public PackageManager
  {
  public:
-    virtual bool StatusChanged(std::string PackageName, 
+    virtual bool StatusChanged(std::string PackageName,
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
  };
 
 
                                unsigned int StepsDone,
                                unsigned int TotalSteps,
                                std::string HumanReadableAction);
  };
 
 
-}; // namespace Progress
-}; // namespace APT
+} // namespace Progress
+} // namespace APT
 
 #endif
 
 #endif