javamanager/javaregistry/legacy/installedappsregistry/inc/installedappsregistryfiles.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:27:20 +0300
changeset 21 2a9601315dfc
permissions -rw-r--r--
Revision: v2.1.22 Kit: 201018

/*
* Copyright (c) 2002 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:  Definition of CInstalledAppsRegistryFiles class.
*
*/


#ifndef INSTALLEDAPPSREGISTRYFILES_H
#define INSTALLEDAPPSREGISTRYFILES_H

// INCLUDE FILES

#include <e32base.h>

// FORWARD DECLARATIONS

class RWriteStream;
class RReadStream;
class RFs;

/**
* This class is used by CInstalledAppsRegistryEntry and encapsulates
* all the file names contained in a package. To save memory and
* disk space, it is not stored directly as an array of filenames,
* but rather as an array of directories, and each directory containing
* an array of pathless filenames. This is so that directory paths
* are only stored once.
*/
class CInstalledAppsRegistryFiles : public CBase
{
public:
    // construction, destruction
    static CInstalledAppsRegistryFiles* NewL();
    static CInstalledAppsRegistryFiles* NewL
    (const CInstalledAppsRegistryFiles&  aOther);
    static CInstalledAppsRegistryFiles* NewL(RReadStream& aStream);
    virtual ~CInstalledAppsRegistryFiles();

    // For streaming/serialisation
    void ExternalizeL(RWriteStream& aStream) const;

    /**
    * Returns the number of bytes required be present in a stream wishing to
    * store names of files, directories and apparc identifiers contained by
    * this object.
    * @return The number of bytes that will be externalized to a stream.
    */
    TInt SizeForStreamingL() const;

public: // APIs reflected from MInstalledAppsRegistryEntry

    /**
    * Adds a file to the list of files.
    */
    void AddFileL(const TDesC& aFileName);

    /**
    * Appends all the files (and full paths) into the array.
    */
    void ListFilesL(RPointerArray<HBufC>& aFileArray) const;

    /**
    * Returns TRUE if this package uses the input file.
    */
    TBool UsesFileL(const TDesC& aFileName) const;

    /**
    * Returns a filename in the entry with a given extension.
    */
    void FindFileWithExtL(const TDesC&  aExtension,
                          TFileName& aFileName) const;

    /**
    * Returns the number of files added in this object.
    */
    TInt FileCount() const;

    /**
    * Adds a directory owned by the application.
    */
    void AddDirectoryL(const TDesC& aDirName);

    /**
    * Appends all the directories owned into the array.
    */
    void ListDirectoriesL(RPointerArray<HBufC>& aDirArray) const;

    /**
    * Adds an Apparc-identifier (Apparc-identifiers are used for uninstalling
    * Apparc registration files).
    */
    void AddApparcIdentifierL(const TDesC& aApparcIdentifier);

    /**
    * Appends into the array all the Apparc-identifiers (Apparc-identifiers
    * are used for uninstalling Apparc registration files).
    */
    void ListApparcIdentifiersL(RPointerArray<HBufC>&  aApparcIdentifiersArray) const;

    /**
    * Scans all the installed files and returns the total size.
    */
    TInt Size() const;

private:
    // Internal class storing pathnames and filenames under that path
    class CDirFiles : public CBase
    {
    public:
        // construction, destruction
        static CDirFiles*  NewLC(const TDesC& aDirName);
        static CDirFiles*  NewLC(const CDirFiles& aOther);
        static CDirFiles*  NewLC(RReadStream& aStream);
        ~CDirFiles();

        /**
        * Gets the directory name.
        */
        const TDesC&  DirectoryName() const;

        /**
        * Adds a new file hanging off a directory - must be a filename,
        * not a full path.
        */
        void AddFileL(const TDesC& aFileName);

        /**
        * Returns TRUE if the file exists in this directory.
        */
        TBool Exists(const TDesC& aFileName) const;

        /**
        * Appends all the files (including full path) into the input array.
        */
        void ListFilesL(RPointerArray<HBufC>& aFileArray) const;

        /**
        * Sets/Gets the IsOwned attribute.
        */
        void SetOwned(TBool aIsOwned);
        TBool IsOwned() const;

        /** Finds a filename in the directory with a given extension. Returns
        * ETrue if a file could be found with that extension.
        */
        TBool FindFileWithExtL(const TDesC&  aExtension,
                               TFileName&  aFileName) const;

        /**
        * Returns the number of files in this directory.
        */
        TInt FileCount() const;

        /**
        * Returns the size of all files used by this directory.
        */
        TInt Size(RFs& aFs) const;

        /**
        * For streaming/serialisation.
        */
        void ExternalizeL(RWriteStream& aStream) const;

        /**
        * Returns the number of bytes required be present in a stream wishing
        * to store names of files, directories and apparc identifiers
        * contained by this object.
        * @return The number of bytes that will be externalized to a stream.
        */
        TInt SizeForStreamingL() const;

    private:
        // Constructors (1st- and 2nd-phase)
        CDirFiles();
        void ConstructL(const TDesC& aDirName);
        void ConstructL(const CDirFiles& aOther);
        void ConstructL(RReadStream& aStream);

        /**
        * Returns the size of a file which exists in this directory.
        * The filename is RELATIVE to this directory.
        */
        TInt SizeOfFile(RFs& aFs, const TDesC& aFileName) const;

    private:    // data members

        HBufC*  iDirName;               // Owned.
        RPointerArray<HBufC> iFiles;    // Owned.

        // IsOwned is TRUE if the entry "owns" the directory - This is set
        // from the AddDirectory API call. An owned directory will be deleted
        // when the app is removed.
        TBool iIsOwned;
    };

private:
    // Constructors (1st- and 2nd-phase)
    CInstalledAppsRegistryFiles();
    void ConstructL(RReadStream& aStream);
    void ConstructL(const CInstalledAppsRegistryFiles& aOther);

    // Disallow assignment
    const CInstalledAppsRegistryFiles&
    operator=(const CInstalledAppsRegistryFiles&);

    /**
     * Gets a CDirFiles object which corresponds to the directory
     * specified. If none exists in the array, it returns NULL
     */
    CDirFiles*  GetDirectory(const TDesC& aDirectory) const;

private:

    RPointerArray<CDirFiles> iDirectories;          // Owned.
    RPointerArray<HBufC> iApparcIdentifiersArray;   // Owned.
};

#endif // INSTALLEDAPPSREGISTRYFILES_H