--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/source/integrityservices/integritytree.h Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,203 @@
+/*
+* 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:
+*
+*/
+
+
+/**
+ @file
+ @released
+ @internalTechnology
+*/
+
+#ifndef __INTEGRITYTREE_H__
+#define __INTEGRITYTREE_H__
+
+#include <e32base.h>
+#include <f32file.h>
+#include "integrityservicesevent.h"
+#include "integrityservices.h"
+
+namespace Swi
+{
+
+class CIntegrityTreeNode;
+class CIntegrityTreeLeaf;
+
+typedef void(* TTreeWalkFunctionL)(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, RLoader& aLoader, CFileMan& aFileMan);
+
+class CIntegrityTreeLeaf : public CBase
+ {
+public:
+ /**
+ * Constructs a file tree leaf, and places it on the cleanup stack
+ *
+ * @param aFileName The filename for this leaf node
+ * @param aType The type of this leaf
+ * @param aOwningJournal A reference to the filename of the owning journal
+ * @return A fully constructed tree leaf
+ */
+ static CIntegrityTreeLeaf* NewLC(const TDesC& aFileName, TIntegrityServicesEvent aType,
+ const TDesC& aOwningJournal);
+
+ /**
+ * Sets the peer node if applicable. This is used for leaves that
+ * naturally form pairs, for example a removed file and its backup.
+ *
+ * @param aPeer The leaf's peer.
+ *
+ */
+
+ void SetPeer(CIntegrityTreeLeaf* aPeer);
+
+ /**
+ * Returns the leaf's peer, or null if none was set
+ *
+ * @return The leaf's peer node if available
+ *
+ */
+
+ CIntegrityTreeLeaf* Peer();
+
+ /**
+ * Returns the type of this leaf.
+ *
+ * @return This leaf's type
+ */
+
+ TIntegrityServicesEvent Type();
+
+ /**
+ * Returns the file name for this leaf
+ *
+ * @return The file name for this leaf
+ */
+
+ const TDesC& Name();
+
+ /**
+ * Returns the name of the journal file that owns this leaf
+ *
+ * @return The associated journal file name
+ */
+
+ const TDesC& Journal();
+
+ ~CIntegrityTreeLeaf();
+private:
+ CIntegrityTreeLeaf(TIntegrityServicesEvent aType, const TDesC& aOwningJournal);
+ void ConstructL(const TDesC& aFileName);
+
+private:
+ HBufC* iFileName;
+ TIntegrityServicesEvent iType;
+ CIntegrityTreeLeaf* iPeer;
+
+ const TDesC& iOwningJournal;
+
+ };
+
+class CIntegrityTreeNode : public CBase
+ {
+public:
+ /**
+ * Constructs a file tree node, and places it on the cleanup stack
+ *
+ * @param aDirectoryName The name of the directory this node represents
+ * @return A fully constructed tree node
+ */
+
+ static CIntegrityTreeNode* NewL(const TDesC& aDirectoryName);
+
+ /**
+ * Constructs a file tree node
+ *
+ * @param aDirectoryName The name of the directory this node represents
+ * @return A fully constructed tree node
+ */
+
+ static CIntegrityTreeNode* NewLC(const TDesC& aDirectoryName);
+
+ /**
+ * Returns the name of the directory this node represents
+ *
+ * @return The name of this directory
+ */
+
+ const TDesC& Name();
+
+ /**
+ * Adds a leaf node to this tree structure, adding intermediate (directory) nodes along
+ * the way as appropriate.
+ *
+ * @param aFileName The fully qualified file name of the node to add
+ * @param aType The type of the node to add
+ * @param aOwningJournal The file name of the journal that owns this node
+ * @return The leaf node added.
+ *
+ */
+
+ CIntegrityTreeLeaf* AddNodeL(const TDesC& aFileName, TIntegrityServicesEvent aType, const TDesC& aOwningJournal);
+
+ /**
+ * Finds a node in the tree if it exists.
+ *
+ * @param aFileName The file name to find
+ * @param aType The type of node to find
+ * @return KErrNone if found, otherwise one of the system wide error codes
+ */
+
+ TInt FindNode(const TDesC& aFileName, TIntegrityServicesEvent aType);
+
+ /**
+ * Applies a function to every applicable node in the tree
+ *
+ * @param aFunc The function to apply
+ * @param aTypeFilter The type of node to apply the function to
+ * @param aFs A connected file server session
+ * @param aLoader reference to the RLoader server session
+ * @param aFileMan A constructed CFileMan object
+ * @param aIntegrityServices The parent class for this journal, used exclusively for testing
+ * @param aFailType The type of failure to induce if required. Used exclusively in testing.
+ *
+ */
+
+ void WalkTreeL(TTreeWalkFunctionL aFunc, TIntegrityServicesEvent aTypeFilter,
+ RFs& aFs, RLoader& aLoader, CFileMan& aFileMan,
+ CIntegrityServices& aIntegrityServices, CIntegrityServices::TFailType aFailType);
+
+ ~CIntegrityTreeNode();
+protected:
+ CIntegrityTreeLeaf* DoAddNodeL(TDes& aFileName, TIntegrityServicesEvent aType, const TDesC& aOwningJournal);
+ TInt DoFindNode(TDes& aFileName, TIntegrityServicesEvent aType);
+ void DoWalkTreeL(TDes& aPath, TTreeWalkFunctionL aFunc, TIntegrityServicesEvent aTypeFilter,
+ RFs& aFs, RLoader& aLoader, CFileMan& aFileMan,
+ CIntegrityServices& aIntegrityServices, CIntegrityServices::TFailType aFailType);
+
+private:
+ CIntegrityTreeNode();
+ void ConstructL(const TDesC& aDirectoryName);
+
+private:
+ HBufC* iDirName;
+ RPointerArray<CIntegrityTreeNode> iDirectories;
+ RPointerArray<CIntegrityTreeLeaf> iFiles;
+
+ friend class Swi::CIntegrityServices;
+ };
+
+} // namespace Swi
+
+#endif /* __INTEGRITYTREE_H__ */