root/src/apps/haikudepot/packagemodel/PackageLocalInfo.h
/*
 * Copyright 2024-2025, Andrew Lindesay <apl@lindesay.co.nz>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */
#ifndef PACKAGE_LOCAL_INFO_H
#define PACKAGE_LOCAL_INFO_H


#include <sys/types.h>

#include <set>

#include <Referenceable.h>
#include <String.h>


typedef std::set<int32> PackageInstallationLocationSet;


enum PackageState {
        NONE            = 0,
        INSTALLED       = 1,
        DOWNLOADING     = 2,
        ACTIVATED       = 3,
        UNINSTALLED     = 4,
        PENDING         = 5,
};


class PackageLocalInfoBuilder;


/*!     Instances of this class should not be created directly; instead use the
        PackageLocalInfoBuilder class as a builder-constructor.
*/
class PackageLocalInfo : public BReferenceable
{
friend class PackageLocalInfoBuilder;

public:
                                                                PackageLocalInfo();
                                                                PackageLocalInfo(const PackageLocalInfo& other);
        virtual                                         ~PackageLocalInfo();

                        bool                            operator==(const PackageLocalInfo& other) const;
                        bool                            operator!=(const PackageLocalInfo& other) const;

                        bool                            IsLocalFile() const;
                        bool                            Viewed() const;
                        const BString&          LocalFilePath() const;
                        const BString&          FileName() const;
                        off_t                           Size() const;
                        int32                           Flags() const;
                        bool                            IsSystemPackage() const;
                        bool                            IsSystemDependency() const;
                        PackageState            State() const;
                        bool                            HasInstallationLocation(int32 location) const;
                        int32                           CountInstallationLocations() const;
                        const PackageInstallationLocationSet&
                                                                InstallationLocations() const;
                        float                           DownloadProgress() const;

private:
                        void                            SetViewed();
                        void                            SetLocalFilePath(const char* path);
                        void                            SetFileName(const BString& value);
                        void                            SetSize(off_t size);
                        void                            SetFlags(int32 value);
                        void                            SetSystemDependency(bool isDependency);
                        void                            SetState(PackageState state);
                        void                            AddInstallationLocation(int32 location);
                        void                            SetDownloadProgress(float progress);

private:
                        bool                            fViewed;
                        BString                         fLocalFilePath;
                        BString                         fFileName;
                        off_t                           fSize;
                        int32                           fFlags;
                        bool                            fSystemDependency;
                        PackageState            fState;
                        PackageInstallationLocationSet
                                                                fInstallationLocations;
                        float                           fDownloadProgress;
};


typedef BReference<PackageLocalInfo> PackageLocalInfoRef;


class PackageLocalInfoBuilder
{
public:
                                                                PackageLocalInfoBuilder();
                                                                PackageLocalInfoBuilder(const PackageLocalInfoRef& value);
        virtual                                         ~PackageLocalInfoBuilder();

                        PackageLocalInfoRef     BuildRef();

                        PackageLocalInfoBuilder&
                                                                WithViewed();
                        PackageLocalInfoBuilder&
                                                                WithLocalFilePath(const char* path);
                        PackageLocalInfoBuilder&
                                                                WithFileName(const BString& value);
                        PackageLocalInfoBuilder&
                                                                WithSize(off_t size);
                        PackageLocalInfoBuilder&
                                                                WithFlags(int32 value);
                        PackageLocalInfoBuilder&
                                                                WithSystemDependency(bool isDependency);
                        PackageLocalInfoBuilder&
                                                                WithState(PackageState state);
                        PackageLocalInfoBuilder&
                                                                WithDownloadProgress(float progress);

                        PackageLocalInfoBuilder&
                                                                AddInstallationLocation(int32 location);
                        PackageLocalInfoBuilder&
                                                                ClearInstallationLocations();

private:
                        void                            _InitFromSource();
                        void                            _Init(const PackageLocalInfo* value);

private:
                        PackageLocalInfoRef     fSource;
                        bool                            fViewed;
                        BString                         fLocalFilePath;
                        BString                         fFileName;
                        off_t                           fSize;
                        int32                           fFlags;
                        bool                            fSystemDependency;
                                // When true, this value indicates that the package is a dependency of the
                                // system and so cannot be uninstalled.
                        PackageState            fState;
                        PackageInstallationLocationSet
                                                                fInstallationLocations;
                        float                           fDownloadProgress;
};


#endif // PACKAGE_LOCAL_INFO_H