X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fpackage%2Fpkgutil.cxx;h=bcbe8318226060ebd76d0965191cac454537cb36;hb=32181a3956a8e7e1cb4bdb5338a260df7d343534;hp=c72c1f176c8b304d2642992ade93d2a44c1538bc;hpb=a53071249171facbbfd0a1840155248f2175dc3c;p=simgear.git diff --git a/simgear/package/pkgutil.cxx b/simgear/package/pkgutil.cxx index c72c1f17..bcbe8318 100644 --- a/simgear/package/pkgutil.cxx +++ b/simgear/package/pkgutil.cxx @@ -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. +// + #include #include #include @@ -9,55 +26,145 @@ #include #include -using namespace simgear; +using namespace simgear; using namespace std; bool keepRunning = true; +class MyDelegate : public pkg::Delegate +{ +public: + virtual void catalogRefreshed(pkg::CatalogRef aCatalog, StatusCode aReason) + { + if (aReason == STATUS_REFRESHED) { + if (aCatalog.ptr() == NULL) { + cout << "refreshed all catalogs" << endl; + } else { + cout << "refreshed catalog " << aCatalog->url() << endl; + } + } else if (aReason == STATUS_IN_PROGRESS) { + cout << "started refresh of " << aCatalog->url() << endl; + } else { + cerr << "failed refresh of " << aCatalog->url() << ":" << aReason << endl; + } + } + + virtual void startInstall(pkg::InstallRef aInstall) + { + _lastPercent = 999; + cout << "starting install of " << aInstall->package()->name() << endl; + } + + virtual void installProgress(pkg::InstallRef aInstall, unsigned int bytes, unsigned int total) + { + unsigned int percent = (bytes * 100) / total; + if (percent == _lastPercent) { + return; + } + + _lastPercent = percent; + cout << percent << "%" << endl; + } + + virtual void finishInstall(pkg::InstallRef aInstall, StatusCode aReason) + { + if (aReason == STATUS_SUCCESS) { + cout << "done install of " << aInstall->package()->name() << endl; + } else { + cerr << "failed install of " << aInstall->package()->name() << endl; + } + } + +private: + unsigned int _lastPercent; + +}; + +void printRating(pkg::Package* pkg, const std::string& aRating, const std::string& aLabel) +{ + SGPropertyNode* ratings = pkg->properties()->getChild("rating"); + cout << "\t" << aLabel << ":" << ratings->getIntValue(aRating) << endl; +} + +void printPackageInfo(pkg::Package* pkg) +{ + cout << "Package:" << pkg->catalog()->id() << "." << pkg->id() << endl; + cout << "Revision:" << pkg->revision() << endl; + cout << "Name:" << pkg->name() << endl; + cout << "Description:" << pkg->description() << endl; + cout << "Long description:\n" << pkg->getLocalisedProp("long-description") << endl << endl; + + if (pkg->properties()->hasChild("author")) { + cout << "Authors:" << endl; + BOOST_FOREACH(SGPropertyNode* author, pkg->properties()->getChildren("author")) { + if (author->hasChild("name")) { + cout << "\t" << author->getStringValue("name") << endl; + + } else { + // simple author structure + cout << "\t" << author->getStringValue() << endl; + } + + + } + + cout << endl; + } + + cout << "Ratings:" << endl; + printRating(pkg, "fdm", "Flight-model "); + printRating(pkg, "cockpit", "Cockpit "); + printRating(pkg, "model", "3D model "); + printRating(pkg, "systems", "Aircraft systems"); +} + int main(int argc, char** argv) { HTTP::Client* http = new HTTP::Client(); - pkg::Root* root = new pkg::Root(Dir::current().path()); - + pkg::Root* root = new pkg::Root(Dir::current().path(), ""); + + MyDelegate dlg; + root->addDelegate(&dlg); + cout << "Package root is:" << Dir::current().path() << endl; - cout << "have " << pkg::Catalog::allCatalogs().size() << " catalog(s)" << endl; - + cout << "have " << root->catalogs().size() << " catalog(s)" << endl; + root->setHTTPClient(http); - + if (!strcmp(argv[1], "add")) { std::string url(argv[2]); pkg::Catalog::createFromUrl(root, url); } else if (!strcmp(argv[1], "refresh")) { - root->refresh(); + root->refresh(true); } else if (!strcmp(argv[1], "install")) { - pkg::Package* pkg = root->getPackageById(argv[2]); + pkg::PackageRef pkg = root->getPackageById(argv[2]); if (!pkg) { cerr << "unknown package:" << argv[2] << endl; return EXIT_FAILURE; } - + if (pkg->isInstalled()) { cout << "package " << pkg->id() << " is already installed at " << pkg->install()->path() << endl; return EXIT_SUCCESS; } - - pkg::Catalog* catalog = pkg->catalog(); + + pkg::CatalogRef catalog = pkg->catalog(); cout << "Will install:" << pkg->id() << " from " << catalog->id() << "(" << catalog->description() << ")" << endl; pkg->install(); - } else if (!strcmp(argv[1], "uninstall")) { - pkg::Package* pkg = root->getPackageById(argv[2]); + } else if (!strcmp(argv[1], "uninstall") || !strcmp(argv[1], "remove")) { + pkg::PackageRef pkg = root->getPackageById(argv[2]); if (!pkg) { cerr << "unknown package:" << argv[2] << endl; return EXIT_FAILURE; } - + if (!pkg->isInstalled()) { cerr << "package " << argv[2] << " not installed" << endl; return EXIT_FAILURE; } - + cout << "Will uninstall:" << pkg->id() << endl; pkg->install()->uninstall(); } else if (!strcmp(argv[1], "update-all")) { @@ -71,13 +178,24 @@ int main(int argc, char** argv) cout << "no packages with updates" << endl; return EXIT_SUCCESS; } - + cout << updates.size() << " packages have updates" << endl; BOOST_FOREACH(pkg::Package* p, updates) { cout << "\t" << p->id() << " " << p->getLocalisedProp("name") << endl; } + } else if (!strcmp(argv[1], "info")) { + pkg::PackageRef pkg = root->getPackageById(argv[2]); + if (!pkg) { + cerr << "unknown package:" << argv[2] << endl; + return EXIT_FAILURE; + } + + printPackageInfo(pkg); + } else { + cerr << "unknown command:" << argv[1] << endl; + return EXIT_FAILURE; } - + while (http->hasActiveRequests()) { http->update(); }