|
@@ -25,6 +25,8 @@
|
|
|
#include <signal.h>
|
|
#include <signal.h>
|
|
|
#include <errno.h>
|
|
#include <errno.h>
|
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
|
|
|
+#include <string.h>
|
|
|
|
|
+#include <algorithm>
|
|
|
#include <sstream>
|
|
#include <sstream>
|
|
|
#include <map>
|
|
#include <map>
|
|
|
|
|
|
|
@@ -39,7 +41,38 @@
|
|
|
|
|
|
|
|
using namespace std;
|
|
using namespace std;
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+namespace
|
|
|
|
|
+{
|
|
|
|
|
+ // Maps the dpkg "processing" info to human readable names. Entry 0
|
|
|
|
|
+ // of each array is the key, entry 1 is the value.
|
|
|
|
|
+ const std::pair<const char *, const char *> PackageProcessingOps[] = {
|
|
|
|
|
+ std::make_pair("install", N_("Installing %s")),
|
|
|
|
|
+ std::make_pair("configure", N_("Configuring %s")),
|
|
|
|
|
+ std::make_pair("remove", N_("Removing %s")),
|
|
|
|
|
+ std::make_pair("trigproc", N_("Running post-installation trigger %s"))
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const std::pair<const char *, const char *> * const PackageProcessingOpsBegin = PackageProcessingOps;
|
|
|
|
|
+ const std::pair<const char *, const char *> * const PackageProcessingOpsEnd = PackageProcessingOps + sizeof(PackageProcessingOps) / sizeof(PackageProcessingOps[0]);
|
|
|
|
|
+
|
|
|
|
|
+ // Predicate to test whether an entry in the PackageProcessingOps
|
|
|
|
|
+ // array matches a string.
|
|
|
|
|
+ class MatchProcessingOp
|
|
|
|
|
+ {
|
|
|
|
|
+ const char *target;
|
|
|
|
|
+
|
|
|
|
|
+ public:
|
|
|
|
|
+ MatchProcessingOp(const char *the_target)
|
|
|
|
|
+ : target(the_target)
|
|
|
|
|
+ {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ bool operator()(const std::pair<const char *, const char *> &pair) const
|
|
|
|
|
+ {
|
|
|
|
|
+ return strcmp(pair.first, target) == 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
// DPkgPM::pkgDPkgPM - Constructor /*{{{*/
|
|
// DPkgPM::pkgDPkgPM - Constructor /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------
|
|
@@ -362,17 +395,19 @@ void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line)
|
|
|
if(strncmp(list[0], "processing", strlen("processing")) == 0)
|
|
if(strncmp(list[0], "processing", strlen("processing")) == 0)
|
|
|
{
|
|
{
|
|
|
char s[200];
|
|
char s[200];
|
|
|
- map<string,string>::iterator iter;
|
|
|
|
|
char *pkg_or_trigger = _strstrip(list[2]);
|
|
char *pkg_or_trigger = _strstrip(list[2]);
|
|
|
action =_strstrip( list[1]);
|
|
action =_strstrip( list[1]);
|
|
|
- iter = PackageProcessingOps.find(action);
|
|
|
|
|
- if(iter == PackageProcessingOps.end())
|
|
|
|
|
|
|
+ const std::pair<const char *, const char *> * const iter =
|
|
|
|
|
+ std::find_if(PackageProcessingOpsBegin,
|
|
|
|
|
+ PackageProcessingOpsEnd,
|
|
|
|
|
+ MatchProcessingOp(action));
|
|
|
|
|
+ if(iter == PackageProcessingOpsEnd)
|
|
|
{
|
|
{
|
|
|
if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
|
|
if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
|
|
|
std::clog << "ignoring unknwon action: " << action << std::endl;
|
|
std::clog << "ignoring unknwon action: " << action << std::endl;
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- snprintf(s, sizeof(s), _(iter->second.c_str()), pkg_or_trigger);
|
|
|
|
|
|
|
+ snprintf(s, sizeof(s), _(iter->second), pkg_or_trigger);
|
|
|
|
|
|
|
|
status << "pmstatus:" << pkg_or_trigger
|
|
status << "pmstatus:" << pkg_or_trigger
|
|
|
<< ":" << (PackagesDone/float(PackagesTotal)*100.0)
|
|
<< ":" << (PackagesDone/float(PackagesTotal)*100.0)
|
|
@@ -601,12 +636,6 @@ bool pkgDPkgPM::Go(int OutStatusFd)
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- // populate the "processing" map
|
|
|
|
|
- PackageProcessingOps.insert( make_pair("install",N_("Installing %s")) );
|
|
|
|
|
- PackageProcessingOps.insert( make_pair("configure",N_("Configuring %s")) );
|
|
|
|
|
- PackageProcessingOps.insert( make_pair("remove",N_("Removing %s")) );
|
|
|
|
|
- PackageProcessingOps.insert( make_pair("trigproc",N_("Running post-installation trigger %s")) );
|
|
|
|
|
-
|
|
|
|
|
// init the PackageOps map, go over the list of packages that
|
|
// init the PackageOps map, go over the list of packages that
|
|
|
// that will be [installed|configured|removed|purged] and add
|
|
// that will be [installed|configured|removed|purged] and add
|
|
|
// them to the PackageOps map (the dpkg states it goes through)
|
|
// them to the PackageOps map (the dpkg states it goes through)
|