]> git.mxchange.org Git - simgear.git/blobdiff - simgear/package/Package.hxx
Fix platform check for strerror_r on Mac
[simgear.git] / simgear / package / Package.hxx
index 416384d84e41a0cb1dbd1ec919f3fa7a26a1ce58..840a22cd66d2458f47fa1c4630e1e5eec2a4403e 100644 (file)
@@ -1,3 +1,20 @@
+// 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_PACKAGE_HXX
 #define SG_PACKAGE_PACKAGE_HXX
 
@@ -7,6 +24,10 @@
 #include <simgear/props/props.hxx>
 #include <simgear/misc/strutils.hxx>
 
+#include <simgear/structure/function_list.hxx>
+#include <simgear/structure/SGReferenced.hxx>
+#include <simgear/structure/SGSharedPtr.hxx>
+
 typedef std::set<std::string> string_set;
 
 namespace simgear
@@ -18,46 +39,136 @@ namespace pkg
 // forward decls
 class Install;
 class Catalog;
+class Package;
+  
+typedef SGSharedPtr<Package> PackageRef;
+typedef SGSharedPtr<Catalog> CatalogRef;
+typedef SGSharedPtr<Install> InstallRef;
 
-class Package
+typedef std::vector<PackageRef> PackageList;
+    
+  class Package : public SGReferenced
 {
 public:
+
+    typedef boost::function<void(Package*, Install*)> InstallCallback;
+
     /**
      * get or create an install for the package
      */
-    Install* install();
-    
+    InstallRef install();
+
+    InstallRef
+    existingInstall(const InstallCallback& cb = InstallCallback()) const;
+
     bool isInstalled() const;
     
     std::string id() const;
+
+    /**
+     * Variant IDs. Note the primary ID will always be included as 
+     * variants()[0], to simplify enumerating all variants
+     */
+    string_list variants() const;
+
+    /**
+     * Fully-qualified ID, including our catalog'd ID
+     */
+    std::string qualifiedId() const;
+
+    /**
+     * Fully-qualified ID, including our catalog'd ID
+     */
+    std::string qualifiedVariantId(const unsigned int variantIndex) const;
+    
+    /**
+     * human-readable name - note this is probably not localised,
+     * although this is not ruled out for the future.
+     */
+    std::string name() const;
+
+    /**
+     * Human readable name of a variant
+     */
+    std::string nameForVariant(const std::string& vid) const;
+
+    std::string nameForVariant(const unsigned int vIndex) const;
+
+    /**
+     * syntactic sugar to get the localised description
+     */
+    std::string description() const;
     
+    /**
+     * access the raw property data in the package
+     */
+    SGPropertyNode* properties() const;
+    
+    /**
+     * hex-encoded MD5 sum of the download files
+     */
     std::string md5() const;
     
     std::string getLocalisedProp(const std::string& aName) const;
 
     unsigned int revision() const;
-    
-    Catalog* catalog() const
+  
+    size_t fileSizeBytes() const;
+  
+    CatalogRef catalog() const
         { return m_catalog; }
     
     bool matches(const SGPropertyNode* aFilter) const;
-    
+
+    string_set tags() const;
+
+    /**
+     * download URLs for the package
+     */
     string_list downloadUrls() const;
+    
+    string_list thumbnailUrls() const;
+    
+    /**
+     * thumbnail file paths within the package on disk
+     */
+    string_list thumbnails() const;
+    
+    /**
+     * Packages we depend upon.
+     * If the dependency list cannot be satisifed for some reason,
+     * this will raise an sg_exception.
+     */
+    PackageList dependencies() const;
+
+    /**
+     * Name of the package directory on disk. This may or may not be the
+     * same as the primary ID, depending on the aircraft author
+     */
+    std::string dirName() const;
 private:
+    SGPath pathOnDisk() const;
+
     friend class Catalog;
+    friend class Root;
     
-    Package(const SGPropertyNode* aProps, Catalog* aCatalog);
+    Package(const SGPropertyNode* aProps, CatalogRef aCatalog);
     
     void initWithProps(const SGPropertyNode* aProps);
-    
+
+    void updateFromProps(const SGPropertyNode* aProps);
+
     std::string getLocalisedString(const SGPropertyNode* aRoot, const char* aName) const;
     
     SGPropertyNode_ptr m_props;
+    std::string m_id;
     string_set m_tags;
-    Catalog* m_catalog;
+    CatalogRef m_catalog;
+
+    mutable function_list<InstallCallback> _install_cb;
 };
 
-typedef std::vector<Package*> PackageList;
+
 
 
 } // of namespace pkg