-
+// 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
{
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)
*/
void refresh(bool aForce = false);
+ /**
+ *
+ */
+ PackageList allPackages() const;
+
/**
* retrieve packages matching a filter.
* filter consists of required / minimum values, AND-ed together.
*/
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