/*
 * Copyright 2002-2014, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _APP_FILE_INFO_H
#define _APP_FILE_INFO_H


#include <NodeInfo.h>


class BBitmap;
class BFile;
class BMessage;
class BResources;


struct version_info {
	uint32	major;
	uint32	middle;
	uint32	minor;
	uint32	variety;
	uint32	internal;
	char	short_info[64];
	char	long_info[256];
};

enum info_variety {
	B_DEVELOPMENT_VERSION = 0,
	B_ALPHA_VERSION,
	B_BETA_VERSION,
	B_GAMMA_VERSION,
	B_GOLDEN_MASTER_VERSION,
	B_FINAL_VERSION
};

enum info_location {
	B_USE_ATTRIBUTES		= 0x1,
	B_USE_RESOURCES			= 0x2,
	B_USE_BOTH_LOCATIONS	= 0x3	// == B_USE_ATTRIBUTES | B_USE_RESOURCES
};

enum version_kind {
	B_APP_VERSION_KIND,
	B_SYSTEM_VERSION_KIND
};


class BAppFileInfo: public BNodeInfo {
public:
								BAppFileInfo();
								BAppFileInfo(BFile* file);
	virtual						~BAppFileInfo();

			status_t			SetTo(BFile* file);

	virtual	status_t			GetType(char* type) const;
	virtual	status_t			SetType(const char* type);

			status_t			GetSignature(char* signature) const;
			status_t			SetSignature(const char* signature);

			status_t			GetCatalogEntry(char* catalogEntry) const;
			status_t			SetCatalogEntry(const char* catalogEntry);

			status_t			GetAppFlags(uint32* flags) const;
			status_t			SetAppFlags(uint32 flags);
			status_t			RemoveAppFlags();

			status_t			GetSupportedTypes(BMessage* types) const;
			status_t			SetSupportedTypes(const BMessage* types,
									bool updateMimeDB, bool syncAll);
			status_t			SetSupportedTypes(const BMessage* types,
									bool syncAll);
			status_t			SetSupportedTypes(const BMessage* types);
			bool				IsSupportedType(const char* type) const;
			bool				Supports(BMimeType* type) const;

	virtual	status_t			GetIcon(BBitmap* icon, icon_size which) const;
			status_t			SetIcon(const BBitmap* icon, icon_size which,
									bool updateMimeDB);
	virtual	status_t			SetIcon(const BBitmap* icon, icon_size which);

			status_t			GetIcon(uint8** data, size_t* size) const;
			status_t			SetIcon(const uint8* data, size_t size,
									bool updateMimeDB);
			status_t			SetIcon(const uint8* data, size_t size);

			status_t			GetVersionInfo(version_info* info,
									version_kind kind) const;
			status_t			SetVersionInfo(const version_info* info,
									version_kind kind);

			status_t			GetIconForType(const char* type, BBitmap* icon,
									icon_size which) const;
			status_t			GetIconForType(const char* type, uint8** data,
									size_t* size) const;
			status_t			SetIconForType(const char* type,
									const BBitmap* icon, icon_size which,
									bool updateMimeDB);
			status_t			SetIconForType(const char* type,
									const BBitmap* icon, icon_size which);
			status_t			SetIconForType(const char* type,
									const uint8* data, size_t size,
									bool updateMimeDB);
			status_t			SetIconForType(const char* type,
									const uint8* data, size_t size);

			void				SetInfoLocation(info_location location);
			bool				IsUsingAttributes() const;
			bool				IsUsingResources() const;

private:
	virtual	void				_ReservedAppFileInfo1();
	virtual	void				_ReservedAppFileInfo2();
	virtual	void				_ReservedAppFileInfo3();

			BAppFileInfo&		operator=(const BAppFileInfo&);
								BAppFileInfo(const BAppFileInfo&);

			status_t			GetMetaMime(BMimeType* meta) const;

			status_t			_ReadData(const char* name, int32 id,
									type_code type, void* buffer,
									size_t bufferSize, size_t& bytesRead,
									void** allocatedBuffer = NULL) const;
			status_t			_WriteData(const char* name, int32 id,
									type_code type, const void* buffer,
									size_t bufferSize, bool findID = false);
			status_t			_RemoveData(const char* name, type_code type);

private:
			BResources*			fResources;
			info_location		fWhere;
			uint32				_reserved[2];
};


#endif	// _APP_FILE_INFO_H
