filemanager/GFLM/src/CGflmFileRecognizer.cpp
branchRCL_3
changeset 38 491b3ed49290
parent 36 95243422089a
child 39 65326cf895ed
--- a/filemanager/GFLM/src/CGflmFileRecognizer.cpp	Thu Aug 19 09:42:45 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,454 +0,0 @@
-/*
-* Copyright (c) 2002-2007 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:  Recogniser wrapper
-*
-*/
-
-
-
-// INCLUDE FILES
-#include "CGflmFileRecognizer.h"
-#include "CGflmDriveResolver.h"
-#include "CGflmDriveItem.h"
-#include "GflmUtils.h"
-#include "GFLMConsts.h"
-#include <e32svr.h>
-#include <barsread.h>
-#include <gflmfileextensionmimetypes.rsg>
-#include <data_caging_path_literals.hrh> 
-
-
-// CONSTANTS
-_LIT( KFileExtensionResourceFile, "gflmfileextensionmimetypes.rsc" );
-const TInt KMimeTypeGranularity = 10;
-const TUint KPerCentToDrop = 30;
-const TUint KHundredPerCent = 100;
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CGflmFileRecognizer
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CGflmFileRecognizer::CGflmFileRecognizer(
-        CGflmDriveResolver* aDriveResolver,
-        RFs& aFs ) :
-    iCache( _FOFF( CPathTypePair, iLink ) ),
-    iDriveResolver( aDriveResolver ),
-    iFs( aFs )
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CGflmFileRecognizer::ConstructL( TInt aMemoryConsumption )
-    {
-    User::LeaveIfError( iApaSession.Connect() );
-    iMimeTypes = new( ELeave ) CDesCArraySeg( KMimeTypeGranularity );
-    iCacheMaxMemoryUsage = aMemoryConsumption;
-
-    // Get resource drive from dll location
-    TFileName dllFileName;
-    Dll::FileName( dllFileName );
-    TParsePtrC dllParse( dllFileName );
-
-    TFileName resFileName;
-    resFileName.Copy( dllParse.Drive() );
-    resFileName.Append( KDC_RESOURCE_FILES_DIR );
-    GflmUtils::EnsureFinalBackslash( resFileName );
-    resFileName.Append( KFileExtensionResourceFile );
-
-    RResourceFile resFile;
-    resFile.OpenL( iFs, resFileName );
-    CleanupClosePushL( resFile );
-    resFile.ConfirmSignatureL();
-
-    ConstructExtMimePairsL( resFile, R_EXT_MIME_PAIRS, iExtMimePairs );
-    ConstructExtMimePairsL(
-        resFile, R_REMOTE_EXT_MIME_PAIRS, iRemoteExtMimePairs );
-
-    CleanupStack::PopAndDestroy( &resFile );
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::ConstructExtMimePairsL
-//
-// -----------------------------------------------------------------------------
-//
-void CGflmFileRecognizer::ConstructExtMimePairsL(
-        RResourceFile& aResFile,
-        TInt aResId,
-        RPointerArray< CExtMimePair >& aPairs )
-    {   
-    TCleanupItem cleanupItem( ResetAndDestroyExtMimePairs, &aPairs );
-    CleanupStack::PushL( cleanupItem );
-    // read the pairs
-    HBufC8* resData = aResFile.AllocReadLC( aResId );
-    TResourceReader reader;
-    reader.SetBuffer( resData );
-    TInt count( reader.ReadInt16() );
-    aPairs.ReserveL( count );
-    for ( TInt i( 0 ); i < count; i++ )
-        {
-        TPtrC ext( reader.ReadTPtrC() );
-        TPtrC mime( reader.ReadTPtrC() );
-        CExtMimePair* pair = new (ELeave) CExtMimePair();
-        CleanupStack::PushL( pair );
-        pair->iExt = ext.AllocL();
-        pair->iMime = mime.AllocL();
-        aPairs.AppendL( pair );
-        CleanupStack::Pop( pair );
-        }
-    CleanupStack::PopAndDestroy( resData );
-    CleanupStack::Pop( &aPairs );
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::FindMimeFromExt
-//
-// -----------------------------------------------------------------------------
-//
-TPtrC CGflmFileRecognizer::FindMimeFromExt(
-        const TDesC& aExt,
-        RPointerArray< CExtMimePair >& aPairs )
-    {
-    TInt count( aPairs.Count() );
-
-    for( TInt i( 0 ); i < count; i++)
-        {
-        CExtMimePair* pair = aPairs[ i ];
-        if( !aExt.CompareF( *pair->iExt ) )
-            {
-            return TPtrC( *pair->iMime );
-            }
-        }
-    return TPtrC( KNullDesC );
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CGflmFileRecognizer* CGflmFileRecognizer::NewL(
-        RFs& aFs,
-        TInt aMemoryConsumption,
-        CGflmDriveResolver* aDriveResolver )
-    {
-    CGflmFileRecognizer* self =
-        new( ELeave ) CGflmFileRecognizer( aDriveResolver, aFs );
-
-    CleanupStack::PushL( self );
-    self->ConstructL( aMemoryConsumption );
-    CleanupStack::Pop( self );
-
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::~CGflmFileRecognizer
-//
-// -----------------------------------------------------------------------------
-//
-CGflmFileRecognizer::~CGflmFileRecognizer()
-    {
-    iApaSession.Close();
-
-    FlushCache();
-
-    delete iMimeTypes;
-
-    iExtMimePairs.ResetAndDestroy();
-    iExtMimePairs.Close();
-
-    iRemoteExtMimePairs.ResetAndDestroy();
-    iRemoteExtMimePairs.Close();
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::RecognizeL( const TDesC& aFilename )
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TPtrC CGflmFileRecognizer::RecognizeL( const TDesC& aFilename )
-    {
-    TPtrC mimeType;
-    TRAPD( err, mimeType.Set( DoRecognizeL( aFilename ) ) );
-    if ( err == KErrNoMemory )
-        {
-        FlushCache();
-        return DoRecognizeL( aFilename );
-        }
-    User::LeaveIfError( err );
-    return mimeType;
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::DoRecognizeL( const TDesC& aFilename )
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TPtrC CGflmFileRecognizer::DoRecognizeL( const TDesC& aFilename )
-    {
-    // Search the cache for a hit
-    TInt cropPoint( aFilename.LocateReverse( KGFLMDot()[ 0 ] ) );
-    TBool isRemoteDrive( EFalse );
-
-    if ( iDriveResolver && iDriveResolver->IsRemoteDrive( aFilename ) )
-        {
-        isRemoteDrive = ETrue;
-        }
-
-    if( cropPoint != KErrNotFound )
-        {        
-        TPtrC ext( aFilename.Mid( cropPoint ) );
-        TPtrC mime( FindMimeFromExt( ext, iExtMimePairs ) );
-        if ( mime.Length() )
-            {
-            return mime;
-            }
-
-        // Use remote drive specific extension mime pairs and skip
-        // content recognition because it is so slow for remote drives.
-        // Mime types are resolved from extension by remote storage framework
-        // anyway.
-        if ( isRemoteDrive)
-            {
-            return FindMimeFromExt( ext, iRemoteExtMimePairs );
-            }
-        }
-    else if ( isRemoteDrive)
-        {
-        // Skip content recognition for remote drives because it is so slow
-        return TPtrC( KNullDesC );
-        }
-
-    TDblQueIter< CPathTypePair > pairIt( iCache );
-    pairIt.SetToFirst();
-    CPathTypePair* pair = NULL;
-    while ( ( pair = pairIt++ ) != NULL )
-        {
-        TPtrC ptr( *( pair->iFilename ) );
-        if( ptr.Length() == aFilename.Length() &&
-           !aFilename.CompareF( ptr ) )
-            {
-            // Cache hit
-            // Move item to the first position if not already.
-            // When clearing cache, oldest items can be dropped easily.
-            pair->iLink.Deque();
-            iCache.AddFirst( *pair );
-
-            if ( pair->iTypeIndex != KErrNotFound )
-                {
-                return iMimeTypes->MdcaPoint( pair->iTypeIndex );
-                }
-            return TPtrC( KNullDesC );
-            }
-        }
-
-        // Cache miss
-        TUid uid( KNullUid );
-        TDataType datatype;
-
-        TIMESTAMP( "GFLM AppForDocument started: " )
-
-        // Acquire the mime-type of the file
-        TInt err( iApaSession.AppForDocument( aFilename, uid, datatype ) );
-
-        TIMESTAMP( "GFLM AppForDocument ended: " )
-
-        if ( err != KErrNone )
-            {
-            // If recognition returns error, handle as unrecognized file
-            ERROR_LOG1(
-                "CGflmFileRecognizer::DoRecognizeL-AppForDocument=%d",
-                err )
-            return TPtrC( KNullDesC );
-            }
-
-        CPathTypePair* newPair = CPathTypePair::NewLC( aFilename );
-        TPtrC mimeType( datatype.Des() );
-
-        INFO_LOG2( "GFLM AppForDocument:file=%S,mime=%S", &aFilename, &mimeType )
-
-        // Run through the mime-type list to find the correct index
-        if ( mimeType.Length() )
-            {
-            TBool isMimeFound( EFalse );
-            TInt mimeCount( iMimeTypes->MdcaCount() );
-            for ( TInt j( 0 ); j < mimeCount; j++ )
-                {
-                if( !mimeType.CompareF( iMimeTypes->MdcaPoint( j ) ) )
-                    {
-                    newPair->iTypeIndex = j;
-                    isMimeFound = ETrue;
-                    break;
-                    }
-                }
-            // Add mime type to list if not already added
-            if ( !isMimeFound )
-                {
-                iMimeTypes->AppendL( mimeType );
-                newPair->iTypeIndex = mimeCount;
-                }
-            }
-
-        // Cleanup cache and add new pair
-        CleanupStack::Pop( newPair );
-        CleanupCache();
-        iCacheMemoryUsage += newPair->Size();
-        iCache.AddFirst( *newPair );
-
-        if ( newPair->iTypeIndex != KErrNotFound )
-            {
-            return iMimeTypes->MdcaPoint( newPair->iTypeIndex );
-            }
-        return TPtrC( KNullDesC );
-    }
-
-
-// -----------------------------------------------------------------------------
-//  CGflmFileRecognizer::ResetAndDestroyExtMimePairs( )
-// 
-// -----------------------------------------------------------------------------
-//
-void CGflmFileRecognizer::ResetAndDestroyExtMimePairs( TAny* aPtr )
-    {
-    RPointerArray< CExtMimePair >* extMimePairs = 
-        static_cast< RPointerArray< CExtMimePair >* >( aPtr );
-    extMimePairs->ResetAndDestroy();
-    extMimePairs->Close();
-    }
- 
- 
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::FlushCache( )
-//
-// -----------------------------------------------------------------------------
-//
-void CGflmFileRecognizer::FlushCache()
-    {
-    TDblQueIter< CPathTypePair > pairIt( iCache );
-    pairIt.SetToFirst();
-    CPathTypePair* pair = NULL;
-    while ( ( pair = pairIt++ ) != NULL )
-        {
-        pair->iLink.Deque();
-        delete pair;
-        }
-    iCacheMemoryUsage = 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CleanupCache( )
-//
-// -----------------------------------------------------------------------------
-//
-void CGflmFileRecognizer::CleanupCache( )
-    {
-    if( iCacheMemoryUsage > iCacheMaxMemoryUsage )
-        {
-        TInt dropThreshold = ( TInt ) ( ( ( ( TUint ) iCacheMaxMemoryUsage ) *
-            KPerCentToDrop ) / KHundredPerCent );
-        TInt droppedSize( 0 );
-
-        TDblQueIter< CPathTypePair > pairIt( iCache );
-        pairIt.SetToLast();
-        CPathTypePair* pair = NULL;
-        while ( ( pair = pairIt-- ) != NULL )
-            {
-            droppedSize += pair->Size();
-            pair->iLink.Deque();
-            delete pair;
-            if ( droppedSize >= dropThreshold )
-                {
-                break;
-                }
-            }
-        iCacheMemoryUsage -= droppedSize;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CPathTypePair::NewLC()
-// 
-// -----------------------------------------------------------------------------
-//
-CGflmFileRecognizer::CPathTypePair*
-        CGflmFileRecognizer::CPathTypePair::NewLC( const TDesC& aFilename )
-    {
-    CPathTypePair* self = new ( ELeave ) CPathTypePair();
-    CleanupStack::PushL( self );
-    self->ConstructL( aFilename );
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CPathTypePair::ConstructL()
-// 
-// -----------------------------------------------------------------------------
-//
-void CGflmFileRecognizer::CPathTypePair::ConstructL( const TDesC& aFilename )
-    {
-    iFilename = aFilename.AllocL();
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CPathTypePair::CPathTypePair()
-// 
-// -----------------------------------------------------------------------------
-//
-CGflmFileRecognizer::CPathTypePair::CPathTypePair() :
-        iTypeIndex( KErrNotFound )
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CPathTypePair::~CPathTypePair()
-// 
-// -----------------------------------------------------------------------------
-//
-CGflmFileRecognizer::CPathTypePair::~CPathTypePair()
-    {
-    delete iFilename;
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CPathTypePair::Size()
-// 
-// -----------------------------------------------------------------------------
-//
-TInt CGflmFileRecognizer::CPathTypePair::Size() const
-    {
-    return ( sizeof( TInt ) + iFilename->Size() + sizeof( TDblQueLink ) );
-    }
-
-// -----------------------------------------------------------------------------
-// CGflmFileRecognizer::CExtMimePair::~CExtMimePair()
-// 
-// -----------------------------------------------------------------------------
-//
-CGflmFileRecognizer::CExtMimePair::~CExtMimePair()
-    {
-    delete iExt;
-    delete iMime;
-    }
-
-//  End of File