⛏️ index : haiku.git

/*
 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef PACKAGE_SUPPORT_H
#define PACKAGE_SUPPORT_H


#include <dirent.h>

#include <Referenceable.h>
#include <util/DoublyLinkedList.h>


class Directory;


class PackageVolumeState : public DoublyLinkedListLinkImpl<PackageVolumeState> {
public:
								PackageVolumeState();
								~PackageVolumeState();

			status_t			SetTo(const char* stateName);
			void				Unset();

			const char*			Name() const
									{ return fName; }
			const char*			DisplayName() const;

			const char*			SystemPackage() const
									{ return fSystemPackage; }
			status_t			SetSystemPackage(const char* package);

			void				GetPackagePath(const char* name, char* path,
									size_t pathSize);

	static	bool				IsNewer(const PackageVolumeState* a,
									const PackageVolumeState* b);

private:
			char*				fName;
			char*				fDisplayName;
			char*				fSystemPackage;
};

typedef DoublyLinkedList<PackageVolumeState> PackageVolumeStateList;


class PackageVolumeInfo : public BReferenceable {
public:
			typedef PackageVolumeStateList StateList;

public:
								PackageVolumeInfo();
								~PackageVolumeInfo();

			status_t			SetTo(Directory* baseDirectory,
									const char* packagesPath);

			status_t			LoadOldStates();

			const StateList&	States() const
									{ return fStates; }

private:
			PackageVolumeState*	_AddState(const char* stateName);
			status_t			_InitState(Directory* packagesDirectory,
									DIR* dir, PackageVolumeState* state);
			status_t			_ParseActivatedPackagesFile(
									Directory* packagesDirectory,
									PackageVolumeState* state,
									char* packageName, size_t packageNameSize);

private:
			StateList			fStates;
			DIR*				fPackagesDir;
};


#endif	// PACKAGE_SUPPORT_H