diff -r 000000000000 -r a2952bb97e68 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderenumerator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderenumerator.h Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,218 @@ +/* +* 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: Enumerator objects +* +*/ + + +#ifndef CMEDIAMTPDATAPROVIDERENUMERATOR_H +#define CMEDIAMTPDATAPROVIDERENUMERATOR_H + +#include +#include + +#include "mmmtpenumerationcallback.h" +#include "cmmmtpdpperflog.h" + +// keep here to avoid warning on urel +_LIT( KDirectoryScan, "DirectoryScan" ); +_LIT( KFormatFilter, "FormatFilter" ); +_LIT( KObjectManagerObjectUid, "ObjectManagerObjectUid" ); +_LIT( KObjectManagerInsert, "ObjectManagerInsert" ); + +// Forward declarations +class MMTPDataProviderFramework; +class MMTPObjectMgr; +class CMTPObjectMetaData; +class CMediaMtpDataProvider; + +/** +* Defines file enumerator. Enumerates all files/directories under a +* specified path or storage +*/ +class CMediaMtpDataProviderEnumerator: public CActive + { +public: + /** + * Two phase constructor + * @param aFramework Reference to MMTPDataProviderFramework + * @param aDataProvider Reference to CMediaMtpDataProvider + * @return A pointer to a new instance of the object + */ + static CMediaMtpDataProviderEnumerator* NewL( MMTPDataProviderFramework& aFramework, + CMediaMtpDataProvider& aDataProvider ); + + /** + * destructor + */ + ~CMediaMtpDataProviderEnumerator(); + + /** + * Kick off the enumeration on the specified storage + * @param aStorageId storage to be enumerated + */ + void StartL( TUint32 aStorageId ); + + // introduce to cleanup db at close session + void SessionClosedL(); + +protected: + // from CActive + /** + * Cancel the enumeration process + */ + void DoCancel(); + + void RunL(); + + /** + * Ignore the error, continue with the next one + */ + TInt RunError( TInt aError ); + +private: + /** + * Standard C++ Constructor + * @param aFramework Reference to MMTPDataProviderFramework + * @param aDataProvider Reference to CMediaMtpDataProvider + */ + CMediaMtpDataProviderEnumerator( MMTPDataProviderFramework& aFramework, + CMediaMtpDataProvider& aDataProvider ); + + void ConstructL(); + + /** + * Called when the enumeration is completed + */ + void SignalCompleteL( MMTPEnumerationCallback& aCallback, + TInt aError = KErrNone ); + + void ScanStorageL( TUint32 aStorageId ); + + /** + * Scan next storage + */ + void ScanNextStorageL(); + + /** + * Scans directory at aPath recursing into subdirectories on a depth + * first basis. + * + * Directory entries are kept in iDirStack - which is a LIFO stack. + * The current path, needed since TEntries don't keep track of it, + * is kept in iPath. + * + * The algorithm works as follows: + * + * 1. Read directory entries. + * 2. ProcessEntriesL is called if no error occurs and >= 1 entries are + * read. + * 3. ProcessEntriesL adds entries to database, if entry is directory + * add to iDirStack. + * 4. When all entries are processed pop entry off the dirstack, + * if entry is empty TEntry remove one directory from iPath. + * 5. Append entry name onto iPath - to update path with new depth + * (parent/subdir). + * 6. Push an empty TEntry onto iDirStack - this tells us we have + * recursed one, think of it as pushing the '\' separator onto + * iDirStack. + * 7. Repeat 1-7 until iDirStack is empty. + */ + void ScanDirL(); + + /** + * Recurse into the next directory on the stack + * and scan it for entries. + */ + void ScanNextDirL(); + + /** + * Scan next sub dir + */ + void ScanNextSubdirL(); + + /** + * Iterates iEntries adding entries as needed to object manager and + * iDirStack. + */ + void ProcessEntriesL(); + + /** + * Add a file entry to the object store + * @param aFullFileName current scanned file path + */ + void AddEntryL( const TDesC& aFullFileName ); + + /** + * Returns a TMTPFormatCode for the requested object + */ + TMTPFormatCode GetObjectFormatCode( const TDesC& aFullFileName ); + + /** + * @param aFullFileName the object file name + * @return the file if needed to be enumeratored? + */ + TBool IsFileAccepted( const TDesC& aFullFileName ); + + /** + * start count system tick + */ + void StartEnumerationCount(); + + /** + * check if the system tick more than predefined value + * @retuan if more than the predefined value, return true + * else return false + */ + TBool IsOverThreshold(); + + /** + * Get modified content and report to Symbian MTP Framework + */ + void GetModifiedContentL( const TDesC& aStorageRoot ); + +private: + // Owned + /** MMTPDataProviderFramework used to access MTP components*/ + MMTPDataProviderFramework& iFramework; + + /** MTP Object Manager */ + MMTPObjectMgr& iObjectMgr; + + /** MTP Data Provider ID */ + TUint iDataProviderId; + + CMediaMtpDataProvider& iDataProvider; + TParse iPath; + RDir iDir; + TEntryArray iEntries; + TInt iFirstUnprocessed; + RPointerArray iDirStack; + RArray iStorages; + TUint32 iStorageId; + TUint32 iParentHandle; + TMTPFormatCode iFormatCode; + TBool iScanningDir; + + // record the system tick + TUint iTickCountBegin; + TInt iTickPeriod; + +#if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) + CMmMtpDpPerfLog* iPerfLog; +#endif + + }; + +#endif // CMEDIAMTPDATAPROVIDERENUMERATOR_H