diff options
author | Piotr Galiszewski <piotr@galiszewski.pl> | 2010-07-14 17:37:32 +0200 |
---|---|---|
committer | Piotr Galiszewski <piotr@galiszewski.pl> | 2010-07-21 16:20:03 +0200 |
commit | d5801d3fef51517e849a33a8ca9f9da5bfb179eb (patch) | |
tree | d85a14da9b55d3ff35769b236b16d67edee08fd1 | |
parent | c16ff0960ef77a22d6e9ac313bc6034b00116f05 (diff) | |
download | aptitude-d5801d3fef51517e849a33a8ca9f9da5bfb179eb.tar.gz |
Introduce package and version classes
-rw-r--r-- | src/qt/Makefile.am | 6 | ||||
-rw-r--r-- | src/qt/package.cc | 257 | ||||
-rw-r--r-- | src/qt/package.h | 170 | ||||
-rw-r--r-- | src/qt/version.cc | 155 | ||||
-rw-r--r-- | src/qt/version.h | 118 |
5 files changed, 705 insertions, 1 deletions
diff --git a/src/qt/Makefile.am b/src/qt/Makefile.am index fef5d547..cca05516 100644 --- a/src/qt/Makefile.am +++ b/src/qt/Makefile.am @@ -37,9 +37,13 @@ libqt_a_SOURCES= \ widgets/tab_widget.h \ windows/main_window.cc \ windows/main_window.h \ + package.cc \ + package.h \ qt_main.cc \ qt_main.h \ tabs_manager.cc \ - tabs_manager.h + tabs_manager.h \ + version.cc \ + version.h BUILT_SOURCES = $(libqt_a_MOC) diff --git a/src/qt/package.cc b/src/qt/package.cc new file mode 100644 index 00000000..59b04119 --- /dev/null +++ b/src/qt/package.cc @@ -0,0 +1,257 @@ +/** \file package.cc */ +// +// Copyright 1999-2008 Daniel Burrows +// Copyright 2008 Obey Arthur Liu +// Copyright (C) 2010 Piotr Galiszewski +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program 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 +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; see the file COPYING. If not, write to +// the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. + +// Local includes +#include "package.h" + +#include "aptitude.h" +#include "solution_fragment.h" // For archives_text. + +#include <generic/apt/apt.h> +#include <generic/apt/config_signal.h> + +// System includes +#include <apt-pkg/pkgcache.h> +#include <apt-pkg/strutl.h> +#include <apt-pkg/pkgrecords.h> + +namespace cw = cwidget; + +using aptitude::apt::get_tags; +using aptitude::apt::tag; +using aptitude::description_element_ref; +using aptitude::parse_desc; +using boost::make_shared; +using cw::util::transcode; + +namespace aptitude +{ + namespace gui + { + namespace qt + { + package_ptr package::create(const pkgCache::PkgIterator &pkg) + { + return make_shared<package>(pkg); + } + + package::package(const pkgCache::PkgIterator &_pkg) + : pkg(_pkg) + { + // name is always used during during initial sorting. + // So lazy loading doesn't have sense here. + name = pkg.Name(); + } + + package::~package() + { + } + + const pkgCache::PkgIterator &package::get_pkg() const + { + return pkg; + } + + const version_ptr &package::get_candidate_ver() const + { + if(!candidate_ver) + { + pkgDepCache::StateCache &state = (*apt_cache_file)[pkg]; + + pkgCache::VerIterator candver = state.CandidateVerIter(*apt_cache_file); + + if(!candver.end()) + candidate_ver = version::create(candver); + else + candidate_ver = version_ptr(); + } + return *candidate_ver; + } + + const version_ptr &package::get_visible_ver() const + { + if(!visible_ver) + { + pkgDepCache::StateCache &state = (*apt_cache_file)[pkg]; + + if(get_candidate_ver()) + visible_ver = get_candidate_ver(); + else if(pkg.CurrentVer().end() && state.Install()) + visible_ver = version::create(state.InstVerIter(*apt_cache_file)); + else if(!pkg.CurrentVer().end()) + visible_ver = version::create(pkg.CurrentVer()); + else if(!pkg.VersionList().end()) + visible_ver = version::create(pkg.VersionList()); + else + visible_ver = version_ptr(); + } + return *visible_ver; + } + + package::version_iterator package::versions_begin() const + { + if(!versions) + load_versions(); + + return (*versions).begin(); + } + + package::version_iterator package::versions_end() const + { + if(!versions) + load_versions(); + + return (*versions).end(); + } + + package::tag_iterator package::tags_begin() const + { + if(!tags) + tags = aptitude::apt::get_tags(pkg); + + return (*tags).begin(); + } + + package::tag_iterator package::tags_end() const + { + if(!tags) + tags = aptitude::apt::get_tags(pkg); + + return (*tags).end(); + } + + void package::load_versions() const + { + versions = std::vector<version_ptr>(); + + for(pkgCache::VerIterator i=pkg.VersionList(); !i.end(); i++) + if(i!=get_visible_ver()->get_ver()) + (*versions).push_back(version::create(i)); + else + (*versions).push_back(get_visible_ver()); + } + + const std::string &package::get_archive() const + { + return get_visible_ver() + ? get_visible_ver()->get_archive() + : empty_string; + } + + const std::string &package::get_candidate_version() const + { + return get_candidate_ver() + ? get_candidate_ver()->get_version_number() + : empty_string; + } + + const std::string &package::get_current_version() const + { + if(!current_version) + current_version = pkg.CurrentVer() + ? pkg.CurrentVer().VerStr() + : std::string(); + + return *current_version; + } + + const std::string &package::get_homepage() const + { + return get_visible_ver() + ? get_visible_ver()->get_homepage() + : empty_string; + } + + const std::string &package::get_maintainer() const + { + return get_visible_ver() + ? get_visible_ver()->get_maintainer() + : empty_string; + } + + const std::string &package::get_name() const + { + return name; + } + + const std::vector<description_element_ref> &package::get_parsed_long_description() const + { + return get_visible_ver() + ? get_visible_ver()->get_parsed_long_description() + : long_description_fallback; + } + + const std::string &package::get_priority() const + { + return get_visible_ver() + ? get_visible_ver()->get_priority() + : empty_string; + } + + const std::wstring &package::get_raw_long_description() const + { + return get_visible_ver() + ? get_visible_ver()->get_raw_long_description() + : empty_wstring; + } + + const std::string &package::get_section() const + { + if(!get_visible_ver()) + return empty_string; + + if(!section) + section = pkg.Section() + ? pkg.Section() + : _("Unknown"); + + return *section; + } + + const std::string &package::get_short_description() const + { + if(!get_visible_ver()) + { + if(!short_desc_fallback) + short_desc_fallback = _("virtual"); + + return *short_desc_fallback; + } + + return get_visible_ver()->get_short_description(); + } + + const std::string &package::get_source_package() const + { + if(!get_visible_ver()) + return empty_string; + + if(!source_package) + { + source_package = get_visible_ver()->get_source_package(); + if((*source_package).empty()) + source_package = get_name(); + } + return *source_package; + } + } + } +} diff --git a/src/qt/package.h b/src/qt/package.h new file mode 100644 index 00000000..ba6ece60 --- /dev/null +++ b/src/qt/package.h @@ -0,0 +1,170 @@ +/** \file package.h */ // -*-c++-*- +// +// Copyright 1999-2008 Daniel Burrows +// Copyright 2008 Obey Arthur Liu +// Copyright (C) 2010 Piotr Galiszewski +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program 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 +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; see the file COPYING. If not, write to +// the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. + +#ifndef APTITUDE_QT_PACKAGE_H +#define APTITUDE_QT_PACKAGE_H + +// Local includes +#include "version.h" + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <generic/apt/desc_parse.h> +#include <generic/apt/tags.h> + +// System includes +#include <apt-pkg/pkgcache.h> + +#include <boost/make_shared.hpp> +#include <boost/optional.hpp> +#include <boost/shared_ptr.hpp> +#include <boost/utility.hpp> + +#include <set> +#include <vector> + +#ifdef HAVE_QT +#include <QtCore/QMetaType> +#endif + +using aptitude::apt::tag; +using boost::make_shared; +using boost::optional; + +namespace aptitude +{ + namespace gui + { + namespace qt + { + class package; + typedef boost::shared_ptr<package> package_ptr; + + /** \brief An object representing a displayable package. + * + * This class contains methods extracting package informations. Except name + * (which is loaded during object creation), every component is lazy loaded + * on the first request for its value. + * + * It is also possible to retrieve the raw PkgIterator object for this package. + */ + class package : boost::noncopyable + { + friend boost::shared_ptr<package> make_shared<package>(const pkgCache::PkgIterator &); + + const pkgCache::PkgIterator pkg; + mutable boost::optional<version_ptr> candidate_ver; + mutable boost::optional<version_ptr> visible_ver; + + const std::string empty_string; + const std::wstring empty_wstring; + const std::vector<description_element_ref> long_description_fallback; + + mutable boost::optional<std::string> current_version; + mutable std::string name; + mutable boost::optional<std::string> section; + mutable boost::optional<std::string> short_desc_fallback; + mutable boost::optional<std::string> source_package; + mutable boost::optional<std::set<tag> > tags; + mutable boost::optional<std::vector<version_ptr> > versions; + + void load_versions() const; + + /** \brief Create a new package object for the given PkgIterator. */ + explicit package(const pkgCache::PkgIterator &_pkg); + + public: + /** \brief Create a new package object for the given PkgIterator. */ + static package_ptr create(const pkgCache::PkgIterator &pkg); + + ~package(); + + typedef std::vector<version_ptr>::const_iterator version_iterator; + typedef std::set<tag>::const_iterator tag_iterator; + + /** \brief Retrieve all available versions of this package. */ + version_iterator versions_begin() const; + version_iterator versions_end() const; + + /** \brief Retrieve a list of tags for this package. */ + tag_iterator tags_begin() const; + tag_iterator tags_end() const; + + /** \brief Retrieve the archive which contains the candidate version of this package. */ + const std::string &get_archive() const; + + /** \brief Retrieve the candidate version number of this package. */ + const std::string &get_candidate_version() const; + + /** \brief Retrieve the installed version number of this package. */ + const std::string &get_current_version() const; + + /** \brief Retrieve the package's homepage. */ + const std::string &get_homepage() const; + + /** \brief Retrieve the maintainer of this package. */ + const std::string &get_maintainer() const; + + /** \brief Retrieve the name of this package. */ + const std::string &get_name() const; + + /** \brief Retrieve the list of a parsed long description's elements of this package. */ + const std::vector<description_element_ref> &get_parsed_long_description() const; + + /** \brief Retrieve the priority of this version. */ + const std::string &get_priority() const; + + /** \brief Retrieve the raw form of the long description of this package. */ + const std::wstring &get_raw_long_description() const; + + /** \brief Retrieve the section to which this package belongs. */ + const std::string &get_section() const; + + /** \brief Retrieve the short description of this package. */ + const std::string &get_short_description() const; + + /** \brief Retrieve the name of this package's source package. */ + const std::string &get_source_package() const; + + /** \brief Retrieve the PkgIterator corresponding to this package. */ + const pkgCache::PkgIterator &get_pkg() const; + + /** \brief Retrieve the candidate version of this package, or an invalid reference + * if the package has no candidate version. + */ + const version_ptr &get_candidate_ver() const; + + /** \brief Retrieve the default visible version of this package, or an invalid reference + * if the package has no version. + */ + const version_ptr &get_visible_ver() const; + }; + } + } +} + +#ifdef HAVE_QT +Q_DECLARE_METATYPE(aptitude::gui::qt::package_ptr) +#endif + +#endif // APTITUDE_QT_PACKAGE_H diff --git a/src/qt/version.cc b/src/qt/version.cc new file mode 100644 index 00000000..a85d94ee --- /dev/null +++ b/src/qt/version.cc @@ -0,0 +1,155 @@ +/** \file version.cc */ +// +// Copyright 1999-2008 Daniel Burrows +// Copyright 2008 Obey Arthur Liu +// Copyright (C) 2010 Piotr Galiszewski +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program 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 +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; see the file COPYING. If not, write to +// the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. + +// Local includes +#include "version.h" + +#include "aptitude.h" +#include "solution_fragment.h" // For archives_text. + +#include <generic/apt/apt.h> +#include <generic/apt/config_signal.h> + +// System includes +#include <apt-pkg/pkgcache.h> +#include <apt-pkg/strutl.h> +#include <apt-pkg/pkgrecords.h> + +namespace cw = cwidget; + +using aptitude::description_element_ref; +using aptitude::parse_desc; +using cw::util::transcode; + +namespace aptitude +{ + namespace gui + { + namespace qt + { + version_ptr version::create(const pkgCache::VerIterator &ver) + { + return make_shared<version>(ver); + } + + version::version(const pkgCache::VerIterator &_ver) + : ver(_ver) + { + } + + version::~version() + { + } + + const pkgCache::VerIterator &version::get_ver() const + { + return ver; + } + + const std::string &version::get_archive() const + { + if(!archive) + { + archive = archives_text(ver); + } + return *archive; + } + + const std::string &version::get_homepage() const + { + if(!homepage) + { + pkgRecords::Parser & parser = apt_package_records->Lookup(ver.FileList()); + homepage = parser.Homepage(); + } + return *homepage; + } + + const std::string &version::get_maintainer() const + { + if(!maintainer) + { + pkgRecords::Parser &rec=apt_package_records->Lookup(ver.FileList()); + maintainer = rec.Maintainer().c_str(); + } + return *maintainer; + } + + const std::vector<description_element_ref> &version::get_parsed_long_description() const + { + if(!parsed_long_description) + { + const std::wstring fulldesc = get_long_description(ver, apt_package_records); + + parsed_long_description = std::vector<description_element_ref>(); + + parse_desc(fulldesc, *parsed_long_description); + } + return *parsed_long_description; + } + + const std::string &version::get_priority() const + { + if(!priority) + { + pkgCache::VerIterator &temp = const_cast<pkgCache::VerIterator &>(ver); + priority = temp.PriorityType()?temp.PriorityType():_("Unknown"); + } + return *priority; + } + + const std::wstring &version::get_raw_long_description() const + { + if(!raw_long_description) + raw_long_description = get_long_description(ver, apt_package_records); + + return *raw_long_description; + } + + const std::string &version::get_short_description() const + { + if(!short_description) + short_description = transcode(::get_short_description(ver, apt_package_records), "UTF-8"); + + return *short_description; + } + + const std::string &version::get_source_package() const + { + if(!source_package) + { + pkgRecords::Parser &rec=apt_package_records->Lookup(ver.FileList()); + source_package = rec.SourcePkg().empty()?"":rec.SourcePkg().c_str(); + } + return *source_package; + } + + const std::string &version::get_version_number() const + { + if(!version_number) + version_number = ver.VerStr(); + + return *version_number; + } + } + } +} + diff --git a/src/qt/version.h b/src/qt/version.h new file mode 100644 index 00000000..fdafd029 --- /dev/null +++ b/src/qt/version.h @@ -0,0 +1,118 @@ +/** \file version.h */ // -*-c++-*- +// +// Copyright 1999-2008 Daniel Burrows +// Copyright 2008 Obey Arthur Liu +// Copyright (C) 2010 Piotr Galiszewski +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program 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 +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; see the file COPYING. If not, write to +// the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. + +#ifndef APTITUDE_QT_VERSION_H +#define APTITUDE_QT_VERSION_H + +// Local includes +#include <generic/apt/desc_parse.h> + +// System includes +#include <apt-pkg/pkgcache.h> + +#include <boost/make_shared.hpp> +#include <boost/optional.hpp> +#include <boost/shared_ptr.hpp> +#include <boost/utility.hpp> + +#include <list> +#include <vector> + +using aptitude::description_element_ref; +using boost::make_shared; +using boost::optional; + +namespace aptitude +{ + namespace gui + { + namespace qt + { + class version; + typedef boost::shared_ptr<version> version_ptr; + + /** \brief An object representing a displayable version of a package. + * + * This class contains methods extracting version informations. Every component + * is lazy loaded on the first request for its value. + * + * It is also possible to retrieve the raw VerIterator object for this version. + */ + class version : boost::noncopyable + { + friend boost::shared_ptr<version> make_shared<version>(const pkgCache::VerIterator &); + + const pkgCache::VerIterator ver; + + mutable boost::optional<std::string> archive; + mutable boost::optional<std::string> homepage; + mutable boost::optional<std::string> maintainer; + mutable boost::optional<std::vector<description_element_ref> > parsed_long_description; + mutable boost::optional<std::string> priority; + mutable boost::optional<std::wstring> raw_long_description; + mutable boost::optional<std::string> short_description; + mutable boost::optional<std::string> source_package; + mutable boost::optional<std::string> version_number; + + /** \brief Create a new version object for the given VerIterator. */ + explicit version(const pkgCache::VerIterator &_ver); + + public: + /** \brief Create a new version object for the given VerIterator. */ + static version_ptr create(const pkgCache::VerIterator &ver); + + ~version(); + + /** \brief Retrieve a description of the archives that contain this version. */ + const std::string &get_archive() const; + + /** \brief Retrieve the package's homepage. */ + const std::string &get_homepage() const; + + /** \brief Retrieve the maintainer of this version. */ + const std::string &get_maintainer() const; + + /** \brief Retrieve the list of a parsed long description's elements of this version. */ + const std::vector<description_element_ref> &get_parsed_long_description() const; + + /** \brief Retrieve the priority of this version. */ + const std::string &get_priority() const; + + /** \brief Retrieve the raw form of the long description of this version. */ + const std::wstring &get_raw_long_description() const; + + /** \brief Retrieve the short description of this version. */ + const std::string &get_short_description() const; + + /** \brief Retrieve the name of this version's source package. */ + const std::string &get_source_package() const; + + /** \brief Retrieve the version number of this version. */ + const std::string &get_version_number() const; + + /** \brief Retrieve the VerIterator corresponding to this version. */ + const pkgCache::VerIterator &get_ver() const; + }; + } + } +} + +#endif // APTITUDE_QT_VERSION_H |