root/src/bin/package/PackageInfoPrinter.h
/*
 * 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 <stdio.h>

#include <package/hpkg/PackageInfoAttributeValue.h>
#include <package/PackageInfo.h>


using namespace BPackageKit;
using BPackageKit::BHPKG::BGlobalWritableFileInfoData;
using BPackageKit::BHPKG::BPackageInfoAttributeValue;
using BPackageKit::BHPKG::BUserData;
using BPackageKit::BHPKG::BUserSettingsFileInfoData;


class PackageInfoPrinter {
public:
        void PrintPackageInfo(const BPackageInfo& info)
        {
                PrintName(info.Name());
                PrintSummary(info.Summary());
                PrintDescription(info.Description());
                PrintVendor(info.Vendor());
                PrintPackager(info.Packager());

                if (!info.BasePackage().IsEmpty())
                        PrintBasePackage(info.BasePackage());

                PrintFlags(info.Flags());
                PrintArchitecture((uint32)info.Architecture());
                PrintVersion(info.Version());

                int32 count = info.CopyrightList().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintCopyright(info.CopyrightList().StringAt(i));

                count = info.LicenseList().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintLicense(info.LicenseList().StringAt(i));

                count = info.URLList().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintUrl(info.URLList().StringAt(i));

                count = info.SourceURLList().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintSourceUrl(info.SourceURLList().StringAt(i));

                count = info.ProvidesList().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintProvides(*info.ProvidesList().ItemAt(i));

                count = info.RequiresList().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintRequires(*info.RequiresList().ItemAt(i));

                count = info.SupplementsList().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintSupplements(*info.SupplementsList().ItemAt(i));

                count = info.ConflictsList().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintConflicts(*info.ConflictsList().ItemAt(i));

                count = info.FreshensList().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintFreshens(*info.FreshensList().ItemAt(i));

                count = info.ReplacesList().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintReplaces(info.ReplacesList().StringAt(i));

                count = info.GlobalWritableFileInfos().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintGlobalWritableFile(*info.GlobalWritableFileInfos().ItemAt(i));

                count = info.UserSettingsFileInfos().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintUserSettingsFile(*info.UserSettingsFileInfos().ItemAt(i));

                count = info.Users().CountItems();
                for (int32 i = 0; i < count; i++)
                        PrintUser(*info.Users().ItemAt(i));

                count = info.Groups().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintGroup(info.Groups().StringAt(i));

                count = info.PostInstallScripts().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintPostInstallScript(info.PostInstallScripts().StringAt(i));

                count = info.PreUninstallScripts().CountStrings();
                for (int32 i = 0; i < count; i++)
                        PrintPreUninstallScript(info.PreUninstallScripts().StringAt(i));

                if (!info.InstallPath().IsEmpty())
                        PrintInstallPath(info.InstallPath());
        }

        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_PRE_UNINSTALL_SCRIPTS:
                                PrintPreUninstallScript(value.string);
                                break;

                        case B_PACKAGE_INFO_INSTALL_PATH:
                                PrintInstallPath(value.string);
                                break;

                        case B_PACKAGE_INFO_CHECKSUM:
                                PrintChecksum(value.string);
                                break;

                        default:
                                printf("\tunknown or future attribute: "
                                        "BPackageInfoAttributeID #%d\n", value.attributeID);
                                return true;
                }

                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]
                                : "<invalid>");
        }

        void PrintVersion(const BPackageVersion& version) const
        {
                printf("\tversion: %s\n", version.ToString().String());
        }

        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 BPackageResolvable& provides) const
        {
                printf("\tprovides: %s", provides.Name().String());
                if (provides.Version().InitCheck() == B_OK)
                        printf(" = %s", provides.Version().ToString().String());

                if (provides.CompatibleVersion().InitCheck() == B_OK) {
                        printf(" (compatible >= %s)",
                                provides.CompatibleVersion().ToString().String());
                }
                printf("\n");
        }

        void PrintRequires(const BPackageResolvableExpression& require) const
        {
                _PrintResolvableExpression("requires", require);
        }

        void PrintSupplements(const BPackageResolvableExpression& supplements)
                const
        {
                _PrintResolvableExpression("supplements", supplements);
        }

        void PrintConflicts(const BPackageResolvableExpression& conflicts) const
        {
                _PrintResolvableExpression("conflicts", conflicts);
        }

        void PrintFreshens(const BPackageResolvableExpression& freshens) const
        {
                _PrintResolvableExpression("freshens", freshens);
        }

        void PrintReplaces(const char* replaces) const
        {
                printf("\treplaces: %s\n", replaces);
        }

        void PrintGlobalWritableFile(const BGlobalWritableFileInfo& info) const
        {
                printf("\tglobal writable file: %s", info.Path().String());
                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 BUserSettingsFileInfo& info) const
        {
                printf("\tuser settings file: %s", info.Path().String());
                if (info.IsDirectory())
                        printf( " directory\n");
                else if (!info.TemplatePath().IsEmpty())
                        printf(" template %s\n", info.TemplatePath().String());
                else
                        printf("\n");
        }

        void PrintUser(const BUser& user) const
        {
                printf("\tuser: %s\n", user.Name().String());
                if (!user.RealName().IsEmpty())
                        printf("\t\treal name: %s\n", user.RealName().String());
                if (!user.Home().IsEmpty())
                        printf("\t\thome:      %s\n", user.Home().String());
                if (!user.Shell().IsEmpty())
                        printf("\t\tshell:     %s\n", user.Shell().String());

                int32 groupCount = user.Groups().CountStrings();
                for (int32 i = 0; i < groupCount; i++)
                        printf("\t\tgroup:     %s\n", user.Groups().StringAt(i).String());
        }

        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 PrintPreUninstallScript(const char* script) const
        {
                printf("\tpre-uninstall script: %s\n", script);
        }

        void PrintInstallPath(const char* path) const
        {
                printf("\tinstall path: %s\n", path);
        }

        void PrintChecksum(const char* checksum) const
        {
                printf("\tchecksum: %s\n", checksum);
        }

private:
        void _PrintResolvableExpression(const char* fieldName,
                const BPackageResolvableExpression& expression) const
        {
                printf("\t%s: %s\n", fieldName, expression.ToString().String());
        }
};


#endif  // PACKAGE_INFO_PRINTER_H