--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appinstaller/AppMngr2/src/appmngr2filerecognizer.cpp Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,227 @@
+/*
+* Copyright (c) 2008 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: Recognizes files to get corresponding MIME types
+*
+*/
+
+
+#include "appmngr2filerecognizer.h" // CAppMngr2FileRecognizer
+#include <appmngr2recognizedfile.h> // CAppMngr2RecognizedFile
+#include <f32file.h> // RFs, CDir
+#include <apmstd.h> // TDataType
+#include <caf/caf.h> // ContentAccess
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::NewL()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2FileRecognizer* CAppMngr2FileRecognizer::NewL( RFs& aFs )
+ {
+ CAppMngr2FileRecognizer* self = new (ELeave) CAppMngr2FileRecognizer( aFs );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::~CAppMngr2FileRecognizer()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2FileRecognizer::~CAppMngr2FileRecognizer()
+ {
+ Cancel();
+ iDirStatus = NULL;
+ delete iDirPath;
+ delete iDirEntries;
+ iResultArray.ResetAndDestroy();
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::RecognizeFilesL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2FileRecognizer::RecognizeFilesL( const TDesC& aPath,
+ TRequestStatus& aStatus )
+ {
+ if( IsActive() )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ if( iDirPath )
+ {
+ delete iDirPath;
+ iDirPath = NULL;
+ }
+ iDirPath = aPath.AllocL();
+
+ if( iDirEntries )
+ {
+ delete iDirEntries;
+ iDirEntries = NULL;
+ }
+
+ TInt err = iFs.GetDir( *iDirPath, KEntryAttNormal, ESortNone, iDirEntries );
+ User::LeaveIfError( err );
+
+ aStatus = KRequestPending; // for recognizing all files in the directory
+ iDirStatus = &aStatus;
+
+ iResultArray.ResetAndDestroy();
+ iIndex = 0;
+ iState = ERecognizing;
+
+ // start recognizing the first file asynchronously
+ SetActive();
+ TRequestStatus* fileStatus = &iStatus;
+ User::RequestComplete( fileStatus, KErrNone );
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::CancelRecognizeFiles()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2FileRecognizer::CancelRecognizeFiles()
+ {
+ Cancel();
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::Results()
+// ---------------------------------------------------------------------------
+//
+RPointerArray<CAppMngr2RecognizedFile>& CAppMngr2FileRecognizer::Results()
+ {
+ return iResultArray;
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2FileRecognizer::DoCancel()
+ {
+ switch( iState )
+ {
+ case EIdle:
+ break;
+ case ERecognizing:
+ iState = EIdle;
+ if( iDirStatus )
+ {
+ User::RequestComplete( iDirStatus, KErrCancel );
+ iDirStatus = NULL;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::RunL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2FileRecognizer::RunL()
+ {
+ User::LeaveIfError( iStatus.Int() );
+
+ switch( iState )
+ {
+ case EIdle:
+ break;
+ case ERecognizing:
+ RecognizeNextFileL();
+ break;
+ default:
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::RunError()
+// ---------------------------------------------------------------------------
+//
+TInt CAppMngr2FileRecognizer::RunError( TInt aError )
+ {
+ // RunL() leaved, pass the error code to caller
+ if( iDirStatus )
+ {
+ User::RequestComplete( iDirStatus, aError );
+ iDirStatus = NULL;
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::CAppMngr2FileRecognizer()
+// ---------------------------------------------------------------------------
+//
+CAppMngr2FileRecognizer::CAppMngr2FileRecognizer( RFs& aFs ) :
+ CActive( CActive::EPriorityLow ), iFs( aFs )
+ {
+ // EPriorityLow used for smooth operation. Low priority allows UI refreshes
+ // to proceed when some files have been recognized (even if there are still
+ // more files to be recognized and recognizer is waiting for the next file
+ // to be recognized).
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CAppMngr2FileRecognizer::RecognizeNextFileL()
+// ---------------------------------------------------------------------------
+//
+void CAppMngr2FileRecognizer::RecognizeNextFileL()
+ {
+ if( iIndex < iDirEntries->Count() )
+ {
+ // recognize the file which index is iIndex
+ const TEntry& file = ( *iDirEntries )[ iIndex ];
+
+ HBufC* fullName = HBufC::NewLC( iDirPath->Length() + file.iName.Length() );
+ TPtr namePtr( fullName->Des() );
+ namePtr.Copy( *iDirPath );
+ namePtr.Append( file.iName );
+
+ ContentAccess::CContent* content = ContentAccess::CContent::NewLC(
+ *fullName, ContentAccess::EContentShareReadWrite );
+
+ HBufC* mimeType = HBufC::NewLC( KMaxDataTypeLength );
+ TPtr mimePtr( mimeType->Des() );
+ content->GetStringAttribute( ContentAccess::EMimeType, mimePtr );
+
+ CAppMngr2RecognizedFile* recFile = CAppMngr2RecognizedFile::NewL( fullName, mimeType );
+ CleanupStack::Pop( mimeType );
+ CleanupStack::PopAndDestroy( content );
+ CleanupStack::Pop( fullName );
+
+ CleanupStack::PushL( recFile );
+ iResultArray.AppendL( recFile );
+ CleanupStack::Pop( recFile );
+
+ // and then recognize the next file
+ iIndex++;
+ SetActive();
+ TRequestStatus* fileStatus = &iStatus;
+ User::RequestComplete( fileStatus, KErrNone );
+ }
+ else
+ {
+ // all done, directory has been processed
+ User::RequestComplete( iDirStatus, KErrNone );
+ iDirStatus = NULL;
+ }
+ }
+