summaryrefslogtreecommitdiffstats
path: root/dselect/pkglist.h
diff options
context:
space:
mode:
Diffstat (limited to 'dselect/pkglist.h')
-rw-r--r--dselect/pkglist.h263
1 files changed, 263 insertions, 0 deletions
diff --git a/dselect/pkglist.h b/dselect/pkglist.h
new file mode 100644
index 0000000..0816d4b
--- /dev/null
+++ b/dselect/pkglist.h
@@ -0,0 +1,263 @@
+/*
+ * dselect - Debian package maintenance user interface
+ * pkglist.h - external definitions for package list handling
+ *
+ * Copyright © 1994,1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
+ * Copyright © 2001 Wichert Akkerman <wakkerma@debian.org>
+ * Copyright © 2007-2014 Guillem Jover <guillem@debian.org>
+ *
+ * This 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 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. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef PKGLIST_H
+#define PKGLIST_H
+
+#include <regex.h>
+
+enum showpriority {
+ dp_none, // has not been involved in any unsatisfied things
+ dp_may, // has been involved in an unsatisfied Suggests
+ dp_should, // has been involved in an unsatisfied Recommends
+ dp_must, // has been involved in an unsatisfied Depends/Conflicts
+};
+
+enum selpriority {
+ // where did the currently suggested value come from, and how important
+ // is it to display this package ?
+ // low
+ sp_inherit, // inherited from our parent list
+ sp_selecting, // propagating a selection
+ sp_deselecting, // propagating a deselection
+ sp_fixed, // it came from the ‘status’ file and we're not a recursive list
+ // high
+};
+
+enum ssavailval { // Availability sorting order, first to last:
+ ssa_broken, // Brokenly-installed and nothing available
+ ssa_notinst_unseen, // Entirely new packages (available but not deselected yet)
+ ssa_installed_newer, // Installed, newer version available
+ ssa_installed_gone, // Installed but no longer available
+ ssa_installed_sameold, // Same or older version available as installed
+ ssa_notinst_seen, // Available but not installed
+ ssa_notinst_gone, // Not available, and only config files left
+ ssa_none = -1,
+};
+
+enum ssstateval { // State sorting order, first to last:
+ sss_broken, // In some way brokenly installed
+ sss_installed, // Installed
+ sss_configfiles, // Config files only
+ sss_notinstalled, // Not installed
+ sss_none = -1,
+};
+
+struct perpackagestate {
+ struct pkginfo *pkg;
+ /* The ‘heading’ entries in the list, for “all packages of type foo”,
+ * point to a made-up pkginfo, which has pkg->name==0.
+ * pkg->priority and pkg->section are set to the values if appropriate, or to
+ * PKG_PRIO_UNSET resp. null if the heading refers to all priorities resp.
+ * sections.
+ * uprec is used when constructing the list initially and when tearing it
+ * down and should not otherwise be used; other fields are undefined.
+ */
+ pkgwant original; // set by caller
+ pkgwant direct; // set by caller
+ pkgwant suggested; // set by caller, modified by resolvesuggest
+ pkgwant selected; // not set by caller, will be set by packagelist
+ selpriority spriority; // monotonically increases (used by sublists)
+ showpriority dpriority; // monotonically increases (used by sublists)
+ struct perpackagestate *uprec; // 0 if this is not part of a recursive list
+ ssavailval ssavail;
+ ssstateval ssstate;
+ varbuf relations;
+
+ void free(bool recursive);
+};
+
+class packagelist : public baselist {
+protected:
+ column col_status;
+ column col_section;
+ column col_priority;
+ column col_package;
+ column col_archinstalled;
+ column col_archavailable;
+ column col_versioninstalled;
+ column col_versionavailable;
+ column col_description;
+
+ // Only used when ‘verbose’ is set
+ column col_status_hold;
+ column col_status_status;
+ column col_status_old_want;
+ column col_status_new_want;
+
+ // Table of packages
+ struct perpackagestate *datatable;
+ struct perpackagestate **table;
+
+ // Misc.
+ int nallocated;
+ bool recursive, verbose;
+ enum {
+ so_unsorted,
+ so_section,
+ so_priority,
+ so_alpha,
+ } sortorder;
+ enum {
+ sso_unsorted,
+ sso_avail,
+ sso_state,
+ } statsortorder;
+ enum {
+ ado_none,
+ ado_available,
+ ado_both,
+ } archdisplayopt;
+ enum {
+ vdo_none,
+ vdo_available,
+ vdo_both,
+ } versiondisplayopt;
+ bool calcssadone, calcsssdone;
+ struct perpackagestate *headings;
+
+ // Package searching flags
+ bool searchdescr;
+ regex_t searchfsm;
+
+ // Information displays
+ struct infotype {
+ bool (packagelist::*relevant)(); // null means always relevant
+ void (packagelist::*display)(); // null means end of table
+ };
+ const infotype *currentinfo;
+ static const infotype infoinfos[];
+ static const infotype *const baseinfo;
+ bool itr_recursive();
+ bool itr_nonrecursive();
+ void severalinfoblurb();
+ void itd_mainwelcome();
+ void itd_explaindisplay();
+ void itd_recurwelcome();
+ void itd_relations();
+ void itd_description();
+ void itd_statuscontrol();
+ void itd_availablecontrol();
+
+ // Dependency and sublist processing
+ struct doneent { doneent *next; void *dep; } *depsdone, *unavdone;
+ bool alreadydone(doneent **, void *);
+ int resolvedepcon(dependency*);
+ int checkdependers(pkginfo*, int changemade); // returns new changemade
+ int deselect_one_of(pkginfo *er, pkginfo *ed, dependency *dep);
+
+ // Define these virtuals
+ bool checksearch(char *str) override;
+ bool matchsearch(int index) override;
+ void redraw1itemsel(int index, int selected) override;
+ void redrawcolheads() override;
+ void redrawthisstate() override;
+ void redrawinfo() override;
+ void redrawtitle() override;
+ void setwidths() override;
+ const char *itemname(int index) override;
+ const struct helpmenuentry *helpmenulist() override;
+
+ // Miscellaneous internal routines
+
+ void redraw1package(int index, int selected);
+ int compareentries(const struct perpackagestate *a, const struct perpackagestate *b);
+ friend int qsort_compareentries(const void *a, const void *b);
+ pkgwant reallywant(pkgwant, struct perpackagestate *);
+ int describemany(char buf[], const char *prioritystring, const char *section,
+ const struct perpackagestate *pps);
+ bool deppossatisfied(deppossi *possi, perpackagestate **fixbyupgrade);
+
+ void sortmakeheads();
+ void resortredisplay();
+ void movecursorafter(int ncursor);
+ void initialsetup();
+ void finalsetup();
+ void ensurestatsortinfo();
+
+ // To do with building the list, with heading lines in it
+ void discardheadings();
+ void addheading(enum ssavailval, enum ssstateval,
+ pkgpriority, const char *, const char *section);
+ void sortinplace();
+ bool affectedmatches(struct pkginfo *pkg, struct pkginfo *comparewith);
+ void affectedrange(int *startp, int *endp);
+ void setwant(pkgwant nw);
+ void sethold(int hold);
+
+ public:
+
+ // Keybinding functions */
+ void kd_quit_noop();
+ void kd_revert_abort();
+ void kd_revertsuggest();
+ void kd_revertdirect();
+ void kd_revertinstalled();
+ void kd_morespecific();
+ void kd_lessspecific();
+ void kd_swaporder();
+ void kd_swapstatorder();
+ void kd_select();
+ void kd_deselect();
+ void kd_purge();
+ void kd_hold();
+ void kd_unhold();
+ void kd_info();
+ void kd_toggleinfo();
+ void kd_verbose();
+ void kd_archdisplay();
+ void kd_versiondisplay();
+
+ explicit packagelist(keybindings *kb); // nonrecursive
+ packagelist(keybindings *kb, pkginfo **pkgltab); // recursive
+ void add(pkginfo **array) { while (*array) add(*array++); }
+ void add(pkginfo*);
+ void add(pkginfo *, pkgwant);
+ void add(pkginfo*, const char *extrainfo, showpriority displayimportance);
+ bool add(dependency *, showpriority displayimportance);
+ void addunavailable(deppossi*);
+ bool useavailable(pkginfo *);
+ pkgbin *find_pkgbin(pkginfo *);
+
+ int resolvesuggest();
+ int deletelessimp_anyleft(showpriority than);
+ pkginfo **display();
+ ~packagelist();
+};
+
+void repeatedlydisplay(packagelist *sub, showpriority,
+ packagelist *unredisplay = nullptr);
+int would_like_to_install(pkgwant, pkginfo *pkg);
+
+extern const char *const wantstrings[];
+extern const char *const eflagstrings[];
+extern const char *const statusstrings[];
+extern const char *const prioritystrings[];
+extern const char *const priorityabbrevs[];
+extern const char *const relatestrings[];
+extern const char *const ssastrings[], *const ssaabbrevs[];
+extern const char *const sssstrings[], *const sssabbrevs[];
+extern const char statuschars[];
+extern const char eflagchars[];
+extern const char wantchars[];
+
+#endif /* PKGLIST_H */