X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fpackage%2FInstall.hxx;h=4e198eba01d53eef35743b05fe807b5a0054f94f;hb=32181a3956a8e7e1cb4bdb5338a260df7d343534;hp=92e2c4fc8b77ddd9be284311b864913371e78a5c;hpb=a53071249171facbbfd0a1840155248f2175dc3c;p=simgear.git diff --git a/simgear/package/Install.hxx b/simgear/package/Install.hxx index 92e2c4fc..4e198eba 100644 --- a/simgear/package/Install.hxx +++ b/simgear/package/Install.hxx @@ -1,9 +1,35 @@ +// 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_INSTALL_HXX #define SG_PACKAGE_INSTALL_HXX #include #include +#include +#include + +#include +#include +#include +#include + +#include namespace simgear { @@ -14,22 +40,33 @@ namespace pkg // forward decls class Package; class Catalog; - +class Install; + +typedef SGSharedPtr PackageRef; +typedef SGSharedPtr CatalogRef; +typedef SGSharedPtr InstallRef; + /** * */ -class Install +class Install : public SGReferenced { public: + virtual ~Install(); + + typedef boost::function Callback; + typedef boost::function + 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 @@ -38,30 +75,120 @@ public: bool hasUpdate() const; void startUpdate(); + + bool uninstall(); + + bool isDownloading() const; + + bool isQueued() const; + + int downloadedPercent() const; - void uninstall(); + size_t downloadedBytes() const; + + /** + * full path to the primary -set.xml file for this install + */ + SGPath primarySetPath() const; + + /** + * 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; -// boost signals time? - // failure - // progress - // completed + /** + * 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 + 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 + 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 + 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 + 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 _cb_done, + _cb_fail, + _cb_always; + function_list _cb_progress; };