/*
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/


#ifndef	SISREGISTRYOBJECT_H
#define	SISREGISTRYOBJECT_H

#include <vector>
#include <string>
#include "sisregistrytoken.h"
#include "serialisable.h"
#include "truststatus.h"
#include "filedescription.h"
#include "sisregistryproperty.h"
#include "sisregistrydependency.h"
#include "installablefile.h"
#include "siscontroller.h"
#include "configmanager.h"

typedef std::vector<FileDescription*>			FileDescriptions;
typedef std::vector<SisRegistryDependency*>		Dependencies;
typedef std::vector<SisRegistryPackage*>		Packages;
typedef std::vector<SisRegistryProperty*>		Properties;

class SisFile;
class RomManager;

/**
* @file SISREGISTRYOBJECT.H
*
* @internalComponent
* @released
*/
class SisRegistryObject : public SisRegistryToken
{
public:

	static const TUint32 KSisPackageCertificateChainValidatedToTrustAnchor;
	static const TUint32 KSisPackageBuiltIntoRom;

	SisRegistryObject (ConfigManager& aConfigManager);

	SisRegistryObject(
		const SisFile& aSis,
		const InstallableFiles& aFiles,
		const TInt aTargetDrive,
		const TUint16 aRegistryFileMajorVersion,
		const TUint16 aRegistryFileMinorVersion,
		const bool aSUFlag,
		ConfigManager& aConfigManager);

	SisRegistryObject(CSISController& aSisController,
				RomManager& aRomManager,
				const TUint16 aRegistryFileMajorVersion,
				const TUint16 aRegistryFileMinorVersion,
				ConfigManager& aConfigManager);

	virtual ~SisRegistryObject ();

	virtual void Internalize(Deserialiser& des);
	virtual void Externalize(Serialiser& ser);

	const std::vector<TInt>& GetInstallChainIndices() const
	{ return iInstallChainIndices; }

	void SetInstallChainIndices(const std::vector<TInt>& aInstallChainIndices)
	{ iInstallChainIndices = aInstallChainIndices; }

	const TrustStatus& GetTrustStatus() const
	{ return *iTrustStatus; }

	void SetTrustStatus(const TrustStatus& aTrustStatus)
	{ delete iTrustStatus; iTrustStatus = new TrustStatus(aTrustStatus); }

	TInt64 GetTrustTimeStamp() const
	{ return iTrustTimeStamp; }

	void SetTrustTimeStamp(TInt64& aTrustTimeStamp)
	{ iTrustTimeStamp = aTrustTimeStamp; }

	TInt GetRemoveWithLastDependent() const
	{ return iRemoveWithLastDependent; }

	void SetRemoveWithLastDependent(TInt& aIsRemoveWithLastDependent)
	{ iRemoveWithLastDependent = aIsRemoveWithLastDependent; }

	TInt GetTrust() const
	{ return iTrust; }

	void SetTrust(TInt& aTrust)
	{ iTrust = aTrust; }

	TUint16 GetFileMinorVersion() const
	{ return iFileMinorVersion; }

	void SetFileMinorVersion(TUint16& aFileMinorVersion)
	{ iFileMinorVersion = aFileMinorVersion; }

	TUint16 GetFileMajorVersion() const
	{ return iFileMajorVersion; }

	void SetFileMajorVersion(TUint16& aFileMajorVersion)
	{ iFileMajorVersion = aFileMajorVersion; }

	TBool GetPreInstalled() const
	{ return iDeletablePreInstalled; }

	void SetPreInstalled(TBool& aPreInstalled)
	{ iDeletablePreInstalled = aPreInstalled; }

	TBool IsPreInstalled() const
	{ return (iInstallType == CSISInfo::EInstPreInstalledApp); }

	TBool GetSigned() const
	{ return iSigned; }

	void SetSigned(TBool& aSigned)
	{ iSigned = aSigned; }

	TBool GetInRom() const
	{ return iInRom; }

	void SetInRom(TBool& aInRom)
	{ iInRom = aInRom; }

	const FileDescriptions& GetFileDescriptions() const
	{ return iFileDescriptions; }

	TBool GetIsRemovable() const
	{ return iIsRemovable; }

	void SetIsRemovable(TBool& aIsRemovable)
	{ iIsRemovable = aIsRemovable; }

	TBool GetSignedBySuCert() const
	{ return iSignedBySuCert; }

	void SetSignedBySuCert(TBool& aSignedBySuCert)
	{ iSignedBySuCert = aSignedBySuCert; }

	FileDescription const * GetFile(const std::wstring& aFile) const;
	FileDescription const * GetFile(TUint32 aSid) const;

	void SetFileDescriptions(const FileDescriptions& aFileDescriptions);

	const Properties& GetProperties() const
	{ return iProperties; }

	void SetProperties(const Properties& aProperties);

	const Packages& GetEmbeddedPackages() const
	{ return iEmbeddedPackages; }

	void SetEmbeddedPackages(const Packages& aEmbeddedPackages);

	const Dependencies& GetDependencies() const
	{ return iDependencies; }

	void SetDependencies(const Dependencies& aDependencies);

	TUint32 GetInstallType() const
	{ return iInstallType; }

	void SetInstallType(TUint32& aInstallType)
	{ iInstallType = aInstallType; }

	const std::wstring& GetVendorLocalizedName() const
	{ return *iVendorLocalizedName; }

	void SetVendorLocalizedName(const std::wstring& aVendorLocalizedName)
	{ *iVendorLocalizedName = aVendorLocalizedName; }

	const std::vector<TInt>& GetMatchingSupportedLanguages() const
	{ return iSupportedLanguageIds; }

	const std::vector<CSISString*>& GetLocalizedPackageNames() const
	{ return iLocalizedPackageNames; }
	
	const std::vector<CSISString*>& GetLocalizedVendorNames() const
	{ return iLocalizedVendorNames; }
	
	// Utility functions

	std::wstring GetRegistryDir(const std::wstring& aDrivePath) const;
	int NextSisRegistryIndex(const std::wstring& aDrivePath) const;
	int NextSisControllerIndex(const std::wstring& aDrivePath) const;

	// Update the entry for a PU installation
	void UpgradeEntry(const SisFile& aSis, const InstallableFiles& aFiles, 
					TInt aInstallDrive, const bool aSUFlag, const bool aIsRemovable, ConfigManager& aConfigManager);
					
	#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
	void SetValidationStatus(bool aOriginVerificationStatus);
	
	TBool GetIsHidden() const
	{ return iIsHidden; }

	void SetIsHidden(TBool& aIsHidden)
	{ iIsHidden = aIsHidden; }
	#endif
	
private:

	// PU installations
	void UpdateDrives();
	void AddFiles(const InstallableFiles& aFiles);
	void RemoveFiles(const InstallableFiles& aFiles);

private:

	std::wstring*                             iVendorLocalizedName;
	TUint32                                   iInstallType;
	Dependencies						      iDependencies;
	Packages						          iEmbeddedPackages;
	Properties						          iProperties;
	FileDescriptions						  iFileDescriptions;
	TBool                                     iInRom;
	TBool                                     iSigned;
	TBool									  iSignedBySuCert;
	TBool                                     iDeletablePreInstalled;
	TUint16                                   iFileMajorVersion;
	TUint16                                   iFileMinorVersion;
	TInt                                    iTrust;
	TInt                                    iRemoveWithLastDependent;
	TInt64                                    iTrustTimeStamp;
	TrustStatus*                              iTrustStatus;
	std::vector<TInt>                       iInstallChainIndices;
	TBool									  iIsRemovable;
	#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
	TBool									iIsHidden;
	#endif
	// Array of language Id's that are common to the languages in mentioned
	// in SIS file and device supported languages
	std::vector<TInt> iSupportedLanguageIds;

	// Localized packagename info in supported languages
	std::vector<CSISString*> iLocalizedPackageNames;
	
	// Localized vendorname info in supported languages
	std::vector<CSISString*> iLocalizedVendorNames;
	
	ConfigManager& iConfigManager;
};


#ifdef _MSC_VER

Deserialiser& operator>>(Deserialiser& aInput, std::vector<SisRegistryObject*>& val);

#endif

#endif	/* SISREGISTRYOBJECT_H */
