]> git.mxchange.org Git - simgear.git/blobdiff - simgear/package/Root.hxx
Expand package-system unit-tests.
[simgear.git] / simgear / package / Root.hxx
index 576b23c7d29777936cb9bbdc28d806609c87b51b..69ac4804cbfa57d91db16051d2e51b850abfd45c 100644 (file)
@@ -1,22 +1,41 @@
-
+// Copyright (C) 2013  James Turner - zakalawe@mac.com
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
 
 #ifndef SG_PACKAGE_ROOT_HXX
 #define SG_PACKAGE_ROOT_HXX
 
 #include <vector>
-#include <map>
-#include <deque>
-#include <set>
+#include <memory> // for auto_ptr
 
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/package/Delegate.hxx>
 
+#include <simgear/structure/SGReferenced.hxx>
+#include <simgear/structure/SGSharedPtr.hxx>
+
 class SGPropertyNode;
 
 namespace simgear
 {
     
-namespace HTTP { class Client; }
+namespace HTTP {
+    class Client;
+    class Request;
+}
     
 namespace pkg
 {
@@ -25,34 +44,60 @@ namespace pkg
 class Package;
 class Catalog;
 class Install;
-
-typedef std::vector<Package*> PackageList;
-typedef std::vector<Catalog*> CatalogList;
-
-typedef std::map<std::string, Catalog*> CatalogDict;
-
-class Root
+  
+typedef SGSharedPtr<Package> PackageRef;
+typedef SGSharedPtr<Catalog> CatalogRef;
+typedef SGSharedPtr<Install> InstallRef;
+  
+typedef std::vector<PackageRef> PackageList;
+typedef std::vector<CatalogRef> CatalogList;
+
+class Root : public SGReferenced
 {
 public:
-    Root(const SGPath& aPath);
+    Root(const SGPath& aPath, const std::string& aVersion);
     virtual ~Root();
     
-    SGPath path() const
-        { return m_path; }
+    SGPath path() const;
     
     void setLocale(const std::string& aLocale);
         
-    void setDelegate(Delegate* aDelegate);
-        
+    void addDelegate(Delegate* aDelegate);
+    
+    void removeDelegate(Delegate* aDelegate);
+    
     std::string getLocale() const;
     
     CatalogList catalogs() const;
         
-    void setMaxAgeSeconds(int seconds);
-
+    void setMaxAgeSeconds(unsigned int seconds);
+    unsigned int maxAgeSeconds() const;
+    
     void setHTTPClient(HTTP::Client* aHTTP);
 
-    HTTP::Client* getHTTPClient() const;
+    /**
+     * Submit an HTTP request. The Root may delay or queue requests if it needs
+     * too, for example during startup when the HTTP engine may not have been
+     * set yet.
+     */
+    void makeHTTPRequest(HTTP::Request* req);
+
+    /**
+     * Cancel an HTTP request.
+     */
+    void cancelHTTPRequest(HTTP::Request* req, const std::string& reason);
+    
+    /**
+     * The catalog XML/property version in use. This is used to make incomaptible
+     * changes to the package/catalog syntax
+     */
+    int catalogVersion() const;
+
+    /**
+     * the version string of the application. Catalogs must match this version,
+     * or they will be ignored / rejected.
+     */
+    std::string applicationVersion() const;
 
     /**
      * refresh catalogs which are more than the maximum age (24 hours by default)
@@ -60,6 +105,11 @@ public:
      */
     void refresh(bool aForce = false);
 
+    /**
+     *
+     */
+    PackageList allPackages() const;
+    
     /**
      * retrieve packages matching a filter.
      * filter consists of required / minimum values, AND-ed together.
@@ -72,37 +122,50 @@ public:
      */ 
     PackageList packagesNeedingUpdate() const;
      
-    Package* getPackageById(const std::string& aId) const;
+    PackageRef getPackageById(const std::string& aId) const;
     
-    Catalog* getCatalogById(const std::string& aId) const;
+    CatalogRef getCatalogById(const std::string& aId) const;
     
-    void scheduleToUpdate(Install* aInstall);
+    void scheduleToUpdate(InstallRef aInstall);
+    
+    /**
+     * remove a catalog. Will uninstall all packages originating
+     * from the catalog too.
+     */
+    bool removeCatalogById(const std::string& aId);
+    
+    /**
+     * request thumbnail data from the cache / network
+     */
+    void requestThumbnailData(const std::string& aUrl);
+    
+    bool isInstallQueued(InstallRef aInstall) const;
 private:
     friend class Install;
     friend class Catalog;    
+    friend class Package;
     
-
-    void catalogRefreshBegin(Catalog* aCat);
-    void catalogRefreshComplete(Catalog* aCat, bool aSuccess);
-        
-    void startNext(Install* aCurrent);
+    InstallRef existingInstallForPackage(PackageRef p) const;
     
-    void startInstall(Install* aInstall);
-    void installProgress(Install* aInstall, unsigned int aBytes, unsigned int aTotal);
-    void finishInstall(Install* aInstall);    
-    void failedInstall(Install* aInstall, Delegate::FailureCode aReason);
+    void catalogRefreshStatus(CatalogRef aCat, Delegate::StatusCode aReason);
+        
+    void startNext(InstallRef aCurrent);
     
-    SGPath m_path;
-    std::string m_locale;
-    HTTP::Client* m_http;
-    CatalogDict m_catalogs;
-    unsigned int m_maxAgeSeconds;
-    Delegate* m_delegate;
+    void startInstall(InstallRef aInstall);
+    void installProgress(InstallRef aInstall, unsigned int aBytes, unsigned int aTotal);
+    void finishInstall(InstallRef aInstall, Delegate::StatusCode aReason);
+    void cancelDownload(InstallRef aInstall);
     
-    std::set<Catalog*> m_refreshing;
-    std::deque<Install*> m_updateDeque;
-};  
+    void registerInstall(InstallRef ins);
+    void unregisterInstall(InstallRef ins);
     
+    class ThumbnailDownloader;
+    class RootPrivate;
+    std::auto_ptr<RootPrivate> d;
+};
+  
+typedef SGSharedPtr<Root> RootRef;
+  
 } // of namespace pkg
 
 } // of namespace simgear