X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fpackage%2FPackage.hxx;h=840a22cd66d2458f47fa1c4630e1e5eec2a4403e;hb=a3f1bb546fec72b07f11f69934e6894696fea57a;hp=d1e798160695c06b6077db0d0e02713700500c8e;hpb=413e89c955c44ef67cd62bd1416ee0a8cc527c85;p=simgear.git diff --git a/simgear/package/Package.hxx b/simgear/package/Package.hxx index d1e79816..840a22cd 100644 --- a/simgear/package/Package.hxx +++ b/simgear/package/Package.hxx @@ -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 #include +#include +#include +#include + typedef std::set string_set; namespace simgear @@ -19,20 +40,64 @@ namespace pkg class Install; class Catalog; class Package; + +typedef SGSharedPtr PackageRef; +typedef SGSharedPtr CatalogRef; +typedef SGSharedPtr InstallRef; -typedef std::vector PackageList; +typedef std::vector PackageList; -class Package + class Package : public SGReferenced { public: + + typedef boost::function 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 @@ -47,12 +112,16 @@ public: 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 */ @@ -60,24 +129,43 @@ public: 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 _install_cb; };