root/src/apps/haikudepot/packagemanagement/PackageAction.h
/*
 * Copyright 2021-2026, Andrew Lindesay <apl@lindesay.co.nz>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */
#ifndef PACKAGE_ACTION_H
#define PACKAGE_ACTION_H

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

#include "DeskbarLink.h"


class PackageAction : public BReferenceable, public BArchivable
{
public:
                                                                PackageAction(const BString& title, const BString& packageName);
                                                                PackageAction(const BMessage* from);
        virtual                                         ~PackageAction();

        const   BString&                        Title() const;
        const   BString&                        PackageName() const;

        const   BMessage                        Message() const;
        virtual const uint32            MessageWhat() const = 0;

        virtual status_t                        Archive(BMessage* into, bool deep = true) const;

protected:
                        BString                         fTitle;
                        BString                         fPackageName;
};


typedef BReference<PackageAction> PackageActionRef;


class UninstallPackageAction : public PackageAction
{
public:
                                                                UninstallPackageAction(const BString& packageName,
                                                                        const BString& packageTitle);
                                                                UninstallPackageAction(const BMessage* from);
        virtual                                         ~UninstallPackageAction();

        virtual const uint32            MessageWhat() const;

};


class InstallPackageAction : public PackageAction
{
public:
                                                                InstallPackageAction(const BString& packageName,
                                        const BString& packageTitle);
                                                                InstallPackageAction(const BMessage* from);
        virtual                                         ~InstallPackageAction();

        virtual const uint32            MessageWhat() const;
};


class OpenPackageAction : public PackageAction
{
public:
                                                                OpenPackageAction(const BString& packageName,
                                                                        const DeskbarLink& link);
                                                                OpenPackageAction(const BMessage* from);
                                                                ~OpenPackageAction();

        virtual const uint32            MessageWhat() const;

        const   DeskbarLink                     Link() const;

        virtual status_t                        Archive(BMessage* into, bool deep = true) const;

private:
                        DeskbarLink                     fLink;
};


#endif // PACKAGE_ACTION_H