]> git.mxchange.org Git - simgear.git/blobdiff - simgear/package/Install.hxx
Expand package-system unit-tests.
[simgear.git] / simgear / package / Install.hxx
index 5fafb540e0d5d18c89298a2161ca9463b6b72a9b..4e198eba01d53eef35743b05fe807b5a0054f94f 100644 (file)
 #include <vector>
 
 #include <simgear/misc/sg_path.hxx>
+#include <simgear/misc/sg_dir.hxx>
+#include <simgear/package/Delegate.hxx>
+
+#include <simgear/structure/function_list.hxx>
+#include <simgear/structure/SGReferenced.hxx>
+#include <simgear/structure/SGSharedPtr.hxx>
+#include <simgear/io/HTTPRequest.hxx>
+
+#include <boost/bind.hpp>
 
 namespace simgear
 {
@@ -31,22 +40,33 @@ namespace pkg
 // forward decls
 class Package;
 class Catalog;
-    
+class Install;
+  
+typedef SGSharedPtr<Package> PackageRef;
+typedef SGSharedPtr<Catalog> CatalogRef;  
+typedef SGSharedPtr<Install> InstallRef;
+  
 /**
  *
  */
-class Install
+class Install : public SGReferenced
 {
 public:
+    virtual ~Install();
+  
+    typedef boost::function<void(Install*)> Callback;
+    typedef boost::function<void(Install*, unsigned int, unsigned int)>
+                                            ProgressCallback;
+
     /**
      * create from a directory on disk, or fail.
      */
-    static Install* createFromPath(const SGPath& aPath, Catalog* aCat);
+    static InstallRef createFromPath(const SGPath& aPath, CatalogRef aCat);
     
     unsigned int revsion() const
         { return m_revision; }
     
-    Package* package() const
+    PackageRef package() const
         { return m_package; } 
     
     SGPath path() const
@@ -55,30 +75,120 @@ public:
     bool hasUpdate() const;
     
     void startUpdate();
+
+    bool uninstall();
+
+    bool isDownloading() const;
+    
+    bool isQueued() const;
+    
+    int downloadedPercent() const;
+    
+    size_t downloadedBytes() const;
     
-    void uninstall();
+    /**
+     * full path to the primary -set.xml file for this install
+     */
+    SGPath primarySetPath() const;
     
-// boost signals time?
-    // failure
-    // progress
-    // completed
+    /**
+     * if a download is in progress, cancel it. If this is the first install
+     * of the package (as opposed to an update), the install will be cleaned
+     * up once the last reference is gone.
+     */
+    void cancelDownload();
     
+    /**
+     * return the thumbnails associated with this install, but as locations
+     * on the file system, not URLs. It is assumed the order of thumbnails
+     * is consistent with the URLs returned from Package::thumbnailUrls()
+     */
+    PathList thumbnailPaths() const;
+    
+    /**
+     * Set the handler to be called when the installation successfully
+     * completes.
+     *
+     * @note If the installation is already complete, the handler is called
+     *       immediately.
+     */
+    Install* done(const Callback& cb);
+
+    template<class C>
+    Install* done(C* instance, void (C::*mem_func)(Install*))
+    {
+      return done(boost::bind(mem_func, instance, _1));
+    }
+
+    /**
+     * Set the handler to be called when the installation fails or is aborted.
+     *
+     * @note If the installation has already failed, the handler is called
+     *       immediately.
+     */
+    Install* fail(const Callback& cb);
+
+    template<class C>
+    Install* fail(C* instance, void (C::*mem_func)(Install*))
+    {
+      return fail(boost::bind(mem_func, instance, _1));
+    }
+
+    /**
+     * Set the handler to be called when the installation either successfully
+     * completes or fails.
+     *
+     * @note If the installation is already complete or has already failed, the
+     *       handler is called immediately.
+     */
+    Install* always(const Callback& cb);
+
+    template<class C>
+    Install* always(C* instance, void (C::*mem_func)(Install*))
+    {
+      return always(boost::bind(mem_func, instance, _1));
+    }
+    
+    /**
+     * Set the handler to be called during downloading the installation file
+     * indicating the progress of the download.
+     *
+     */
+    Install* progress(const ProgressCallback& cb);
+
+    template<class C>
+    Install* progress(C* instance,
+                      void (C::*mem_func)(Install*, unsigned int, unsigned int))
+    {
+      return progress(boost::bind(mem_func, instance, _1, _2, _3));
+    }
+
 private:
     friend class Package;
     
     class PackageArchiveDownloader;
     friend class PackageArchiveDownloader;
     
-    Install(Package* aPkg, const SGPath& aPath);
+    Install(PackageRef aPkg, const SGPath& aPath);
     
     void parseRevision();
     void writeRevisionFile();
     
-    Package* m_package;
+    void installResult(Delegate::StatusCode aReason);
+    void installProgress(unsigned int aBytes, unsigned int aTotal);
+    
+    PackageRef m_package;
     unsigned int m_revision; ///< revision on disk
     SGPath m_path; ///< installation point on disk
     
-    PackageArchiveDownloader* m_download;
+    HTTP::Request_ptr m_download;
+
+    Delegate::StatusCode m_status;
+
+    function_list<Callback>         _cb_done,
+                                    _cb_fail,
+                                    _cb_always;
+    function_list<ProgressCallback> _cb_progress;
 };