smartinstaller/adm/inc/ADMPackageInfo.h
author Santosh V Patil <santosh.v.patil@nokia.com>
Wed, 30 Jun 2010 11:01:26 +0530
branchADM
changeset 48 364021cecc90
permissions -rw-r--r--
SmartInstaller contribution based on the Nokia Qt SDK 1.0 release

/*
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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: 
*     Declares the various classes required to maintain the Package Info and Dependency Tree for ADM application.
*
*
*/


#ifndef __PACKAGEINFO_H__
#define __PACKAGEINFO_H__

const TInt NOT_VISITED = 0;
const TInt BEING_VISITED = 1;
const TInt DONE_VISITED = 2;

// Forward Declaration
class CXmlParser;
class CPackageInfo;
class CADMAppUi;
class RFileLogger;

class Edge : public CBase
{
public:
	static Edge* NewL(CPackageInfo *aVtx1, CPackageInfo *aVtx2);
	static Edge* NewLC(CPackageInfo *aVtx1, CPackageInfo *aVtx2);
	~Edge(){}

	inline CPackageInfo *GetVertexOrg() const;
	inline CPackageInfo *GetVertexDst() const;

private:
	void ConstructL();
	Edge(CPackageInfo *aVtx1, CPackageInfo *aVtx2);

private:
	friend class CPackageInfo;

	CPackageInfo *iVertexOrg;
	CPackageInfo *iVertexDst;
	TDblQueLink iEdgeDlink;
};

enum PackageStatus
	{
	EPackageStatusUnknown,
	EPackageInstalled,
	EPackageToBeFetched,
	EPackageToBeUpgraded,
	EPackageFetchedInstalled,
	EPackageRootToBeInstalled,
	EPackageRootInstalled
	//EPackageToBeInstalled,
	//EPackageInstallationFailed
	};


// Class for storing Depfile data
class CPackageInfo: public CBase
	{
public:
	static CPackageInfo* NewL();
	static CPackageInfo* NewLC();
	~CPackageInfo();

	// Sort Order By Drive Priority
	static const TLinearOrder<CPackageInfo> KSortOrderByDrivePriority;

	//Comparator Function for sort by name
	static TInt CompareByDrivePriority( const CPackageInfo& aPackageOne,const CPackageInfo& aPackageTwo );

	void AddEdgeL(CPackageInfo* aDest);
	void VisitL(CDepTree *aDepTree);
	void SetDepFileNameL(const TDesC& aName);
	void SetChangesFileNameL();
	void SetSisFileNameL(const TDesC& aName);
	HBufC8* GetDownloadUrlL();

	inline HBufC8* GetURL() const
		{
		return iUrl;
		};

	inline HBufC* GetChangesFileName() const
		{
		return iChangesFileName;
		}

	inline HBufC* GetDepFileName() const
		{
		return iDepFileName;
		}

	inline HBufC* GetPackageName() const
		{
		return iPackageName;
		};

	inline HBufC* GetSisPackageName() const
		{
		return iSisPackageName;
		};

	inline PackageStatus GetPackageStatus() const
		{
		return iPackageStatus;
		}

	inline TUint32 GetPackageUid() const
		{
		return iPackageUid;
		}

	inline void SetPackageStatus(const PackageStatus& aStatus)
		{
		iPackageStatus = aStatus;
		}

	inline TUint32 GetDownloadSize() const
		{
		return iDownloadSize;
		}

	inline TUint32 GetInstallSize() const
		{
		return iInstalledSize;
		}

	inline TVersion GetPackageVersion() const
		{
		return iVersion;
		}

	inline TUint32 GetDrivePriority() const
		{
		return iDrivePriority;
		}
	inline void SetInstallDrive(const TChar aDrive)
		{
		iInstallDrive = aDrive;
		}
	inline TChar GetInstallDrive() const
		{
		return iInstallDrive;
		}

	inline TChar GetMandatoryInstallDrive() const
		{
		return iMandatoryInstallDrive;
		}

private:
	void ConstructL();
	CPackageInfo();

private:
	friend class CXmlParser;
	friend class CDepTree;
	friend class CSisParser;

	// Mandatory fields
	TUint32 iPackageUid;
	TVersion iDepVersion;

	// Optional Fields
	HBufC* iPackageName;
	HBufC* iVendor;
	HBufC* iDateOfSubmission;//the input was a separate day,month, year format. This should've been converted into a string??
	HBufC* iDateOfModification;//the input was a separate day,month, year format. This should've been converted into a string??

	TUint32 iDownloadSize;
	TUint32 iInstalledSize;

	TVersion iVersion;
	HBufC8* iUrl;
	HBufC8* iDownloadUrl;

	HBufC* iDepFileName;
	//HBufC8 iDepUrl;

	HBufC* iChangesFileName;
	HBufC* iSisPackageName;
	PackageStatus iPackageStatus;

	TUint32 iDrivePriority; //priority to set as 'C' drive (for now)
	TChar iInstallDrive; //drive in which the package needs to be installed
	TChar iMandatoryInstallDrive; //mandatory drive specified in the changes file of the package.
	//This is for Edges management in a package
	TUint32 iVisited;

	TDblQue<Edge>     iEdgeDlinkHdr;
	TDblQueIter<Edge> iEdgeDlinkIter;

	//This is the link for added packages connection
	TDblQueLink iPackageDlink;
	};


class CDepTree: public CBase
	{
#ifdef USE_LOGFILE
public:
	static CDepTree* NewL(RFileLogger& aLogger, const TDesC& aDownloadPath);
	static CDepTree* NewLC(RFileLogger& aLogger, const TDesC& aDownloadPath);
private:
	CDepTree(RFileLogger& aLogger);

private:
	RFileLogger& iLog; ///< Not owned
#else

public:
	static CDepTree* NewL(const TDesC& aDownloadPath);
	static CDepTree* NewLC(const TDesC& aDownloadPath);
private:
	CDepTree();
#endif

public:
	~CDepTree();
	TBool SetDriveInfo();
	void GetDriveListL(RFs& aRFs, RArray<TChar>& aDriveLetters, RArray<TInt64>& aDriveSpaces);

	void AddPackageInfo(CPackageInfo *aPackageInfo);
	void AddFetchPackageInfo(CPackageInfo *aPackageInfo);
	CPackageInfo* LocatePackageInDepTree(const TUint32& aDepPackageUid);
	CPackageInfo* GetNextNode();
	CPackageInfo* GetFetchNode( TInt nodeLocation);
	CPackageInfo* GetNextFetchNode();
	CPackageInfo* GetNextSortedNode();
	CPackageInfo* GetPreviousFetchNode();
	inline void SetMachineId(TUint32 machineId)
		{
		iMachineId = machineId;
		}
	inline TUint32 GetMachineId()
		{
		return iMachineId;
		}
	inline CPackageInfo* GetCurrentFetchNode() const
		{
		return iFetchList[iCurrentPackage];
		}

	inline TInt NodesCount() const
		{
		return iFetchList.Count();
		}

	inline TInt CountDownloadNodes() const
		{
		// -1 is because iSortedlist contains also the root package
		// which is not actually downloaded
		if (iSortedList.Count() > 0)
			return iSortedList.Count() - 1;
		else
			return 0;
		}

	inline TUint32 GetTotalDownloadSize() const
		{
		return iTotalDownloadSize;
		}

	inline TUint32 GetMaxDownloadSize() const
		{
		return iMaxDownloadSize;
		}

	TBool ConstructFetchListL();
	TBool IsDepTreeEmpty() const;
	TBool IsCyclePresent() const;
	TPtrC GetDownloadPath() const;
	CPackageInfo* GetRootNode();
	void RemoveDownloadedFiles(RFs& aRfs);
	void DeleteFile(RFs& aRfs, const TDesC& aFileName, const TDesC& aFilePath );

private:
	void ConstructL(const TDesC& aDownloadPath);

private:
	friend class CPackageInfo;

	HBufC* iDownloadPath;
	RPointerArray<CPackageInfo> iFetchList; //Fetch list - the order in which the packages need to be fetched.
	//Cannot sort Fetchlist, as that would collapse the fetch order.
	RPointerArray<CPackageInfo> iSortedList; //The sorted fetch list based on drive priority

	TInt iCurrentPackage;
	TInt iSortedPackage;
	TBool iCyclePresent;

	// This is for added Packages in a Dep Tree
	TDblQue<CPackageInfo> iPackageDlinkHdr;
	// This is used for traversal of the tree to get the next pkg to be updated
	TDblQueIter<CPackageInfo> iPackageDlinkFetchIter;
	//Include the device info.

	TUint32 iTotalDownloadSize;
	TUint32 iMaxDownloadSize;
	TUint32 iMachineId;
	TChar iDownloadDrive; //drive in which the package needs to be downloaded
	};

#endif //__PACKAGEINFO_H__