diff -r 000000000000 -r ba25891c3a9e iaupdate/IAD/engine/controller/inc/iaupdatenodecontainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/engine/controller/inc/iaupdatenodecontainer.h Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,230 @@ +/* +* Copyright (c) 2009 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: ?Description +* +*/ + + + +#ifndef IAUPDATENODECONTAINER_H +#define IAUPDATENODECONTAINER_H + +#include + + +class CIAUpdateController; +class CIAUpdateNode; +class CIAUpdateFwNode; +class CIAUpdateNodeDependency; + +class CIAUpdateNodeContainer : public CBase + { + +public: + + static CIAUpdateNodeContainer *NewLC( + CIAUpdateController& aController ); + static CIAUpdateNodeContainer *NewL( + CIAUpdateController& aController ); + + virtual ~CIAUpdateNodeContainer(); + + + /** + * Add a node to the node container. + * + * @note Caller should take care that same node is inserted only once. + * This function does not do any checks. So, if the node is inserted more than once + * it will be deleted multiple times which will result to panic. + * + * @note If the content of the given node can be thought as installed or if it can not be + * installed, then this node will be immediately deleted. So, the node pointer may become + * obsolete when this function is called. Also, if this function is about to leave, + * the node will automatically be deleted. + * + * @param aNode Node to be added. Ownership is transferred. + **/ + void AddNodeL( CIAUpdateNode* aNode ); + + + /** + * Add an excess node to the node container. These nodes are some extra nodes that a user + * of this class wants to store into the container separately. They are also handled + * separately and no intelligence are done to these nodes. For example, dependecy chains + * are not checked here. This function will also automatically make the node hidden. + * + * @note Caller should take care that same node is inserted only once. + * This function does not do any checks. So, if the node is inserted more than once + * it will be deleted multiple times which will result to panic. + * + * @param aNode Node to be added. Ownership is transferred. + **/ + void AddExcessNodeL( CIAUpdateNode* aNode ); + + + /** + * Add a firmware update node to the node container. + * + * @note Caller should take care that same node is inserted only once. + * This function does not do any checks. So, if the node is inserted more than once + * it will be deleted multiple times which will result to panic. + * + * @note If the content of the given node can be thought as installed or if it can not be + * installed, then this node will be immediately deleted. So, the node pointer may become + * obsolete when this function is called. Also, if this function is about to leave, + * the node will automatically be deleted. + * + * @param aNode Node to be added. Ownership is transferred. + **/ + void AddFwNodeL( CIAUpdateFwNode* aNode ); + + + /** + * Clears node container and frees memory. + * Is automatically called during container destruction. + **/ + void Clear(); + + + /** + * @return const RPointerArray< CIAUpdateNode >& All nodes of the container, including ones that + * are not header nodes. Excess nodes are not included here. + */ + const RPointerArray< CIAUpdateNode >& AllNodes() const; + + + /** + * @return const RPointerArray< CIAUpdateNode >& Excess nodes of the container. + */ + const RPointerArray< CIAUpdateNode >& ExcessNodes() const; + + + /** + * Gets current head nodes of nodes added to this container. Also updates node dependencies by calling + * UpdateDependenciesL() + * Head node is a node that represents the latest update available to a software installed on the device. + * They should be the primary nodes to be offered to the user to make his update selections. + * If a node is a head node it does NOT mean that it always can be installed, because if might have + * dependencies to other nodes that cannot be installed for whatever reason. + * @return const RPointerArray< CIAUpdateNode >& Head nodes. Ownership of the arary and its contents are + * not transferred. + **/ + const RPointerArray< CIAUpdateNode >& HeadNodesL(); + + + /** + * @return const RPointerArray< CIAUpdateFwNode >& Firmware update nodes + * of the container. + */ + const RPointerArray< CIAUpdateFwNode >& FwNodes(); + + +private: + + /** + * Constructor + */ + CIAUpdateNodeContainer( CIAUpdateController& aController ); + + /** + * ConstructL + */ + void ConstructL(); + + + // Prevent these if not implemented + CIAUpdateNodeContainer( const CIAUpdateNodeContainer& aObject ); + CIAUpdateNodeContainer& operator =( const CIAUpdateNodeContainer& aObject ); + + + /** + * Updates node dependencies. + **/ + void UpdateDependenciesL(); + + TInt UpdateNodeDependenciesL( CIAUpdateNode& aNode, + TInt aDepth ); + + TInt FindBestMatchL( CIAUpdateNode& aNode, + CIAUpdateNodeDependency& aDependency, + TInt aDepth ); + + void FindMatchesL( RPointerArray& aNodes, + const CIAUpdateNodeDependency& aDependency ); + + + void ManageHeaderNodesL(); + + /** + * Updates the head node list. + * If the node content has not been installed yet or if the content + * is newer version than installed one, then the node is thought as + * head node. + * @param aNode Ownership is transferred. + */ + void UpdateHeadNodeListL( CIAUpdateNode& aNode ); + + TBool ReplaceRecommendedL( const CIAUpdateNode& aCurrentNode, + const CIAUpdateNode& aNewNode ) const; + + TBool PackageTypeAcceptedL( const CIAUpdateNode& aNode ) const; + + TBool NodeAlreadyExists( const CIAUpdateNode& aNode ) const; + + // Creates bundle for self update purposes. + // Sets the possible existing self updater and NCD head nodes to hidden. + // So, they will not be provided for UI. After, RemoveHiddenNodesFromHeadList + // function is called. + void CreateSelfUpdateBundleL(); + + // Removes all possible existing head nodes that are marked as hidden from the head list. + void RemoveHiddenNodesFromHeadList(); + + // This will start to set the correct values to the service pack + // dependency nodes. + void HandleServicePacksL(); + + // Checks if newer version of the node is already installed. + // Check is passed if newer version is not installed. + // If same version of the node is installed, makes it hidden. + TBool InstallCheckL( CIAUpdateNode& aNode ) const; + + +private: // data + + // Controller object + CIAUpdateController& iController; + + // This array will contain all the nodes that belong to the intact dependency chains. + // These nodes are head nodes and possible dependency nodes (for example previous versions + // that are required). + // Array owns the nodes. And they will be deleted when the array is cleared. + RPointerArray iNodes; + + // This array will contain only the head nodes after all the dependency checks are done. + // Array does not own the nodes. + RPointerArray iHeadNodes; + + // This array will contain all the nodes excess nodes that are given by the user of this + // class object. The excess nodes are just stored here and no normal actions are directed + // to them by the operations of this class object. + RPointerArray iExcessNodes; + + // This array will contain all the firmware update nodes. + // Array owns the nodes. + RPointerArray iFwNodes; + + }; + +#endif // IAUPDATENODECONTAINER_H