mmappcomponents/harvester/filehandler/src/mpxmetadatascanner.cpp
changeset 0 a2952bb97e68
child 23 4740b34b83ce
child 27 cbb1bfb7ebfb
equal deleted inserted replaced
-1:000000000000 0:a2952bb97e68
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Active object to extract metadata 
       
    15 *  Version     : %version: da1mmcf#16.2.3.1.5 % 
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 #include <e32base.h>
       
    21 #include <f32file.h>
       
    22 #include <badesca.h>
       
    23 #include <apgcli.h>
       
    24 #include <mpxmedia.h>
       
    25 #include <mpxmediaarray.h>
       
    26 #include <mpxcollectionpath.h>
       
    27 #include <mpxcollectiontype.h>
       
    28 #include <mpxdrmmediautility.h>
       
    29 #include <mpxlog.h>
       
    30 #include <mpxmetadataextractor.h>
       
    31 #include "mpxmetadatascanner.h"
       
    32 #include "mpxmetadatascanobserver.h"
       
    33 #include "mpxfilescanstateobserver.h"
       
    34 
       
    35 // CONSTANTS
       
    36 const TInt KLoopCount = 10;
       
    37 
       
    38 // ======== MEMBER FUNCTIONS ========
       
    39 
       
    40 // ---------------------------------------------------------------------------
       
    41 // Private Constructor
       
    42 // ---------------------------------------------------------------------------
       
    43 //
       
    44 CMPXMetadataScanner::CMPXMetadataScanner( MMPXMetadataScanObserver& aObs,
       
    45                                           MMPXFileScanStateObserver& aStateObs )
       
    46                                       : CActive( EPriorityNull ),
       
    47                                         iObserver( aObs ),
       
    48                                         iStateObserver( aStateObs ) 
       
    49     {
       
    50     CActiveScheduler::Add( this );
       
    51     }
       
    52 
       
    53 
       
    54 // ---------------------------------------------------------------------------
       
    55 // 2nd Phase Constructor
       
    56 // ---------------------------------------------------------------------------
       
    57 //
       
    58 void CMPXMetadataScanner::ConstructL( RFs& aFs, 
       
    59                                       RApaLsSession& aAppArc,
       
    60                                       RPointerArray<CMPXCollectionType>& aTypesAry )
       
    61     {
       
    62     iExtractor = CMPXMetadataExtractor::NewL( aFs, aAppArc, aTypesAry );
       
    63     iNewFileProps = CMPXMediaArray::NewL();
       
    64     iModifiedFileProps = CMPXMediaArray::NewL();
       
    65     }
       
    66 
       
    67 
       
    68 // ---------------------------------------------------------------------------
       
    69 // Two-Phased Constructor
       
    70 // ---------------------------------------------------------------------------
       
    71 //
       
    72 CMPXMetadataScanner* CMPXMetadataScanner::NewL( RFs& aFs,
       
    73                                  RApaLsSession& aAppArc,
       
    74                                  RPointerArray<CMPXCollectionType>& aTypesAry,
       
    75                                  MMPXMetadataScanObserver& aObs,
       
    76                                  MMPXFileScanStateObserver& aStateObs )
       
    77     {
       
    78     CMPXMetadataScanner* self = CMPXMetadataScanner::NewLC( aFs,
       
    79                                                             aAppArc,
       
    80                                                             aTypesAry, 
       
    81                                                             aObs,
       
    82                                                             aStateObs );
       
    83     CleanupStack::Pop( self );
       
    84     return self;
       
    85     }
       
    86 
       
    87 
       
    88 // ---------------------------------------------------------------------------
       
    89 // Two-Phased Constructor
       
    90 // ---------------------------------------------------------------------------
       
    91 //
       
    92 CMPXMetadataScanner* CMPXMetadataScanner::NewLC( RFs& aFs,
       
    93                                   RApaLsSession& aAppArc,
       
    94                                   RPointerArray<CMPXCollectionType>& aTypesAry,
       
    95                                   MMPXMetadataScanObserver& aObs,
       
    96                                   MMPXFileScanStateObserver& aStateObs )
       
    97     {
       
    98     CMPXMetadataScanner* self = new( ELeave ) CMPXMetadataScanner( aObs,
       
    99                                                                    aStateObs );
       
   100     CleanupStack::PushL( self );
       
   101     self->ConstructL( aFs, aAppArc, aTypesAry );
       
   102     return self;
       
   103     }
       
   104 
       
   105 
       
   106 // ---------------------------------------------------------------------------
       
   107 // Virtual Destructor
       
   108 // ---------------------------------------------------------------------------
       
   109 //
       
   110 CMPXMetadataScanner::~CMPXMetadataScanner()
       
   111     {
       
   112     Cancel();
       
   113     Reset();
       
   114     iNewFiles.Close();
       
   115     iModifiedFiles.Close();
       
   116     
       
   117     delete iNewFileProps;
       
   118     delete iModifiedFileProps;
       
   119    
       
   120     delete iExtractor;
       
   121     }
       
   122     
       
   123 // ---------------------------------------------------------------------------
       
   124 // Resets this object
       
   125 // ---------------------------------------------------------------------------
       
   126 //
       
   127 void CMPXMetadataScanner::Reset()
       
   128     {
       
   129     iNewFiles.ResetAndDestroy();
       
   130     iModifiedFiles.ResetAndDestroy();
       
   131     if(iNewFileProps)
       
   132         {
       
   133     iNewFileProps->Reset();
       
   134         }
       
   135     if(iModifiedFileProps)
       
   136         {
       
   137     iModifiedFileProps->Reset();
       
   138         }
       
   139     }
       
   140 
       
   141 // ---------------------------------------------------------------------------
       
   142 // Starts the metadata extraction process
       
   143 // ---------------------------------------------------------------------------
       
   144 //    
       
   145 void CMPXMetadataScanner::Start()
       
   146     {
       
   147     MPX_DEBUG1("MPXMetadataScanner::StartL <---");
       
   148     if( !IsActive() )
       
   149         {
       
   150         // Setup
       
   151         iAryPos = 0;
       
   152         iExtractType = ENewFiles;
       
   153         iExtracting = ETrue;        
       
   154         
       
   155         // Set Active
       
   156         iStatus = KRequestPending;
       
   157         SetActive();
       
   158         TRequestStatus* status = &iStatus;
       
   159         User::RequestComplete( status, KErrNone );    
       
   160         MPX_DEBUG1("MPXMetadataScanner::StartL --->");
       
   161         }
       
   162     }
       
   163 // ---------------------------------------------------------------------------
       
   164 // Stops the metadata extraction process
       
   165 // ---------------------------------------------------------------------------
       
   166 //
       
   167 void CMPXMetadataScanner::Stop()
       
   168     {
       
   169     MPX_DEBUG1("MPXMetadataScanner::Stop <---");
       
   170     DoCancel();
       
   171     MPX_DEBUG1("MPXMetadataScanner::Stop --->");
       
   172     }
       
   173 
       
   174 // ---------------------------------------------------------------------------
       
   175 // Add a file to the scanning list
       
   176 // ---------------------------------------------------------------------------
       
   177 //  
       
   178 void CMPXMetadataScanner::AddNewFileToScanL( const TDesC& aFile )
       
   179     {
       
   180     HBufC* file = aFile.AllocLC();
       
   181     iNewFiles.AppendL( file );
       
   182     CleanupStack::Pop( file );
       
   183     }
       
   184 
       
   185 // ---------------------------------------------------------------------------
       
   186 // Add a file to the modified list
       
   187 // ---------------------------------------------------------------------------
       
   188 //      
       
   189 void CMPXMetadataScanner::AddModifiedFileToScanL( const TDesC& aFile )
       
   190     {
       
   191     HBufC* file = aFile.AllocLC();
       
   192     iModifiedFiles.AppendL( file );
       
   193     CleanupStack::Pop( file );
       
   194     }
       
   195 
       
   196 // ---------------------------------------------------------------------------
       
   197 // Extract media properties for a file
       
   198 // ---------------------------------------------------------------------------
       
   199 //
       
   200 CMPXMedia* CMPXMetadataScanner::ExtractFileL( const TDesC& aFile )
       
   201     {
       
   202     CMPXMedia* media;
       
   203     iExtractor->CreateMediaL( aFile, media );
       
   204     return media;
       
   205     }
       
   206     
       
   207 // ---------------------------------------------------------------------------
       
   208 // Cancel the operation
       
   209 // ---------------------------------------------------------------------------
       
   210 //   
       
   211 void CMPXMetadataScanner::DoCancel()
       
   212     {
       
   213     if( iExtracting )
       
   214         {
       
   215         // Callback to observer 
       
   216         Reset();
       
   217         TRAP_IGNORE( iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanMetadata,
       
   218                                                               KErrCancel ) );
       
   219         iExtracting = EFalse;
       
   220         }    
       
   221     }
       
   222     
       
   223 // ---------------------------------------------------------------------------
       
   224 // RunL function
       
   225 // ---------------------------------------------------------------------------
       
   226 //   
       
   227 void CMPXMetadataScanner::RunL()
       
   228     {
       
   229     if ( iExtracting )
       
   230         {
       
   231         TBool done(EFalse);
       
   232         TRAPD( err, done = DoExtractL() );
       
   233         if ( !iExtracting )
       
   234             {
       
   235             // If DoCancel() was called during DoExtractL(), do nothing.
       
   236             MPX_DEBUG1("CMPXMetadataScanner::RunL - Cancel during RunL");
       
   237             }
       
   238         else if( KErrNone != err || done )
       
   239             {
       
   240             // Callback to observer 
       
   241             TRAP_IGNORE( iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanMetadata,
       
   242                                                               err ) );
       
   243             iExtracting = EFalse;
       
   244             }
       
   245         else
       
   246             {
       
   247             MPX_DEBUG1("CMPXMetadataScanner::RunL -- Run again");
       
   248             iStatus = KRequestPending;
       
   249             SetActive();
       
   250             TRequestStatus* status = &iStatus;
       
   251             User::RequestComplete( status, KErrNone );    
       
   252             }
       
   253         }
       
   254     }
       
   255 
       
   256 // ---------------------------------------------------------------------------
       
   257 // Extract metadata
       
   258 // ---------------------------------------------------------------------------
       
   259 //   
       
   260 TBool CMPXMetadataScanner::DoExtractL()
       
   261     {
       
   262     MPX_DEBUG1("CMPXMetadataScanner::DoExtractL <---");
       
   263     TBool done(EFalse);
       
   264     TExtractType curType = (TExtractType) iExtractType;
       
   265     
       
   266     // Pointer re-direction to generalize extraction
       
   267     RPointerArray<HBufC>* source;
       
   268     CMPXMediaArray* mptarget;
       
   269     if( curType == ENewFiles )
       
   270         {
       
   271         source = &iNewFiles;
       
   272         mptarget = iNewFileProps;
       
   273         }
       
   274     else if( curType == EModFiles )
       
   275         {
       
   276         source = &iModifiedFiles;
       
   277         mptarget = iModifiedFileProps;
       
   278         }
       
   279     else // All done!
       
   280         {
       
   281         return ETrue;    
       
   282         }
       
   283     
       
   284     // Process at most KLoopCount number of files 
       
   285     //
       
   286     mptarget->Reset();
       
   287     if( source->Count() != 0 )
       
   288         {
       
   289         for( TInt i=0; i<KLoopCount; ++i )
       
   290             {
       
   291             CMPXMedia* media(NULL);
       
   292             
       
   293             // TRAP to keep scanning if 1 file fails 
       
   294             TRAPD( err, iExtractor->CreateMediaL( *(*source)[iAryPos], media ) );
       
   295             if ( !iExtracting )
       
   296                 {
       
   297                 // In case DoCancel() was called while processing iExtractor->CreateMediaL
       
   298                 MPX_DEBUG1("CMPXMetadataScanner::DoExtractL - Cancel during CreateMediaL");
       
   299                 delete media;
       
   300                 return ETrue;
       
   301                 }
       
   302             
       
   303             if( err == KErrNone )
       
   304                 {
       
   305                 CleanupStack::PushL( media );
       
   306                 mptarget->AppendL( media );
       
   307                 CleanupStack::Pop( media );
       
   308                 }
       
   309             
       
   310             iAryPos++;
       
   311             if( iAryPos == source->Count() )
       
   312                 {
       
   313                 iAryPos = 0;
       
   314                 iExtractType++;
       
   315                 break;
       
   316                 }
       
   317             }    
       
   318         }
       
   319     else // No item in the array
       
   320         {
       
   321         iAryPos = 0;
       
   322         iExtractType++;    
       
   323         }
       
   324     
       
   325     // After extraction, get observer to add files to the collection
       
   326     //
       
   327     switch( curType )
       
   328         {
       
   329         case ENewFiles:
       
   330             {
       
   331             if( iNewFileProps->Count() )
       
   332                 {
       
   333                 iObserver.AddFilesToCollectionL( *iNewFileProps );
       
   334                 }
       
   335             break;
       
   336             }
       
   337         case EModFiles:
       
   338             {
       
   339             if( iModifiedFileProps->Count() )
       
   340                 {
       
   341                 iObserver.UpdatesFilesInCollectionL( *iModifiedFileProps );
       
   342                 }
       
   343             break;
       
   344             }
       
   345         case EMaxFile:  // All done.
       
   346             done = ETrue;
       
   347             break;
       
   348         default:
       
   349             ASSERT(0); 
       
   350         }
       
   351         
       
   352     MPX_DEBUG1("CMPXMetadataScanner::DoExtractL --->");    
       
   353     return done; 
       
   354     }