summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Galiszewski <piotr@galiszewski.pl>2010-07-14 17:37:32 +0200
committerPiotr Galiszewski <piotr@galiszewski.pl>2010-07-21 16:20:03 +0200
commitd5801d3fef51517e849a33a8ca9f9da5bfb179eb (patch)
treed85a14da9b55d3ff35769b236b16d67edee08fd1
parentc16ff0960ef77a22d6e9ac313bc6034b00116f05 (diff)
downloadaptitude-d5801d3fef51517e849a33a8ca9f9da5bfb179eb.tar.gz
Introduce package and version classes
-rw-r--r--src/qt/Makefile.am6
-rw-r--r--src/qt/package.cc257
-rw-r--r--src/qt/package.h170
-rw-r--r--src/qt/version.cc155
-rw-r--r--src/qt/version.h118
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