From ed156ea6c830aad9386342372bfcaf743a853663 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 13 Jul 2013 16:24:03 +0200 Subject: [PATCH] package[_repo] list: reduce code duplication Introduce helper class PackageInfoPrinter that does the printing and is used by both commands. --- src/bin/package/PackageInfoPrinter.h | 326 ++++++++++++++++++++++++++ src/bin/package/command_list.cpp | 188 +-------------- src/bin/package_repo/Jamfile | 3 +- src/bin/package_repo/command_list.cpp | 230 ++---------------- 4 files changed, 354 insertions(+), 393 deletions(-) create mode 100644 src/bin/package/PackageInfoPrinter.h diff --git a/src/bin/package/PackageInfoPrinter.h b/src/bin/package/PackageInfoPrinter.h new file mode 100644 index 0000000000..7bc6f39ab2 --- /dev/null +++ b/src/bin/package/PackageInfoPrinter.h @@ -0,0 +1,326 @@ +/* + * Copyright 2009-2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef PACKAGE_INFO_PRINTER_H +#define PACKAGE_INFO_PRINTER_H + + +#include + +#include +#include + + +using namespace BPackageKit; +using BPackageKit::BHPKG::BGlobalWritableFileInfoData; +using BPackageKit::BHPKG::BPackageInfoAttributeValue; +using BPackageKit::BHPKG::BUserData; +using BPackageKit::BHPKG::BUserSettingsFileInfoData; + + +class PackageInfoPrinter { +public: + bool PrintAttribute(const BPackageInfoAttributeValue& value) + { + switch (value.attributeID) { + case B_PACKAGE_INFO_NAME: + PrintName(value.string); + break; + + case B_PACKAGE_INFO_SUMMARY: + PrintSummary(value.string); + break; + + case B_PACKAGE_INFO_DESCRIPTION: + PrintDescription(value.string); + break; + + case B_PACKAGE_INFO_VENDOR: + PrintVendor(value.string); + break; + + case B_PACKAGE_INFO_PACKAGER: + PrintPackager(value.string); + break; + + case B_PACKAGE_INFO_BASE_PACKAGE: + PrintBasePackage(value.string); + break; + + case B_PACKAGE_INFO_FLAGS: + PrintFlags(value.unsignedInt); + break; + + case B_PACKAGE_INFO_ARCHITECTURE: + PrintArchitecture(value.unsignedInt); + break; + + case B_PACKAGE_INFO_VERSION: + PrintVersion(value.version); + break; + + case B_PACKAGE_INFO_COPYRIGHTS: + PrintCopyright(value.string); + break; + + case B_PACKAGE_INFO_LICENSES: + PrintLicense(value.string); + break; + + case B_PACKAGE_INFO_URLS: + PrintUrl(value.string); + break; + + case B_PACKAGE_INFO_SOURCE_URLS: + PrintSourceUrl(value.string); + break; + + case B_PACKAGE_INFO_PROVIDES: + PrintProvides(value.resolvable); + break; + + case B_PACKAGE_INFO_REQUIRES: + PrintRequires(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_SUPPLEMENTS: + PrintSupplements(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_CONFLICTS: + PrintConflicts(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_FRESHENS: + PrintFreshens(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_REPLACES: + PrintReplaces(value.string); + break; + + case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: + PrintGlobalWritableFile(value.globalWritableFileInfo); + break; + + case B_PACKAGE_INFO_USER_SETTINGS_FILES: + PrintUserSettingsFile(value.userSettingsFileInfo); + break; + + case B_PACKAGE_INFO_USERS: + PrintUser(value.user); + break; + + case B_PACKAGE_INFO_GROUPS: + PrintGroup(value.string); + break; + + case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: + PrintPostInstallScript(value.string); + break; + + case B_PACKAGE_INFO_INSTALL_PATH: + PrintInstallPath(value.string); + break; + + default: + return false; + } + + return true; + } + + void PrintName(const char* name) const + { + printf("\tname: %s\n", name); + } + + void PrintSummary(const char* summary) const + { + printf("\tsummary: %s\n", summary); + } + + void PrintDescription(const char* description) const + { + printf("\tdescription: %s\n", description); + } + + void PrintVendor(const char* vendor) const + { + printf("\tvendor: %s\n", vendor); + } + + void PrintPackager(const char* packager) const + { + printf("\tpackager: %s\n", packager); + } + + void PrintBasePackage(const char* basePackage) const + { + printf("\tbase package: %s\n", basePackage); + } + + void PrintFlags(uint32 flags) const + { + if (flags == 0) + return; + + printf("\tflags:\n"); + if ((flags & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0) + printf("\t\tapprove_license\n"); + if ((flags & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0) + printf("\t\tsystem_package\n"); + } + + void PrintArchitecture(uint32 architecture) const + { + printf("\tarchitecture: %s\n", + architecture < B_PACKAGE_ARCHITECTURE_ENUM_COUNT + ? BPackageInfo::kArchitectureNames[architecture] + : ""); + } + + void PrintVersion(const BPackageVersionData& version) const + { + printf("\tversion: "); + _PrintPackageVersion(version); + printf("\n"); + } + + void PrintCopyright(const char* copyright) const + { + printf("\tcopyright: %s\n", copyright); + } + + void PrintLicense(const char* license) const + { + printf("\tlicense: %s\n", license); + } + + void PrintUrl(const char* url) const + { + printf("\tURL: %s\n", url); + } + + void PrintSourceUrl(const char* sourceUrl) const + { + printf("\tsource URL: %s\n", sourceUrl); + } + + void PrintProvides(const BPackageResolvableData& provides) const + { + printf("\tprovides: %s", provides.name); + if (provides.haveVersion) { + printf(" = "); + _PrintPackageVersion(provides.version); + } + if (provides.haveCompatibleVersion) { + printf(" (compatible >= "); + _PrintPackageVersion(provides.compatibleVersion); + printf(")"); + } + printf("\n"); + } + + void PrintRequires(const BPackageResolvableExpressionData& requires) const + { + _PrintResolvableExpression("requires", requires); + } + + void PrintSupplements(const BPackageResolvableExpressionData& supplements) + const + { + _PrintResolvableExpression("supplements", supplements); + } + + void PrintConflicts(const BPackageResolvableExpressionData& conflicts) const + { + _PrintResolvableExpression("conflicts", conflicts); + } + + void PrintFreshens(const BPackageResolvableExpressionData& freshens) const + { + _PrintResolvableExpression("freshens", freshens); + } + + void PrintReplaces(const char* replaces) const + { + printf("\treplaces: %s\n", replaces); + } + + void PrintGlobalWritableFile(const BGlobalWritableFileInfoData& info) const + { + printf("\tglobal writable file: %s", info.path); + if (info.isDirectory) + printf( " directory"); + if (info.updateType < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { + printf(" %s\n", + BPackageInfo::kWritableFileUpdateTypes[info.updateType]); + } else + printf("\n"); + } + + void PrintUserSettingsFile(const BUserSettingsFileInfoData& info) const + { + printf("\tuser settings file: %s", info.path); + if (info.isDirectory) + printf( " directory\n"); + else if (info.templatePath != NULL) + printf(" template %s\n", info.templatePath); + else + printf("\n"); + } + + void PrintUser(const BUserData& user) const + { + printf("\tuser: %s\n", user.name); + if (user.realName != NULL) + printf("\t\treal name: %s\n", user.realName); + if (user.home != NULL) + printf("\t\thome: %s\n", user.home); + if (user.shell != NULL) + printf("\t\tshell: %s\n", user.shell); + for (size_t i = 0; i < user.groupCount; i++) + printf("\t\tgroup: %s\n", user.groups[i]); + } + + void PrintGroup(const char* group) const + { + printf("\tgroup: %s\n", group); + } + + void PrintPostInstallScript(const char* script) const + { + printf("\tpost install script: %s\n", script); + } + + void PrintInstallPath(const char* path) const + { + printf("\tinstall path: %s\n", path); + } + +private: + static void _PrintPackageVersion(const BPackageVersionData& version) + { + printf("%s", BPackageVersion(version).ToString().String()); + } + + void _PrintResolvableExpression(const char* fieldName, + const BPackageResolvableExpressionData& expression) const + { + printf("\t%s: %s", fieldName, expression.name); + if (expression.haveOpAndVersion) { + printf(" %s ", + expression.op < B_PACKAGE_RESOLVABLE_OP_ENUM_COUNT + ? BPackageResolvableExpression::kOperatorNames[ + expression.op] + : ""); + _PrintPackageVersion(expression.version); + } + printf("\n"); + } +}; + + +#endif // PACKAGE_INFO_PRINTER_H diff --git a/src/bin/package/command_list.cpp b/src/bin/package/command_list.cpp index dee04523ae..fc84b074f6 100644 --- a/src/bin/package/command_list.cpp +++ b/src/bin/package/command_list.cpp @@ -26,6 +26,7 @@ #include #include "package.h" +#include "PackageInfoPrinter.h" using namespace BPackageKit; @@ -81,6 +82,7 @@ template struct PackageContentListHandler : VersionPolicy::PackageContentHandler { PackageContentListHandler(bool listAttributes) : + fPrinter(), fLevel(0), fListAttribute(listAttributes) { @@ -167,182 +169,13 @@ struct PackageContentListHandler : VersionPolicy::PackageContentHandler { virtual status_t HandlePackageAttribute( const BPackageInfoAttributeValue& value) { - switch (value.attributeID) { - case B_PACKAGE_INFO_NAME: - printf("package-attributes:\n"); - printf("\tname: %s\n", value.string); - break; + if (value.attributeID == B_PACKAGE_INFO_NAME) + printf("package-attributes:\n"); - case B_PACKAGE_INFO_SUMMARY: - printf("\tsummary: %s\n", value.string); - break; - - case B_PACKAGE_INFO_DESCRIPTION: - printf("\tdescription: %s\n", value.string); - break; - - case B_PACKAGE_INFO_VENDOR: - printf("\tvendor: %s\n", value.string); - break; - - case B_PACKAGE_INFO_PACKAGER: - printf("\tpackager: %s\n", value.string); - break; - - case B_PACKAGE_INFO_BASE_PACKAGE: - printf("\tbase package: %s\n", value.string); - break; - - case B_PACKAGE_INFO_FLAGS: - if (value.unsignedInt == 0) - break; - printf("\tflags:\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0) - printf("\t\tapprove_license\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0) - printf("\t\tsystem_package\n"); - break; - - case B_PACKAGE_INFO_ARCHITECTURE: - printf("\tarchitecture: %s\n", - BPackageInfo::kArchitectureNames[value.unsignedInt]); - break; - - case B_PACKAGE_INFO_VERSION: - printf("\tversion: "); - _PrintPackageVersion(value.version); - printf("\n"); - break; - - case B_PACKAGE_INFO_COPYRIGHTS: - printf("\tcopyright: %s\n", value.string); - break; - - case B_PACKAGE_INFO_LICENSES: - printf("\tlicense: %s\n", value.string); - break; - - case B_PACKAGE_INFO_URLS: - printf("\tURL: %s\n", value.string); - break; - - case B_PACKAGE_INFO_SOURCE_URLS: - printf("\tsource URL: %s\n", value.string); - break; - - case B_PACKAGE_INFO_PROVIDES: - printf("\tprovides: %s", value.resolvable.name); - if (value.resolvable.haveVersion) { - printf(" = "); - _PrintPackageVersion(value.resolvable.version); - } - if (value.resolvable.haveCompatibleVersion) { - printf(" (compatible >= "); - _PrintPackageVersion(value.resolvable.compatibleVersion); - printf(")"); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REQUIRES: - printf("\trequires: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_SUPPLEMENTS: - printf("\tsupplements: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_CONFLICTS: - printf("\tconflicts: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_FRESHENS: - printf("\tfreshens: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REPLACES: - printf("\treplaces: %s\n", value.string); - break; - - case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: - printf("\tglobal writable file: %s", - value.globalWritableFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) - printf( " directory"); - if (value.globalWritableFileInfo.updateType - < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { - printf(" %s\n", - BPackageInfo::kWritableFileUpdateTypes[ - value.globalWritableFileInfo.updateType]); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USER_SETTINGS_FILES: - printf("\tuser settings file: %s", - value.userSettingsFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) { - printf( " directory\n"); - } else if (value.userSettingsFileInfo.templatePath != NULL) { - printf(" template %s\n", - value.userSettingsFileInfo.templatePath); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USERS: - printf("\tuser: %s\n", value.user.name); - if (value.user.realName != NULL) - printf("\t\treal name: %s\n", value.user.realName); - if (value.user.home != NULL) - printf("\t\thome: %s\n", value.user.home); - if (value.user.shell != NULL) - printf("\t\tshell: %s\n", value.user.shell); - for (size_t i = 0; i < value.user.groupCount; i++) - printf("\t\tgroup: %s\n", value.user.groups[i]); - break; - - case B_PACKAGE_INFO_GROUPS: - printf("\tgroup: %s\n", value.string); - break; - - case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: - printf("\tpost install script: %s\n", value.string); - break; - - case B_PACKAGE_INFO_INSTALL_PATH: - printf("\tinstall path: %s\n", value.string); - break; - - default: - printf( - "*** Invalid package attribute section: unexpected " - "package attribute id %d encountered\n", value.attributeID); - return B_BAD_DATA; + if (!fPrinter.PrintAttribute(value)) { + printf("*** Invalid package attribute section: unexpected " + "package attribute id %d encountered\n", value.attributeID); + return B_BAD_DATA; } return B_OK; @@ -373,8 +206,9 @@ private: } private: - int fLevel; - bool fListAttribute; + PackageInfoPrinter fPrinter; + int fLevel; + bool fListAttribute; }; diff --git a/src/bin/package_repo/Jamfile b/src/bin/package_repo/Jamfile index fe07930b58..7122a1574d 100644 --- a/src/bin/package_repo/Jamfile +++ b/src/bin/package_repo/Jamfile @@ -2,6 +2,8 @@ SubDir HAIKU_TOP src bin package_repo ; UsePrivateHeaders kernel shared ; +UseHeaders [ FDirName $(HAIKU_TOP) src bin package ] ; + DEFINES += B_ENABLE_INCOMPLETE_POSIX_AT_SUPPORT ; # TODO: Remove when it is complete! @@ -13,4 +15,3 @@ BinCommand package_repo : package be $(TARGET_LIBSUPC++) ; - diff --git a/src/bin/package_repo/command_list.cpp b/src/bin/package_repo/command_list.cpp index 3b95f3ee6f..48570c5156 100644 --- a/src/bin/package_repo/command_list.cpp +++ b/src/bin/package_repo/command_list.cpp @@ -19,6 +19,7 @@ #include #include "package_repo.h" +#include "PackageInfoPrinter.h" using namespace BPackageKit::BHPKG; @@ -27,6 +28,7 @@ using namespace BPackageKit; struct RepositoryContentListHandler : BRepositoryContentHandler { RepositoryContentListHandler(bool verbose) : + fPrinter(), fLevel(0), fVerbose(verbose) { @@ -40,221 +42,18 @@ struct RepositoryContentListHandler : BRepositoryContentHandler { virtual status_t HandlePackageAttribute( const BPackageInfoAttributeValue& value) { - switch (value.attributeID) { - case B_PACKAGE_INFO_NAME: - if (fVerbose) { - printf("package-attributes:\n"); - printf("\tname: %s\n", value.string); - } else - printf("package: %s", value.string); - break; - - case B_PACKAGE_INFO_SUMMARY: - if (fVerbose) - printf("\tsummary: %s\n", value.string); - break; - - case B_PACKAGE_INFO_DESCRIPTION: - if (fVerbose) - printf("\tdescription: %s\n", value.string); - break; - - case B_PACKAGE_INFO_VENDOR: - if (fVerbose) - printf("\tvendor: %s\n", value.string); - break; - - case B_PACKAGE_INFO_PACKAGER: - if (fVerbose) - printf("\tpackager: %s\n", value.string); - break; - - case B_PACKAGE_INFO_BASE_PACKAGE: - if (fVerbose) - printf("\tbase package: %s\n", value.string); - break; - - case B_PACKAGE_INFO_FLAGS: - if (value.unsignedInt == 0 || !fVerbose) - break; - printf("\tflags:\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0) - printf("\t\tapprove_license\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0) - printf("\t\tsystem_package\n"); - break; - - case B_PACKAGE_INFO_ARCHITECTURE: - if (fVerbose) { - printf("\tarchitecture: %s\n", - BPackageInfo::kArchitectureNames[value.unsignedInt]); - } - break; - - case B_PACKAGE_INFO_VERSION: - if (!fVerbose) - printf("("); - _PrintPackageVersion(value.version); - if (!fVerbose) - printf(")\n"); - break; - - case B_PACKAGE_INFO_COPYRIGHTS: - if (fVerbose) - printf("\tcopyright: %s\n", value.string); - break; - - case B_PACKAGE_INFO_LICENSES: - if (fVerbose) - printf("\tlicense: %s\n", value.string); - break; - - case B_PACKAGE_INFO_URLS: - if (fVerbose) - printf("\tURL: %s\n", value.string); - break; - - case B_PACKAGE_INFO_SOURCE_URLS: - if (fVerbose) - printf("\tsource URL: %s\n", value.string); - break; - - case B_PACKAGE_INFO_PROVIDES: - if (!fVerbose) - break; - printf("\tprovides: %s", value.resolvable.name); - if (value.resolvable.haveVersion) { - printf(" = "); - _PrintPackageVersion(value.resolvable.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REQUIRES: - if (!fVerbose) - break; - printf("\trequires: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_SUPPLEMENTS: - if (!fVerbose) - break; - printf("\tsupplements: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_CONFLICTS: - if (!fVerbose) - break; - printf("\tconflicts: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_FRESHENS: - if (!fVerbose) - break; - printf("\tfreshens: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REPLACES: - if (!fVerbose) - break; - printf("\treplaces: %s\n", value.string); - break; - - case B_PACKAGE_INFO_CHECKSUM: - printf("\tchecksum: %s\n", value.string); - break; - - case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: - if (!fVerbose) - break; - printf("\tglobal writable file: %s", - value.globalWritableFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) - printf( " directory"); - if (value.globalWritableFileInfo.updateType - < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { - printf(" %s\n", - BPackageInfo::kWritableFileUpdateTypes[ - value.globalWritableFileInfo.updateType]); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USER_SETTINGS_FILES: - if (!fVerbose) - break; - printf("\tuser settings file: %s", - value.userSettingsFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) { - printf( " directory\n"); - } else if (value.userSettingsFileInfo.templatePath != NULL) { - printf(" template %s\n", - value.userSettingsFileInfo.templatePath); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USERS: - if (!fVerbose) - break; - printf("\tuser: %s\n", value.user.name); - if (value.user.realName != NULL) - printf("\t\treal name: %s\n", value.user.realName); - if (value.user.home != NULL) - printf("\t\thome: %s\n", value.user.home); - if (value.user.shell != NULL) - printf("\t\tshell: %s\n", value.user.shell); - for (size_t i = 0; i < value.user.groupCount; i++) - printf("\t\tgroup: %s\n", value.user.groups[i]); - break; - - case B_PACKAGE_INFO_GROUPS: - if (!fVerbose) - break; - printf("\tgroup: %s\n", value.string); - break; - - case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: - if (!fVerbose) - break; - printf("\tpost install script: %s\n", value.string); - break; - - case B_PACKAGE_INFO_INSTALL_PATH: - if (!fVerbose) - break; - printf("\tinstall path: %s\n", value.string); - break; - - default: - printf( - "*** Invalid package attribute section: unexpected " + if (value.attributeID == B_PACKAGE_INFO_NAME) { + if (fVerbose) { + printf("package-attributes:\n"); + fPrinter.PrintName(value.string); + } else + printf("package: %s", value.string); + } else { + if (fVerbose && !fPrinter.PrintAttribute(value)) { + printf("*** Invalid package attribute section: unexpected " "package attribute id %d encountered\n", value.attributeID); return B_BAD_DATA; + } } return B_OK; @@ -296,8 +95,9 @@ private: } private: - int fLevel; - bool fVerbose; + PackageInfoPrinter fPrinter; + int fLevel; + bool fVerbose; };