imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp
changeset 54 48dd0f169f0d
parent 42 2e2a89493e2b
equal deleted inserted replaced
42:2e2a89493e2b 54:48dd0f169f0d
     1 /*
       
     2 * Copyright (c) 2006-2007 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:  Thumbnail server
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 #include <e32svr.h>
       
    20 #include <MIHLScaler.h>
       
    21 #include <driveinfo.h>
       
    22 #include <caf/data.h>
       
    23 #include <Oma2Agent.h>
       
    24 #include <bautils.h>  
       
    25 #include <mdesession.h>
       
    26 
       
    27 #include "thumbnailserver.h"
       
    28 #include "thumbnailtaskprocessor.h"
       
    29 #include "thumbnailserversession.h"
       
    30 #include "thumbnailmanagerconstants.h"
       
    31 #include "thumbnailmanageruids.hrh"
       
    32 #include "thumbnaillog.h"
       
    33 #include "thumbnailstore.h"
       
    34 #include "thumbnaildiskunmountobserver.h"
       
    35 #include "thumbnailpanic.h"
       
    36 #include "thumbnailcenrep.h"
       
    37 #include "thumbnailmemorycardobserver.h"
       
    38 #include "tmgetimei.h"
       
    39 #include "thumbnailfetchedchecker.h"
       
    40 #include "OstTraceDefinitions.h"
       
    41 #ifdef OST_TRACE_COMPILER_IN_USE
       
    42 #include "thumbnailserverTraces.h"
       
    43 #endif
       
    44 
       
    45 
       
    46 
       
    47 _LIT8( KThumbnailMimeWildCard, "*" );
       
    48 _LIT8( KThumbnailMimeImage, "image" );
       
    49 _LIT8( KThumbnailMimeVideo, "video" );
       
    50 _LIT8( KThumbnailMimeAudio, "audio" );
       
    51 _LIT8( KThumbnailMimeContact, "contact" );
       
    52 
       
    53 const TChar KThumbnailMimeSeparatorChar = '/';
       
    54 const TChar KThumbnailMimeWildCardChar = '*';
       
    55 const TChar KThumbnailMimeTypeSeparatorChar = ' ';
       
    56 
       
    57 // ----------------------------------------------------------------------------------------
       
    58 // Server's policy here
       
    59 // ----------------------------------------------------------------------------------------
       
    60 
       
    61 // ----------------------------------------------------------------------------------------
       
    62 // Total number of ranges
       
    63 // ----------------------------------------------------------------------------------------
       
    64 const TUint KThumbnailServerRangeCount = 16;
       
    65  
       
    66 // ----------------------------------------------------------------------------------------
       
    67 // Definition of the ranges
       
    68 // ----------------------------------------------------------------------------------------
       
    69 const TInt KThumbnailServerRanges[KThumbnailServerRangeCount] = 
       
    70 {
       
    71     ERequestThumbByPathAsync,      
       
    72     ERequestThumbByFileHandleAsync,          
       
    73     EReleaseBitmap,
       
    74     ECancelRequest,
       
    75     EChangePriority,
       
    76     EDeleteThumbnails,
       
    77     EGetMimeTypeBufferSize,
       
    78     EGetMimeTypeList,
       
    79     ERequestThumbByIdAsync,
       
    80     ERequestThumbByBufferAsync,
       
    81     ERequestSetThumbnailByBuffer,
       
    82     EDeleteThumbnailsById,
       
    83     ERenameThumbnails,
       
    84     EUpdateThumbnails,
       
    85     ERequestSetThumbnailByBitmap,
       
    86     EThumbnailServerRequestCount,
       
    87 };
       
    88 
       
    89 // ----------------------------------------------------------------------------------------
       
    90 // Policy to implement for each of the above ranges 
       
    91 // ----------------------------------------------------------------------------------------      
       
    92 const TUint8 KThumbnailServerElementsIndex[KThumbnailServerRangeCount] = 
       
    93     {
       
    94     CPolicyServer::ECustomCheck,    // ERequestThumbByPathAsync
       
    95     CPolicyServer::ECustomCheck,    // ERequestThumbByFileHandleAsync
       
    96     CPolicyServer::ECustomCheck,    // EReleaseBitmap
       
    97     CPolicyServer::ECustomCheck,    // ECancelRequest
       
    98     CPolicyServer::ECustomCheck,    // EChangePriority
       
    99     CPolicyServer::ECustomCheck,    // EDeleteThumbnails
       
   100     CPolicyServer::ECustomCheck,    // EGetMimeTypeBufferSize
       
   101     CPolicyServer::ECustomCheck,    // EGetMimeTypeList
       
   102     CPolicyServer::ECustomCheck,    // ERequestThumbByIdAsync
       
   103     CPolicyServer::ECustomCheck,    // ERequestThumbByBufferAsync
       
   104     CPolicyServer::ECustomCheck,    // ERequestSetThumbnailByBuffer
       
   105     CPolicyServer::ECustomCheck,    // EDeleteThumbnailsById
       
   106     CPolicyServer::ECustomCheck,    // ERenameThumbnails
       
   107     CPolicyServer::ECustomCheck,    // EUpdateThumbnails
       
   108     CPolicyServer::ECustomCheck,    // ERequestSetThumbnailByBitmap
       
   109     CPolicyServer::ECustomCheck,    // EThumbnailServerRequestCount
       
   110     };
       
   111 
       
   112 // ----------------------------------------------------------------------------------------
       
   113 // Package all the above together into a policy 
       
   114 // ---------------------------------------------------------------------------------------- 
       
   115 const CPolicyServer::TPolicy KThumbnailServerPolicy =
       
   116     {
       
   117     CPolicyServer::EAlwaysPass,
       
   118     KThumbnailServerRangeCount,      // number of ranges
       
   119     KThumbnailServerRanges,          // ranges array
       
   120     KThumbnailServerElementsIndex,   // elements<->ranges index
       
   121     NULL 
       
   122                                // array of elements
       
   123     };
       
   124 
       
   125 // ---------------------------------------------------------------------------
       
   126 // CustomSecurityCheckL
       
   127 // ---------------------------------------------------------------------------
       
   128 //
       
   129 CPolicyServer::TCustomResult CThumbnailServer::CustomSecurityCheckL(
       
   130         const RMessage2& aMsg, TInt& /*aAction*/, TSecurityInfo& /*aMissing*/ )
       
   131     {
       
   132     CPolicyServer::TCustomResult securityCheckResult = EFail;
       
   133     
       
   134     switch ( aMsg.Function() )
       
   135         {
       
   136         case ERequestThumbByPathAsync:
       
   137         case ERequestThumbByFileHandleAsync:
       
   138         case ERequestThumbByIdAsync:
       
   139         case ERequestThumbByBufferAsync:
       
   140             {
       
   141             securityCheckResult = EPass;
       
   142             break;
       
   143             }
       
   144         case EReleaseBitmap:
       
   145         case ECancelRequest:
       
   146         case EChangePriority:
       
   147         case EDeleteThumbnails:
       
   148         case EGetMimeTypeBufferSize:
       
   149         case EGetMimeTypeList:
       
   150         case ERequestSetThumbnailByBuffer:
       
   151         case EDeleteThumbnailsById:
       
   152         case EUpdateThumbnails:
       
   153         case ERenameThumbnails:    
       
   154         case ERequestSetThumbnailByBitmap:
       
   155             {
       
   156             if( aMsg.HasCapability( ECapabilityReadDeviceData ) && 
       
   157                 aMsg.HasCapability( ECapabilityWriteDeviceData ) )
       
   158                 {
       
   159                 securityCheckResult = EPass;
       
   160                 }
       
   161             break;
       
   162             }
       
   163         case EThumbnailServerRequestCount:
       
   164         default:
       
   165             {
       
   166             securityCheckResult = EFail;
       
   167             }
       
   168         }
       
   169     
       
   170     return securityCheckResult;
       
   171     }
       
   172 // ---------------------------------------------------------------------------
       
   173 // CustomFailureActionL
       
   174 // ---------------------------------------------------------------------------
       
   175 //
       
   176 CPolicyServer::TCustomResult CThumbnailServer::CustomFailureActionL(
       
   177         const RMessage2& /*aMsg*/, TInt /*aAction*/, const TSecurityInfo& /*aMissing*/ )
       
   178     {
       
   179     // Not used
       
   180     return EFail;
       
   181     }
       
   182 
       
   183 // ======== MEMBER FUNCTIONS ========
       
   184 
       
   185 // ---------------------------------------------------------------------------
       
   186 // CThumbnailServer::CThumbnailServer()
       
   187 // C++ default constructor can NOT contain any code, that might leave.
       
   188 // ---------------------------------------------------------------------------
       
   189 //
       
   190 CThumbnailServer::CThumbnailServer(): CPolicyServer( CActive::EPriorityStandard,
       
   191     KThumbnailServerPolicy, EUnsharableSessions )
       
   192     {
       
   193     // No implementation required
       
   194     }
       
   195 
       
   196 // ---------------------------------------------------------------------------
       
   197 // CThumbnailServer::NewL()
       
   198 // Two-phased constructor.
       
   199 // ---------------------------------------------------------------------------
       
   200 //
       
   201 CThumbnailServer* CThumbnailServer::NewL()
       
   202     {
       
   203     CThumbnailServer* self = new( ELeave )CThumbnailServer();
       
   204     CleanupStack::PushL( self );
       
   205     self->ConstructL();
       
   206     CleanupStack::Pop( self );
       
   207     return self;
       
   208     }
       
   209 
       
   210 
       
   211 // ---------------------------------------------------------------------------
       
   212 // CThumbnailServer::ConstructL()
       
   213 // Symbian 2nd phase constructor can leave.
       
   214 // ---------------------------------------------------------------------------
       
   215 //
       
   216 void CThumbnailServer::ConstructL()
       
   217     {
       
   218     TN_DEBUG1( "CThumbnailServer::ConstructL()" );
       
   219     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_CONSTRUCTL, "CThumbnailServer::ConstructL" );
       
   220     
       
   221 #ifdef _DEBUG
       
   222     iPlaceholderCounter = 0;
       
   223 #endif
       
   224     
       
   225     // create shutdown observer
       
   226     iShutdownObserver = CTMShutdownObserver::NewL( *this, KTMPSNotification, KShutdown, ETrue );  
       
   227     iShutdown = EFalse;
       
   228     
       
   229     // MDS session reconnect timer
       
   230     iReconnect = CPeriodic::NewL(CActive::EPriorityIdle);
       
   231     
       
   232     // connect to MDS
       
   233     iMdESession = CMdESession::NewL( *this );
       
   234     iSessionError = EFalse;
       
   235     
       
   236     User::LeaveIfError( iFbsSession.Connect());
       
   237     User::LeaveIfError( Start( KThumbnailServerName ));
       
   238     User::LeaveIfError( iFs.Connect());
       
   239     iProcessor = CThumbnailTaskProcessor::NewL();
       
   240     REComSession::FinalClose();
       
   241     REComSession::ListImplementationsL( TUid::Uid( THUMBNAIL_PROVIDER_IF_UID ),
       
   242         iPluginInfoArray );
       
   243     
       
   244 	//preload provide plugins
       
   245     PreLoadProviders();
       
   246     
       
   247     CTMGetImei * imeiGetter = CTMGetImei::NewLC();
       
   248    
       
   249     iImei = imeiGetter->GetIMEI();
       
   250     CleanupStack::PopAndDestroy(imeiGetter);
       
   251     
       
   252     iFs.CreatePrivatePath(EDriveC);
       
   253     iFs.SetSessionToPrivate(EDriveC);
       
   254     
       
   255     iCenrep = CThumbnailCenRep::NewL();
       
   256                
       
   257     iPersistentSizes = iCenrep->GetPersistentSizes();
       
   258             
       
   259     iMMCObserver = CThumbnailMemoryCardObserver::NewL( this, iFs );
       
   260     
       
   261     iFormatObserver = CTMFormatObserver::NewL( *this );
       
   262     
       
   263     iFormatting = EFalse;
       
   264     
       
   265     OpenStoresL();
       
   266     
       
   267     AddUnmountObserversL();
       
   268     iFetchedChecker = CThumbnailFetchedChecker::NewL();
       
   269     
       
   270     // Unmount timeout timer
       
   271     iUnmount = CPeriodic::NewL(CActive::EPriorityIdle);
       
   272     }
       
   273 
       
   274 
       
   275 // ---------------------------------------------------------------------------
       
   276 // Destructor.
       
   277 // ---------------------------------------------------------------------------
       
   278 //
       
   279 CThumbnailServer::~CThumbnailServer()
       
   280     {
       
   281     TN_DEBUG1( "CThumbnailServer::~CThumbnailServer()" );
       
   282     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_CTHUMBNAILSERVER, "CThumbnailServer::~CThumbnailServer" );
       
   283 
       
   284     iShutdown = ETrue;
       
   285     
       
   286     if(iUnmount)
       
   287         {
       
   288         iUnmount->Cancel();
       
   289         delete iUnmount;
       
   290         iUnmount = NULL;
       
   291         }
       
   292 		
       
   293 	iUnmountedDrives.Close();
       
   294     
       
   295     delete iFetchedChecker;
       
   296     iFetchedChecker = NULL;
       
   297     delete iShutdownObserver;
       
   298     iShutdownObserver = NULL;
       
   299     delete iProcessor;
       
   300     iProcessor = NULL;
       
   301     
       
   302     if(iReconnect)
       
   303         {
       
   304         iReconnect->Cancel();
       
   305         delete iReconnect;
       
   306         iReconnect = NULL;
       
   307         }
       
   308     
       
   309     if (iMdESession)
       
   310         {
       
   311         delete iMdESession;
       
   312         iMdESession = NULL;
       
   313         }
       
   314 
       
   315     ResetAndDestroyHashMap < TInt, CThumbnailStore > ( iStores );
       
   316     ResetAndDestroyHashMap < TInt32, CThumbnailProvider > ( iProviders );
       
   317     
       
   318     iUnmountObservers.ResetAndDestroy();
       
   319     delete iMMCObserver;
       
   320     iMMCObserver = NULL;
       
   321     delete iFormatObserver;
       
   322     iFormatObserver = NULL;
       
   323     
       
   324     THashMapIter < TInt, TThumbnailBitmapRef > bpiter( iBitmapPool );
       
   325 
       
   326     // const pointer to a non-const object
       
   327     const TThumbnailBitmapRef* ref = bpiter.NextValue();
       
   328 
       
   329     while ( ref )
       
   330         {
       
   331         delete ref->iBitmap;
       
   332         ref = bpiter.NextValue();
       
   333         }
       
   334     
       
   335     delete iScaler;
       
   336     iScaler = NULL;
       
   337     iBitmapPool.Close();
       
   338     iFbsSession.Disconnect();
       
   339     iRecognizer.Close();
       
   340     iPluginInfoArray.ResetAndDestroy();
       
   341     delete iCenrep;
       
   342     iCenrep = NULL;
       
   343     iFs.Close();
       
   344     REComSession::FinalClose();
       
   345     }
       
   346 
       
   347 // -----------------------------------------------------------------------------
       
   348 // CThumbnailServer::HandleSessionOpened
       
   349 // -----------------------------------------------------------------------------
       
   350 //
       
   351 #ifdef _DEBUG
       
   352 void CThumbnailServer::HandleSessionOpened( CMdESession& /* aSession */, TInt aError )
       
   353 #else
       
   354 void CThumbnailServer::HandleSessionOpened( CMdESession& /* aSession */, TInt /*aError*/ )
       
   355 #endif
       
   356     {
       
   357 #ifdef _DEBUG
       
   358     TN_DEBUG2( "CThumbnailServer::HandleSessionOpened error == %d", aError );
       
   359     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_HANDLESESSIONOPENED, "CThumbnailServer::HandleSessionOpened;aError=%d", aError );
       
   360 #endif    
       
   361     }
       
   362 
       
   363 // -----------------------------------------------------------------------------
       
   364 // CThumbnailServer::HandleSessionError
       
   365 // -----------------------------------------------------------------------------
       
   366 //
       
   367 void CThumbnailServer::HandleSessionError( CMdESession& /*aSession*/, TInt aError )
       
   368     {
       
   369     TN_DEBUG2( "CThumbnailServer::HandleSessionError == %d", aError );
       
   370     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_HANDLESESSIONERROR, "CThumbnailServer::HandleSessionError;aError=%d", aError );
       
   371     if (aError != KErrNone && !iShutdown && !iSessionError)
       
   372         {
       
   373         iSessionError = ETrue;
       
   374     
       
   375         if (!iReconnect->IsActive())
       
   376             {
       
   377             iReconnect->Start( KMdEReconnect, KMdEReconnect, 
       
   378                                TCallBack(ReconnectCallBack, this));
       
   379             
       
   380             TN_DEBUG1( "CThumbnailServer::HandleSessionError() - reconnect timer started" );
       
   381             OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_HANDLESESSIONERROR, "CThumbnailServer::HandleSessionError - reconnect timer started" );
       
   382             }
       
   383         } 
       
   384     }
       
   385 
       
   386 // -----------------------------------------------------------------------------
       
   387 // CThumbnailServer::NewSessionL()
       
   388 // Creates new server session.
       
   389 // -----------------------------------------------------------------------------
       
   390 //
       
   391 CSession2* CThumbnailServer::NewSessionL( const TVersion& aVersion, const
       
   392     RMessage2&  /*aMessage*/ )const
       
   393     {
       
   394     const TVersion v( KThumbnailServerMajorVersionNumber,
       
   395         KThumbnailServerMinorVersionNumber, KThumbnailServerBuildVersionNumber )
       
   396         ;
       
   397     if ( !User::QueryVersionSupported( v, aVersion ))
       
   398         {
       
   399         User::Leave( KErrNotSupported );
       
   400         }
       
   401     return new( ELeave )CThumbnailServerSession();
       
   402     }
       
   403 
       
   404 
       
   405 // -----------------------------------------------------------------------------
       
   406 // CThumbnailServer::ThreadFunctionL()
       
   407 // -----------------------------------------------------------------------------
       
   408 //
       
   409 void CThumbnailServer::ThreadFunctionL()
       
   410     {
       
   411     // Rename own thread
       
   412     User::LeaveIfError( User::RenameThread( KThumbnailServerName ));
       
   413 
       
   414     CThumbnailServer* server = NULL;
       
   415     CActiveScheduler* scheduler = new( ELeave )CActiveScheduler();
       
   416 
       
   417     if ( scheduler )
       
   418         {
       
   419         CActiveScheduler::Install( scheduler );
       
   420         CleanupStack::PushL( scheduler );
       
   421         server = CThumbnailServer::NewL(); // Adds server in scheduler
       
   422         // No need to CleanupStack::PushL(server) since no leaves can happen
       
   423         RProcess::Rendezvous( KErrNone );
       
   424         TN_DEBUG1( 
       
   425             "CThumbnailServer::ThreadFunctionL() -- CActiveScheduler::Start() in" );
       
   426         OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_THREADFUNCTIONL, "CThumbnailServer::ThreadFunctionL -- CActiveScheduler::Start() in" );
       
   427         CActiveScheduler::Start();
       
   428         TN_DEBUG1( 
       
   429             "CThumbnailServer::ThreadFunctionL() -- CActiveScheduler::Start() out" );
       
   430         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_THREADFUNCTIONL, "CThumbnailServer::ThreadFunctionL - out" );
       
   431         // Comes here if server gets shut down
       
   432         delete server;
       
   433         server = NULL;
       
   434         CleanupStack::PopAndDestroy( scheduler );
       
   435         }
       
   436     }
       
   437 
       
   438 
       
   439 // -----------------------------------------------------------------------------
       
   440 // CThumbnailServer::AddSession()
       
   441 // -----------------------------------------------------------------------------
       
   442 //
       
   443 void CThumbnailServer::AddSession()
       
   444     {
       
   445     TN_DEBUG2( "CThumbnailServer::AddSession() iSessionCount was %d",
       
   446         iSessionCount );
       
   447     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_ADDSESSION, "CThumbnailServer::AddSession;iSessionCount=%d", iSessionCount );
       
   448     iSessionCount++;
       
   449     }
       
   450 
       
   451 
       
   452 // -----------------------------------------------------------------------------
       
   453 // CThumbnailServer::DropSession()
       
   454 // -----------------------------------------------------------------------------
       
   455 //
       
   456 void CThumbnailServer::DropSession(CThumbnailServerSession* aSession)
       
   457     {
       
   458     TN_DEBUG2( "CThumbnailServer::DropSession() iSessionCount was %d",
       
   459         iSessionCount );
       
   460     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_DROPSESSION, "CThumbnailServer::DropSession;iSessionCount=%d", iSessionCount );
       
   461     iSessionCount--;
       
   462     
       
   463     if(iProcessor)
       
   464         {
       
   465         iProcessor->RemoveTasks(aSession);
       
   466         }
       
   467     
       
   468     TN_DEBUG2( "CThumbnailServer::DropSession() aSession = 0x%08x", aSession );        
       
   469     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_DROPSESSION, "CThumbnailServer::DropSession;aSession=%o", aSession );
       
   470     
       
   471     // clean-up bitmap pool    
       
   472     THashMapIter < TInt, TThumbnailBitmapRef > bpiter( iBitmapPool );
       
   473 
       
   474     // const pointer to a non-const object
       
   475     const TThumbnailBitmapRef* ref = bpiter.NextValue();
       
   476 
       
   477     while ( ref )
       
   478         {        
       
   479         if ( ref->iSession == aSession )
       
   480             {
       
   481             TN_DEBUG2( "CThumbnailServer::DropSession() - ref->iSession = 0x%08x", ref->iSession );
       
   482             OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_DROPSESSION, "CThumbnailServer::DropSession;ref->iSession=%o", ref->iSession );
       
   483         
       
   484             delete ref->iBitmap;
       
   485             bpiter.RemoveCurrent();
       
   486                         
       
   487             TN_DEBUG2( "CThumbnailServer::DropSession() - deleted bitmap, left=%d", iBitmapPool.Count());
       
   488             OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSERVER_DROPSESSION, "CThumbnailServer::DropSession;iBitmapPool.Count()=%d", iBitmapPool.Count() );
       
   489             }
       
   490         
       
   491         ref = bpiter.NextValue();        
       
   492         }
       
   493 
       
   494     if ( iSessionCount <= 0 )
       
   495         {
       
   496         // server shutdown
       
   497         if (!iShutdown)
       
   498             {
       
   499             // rename thread
       
   500             User::RenameThread( KThumbnailServerShutdown );
       
   501         
       
   502             CActiveScheduler::Stop();
       
   503             iShutdown = ETrue;
       
   504             }
       
   505         }
       
   506     }
       
   507 
       
   508 // -----------------------------------------------------------------------------
       
   509 // CThumbnailServer::ShutdownNotification
       
   510 // -----------------------------------------------------------------------------
       
   511 //
       
   512 void CThumbnailServer::ShutdownNotification()
       
   513     {
       
   514     TN_DEBUG1( "CThumbnailServer::ShutdownNotification()");
       
   515     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_SHUTDOWNNOTIFICATION, "CThumbnailServer::ShutdownNotification" );
       
   516     if (!iShutdown)
       
   517         {
       
   518         TN_DEBUG1( "CThumbnailServer::ShutdownNotification() shutdown");
       
   519         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_SHUTDOWNNOTIFICATION, "CThumbnailServer::ShutdownNotification - shutdown" );
       
   520         CActiveScheduler::Stop();
       
   521         iShutdown = ETrue;
       
   522         }
       
   523     }
       
   524 
       
   525 
       
   526 // -----------------------------------------------------------------------------
       
   527 // CThumbnailServer::AddBitmapToPoolL()
       
   528 // Add bitmap to bitmap pool.
       
   529 // -----------------------------------------------------------------------------
       
   530 //
       
   531 void CThumbnailServer::AddBitmapToPoolL( CThumbnailServerSession* aSession,
       
   532     CFbsBitmap* aBitmap, TThumbnailServerRequestId aRequestId )
       
   533     {
       
   534     if( !aBitmap )
       
   535         {
       
   536         TN_DEBUG1( "CThumbnailServer::AddBitmapToPoolL() - KErrArgument");
       
   537         OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_ADDBITMAPTOPOOLL, "CThumbnailServer::AddBitmapToPoolL - KErrArgument" );
       
   538         User::Leave( KErrArgument );
       
   539         }
       
   540     TN_DEBUG4( 
       
   541         "CThumbnailServer::AddBitmapToPoolL(aSession=0x%08x, aBitmap=0x%08x), handle=%d", aSession, aBitmap, aBitmap->Handle());
       
   542 
       
   543     TThumbnailBitmapRef* ptr = iBitmapPool.Find( aBitmap->Handle());
       
   544 
       
   545     TN_DEBUG2( "CThumbnailServer::AddBitmapToPoolL() - req id = %d", aRequestId.iRequestId );
       
   546     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_ADDBITMAPTOPOOLL, "CThumbnailServer::AddBitmapToPoolL;aRequestId.iRequestId=%u", aRequestId.iRequestId );
       
   547     
       
   548     if ( ptr )
       
   549         {
       
   550         ptr->iRefCount++;
       
   551         }
       
   552     else
       
   553         {
       
   554         TThumbnailBitmapRef ref;
       
   555         ref.iBitmap = aBitmap;
       
   556         ref.iSession = aSession;
       
   557         ref.iRefCount = 1; // magic: first reference        
       
   558         ref.iRequestId = aRequestId.iRequestId;               
       
   559         
       
   560         iBitmapPool.InsertL( aBitmap->Handle(), ref );
       
   561         }
       
   562     
       
   563 #ifdef _DEBUG
       
   564     TN_DEBUG2( "CThumbnailServer::BITMAP-POOL-COUNTER----------, Bitmaps = %d", iBitmapPool.Count() );
       
   565     OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_ADDBITMAPTOPOOLL, "CThumbnailServer::AddBitmapToPoolL;iBitmapPool.Count()=%d", iBitmapPool.Count() );
       
   566 #endif
       
   567     }
       
   568 
       
   569 
       
   570 // -----------------------------------------------------------------------------
       
   571 // CThumbnailServer::StoreThumbnailL()
       
   572 // -----------------------------------------------------------------------------
       
   573 //
       
   574 void CThumbnailServer::StoreThumbnailL( const TDesC& aPath, CFbsBitmap* aBitmap,
       
   575     const TSize& aOriginalSize, const TBool aCropped, const TThumbnailSize aThumbnailSize,
       
   576     const TInt64 aModified, const TBool aThumbFromPath, const TBool aCheckExist )
       
   577     {
       
   578     TN_DEBUG6( 
       
   579         "CThumbnailServer::StoreBitmapL(aPath=%S, aBitmap=0x%08x, aOriginalSize=%dx%d, aCropped=%d)", &aPath, aBitmap, aOriginalSize.iWidth, aOriginalSize.iHeight, aCropped );
       
   580     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_STORETHUMBNAILL, "CThumbnailServer::StoreThumbnailL;aBitmap=%o", aBitmap );
       
   581     OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_STORETHUMBNAILL, "CThumbnailServer::StoreThumbnailL;aPath=%S", aPath );
       
   582     OstTraceExt3( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_STORETHUMBNAILL, "CThumbnailServer::StoreThumbnailL;aOriginalSize.iWidth=%d;aOriginalSize.iHeight=%d;aCropped=%u", aOriginalSize.iWidth, aOriginalSize.iHeight, aCropped );
       
   583     
       
   584 #ifdef _DEBUG
       
   585     TN_DEBUG2( "CThumbnailServer::StoreThumbnailL() - iScaledBitmap displaymode is %d", aBitmap->DisplayMode());
       
   586     OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSERVER_STORETHUMBNAILL, "CThumbnailServer::StoreThumbnailL;aBitmap->DisplayMode()=%u", aBitmap->DisplayMode() );
       
   587 #endif
       
   588     
       
   589     if (!aCheckExist)
       
   590         {
       
   591         StoreForPathL( aPath )->StoreThumbnailL( aPath, aBitmap, aOriginalSize,
       
   592                        aCropped, aThumbnailSize, aModified, aThumbFromPath, EFalse );
       
   593         }    
       
   594     else if(BaflUtils::FileExists( iFs, aPath))
       
   595         {
       
   596         StoreForPathL( aPath )->StoreThumbnailL( aPath, aBitmap, aOriginalSize,
       
   597                        aCropped, aThumbnailSize, aModified, aThumbFromPath, EFalse );
       
   598         }
       
   599     else
       
   600         {
       
   601         TN_DEBUG1( "CThumbnailServer::StoreThumbnailL() - file doesn't exists anymore, skip store!");
       
   602         OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVER_STORETHUMBNAILL, "CThumbnailServer::StoreThumbnailL - file doesn't exists anymore, skip store!" );
       
   603         }
       
   604     
       
   605     if( iFetchedChecker )    
       
   606         {
       
   607         iFetchedChecker->SetFetchResult( aPath, aThumbnailSize, KErrNone );
       
   608         }
       
   609     }
       
   610 
       
   611 
       
   612 // -----------------------------------------------------------------------------
       
   613 // CThumbnailServer::FetchThumbnailL()
       
   614 // -----------------------------------------------------------------------------
       
   615 //
       
   616 void CThumbnailServer::FetchThumbnailL( const TDesC& aPath, CFbsBitmap* &
       
   617     aThumbnail, TDesC8* & aData, const TThumbnailSize aThumbnailSize, TSize &aOriginalSize )
       
   618     {
       
   619     TN_DEBUG3( "CThumbnailServer::FetchThumbnailL(aPath=%S aThumbnailSize=%d)", &aPath, aThumbnailSize );
       
   620     OstTraceExt2( TRACE_NORMAL, CTHUMBNAILSERVER_FETCHTHUMBNAILL, "CThumbnailServer::FetchThumbnailL;aPath=%S;aThumbnailSize=%hu", aPath, aThumbnailSize );
       
   621     if( iFetchedChecker )
       
   622         {
       
   623         TInt err( iFetchedChecker->LastFetchResult( aPath, aThumbnailSize ) );
       
   624         if ( err == KErrNone ) // To avoid useless sql gets that fails for sure
       
   625             {
       
   626             // custom sizes are not stored to db, skip fetching
       
   627             if ( aThumbnailSize == ECustomThumbnailSize )
       
   628                 {
       
   629                 User::Leave( KErrNotFound );
       
   630                 }
       
   631         
       
   632             TRAP( err, StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize) );
       
   633             if ( err != KErrNone )
       
   634                 {
       
   635                 iFetchedChecker->SetFetchResult( aPath, aThumbnailSize, err );
       
   636                 }
       
   637             }
       
   638         User::LeaveIfError( err );
       
   639         }
       
   640     else
       
   641         {
       
   642         // custom sizes are not stored to db, skip fetching
       
   643         if ( aThumbnailSize == ECustomThumbnailSize )
       
   644             {
       
   645             User::Leave( KErrNotFound );
       
   646             }
       
   647     
       
   648         StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize);
       
   649         }
       
   650     }
       
   651 
       
   652 
       
   653 
       
   654 // -----------------------------------------------------------------------------
       
   655 // CThumbnailServer::DeleteBitmapFromPool()
       
   656 // Removes bitmap from bitmap pool
       
   657 // -----------------------------------------------------------------------------
       
   658 //
       
   659 void CThumbnailServer::DeleteBitmapFromPool( TInt aHandle )
       
   660     {
       
   661     TN_DEBUG2( "CThumbnailServer::DeleteBitmapFromPool(%d)", aHandle );
       
   662     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_DELETEBITMAPFROMPOOL, "CThumbnailServer::DeleteBitmapFromPool;aHandle=%d", aHandle );
       
   663 
       
   664     TThumbnailBitmapRef* ptr = iBitmapPool.Find( aHandle );
       
   665     if ( ptr )
       
   666         {
       
   667         ptr->iRefCount--;
       
   668         if ( !ptr->iRefCount )
       
   669             {
       
   670             TN_DEBUG3( 
       
   671                 "CThumbnailServer::DeleteBitmapFromPool(%d) -- deleting 0x%08x)", aHandle, ptr );
       
   672             OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_DELETEBITMAPFROMPOOL, "CThumbnailServer::DeleteBitmapFromPool -- deleting;ptr=%o", ptr );
       
   673             delete ptr->iBitmap;
       
   674             ptr->iBitmap = NULL;
       
   675             iBitmapPool.Remove( aHandle );
       
   676             TN_DEBUG2( "CThumbnailServer::DeleteBitmapFromPool -- items left %d", iBitmapPool.Count() );
       
   677             OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_DELETEBITMAPFROMPOOL, "CThumbnailServer::DeleteBitmapFromPool  -- items left;iBitmapPool.Count()=%d", iBitmapPool.Count() );
       
   678             }
       
   679         else
       
   680             {
       
   681             TN_DEBUG3( 
       
   682                 "CThumbnailServer::DeleteBitmapFromPool(%d) -- refcount now %d",
       
   683                 aHandle, ptr->iRefCount );
       
   684             OstTraceExt2( TRACE_NORMAL, DUP3_CTHUMBNAILSERVER_DELETEBITMAPFROMPOOL, "CThumbnailServer::DeleteBitmapFromPool) -- refcount now;aHandle=%d;ptr->iRefCount=%d", aHandle, ptr->iRefCount );
       
   685             }
       
   686         }
       
   687     else
       
   688         {
       
   689         //__ASSERT_DEBUG(( EFalse ), ThumbnailPanic( EThumbnailBitmapNotReleased ));
       
   690         TN_DEBUG2( "CThumbnailServer::DeleteBitmapFromPool(%d) -- not found!",
       
   691             aHandle );
       
   692         OstTrace1( TRACE_NORMAL, DUP4_CTHUMBNAILSERVER_DELETEBITMAPFROMPOOL, "CThumbnailServer::DeleteBitmapFromPool  -- not found!;aHandle=%d", aHandle );
       
   693         }
       
   694     }
       
   695 
       
   696 
       
   697 // -----------------------------------------------------------------------------
       
   698 // Delete thumbnails for given object file
       
   699 // -----------------------------------------------------------------------------
       
   700 //
       
   701 void CThumbnailServer::DeleteThumbnailsL( const TDesC& aPath )
       
   702     {
       
   703     TN_DEBUG2( "CThumbnailServer::DeleteThumbnailsL(%S)", &aPath);
       
   704     OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVER_DELETETHUMBNAILSL, "CThumbnailServer::DeleteThumbnailsL;aPath=%S", aPath );
       
   705     
       
   706     StoreForPathL( aPath )->DeleteThumbnailsL( aPath );
       
   707     
       
   708     if( iFetchedChecker ) 
       
   709         {
       
   710         iFetchedChecker->DeleteFetchResult( aPath );
       
   711         }
       
   712     }
       
   713 
       
   714 // -----------------------------------------------------------------------------
       
   715 // CThumbnailServer::ResolveMimeTypeL()
       
   716 // -----------------------------------------------------------------------------
       
   717 //
       
   718 TDataType CThumbnailServer::ResolveMimeTypeL( RFile64& aFile )
       
   719     {
       
   720     TN_DEBUG1( "CThumbnailStore::ResolveMimeTypeL()");
       
   721     RFile64 tmp = aFile;
       
   722     
       
   723     // check if DRM
       
   724     ContentAccess::CData* data = ContentAccess::CData::NewLC( 
       
   725             tmp, ContentAccess::KDefaultContentObject, ContentAccess::EPeek );
       
   726 
       
   727     TInt filetype( 0 );
       
   728     TInt drm( 0 );
       
   729     User::LeaveIfError( data->GetAttribute( ContentAccess::EIsProtected, drm ) );
       
   730     data->GetAttribute( ContentAccess::EFileType, filetype );
       
   731     CleanupStack::PopAndDestroy();    
       
   732 
       
   733 	//close aFile on leave	
       
   734     CleanupClosePushL( aFile );    
       
   735     
       
   736     if ( drm && filetype != ContentAccess::EOma1Dcf )
       
   737         {
       
   738         // cannot handle other than Oma DRM 1.x files
       
   739         TN_DEBUG1( "CThumbnailStore::ResolveMimeTypeL()- only OMA DRM 1.0 supported");
       
   740         OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_RESOLVEMIMETYPEL, "CThumbnailServer::ResolveMimeTypeL - only OMA DRM 1.0 supported" );
       
   741         User::Leave(KErrNotSupported);
       
   742         }    
       
   743     
       
   744     TDataRecognitionResult res;
       
   745     if ( iRecognizer.Handle() == KNullHandle )
       
   746         {
       
   747         // error using recognizer, (re)connect
       
   748         User::LeaveIfError( iRecognizer.Connect());
       
   749         }
       
   750     
       
   751     User::LeaveIfError( iRecognizer.RecognizeData( aFile, res ));
       
   752     
       
   753     if ( res.iConfidence == CApaDataRecognizerType::ENotRecognized )
       
   754         {
       
   755         // file type not supported
       
   756         User::Leave( KErrNotSupported );
       
   757         }
       
   758 
       
   759     CleanupStack::Pop( &aFile );
       
   760     return res.iDataType;
       
   761     }
       
   762 
       
   763 // -----------------------------------------------------------------------------
       
   764 // CThumbnailServer::ResolveProviderL()
       
   765 // Resolves plugin to be used in thumbnail creation.
       
   766 // -----------------------------------------------------------------------------
       
   767 //
       
   768 CThumbnailProvider* CThumbnailServer::ResolveProviderL( const TDesC8& aMimeType
       
   769     )
       
   770     {
       
   771 #ifdef _DEBUG
       
   772     TBuf < KMaxDataTypeLength > buf; // 16-bit descriptor for debug prints
       
   773     buf.Copy( aMimeType );
       
   774     TN_DEBUG2( "CThumbnailServer::ResolveProviderL(%S)", &buf );
       
   775     OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_RESOLVEMIMETYPEL, "CThumbnailServer::ResolveMimeTypeL;buf=%S", buf );
       
   776 #endif 
       
   777 
       
   778     CThumbnailProvider* ret = NULL;
       
   779 
       
   780     TInt separatorPos = aMimeType.Locate( KThumbnailMimeSeparatorChar );
       
   781     TPtrC8 mediaType( aMimeType.Left( separatorPos ));
       
   782     TPtrC8 subType( aMimeType.Mid( separatorPos + 1 )); // skip slash
       
   783 
       
   784     const TInt count = iPluginInfoArray.Count();
       
   785     for ( TInt i( 0 ); i < count && !ret; i++ )
       
   786         {
       
   787         const TDesC8& opaqueData = iPluginInfoArray[i]->OpaqueData();
       
   788         TInt pSeparatorPos = opaqueData.Locate( KThumbnailMimeSeparatorChar );
       
   789         TPtrC8 pMediaType( opaqueData.Left( pSeparatorPos ));
       
   790         TPtrC8 pSubType( opaqueData.Mid( pSeparatorPos + 1 )); // skip slash
       
   791         
       
   792         if ( !pMediaType.CompareF( mediaType ))
       
   793             {
       
   794             if ( !pSubType.CompareF( KThumbnailMimeWildCard ) ||
       
   795                 !pSubType.CompareF( subType ))
       
   796                 {
       
   797 #ifdef _DEBUG
       
   798                 TN_DEBUG3( 
       
   799                     "CThumbnailServer::ResolveProviderL(%S) -- using provider 0x%08x", &buf, iPluginInfoArray[i]->ImplementationUid().iUid );
       
   800                 OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_RESOLVEPROVIDERL, "CThumbnailServer::ResolveProviderL;buf=%S", buf );
       
   801                 OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_RESOLVEPROVIDERL, "CThumbnailServer::ResolveProviderL;iPluginInfoArray[i]->ImplementationUid().iUid=%o", iPluginInfoArray[i]->ImplementationUid().iUid );
       
   802 #endif 
       
   803                 ret = GetProviderL( iPluginInfoArray[i]->ImplementationUid());
       
   804                 }
       
   805             }
       
   806         }
       
   807     if ( !ret )
       
   808         {
       
   809 #ifdef _DEBUG
       
   810         TN_DEBUG2( 
       
   811             "CThumbnailServer::ResolveProviderL(%S) -- provider not found",
       
   812             &buf );
       
   813         OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVER_RESOLVEPROVIDERL, "CThumbnailServer::ResolveProviderL;buf=%S", buf );
       
   814 #endif 
       
   815         User::Leave( KErrNotSupported );
       
   816         }
       
   817     return ret;
       
   818     }
       
   819 
       
   820 
       
   821 // -----------------------------------------------------------------------------
       
   822 // CThumbnailServer::GetProviderL()
       
   823 // -----------------------------------------------------------------------------
       
   824 //
       
   825 CThumbnailProvider* CThumbnailServer::GetProviderL( const TUid& aImplUid )
       
   826     {
       
   827     CThumbnailProvider** resPtr = iProviders.Find( aImplUid.iUid );
       
   828     CThumbnailProvider* res = NULL;
       
   829     if ( resPtr )
       
   830         {
       
   831         // Use existing instance
       
   832         res = * resPtr;
       
   833         }
       
   834     else
       
   835         {
       
   836         // Plug-in needs to be loaded
       
   837         TN_DEBUG2( 
       
   838             "CThumbnailServer::GetProviderL() -- loading plug-in, UID 0x%08x",
       
   839             aImplUid );
       
   840         res = CThumbnailProvider::NewL( aImplUid );
       
   841         TN_DEBUG1( "CThumbnailServer::GetProviderL() -- loading complete" );
       
   842         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_GETPROVIDERL, "CThumbnailServer::GetProviderL -- loading complete" );
       
   843         CleanupStack::PushL( res );
       
   844         iProviders.InsertL( aImplUid.iUid, res );
       
   845         CleanupStack::Pop( res );
       
   846         }
       
   847 
       
   848     return res;
       
   849     }
       
   850 
       
   851 
       
   852 // -----------------------------------------------------------------------------
       
   853 // CThumbnailServer::PreLoadProviders()
       
   854 // -----------------------------------------------------------------------------
       
   855 //
       
   856 void CThumbnailServer::PreLoadProviders(  )
       
   857     {
       
   858     TN_DEBUG1( "CThumbnailServer::PreLoadProvidersL()" );
       
   859     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_PRELOADPROVIDERS, "CThumbnailServer::PreLoadProviders" );
       
   860     TInt err(KErrNone);
       
   861     
       
   862     for(TInt i=0; i< iPluginInfoArray.Count(); i++)
       
   863         {
       
   864         TRAP(err, GetProviderL( iPluginInfoArray[i]->ImplementationUid()));
       
   865         }
       
   866     }
       
   867 
       
   868 
       
   869 // -----------------------------------------------------------------------------
       
   870 // CThumbnailServer::QueueTaskL()
       
   871 // Adds thumbnailtask to processor queue.
       
   872 // -----------------------------------------------------------------------------
       
   873 //
       
   874 void CThumbnailServer::QueueTaskL( CThumbnailTask* aTask )
       
   875     {
       
   876     __ASSERT_DEBUG(( aTask ), ThumbnailPanic( EThumbnailNullPointer ));
       
   877     iProcessor->AddTaskL( aTask );
       
   878     }
       
   879 
       
   880 
       
   881 // -----------------------------------------------------------------------------
       
   882 // CThumbnailServer::DequeTask()
       
   883 // Removes thumbnailtask from processor queue.
       
   884 // -----------------------------------------------------------------------------
       
   885 //
       
   886 TInt CThumbnailServer::DequeTask( const TThumbnailServerRequestId& aRequestId )
       
   887     {   
       
   888     TInt error = iProcessor->RemoveTask( aRequestId );
       
   889         
       
   890     // clean-up bitmap pool               
       
   891     THashMapIter < TInt, TThumbnailBitmapRef > bpiter( iBitmapPool );
       
   892 
       
   893     // const pointer to a non-const object
       
   894     const TThumbnailBitmapRef* ref = bpiter.NextValue();
       
   895 
       
   896     while ( ref )
       
   897         {       
       
   898         TN_DEBUG2( "CThumbnailServer::DequeTask() - ref->iRequestId = %d", ref->iRequestId );
       
   899         OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_DEQUETASK, "CThumbnailServer::DequeTask;ref->iRequestId=%u", ref->iRequestId );
       
   900 
       
   901         if ( ref->iSession == aRequestId.iSession && 
       
   902              ref->iRequestId == aRequestId.iRequestId )
       
   903             {            
       
   904             delete ref->iBitmap;
       
   905             bpiter.RemoveCurrent();                        
       
   906                         
       
   907             TN_DEBUG2( "CThumbnailServer::DequeTask() - deleted bitmap, left=%d", 
       
   908                     iBitmapPool.Count());
       
   909             OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_DEQUETASK, "CThumbnailServer::DequeTask;iBitmapPool.Count()=%d", iBitmapPool.Count() );
       
   910             }
       
   911         
       
   912         ref = bpiter.NextValue();        
       
   913         }
       
   914 
       
   915     return error;
       
   916     }
       
   917 
       
   918 
       
   919 // -----------------------------------------------------------------------------
       
   920 // CThumbnailServer::ChangeTaskPriority()
       
   921 // Changes priority of specific task.
       
   922 // -----------------------------------------------------------------------------
       
   923 //
       
   924 TInt CThumbnailServer::ChangeTaskPriority( const TThumbnailServerRequestId&
       
   925     aRequestId, TInt aNewPriority )
       
   926     {
       
   927     return iProcessor->ChangeTaskPriority( aRequestId, aNewPriority );
       
   928     }
       
   929 
       
   930 
       
   931 // -----------------------------------------------------------------------------
       
   932 // CThumbnailServer::ScaleBitmapL()
       
   933 // Used to scale image.
       
   934 // -----------------------------------------------------------------------------
       
   935 //
       
   936 void CThumbnailServer::ScaleBitmapL( TRequestStatus& aStatus, const CFbsBitmap&
       
   937     aSource, CFbsBitmap& aDest, const TRect& aSourceRect )
       
   938     {
       
   939     if ( !iScaler )
       
   940         {
       
   941         iScaler = IHLScaler::CreateL();
       
   942         }
       
   943     TRect destRect( TPoint(), aDest.SizeInPixels());
       
   944     User::LeaveIfError( iScaler->Scale( aStatus, aSource, aSourceRect, aDest,
       
   945         destRect ));
       
   946     }
       
   947 
       
   948 
       
   949 // -----------------------------------------------------------------------------
       
   950 // CThumbnailServer::CancelScale()
       
   951 // Cancels scaling task.
       
   952 // -----------------------------------------------------------------------------
       
   953 //
       
   954 void CThumbnailServer::CancelScale()
       
   955     {
       
   956     if ( iScaler )
       
   957         {
       
   958         iScaler->CancelProcess();
       
   959         }
       
   960     }
       
   961 
       
   962 
       
   963 // -----------------------------------------------------------------------------
       
   964 // CThumbnailServer::Processor()
       
   965 // Returns processor.
       
   966 // -----------------------------------------------------------------------------
       
   967 //
       
   968 CThumbnailTaskProcessor& CThumbnailServer::Processor()
       
   969     {
       
   970     __ASSERT_DEBUG(( iProcessor ), ThumbnailPanic( EThumbnailNullPointer ));
       
   971     return * iProcessor;
       
   972     }
       
   973 
       
   974 // -----------------------------------------------------------------------------
       
   975 // Get the thumbnail store instance, which is responsible for this drive
       
   976 // -----------------------------------------------------------------------------
       
   977 //
       
   978 CThumbnailStore* CThumbnailServer::StoreForDriveL( const TInt aDrive )
       
   979     {
       
   980     TN_DEBUG2( "CThumbnailServer::StoreForDriveL() drive=%d", aDrive );
       
   981     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_STOREFORDRIVEL, "CThumbnailServer::StoreForDriveL;aDrive=%d", aDrive );
       
   982     
       
   983     if(iUnmountedDrives.Find( aDrive ) >= KErrNone)
       
   984         {
       
   985         TN_DEBUG1( "CThumbnailServer::StoreForDriveL() unmount in progress, skip!");
       
   986         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_STOREFORDRIVEL, "CThumbnailServer::StoreForDriveL - unmount in progress, skip!" );
       
   987         User::Leave( KErrDisMounted );
       
   988         }
       
   989     
       
   990     CThumbnailStore** resPtr = iStores.Find( aDrive );
       
   991     CThumbnailStore* res = NULL;
       
   992 
       
   993     if ( resPtr )
       
   994         {
       
   995         res = * resPtr;
       
   996         }
       
   997     else
       
   998         {
       
   999         if( iFormatting )
       
  1000            {
       
  1001            TN_DEBUG1( "CThumbnailServer::StoreForDriveL() - FORMATTING! - ABORT");
       
  1002            OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_STOREFORDRIVEL, "CThumbnailServer::StoreForDriveL - FORMATTING! - ABORT" );
       
  1003            User::Leave( KErrNotSupported );
       
  1004            } 
       
  1005         
       
  1006         TVolumeInfo volumeInfo;
       
  1007         TInt err = iFs.Volume( volumeInfo, aDrive );
       
  1008         
       
  1009         if ( err )
       
  1010             {
       
  1011             // Locked
       
  1012             TN_DEBUG2( "CThumbnailServer::StoreForDriveL() - err %d", err);
       
  1013             OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSERVER_STOREFORDRIVEL, "CThumbnailServer::StoreForDriveL;err=%d", err );
       
  1014             User::Leave( err);
       
  1015             }
       
  1016         else if( volumeInfo.iDrive.iMediaAtt& KMediaAttLocked )
       
  1017             {
       
  1018             TN_DEBUG1( "CThumbnailServer::StoreForDriveL() - locked");
       
  1019             OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVER_STOREFORDRIVEL, "CThumbnailServer::StoreForDriveL - locked" );
       
  1020             User::Leave( KErrAccessDenied );
       
  1021             }
       
  1022 		else if ( volumeInfo.iDrive.iDriveAtt& KDriveAttRom ||
       
  1023             volumeInfo.iDrive.iDriveAtt& KDriveAttRemote ||
       
  1024             volumeInfo.iDrive.iMediaAtt& KMediaAttWriteProtected )
       
  1025             {
       
  1026             // We support ROM disks and remote disks in read only mode.
       
  1027             TN_DEBUG1( "CThumbnailServer::StoreForDriveL() - rom/remote/write protected");
       
  1028             OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSERVER_STOREFORDRIVEL, "CThumbnailServer::StoreForDriveL - rom/remote/write protected" );
       
  1029             res = CThumbnailStore::NewL( iFs, aDrive, iImei, this, ETrue );
       
  1030             }
       
  1031         else
       
  1032             {
       
  1033             TN_DEBUG1( "CThumbnailServer::StoreForDriveL() - normal");
       
  1034             OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSERVER_STOREFORDRIVEL, "CThumbnailServer::StoreForDriveL - normal" );
       
  1035             res = CThumbnailStore::NewL( iFs, aDrive, iImei, this, EFalse );
       
  1036             }
       
  1037 			
       
  1038         CleanupStack::PushL( res );
       
  1039         iStores.InsertL( aDrive, res );
       
  1040         res->SetPersistentSizes(iPersistentSizes);
       
  1041         CleanupStack::Pop( res );
       
  1042         
       
  1043         for(TInt i = 0; i < iUnmountObservers.Count(); i++)
       
  1044             {
       
  1045             iUnmountObservers[i]->StartNotify();
       
  1046             }
       
  1047         }
       
  1048 
       
  1049     return res;
       
  1050     }
       
  1051 
       
  1052 // -----------------------------------------------------------------------------
       
  1053 // Get the thumbnail store instance, which is responsible for the drive
       
  1054 // identified by given path
       
  1055 // -----------------------------------------------------------------------------
       
  1056 //
       
  1057 CThumbnailStore* CThumbnailServer::StoreForPathL( const TDesC& aPath )
       
  1058     {
       
  1059     if(aPath.Length() < 3 || aPath.Length() > KMaxPath)
       
  1060         {
       
  1061         TN_DEBUG1( "CThumbnailServer::StoreForPathL() - KErrArgument");
       
  1062         OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_STOREFORPATHL, "CThumbnailServer::StoreForPathL - KErrArgument" );
       
  1063         User::Leave(KErrArgument);
       
  1064         }
       
  1065     TInt drive = 0;
       
  1066     User::LeaveIfError( RFs::CharToDrive( aPath[0], drive ));
       
  1067     return StoreForDriveL( drive );
       
  1068     }
       
  1069 
       
  1070 
       
  1071 // ---------------------------------------------------------------------------
       
  1072 // CThumbnailStore::PersistentSizeL()
       
  1073 // ---------------------------------------------------------------------------
       
  1074 //
       
  1075 TThumbnailPersistentSize & CThumbnailServer::PersistentSizeL( TThumbnailSize aThumbnailSize )
       
  1076     {
       
  1077     if ( !iCenrep )
       
  1078        {
       
  1079        iCenrep = CThumbnailCenRep::NewL();
       
  1080        }
       
  1081     
       
  1082     return iCenrep->PersistentSizeL( aThumbnailSize ); 
       
  1083     }
       
  1084 
       
  1085 // -----------------------------------------------------------------------------
       
  1086 // Open store for each mounted drive
       
  1087 // -----------------------------------------------------------------------------
       
  1088 //
       
  1089 void CThumbnailServer::OpenStoresL()
       
  1090     {      
       
  1091     // get list of mounted drives and open stores
       
  1092     TDriveList driveListInt;
       
  1093     TInt driveCountInt(0);
       
  1094     User::LeaveIfError(DriveInfo::GetUserVisibleDrives(
       
  1095            iFs, driveListInt, driveCountInt, KDriveAttInternal | KDriveAttRemovable ));
       
  1096 
       
  1097     for( TInt i = EDriveA; i <= EDriveZ && driveCountInt; i++ )
       
  1098         {
       
  1099         if (driveListInt[i])
       
  1100             {
       
  1101             TVolumeInfo volumeInfo;
       
  1102             TInt err = iFs.Volume( volumeInfo, i );
       
  1103             
       
  1104             if (!err)
       
  1105                 {
       
  1106                 TN_DEBUG2( "CThumbnailServer::OpenStoresL() StoreForDriveL %d", i);
       
  1107                 OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_OPENSTORESL, "CThumbnailServer::OpenStoresL;i=%d", i );
       
  1108                 
       
  1109                 // ignore errors
       
  1110                 TRAP_IGNORE( StoreForDriveL( i ));
       
  1111                 
       
  1112                 driveCountInt--;
       
  1113                 }
       
  1114             }            
       
  1115         }
       
  1116     
       
  1117     }
       
  1118 
       
  1119 // -----------------------------------------------------------------------------
       
  1120 // Close the thumbnail store instance, which is responsible for this drive
       
  1121 // -----------------------------------------------------------------------------
       
  1122 //
       
  1123 void CThumbnailServer::CloseStoreForDriveL( const TInt aDrive )
       
  1124     {
       
  1125     TN_DEBUG2( "CThumbnailServer::CloseStoreForDriveL drive=%d", aDrive);
       
  1126     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_CLOSESTOREFORDRIVEL, "CThumbnailServer::CloseStoreForDriveL;aDrive=%d", aDrive );
       
  1127     CThumbnailStore** store = iStores.Find( aDrive );
       
  1128     
       
  1129     StartUnmountTimeout( aDrive);
       
  1130     
       
  1131     if (store)
       
  1132         {
       
  1133         delete *store;
       
  1134         *store = NULL;
       
  1135         iStores.Remove( aDrive );
       
  1136         }
       
  1137     }
       
  1138 
       
  1139 
       
  1140 // ---------------------------------------------------------------------------
       
  1141 // CThumbnailStore::PersistentSizes()
       
  1142 // ---------------------------------------------------------------------------
       
  1143 //
       
  1144 RArray < TThumbnailPersistentSize > CThumbnailServer::PersistentSizesL()
       
  1145     {
       
  1146     return iPersistentSizes;
       
  1147     }
       
  1148 
       
  1149 void CThumbnailServer::GetMissingSizesL( const TDesC& aPath, TInt aSourceType, RArray <
       
  1150     TThumbnailPersistentSize > & aMissingSizes, TBool aCheckGridSizeOnly  )
       
  1151     {
       
  1152     StoreForPathL( aPath )->GetMissingSizesL( aPath, aSourceType, aMissingSizes, aCheckGridSizeOnly );
       
  1153     }
       
  1154 
       
  1155 // ---------------------------------------------------------------------------
       
  1156 // CThumbnailServer::Fs()
       
  1157 // ---------------------------------------------------------------------------
       
  1158 //
       
  1159 RFs& CThumbnailServer::Fs()
       
  1160     {
       
  1161     return iFs;
       
  1162     }
       
  1163 
       
  1164 // ---------------------------------------------------------------------------
       
  1165 // CThumbnailServer::AddUnmountObserversL()
       
  1166 // ---------------------------------------------------------------------------
       
  1167 //
       
  1168 void CThumbnailServer::AddUnmountObserversL()
       
  1169     {
       
  1170     TDriveList driveList;
       
  1171     TInt drive; 
       
  1172     TDriveInfo driveInfo;
       
  1173     
       
  1174     iUnmountObservers.ResetAndDestroy();
       
  1175     
       
  1176     User::LeaveIfError( iFs.DriveList(driveList) );
       
  1177    
       
  1178     // search all drives
       
  1179     for( drive = EDriveA; drive <= EDriveZ; drive++ )
       
  1180         {
       
  1181         if( !driveList[drive] ) 
       
  1182             {
       
  1183             // If drive-list entry is zero, drive is not available
       
  1184             continue;
       
  1185             }
       
  1186         
       
  1187         TInt err = iFs.Drive(driveInfo, drive);
       
  1188         
       
  1189         // if removable drive, add observer
       
  1190         if (!err && driveInfo.iDriveAtt& KDriveAttRemovable)
       
  1191             {
       
  1192             TN_DEBUG2( "CThumbnailServer::AddOnMountObserver drive=%d", drive);
       
  1193             OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_ADDUNMOUNTOBSERVERSL, "CThumbnailServer::AddUnmountObserversL;drive=%d", drive );
       
  1194             CThumbnailDiskUnmountObserver* obs = CThumbnailDiskUnmountObserver::NewL( iFs, drive, this );
       
  1195             CleanupStack::PushL( obs );
       
  1196             iUnmountObservers.AppendL( obs );
       
  1197             CleanupStack::Pop( obs );
       
  1198             }
       
  1199         }
       
  1200     }
       
  1201 
       
  1202 // ---------------------------------------------------------------------------
       
  1203 // CThumbnailServer::MemoryCardStatusChangedL()
       
  1204 // ---------------------------------------------------------------------------
       
  1205 //
       
  1206 void CThumbnailServer::MemoryCardStatusChangedL()
       
  1207     {
       
  1208     TN_DEBUG1( "CThumbnailServer::MemoryCardStatusChangedL in()" );
       
  1209     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_MEMORYCARDSTATUSCHANGEDL, "CThumbnailServer::MemoryCardStatusChangedL - in" );
       
  1210     TDriveList driveList;
       
  1211     TInt drive; 
       
  1212     TVolumeInfo volumeInfo;
       
  1213     TDriveInfo driveInfo;
       
  1214         
       
  1215     User::LeaveIfError( iFs.DriveList(driveList) );
       
  1216        
       
  1217     // search all drives
       
  1218     for( drive = EDriveA; drive <= EDriveZ; drive++ )
       
  1219         {
       
  1220         if( !driveList[drive] ) 
       
  1221            {
       
  1222           // If drive-list entry is zero, drive is not available
       
  1223             continue;
       
  1224            }
       
  1225 
       
  1226         TInt err = iFs.Volume(volumeInfo, drive);
       
  1227         TInt err_drive = iFs.Drive(driveInfo, drive);    
       
  1228         
       
  1229         // mount -- if removable drive, add new store
       
  1230         if (!err && !err_drive 
       
  1231                 && driveInfo.iType != EMediaNotPresent
       
  1232                 && driveInfo.iDriveAtt& KDriveAttRemovable )
       
  1233             {
       
  1234             TN_DEBUG2( "CThumbnailServer::MemoryCardStatusChangedL mount drive==%d", drive);
       
  1235             OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_MEMORYCARDSTATUSCHANGEDL, "CThumbnailServer::MemoryCardStatusChangedL;drive=%d", drive );
       
  1236             
       
  1237             CThumbnailStore** resPtr = iStores.Find( drive );
       
  1238 
       
  1239             if ( resPtr )
       
  1240                 {
       
  1241                 TN_DEBUG2( "CThumbnailServer::MemoryCardStatusChangedL() already mounted, skip %d", drive);
       
  1242                 OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_MEMORYCARDSTATUSCHANGEDL, "CThumbnailServer::MemoryCardStatusChangedL;drive=%d", drive );
       
  1243                 continue;
       
  1244                 }
       
  1245             
       
  1246             // ignore errors
       
  1247             TRAP_IGNORE( StoreForDriveL( drive ));
       
  1248             
       
  1249             TUint driveStatus(0);
       
  1250             DriveInfo::GetDriveStatus(iFs, drive, driveStatus);
       
  1251             TN_DEBUG2( "CThumbnailServer::MemoryCardStatusChangedL() driveStatus = %d", driveStatus);
       
  1252             if (!(driveStatus & DriveInfo::EDriveUsbMemory) && 
       
  1253 			    !(driveStatus & DriveInfo::EDriveRemote))
       
  1254                 {
       
  1255                 TN_DEBUG2( "CThumbnailServer::MemoryCardStatusChangedL() update KItemsleft = %d", KErrNotReady);
       
  1256                 OstTrace1( TRACE_NORMAL, DUP3_CTHUMBNAILSERVER_MEMORYCARDSTATUSCHANGEDL, "CThumbnailServer::MemoryCardStatusChangedL;KErrNotReady=%d - update KItemsleft", KErrNotReady );
       
  1257                 RProperty::Set(KTAGDPSNotification, KItemsleft, KErrNotReady );
       
  1258                 }
       
  1259 			
       
  1260             TInt index = iUnmountedDrives.Find( drive );
       
  1261             
       
  1262             if(index >= KErrNone)
       
  1263                 {
       
  1264                 iUnmountedDrives.Remove( index );
       
  1265                 }
       
  1266             
       
  1267             if(!iUnmountedDrives.Count()&& iUnmount && iUnmount->IsActive())
       
  1268                 {
       
  1269                 TN_DEBUG1( "CThumbnailServer::MemoryCardStatusChangedL() cancel unmount timer");
       
  1270                 OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVER_MEMORYCARDSTATUSCHANGEDL, "CThumbnailServer::MemoryCardStatusChangedL - cancel unmount timer" );
       
  1271                 iUnmount->Cancel();
       
  1272                 }
       
  1273             }
       
  1274         
       
  1275         //dismount -- if removable drive, close store
       
  1276         else if(err && !err_drive && driveInfo.iDriveAtt& KDriveAttRemovable )
       
  1277             {
       
  1278             TN_DEBUG2( "CThumbnailServer::MemoryCardStatusChangedL() unmount drive==%d", drive);
       
  1279             OstTrace1( TRACE_NORMAL, DUP5_CTHUMBNAILSERVER_MEMORYCARDSTATUSCHANGEDL, "CThumbnailServer::MemoryCardStatusChangedL - unmount drive;drive=%d", drive );
       
  1280             CloseStoreForDriveL( drive);
       
  1281             }
       
  1282         }
       
  1283 
       
  1284     TN_DEBUG1( "CThumbnailServer::MemoryCardStatusChangedL out()" );
       
  1285     OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSERVER_MEMORYCARDSTATUSCHANGEDL, "CThumbnailServer::MemoryCardStatusChangedL - out" );
       
  1286     }
       
  1287 
       
  1288 
       
  1289 // -----------------------------------------------------------------------------
       
  1290 // Get the required size (in characters) for a buffer that contains the
       
  1291 // list of supported MIME types
       
  1292 // -----------------------------------------------------------------------------
       
  1293 //
       
  1294 TInt CThumbnailServer::GetMimeTypeBufferSize()const
       
  1295     {
       
  1296     TInt size = 0;
       
  1297     for ( TInt i = iPluginInfoArray.Count(); --i >= 0; )
       
  1298         {
       
  1299         const TDesC8& opaqueData = iPluginInfoArray[i]->OpaqueData();
       
  1300         size += opaqueData.Length();
       
  1301         size++; // space for separator character
       
  1302         }
       
  1303     if ( size )
       
  1304         {
       
  1305         size--; // no need for a separator character at the end
       
  1306         }
       
  1307 
       
  1308     return size;
       
  1309     }
       
  1310 
       
  1311 // -----------------------------------------------------------------------------
       
  1312 // Get the list of supported MIME types and store them in the buffer
       
  1313 // allocated by the client.
       
  1314 // -----------------------------------------------------------------------------
       
  1315 //
       
  1316 void CThumbnailServer::GetMimeTypeList( TDes& aBuffer )const
       
  1317     {
       
  1318     TBuf < KMaxDataTypeLength > buf; // needed for convert from TBuf8 to TBuf
       
  1319     aBuffer.Zero();
       
  1320     const TInt count = iPluginInfoArray.Count();
       
  1321     for ( TInt i = 0; i < count; i++ )
       
  1322         {
       
  1323         const TDesC8& opaqueData = iPluginInfoArray[i]->OpaqueData();
       
  1324         buf.Copy( opaqueData );
       
  1325         aBuffer.Append( buf );
       
  1326         aBuffer.Append( KThumbnailMimeTypeSeparatorChar );
       
  1327         }
       
  1328     if ( count )
       
  1329         {
       
  1330         // remove last separator char
       
  1331         aBuffer.SetLength( aBuffer.Length() - 1 );
       
  1332         }
       
  1333     }
       
  1334 
       
  1335 
       
  1336 // -----------------------------------------------------------------------------
       
  1337 // Updates thumbnails by given Id.
       
  1338 // -----------------------------------------------------------------------------
       
  1339 //
       
  1340 TBool CThumbnailServer::UpdateThumbnailsL( const TDesC& aPath,
       
  1341                                            const TInt /*aOrientation*/, const TInt64 aModified )
       
  1342     {
       
  1343     TN_DEBUG1( "CThumbnailServer::UpdateThumbnailsL()");
       
  1344     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_UPDATETHUMBNAILSL, "CThumbnailServer::UpdateThumbnailsL" );
       
  1345     
       
  1346     // 1. check path change
       
  1347     // 2. check timestamp change
       
  1348     TBool modifiedChanged = EFalse;
       
  1349     
       
  1350     CThumbnailStore* store = StoreForPathL( aPath );
       
  1351    
       
  1352     TN_DEBUG1( "CThumbnailServer::UpdateThumbnailsL() - exist");
       
  1353     OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVER_UPDATETHUMBNAILSL, "CThumbnailServer::UpdateThumbnailsL - exist" );
       
  1354         
       
  1355     TBool exists = store->CheckModifiedByPathL(aPath, aModified, modifiedChanged);
       
  1356        
       
  1357     if(!exists)
       
  1358         {
       
  1359         TN_DEBUG1( "CThumbnailServer::UpdateThumbnailsL() - exists NO");
       
  1360     	OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVER_UPDATETHUMBNAILSL, "CThumbnailServer::UpdateThumbnailsL - exists NO" );
       
  1361         //not found, needs to be generated
       
  1362         return EFalse;
       
  1363         }
       
  1364     
       
  1365     TN_DEBUG1( "CThumbnailServer::UpdateThumbnailsL() - modified ?");
       
  1366     OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVER_UPDATETHUMBNAILSL, "CThumbnailServer::UpdateThumbnailsL - modified ?" );
       
  1367     
       
  1368     if (modifiedChanged)
       
  1369         {
       
  1370         TN_DEBUG1( "CThumbnailServer::UpdateThumbnailsL() - modified YES");
       
  1371         OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSERVER_UPDATETHUMBNAILSL, "CThumbnailServer::UpdateThumbnailsL - modified YES" );
       
  1372             
       
  1373         // delete old thumbs
       
  1374         store->DeleteThumbnailsL(aPath, ETrue);
       
  1375             
       
  1376         if( iFetchedChecker ) 
       
  1377             {
       
  1378             iFetchedChecker->DeleteFetchResult( aPath );
       
  1379             }
       
  1380             
       
  1381         // need to create new thumbs
       
  1382         }
       
  1383     else
       
  1384         {
       
  1385         TN_DEBUG1( "CThumbnailServer::UpdateThumbnailsL() - modified NO");
       
  1386         OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSERVER_UPDATETHUMBNAILSL, "CThumbnailServer::UpdateThumbnailsL - modified NO" );
       
  1387         
       
  1388         // not modified
       
  1389         return ETrue;
       
  1390         }
       
  1391     
       
  1392     TN_DEBUG1( "CThumbnailServer::UpdateThumbnailsL() - no thumbs found, create new");
       
  1393     OstTrace0( TRACE_NORMAL, DUP7_CTHUMBNAILSERVER_UPDATETHUMBNAILSL, "CThumbnailServer::UpdateThumbnailsL - no thumbs found, create new" );
       
  1394     
       
  1395     return EFalse;
       
  1396     }
       
  1397 
       
  1398 // -----------------------------------------------------------------------------
       
  1399 // Renames thumbnails.
       
  1400 // -----------------------------------------------------------------------------
       
  1401 //
       
  1402 void CThumbnailServer::RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath )
       
  1403     {
       
  1404     TN_DEBUG2( "CThumbnailServer::RenameThumbnailsL(%S)", &aCurrentPath);
       
  1405     OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVER_RENAMETHUMBNAILSL, "CThumbnailServer::RenameThumbnailsL;aCurrentPath=%S", aCurrentPath );
       
  1406     
       
  1407     StoreForPathL( aCurrentPath )->RenameThumbnailsL( aCurrentPath, aNewPath );
       
  1408     
       
  1409     if( iFetchedChecker ) 
       
  1410         {
       
  1411         iFetchedChecker->RenameFetchResultL( aNewPath, aCurrentPath );
       
  1412         }
       
  1413     }
       
  1414 
       
  1415 // -----------------------------------------------------------------------------
       
  1416 // CThumbnailServer::MimeTypeFromFileExt()
       
  1417 // -----------------------------------------------------------------------------
       
  1418 //
       
  1419 TInt CThumbnailServer::MimeTypeFromFileExt( const TDesC& aFileName, TDataType& aMimeType )
       
  1420     {
       
  1421     TBool found = ETrue;
       
  1422     TPtrC ext( aFileName.Right(KExtLength) ); // tparse panics with virtual URI
       
  1423     
       
  1424     if ( ext.CompareF( KJpegExt ) == 0 || ext.CompareF( KJpgExt ) == 0)
       
  1425         {
       
  1426         aMimeType = TDataType( KJpegMime );
       
  1427         }
       
  1428     else if ( ext.CompareF( KJpeg2000Ext ) == 0 )
       
  1429         {
       
  1430         aMimeType = TDataType( KJpeg2000Mime );
       
  1431         }
       
  1432     else if ( ext.CompareF( KSvgExt ) == 0 )
       
  1433         {
       
  1434         aMimeType = TDataType( KSvgMime );
       
  1435         }    
       
  1436     else if ( ext.CompareF( KGifExt ) == 0 )
       
  1437         {
       
  1438         aMimeType = TDataType( KGifMime );
       
  1439         } 
       
  1440     else if ( ext.CompareF( KPngExt ) == 0 )
       
  1441         {
       
  1442         aMimeType = TDataType( KPngMime );
       
  1443         }
       
  1444     else if ( ext.CompareF( KMpgExt1 ) == 0 )
       
  1445         {
       
  1446         aMimeType = TDataType( KMpgMime1 );
       
  1447         } 
       
  1448     else if ( ext.CompareF( KMpeg4Ext ) == 0 )
       
  1449         {
       
  1450         aMimeType = TDataType( KMpeg4Mime );
       
  1451         } 
       
  1452     else if ( ext.CompareF( KMp4Ext ) == 0 )
       
  1453         {
       
  1454         aMimeType = TDataType( KMp4Mime );
       
  1455         } 
       
  1456     else if ( ext.CompareF( KAviExt ) == 0 )
       
  1457         {
       
  1458         aMimeType = TDataType( KAviMime );
       
  1459         }
       
  1460     else if ( ext.CompareF( KMp3Ext ) == 0 )
       
  1461         {
       
  1462         aMimeType = TDataType( KMp3Mime );
       
  1463         } 
       
  1464     else if ( ext.CompareF( KNonEmbeddArtExt ) == 0 )
       
  1465         {
       
  1466         aMimeType = TDataType( KNonEmbeddArtMime );
       
  1467         }
       
  1468     else if ( ext.CompareF( KAacExt ) == 0 )
       
  1469         {
       
  1470         aMimeType = TDataType( KAacMime );
       
  1471         }   
       
  1472     else if ( ext.CompareF( KWmaExt ) == 0 )
       
  1473         {
       
  1474         aMimeType = TDataType( KWmaMime );
       
  1475         } 
       
  1476     else if ( ext.CompareF( KBmpExt ) == 0 )
       
  1477         {
       
  1478         aMimeType = TDataType( KBmpMime );
       
  1479         }
       
  1480     else if ( ext.CompareF( K3gpExt ) == 0 )
       
  1481         {
       
  1482         aMimeType = TDataType( KVideo3gppMime );
       
  1483         return KErrNotFound; 
       
  1484         // 3gp can contain video or audio, should go to recognizer
       
  1485         } 
       
  1486     else if ( ext.CompareF( K3gppExt ) == 0 )
       
  1487         {
       
  1488         aMimeType = TDataType( KVideo3gppMime );
       
  1489         return KErrNotFound; 
       
  1490         // 3gp can contain video or audio, should go to recognizer
       
  1491         }
       
  1492     else if ( ext.CompareF( KAmrExt ) == 0 )
       
  1493         {
       
  1494         aMimeType = TDataType( KAudioAmrMime );
       
  1495         }
       
  1496     else if ( ext.CompareF( KWmvExt ) == 0 )
       
  1497         {
       
  1498         aMimeType = TDataType( KVideoWmvMime );
       
  1499         } 
       
  1500     else if ( ext.CompareF( KRealAudioExt ) == 0 )
       
  1501         {
       
  1502         aMimeType = TDataType( KRealAudioMime );
       
  1503         }
       
  1504     else if ( ext.CompareF( KPmRealAudioPluginExt ) == 0 )
       
  1505         {
       
  1506         aMimeType = TDataType( KPmRealAudioPluginMime );
       
  1507         } 
       
  1508     else if ( ext.CompareF( KRealVideoExt ) == 0 )
       
  1509         {
       
  1510         aMimeType = TDataType( KRealVideoMime );
       
  1511         }
       
  1512     else if ( ext.CompareF( KM4aExt ) == 0 )
       
  1513         {
       
  1514         aMimeType = TDataType( KM4aMime);
       
  1515         }
       
  1516     else if ( ext.CompareF( KM4vExt ) == 0 )
       
  1517         {
       
  1518         aMimeType = TDataType( KMp4Mime);
       
  1519         }
       
  1520     else if ( ext.CompareF( KPmRealVideoPluginExt ) == 0 )
       
  1521         {
       
  1522         aMimeType = TDataType( KPmRealVideoPluginMime );
       
  1523         }
       
  1524     else if ( ext.CompareF( KPmRealVbVideoPluginExt ) == 0 )
       
  1525         {
       
  1526         aMimeType = TDataType( KPmRealVbVideoPluginMime );
       
  1527         }
       
  1528     else if ( ext.CompareF( KFlashVideoExt ) == 0 )
       
  1529         {
       
  1530         aMimeType = TDataType( KFlashVideoMime );
       
  1531         } 
       
  1532     else if ( ext.CompareF( KMatroskaVideoExt ) == 0 )
       
  1533         {
       
  1534         aMimeType = TDataType( KMatroskaVideoMime );
       
  1535         } 
       
  1536     else if ( ext.CompareF( KContactExt ) == 0 )
       
  1537         {
       
  1538         aMimeType = TDataType( KContactMime );
       
  1539         } 
       
  1540     else if ( ext.CompareF( KAlbumArtExt ) == 0 )
       
  1541         {
       
  1542         aMimeType = TDataType( KAlbumArtMime );
       
  1543         }
       
  1544     else
       
  1545         {
       
  1546         aMimeType = TDataType( KNullDesC8 );
       
  1547         found = EFalse;
       
  1548         }
       
  1549     
       
  1550     if (found)
       
  1551         {
       
  1552         return KErrNone;
       
  1553         }
       
  1554     
       
  1555     return KErrNotFound;
       
  1556     }
       
  1557 
       
  1558 // -----------------------------------------------------------------------------
       
  1559 // CThumbnailServer::SourceTypeFromMimeType()
       
  1560 // -----------------------------------------------------------------------------
       
  1561 //
       
  1562 TInt CThumbnailServer::SourceTypeFromMimeType( const TDataType& aMimeType )
       
  1563     {
       
  1564     const TPtrC8 mimeType = aMimeType.Des8();
       
  1565   
       
  1566     TInt separatorPos = mimeType.Locate( KThumbnailMimeSeparatorChar );
       
  1567     TPtrC8 mediaType( mimeType.Left( separatorPos ));
       
  1568 
       
  1569     if (mediaType.Compare(KThumbnailMimeImage) == 0)
       
  1570         {
       
  1571         return TThumbnailPersistentSize::EImage;
       
  1572         }
       
  1573     else if (mediaType.Compare(KThumbnailMimeVideo) == 0)
       
  1574         {
       
  1575         return TThumbnailPersistentSize::EVideo;
       
  1576         }
       
  1577     else if (mediaType.Compare(KThumbnailMimeAudio) == 0)
       
  1578         {
       
  1579         return TThumbnailPersistentSize::EAudio;
       
  1580         }
       
  1581     else if (mediaType.Compare(KThumbnailMimeContact) == 0)
       
  1582         {
       
  1583         return TThumbnailPersistentSize::EContact;
       
  1584         }
       
  1585 
       
  1586     return TThumbnailPersistentSize::EUnknownSourceType;        
       
  1587     }
       
  1588 
       
  1589 // -----------------------------------------------------------------------------
       
  1590 // CThumbnailServer::SourceTypeFromSizeType()
       
  1591 // -----------------------------------------------------------------------------
       
  1592 //
       
  1593 TInt CThumbnailServer::SourceTypeFromSizeType( const TInt aSizeType )
       
  1594     {
       
  1595     TInt sourceType = 0;
       
  1596     
       
  1597     switch (aSizeType)
       
  1598         {
       
  1599         case EImageGridThumbnailSize:
       
  1600         case EImageListThumbnailSize:
       
  1601         case EImageFullScreenThumbnailSize:
       
  1602             sourceType = TThumbnailPersistentSize::EImage;
       
  1603             break;
       
  1604         case EVideoGridThumbnailSize:
       
  1605         case EVideoListThumbnailSize:
       
  1606         case EVideoFullScreenThumbnailSize:  
       
  1607             sourceType = TThumbnailPersistentSize::EVideo;
       
  1608             break;
       
  1609         case EAudioGridThumbnailSize:
       
  1610         case EAudioListThumbnailSize:
       
  1611         case EAudioFullScreenThumbnailSize:
       
  1612             sourceType = TThumbnailPersistentSize::EAudio;
       
  1613             break;
       
  1614         case EContactListThumbnailSize:
       
  1615         case EContactGridThumbnailSize:
       
  1616         case EContactFullScreenThumbnailSize:
       
  1617             sourceType = TThumbnailPersistentSize::EContact;
       
  1618             break;
       
  1619         default:
       
  1620             sourceType = TThumbnailPersistentSize::EUnknownSourceType;  
       
  1621         }
       
  1622     
       
  1623     return sourceType;
       
  1624     }
       
  1625 
       
  1626 // -----------------------------------------------------------------------------
       
  1627 // CThumbnailServer::SupportedMimeType()
       
  1628 // -----------------------------------------------------------------------------
       
  1629 //
       
  1630 TBool CThumbnailServer::SupportedMimeType( const TDataType& aMimeType )
       
  1631     {
       
  1632     const TPtrC8 mimeType = aMimeType.Des8();
       
  1633     
       
  1634     if ( mimeType.CompareF( KJpegMime ) == 0 || 
       
  1635          mimeType.CompareF( KJpeg2000Mime ) == 0 ||
       
  1636          mimeType.CompareF( KGifMime ) == 0 ||
       
  1637          mimeType.CompareF( KPngMime ) == 0 ||
       
  1638          mimeType.CompareF( KSvgMime ) == 0 ||
       
  1639          mimeType.CompareF( KMpgMime1 ) == 0 ||
       
  1640          mimeType.CompareF( KMpeg4Mime ) == 0 ||
       
  1641          mimeType.CompareF( KMp4Mime ) == 0 ||
       
  1642          mimeType.CompareF( KAviMime ) == 0 ||
       
  1643          mimeType.CompareF( KMp3Mime ) == 0 ||
       
  1644          mimeType.CompareF( KNonEmbeddArtMime ) == 0 ||
       
  1645          mimeType.CompareF( KM4aMime ) == 0  ||
       
  1646          mimeType.CompareF( KAacMime ) == 0 ||
       
  1647          mimeType.CompareF( KWmaMime ) == 0 ||
       
  1648          mimeType.CompareF( KBmpMime ) == 0 ||         
       
  1649          mimeType.CompareF( KAudio3gppMime ) == 0 ||
       
  1650          mimeType.CompareF( KVideo3gppMime ) == 0 ||
       
  1651          mimeType.CompareF( KAudioAmrMime ) == 0 ||
       
  1652          mimeType.CompareF( KVideoWmvMime ) == 0 ||
       
  1653          mimeType.CompareF( KRealAudioMime ) == 0 ||
       
  1654          mimeType.CompareF( KPmRealAudioPluginMime ) == 0 ||
       
  1655          mimeType.CompareF( KPmRealVideoPluginMime ) == 0 ||
       
  1656          mimeType.CompareF( KPmRealVbVideoPluginMime ) == 0 ||
       
  1657          mimeType.CompareF( KRealVideoMime ) == 0 ||
       
  1658          mimeType.CompareF( KFlashVideoMime ) == 0 ||
       
  1659          mimeType.CompareF( KMatroskaVideoMime ) == 0 ||
       
  1660          mimeType.CompareF( KContactMime ) == 0 ||
       
  1661          mimeType.CompareF( KAlbumArtMime ) == 0 )
       
  1662         {
       
  1663         return ETrue;
       
  1664         }
       
  1665     
       
  1666     return EFalse;
       
  1667     }
       
  1668 
       
  1669 // -----------------------------------------------------------------------------
       
  1670 // CThumbnailServer::GetMdESession()
       
  1671 // -----------------------------------------------------------------------------
       
  1672 //
       
  1673 CMdESession* CThumbnailServer::GetMdESession()
       
  1674     {
       
  1675     return iMdESession;
       
  1676     }
       
  1677 
       
  1678 
       
  1679 // -----------------------------------------------------------------------------
       
  1680 // E32Main()
       
  1681 // -----------------------------------------------------------------------------
       
  1682 //
       
  1683 TInt E32Main()
       
  1684     {
       
  1685     __UHEAP_MARK;
       
  1686     CTrapCleanup* cleanup = CTrapCleanup::New();
       
  1687     TInt result = KErrNoMemory;
       
  1688     if ( cleanup )
       
  1689         {
       
  1690         TRAP( result, CThumbnailServer::ThreadFunctionL());
       
  1691         TN_DEBUG2( 
       
  1692             "CThumbnailServer::E32Main() -- thread function out, result=%d",
       
  1693             result );
       
  1694         OstTrace1( TRACE_NORMAL, _E32MAIN, "::E32Main;result=%d - thread function out", result );
       
  1695         delete cleanup;
       
  1696         cleanup = NULL;
       
  1697         }
       
  1698     if ( result != KErrNone )
       
  1699         {
       
  1700         // Signal the client that server creation failed
       
  1701         TN_DEBUG1( "CThumbnailServer::E32Main() -- Rendezvous() in" );
       
  1702         OstTrace0( TRACE_NORMAL, DUP2__E32MAIN, "::E32Main - in" );
       
  1703         RProcess::Rendezvous( result );
       
  1704         TN_DEBUG1( "CThumbnailServer::E32Main() -- Rendezvous() out" );
       
  1705         OstTrace0( TRACE_NORMAL, DUP1__E32MAIN, "::E32Main - out" );
       
  1706         }
       
  1707 
       
  1708     __UHEAP_MARKEND;
       
  1709     return result;
       
  1710     }
       
  1711 
       
  1712 // -----------------------------------------------------------------------------
       
  1713 // Closes stores for removable drives
       
  1714 // -----------------------------------------------------------------------------
       
  1715 //
       
  1716 void CThumbnailServer::CloseRemovableDrivesL()
       
  1717     {
       
  1718     TDriveList driveList;
       
  1719     TInt drive; 
       
  1720     TDriveInfo driveInfo;
       
  1721     iFormatting = ETrue;    
       
  1722         
       
  1723     User::LeaveIfError( iFs.DriveList(driveList) );
       
  1724        
       
  1725     // search all drives
       
  1726     for( drive = EDriveA; drive <= EDriveZ; drive++ )
       
  1727         {
       
  1728         if( !driveList[drive] ) 
       
  1729            {
       
  1730            // If drive-list entry is zero, drive is not available
       
  1731            continue;
       
  1732            }
       
  1733             
       
  1734         TInt err = iFs.Drive(driveInfo, drive);
       
  1735             
       
  1736         // if removable drive, close store
       
  1737         if (!err && driveInfo.iDriveAtt& KDriveAttRemovable)
       
  1738             {
       
  1739             TN_DEBUG2( "CThumbnailServer::CloseRemovableDrive drive=%d", drive);
       
  1740             OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_CLOSEREMOVABLEDRIVESL, "CThumbnailServer::CloseRemovableDrivesL;drive=%d", drive );
       
  1741             CloseStoreForDriveL(drive);
       
  1742             }
       
  1743         }
       
  1744     iProcessor->RemoveAllTasks();
       
  1745     }
       
  1746 
       
  1747 // -----------------------------------------------------------------------------
       
  1748 // Open Stores for removable drives
       
  1749 // -----------------------------------------------------------------------------
       
  1750 //
       
  1751 void CThumbnailServer::OpenRemovableDrivesL()
       
  1752     {
       
  1753     TDriveList driveList;
       
  1754     TInt drive; 
       
  1755     TDriveInfo driveInfo;
       
  1756     iFormatting = EFalse;    
       
  1757         
       
  1758     User::LeaveIfError( iFs.DriveList(driveList) );
       
  1759        
       
  1760     // search all drives
       
  1761     for( drive = EDriveA; drive <= EDriveZ; drive++ )
       
  1762         {
       
  1763         if( !driveList[drive] ) 
       
  1764            {
       
  1765            // If drive-list entry is zero, drive is not available
       
  1766            continue;
       
  1767            }
       
  1768             
       
  1769         TInt err = iFs.Drive(driveInfo, drive);
       
  1770             
       
  1771         // if removable drive, open store
       
  1772         if (!err && driveInfo.iDriveAtt& KDriveAttRemovable)
       
  1773             {
       
  1774             TN_DEBUG2( "CThumbnailServer::OpenRemovableDrive drive=%d", drive);
       
  1775             OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_OPENREMOVABLEDRIVESL, "CThumbnailServer::OpenRemovableDrivesL;drive=%d", drive );
       
  1776             StoreForDriveL(drive);
       
  1777             }
       
  1778         }
       
  1779     }
       
  1780 
       
  1781 // -----------------------------------------------------------------------------
       
  1782 // Is formatting ongoing
       
  1783 // -----------------------------------------------------------------------------
       
  1784 //
       
  1785 TBool CThumbnailServer::IsFormatting()
       
  1786     {
       
  1787     return iFormatting;
       
  1788     }
       
  1789 
       
  1790 // ---------------------------------------------------------------------------
       
  1791 // CThumbnailServer::FormatNotification
       
  1792 // Handles a format operation
       
  1793 // ---------------------------------------------------------------------------
       
  1794 //
       
  1795 void CThumbnailServer::FormatNotification( TBool aFormat )
       
  1796     {
       
  1797     TN_DEBUG2( "CThumbnailServer::FormatNotification(%d)", aFormat );
       
  1798     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_FORMATNOTIFICATION, "CThumbnailServer::FormatNotification;aFormat=%d", aFormat );
       
  1799     
       
  1800     if(aFormat)
       
  1801         {
       
  1802         TRAP_IGNORE( CloseRemovableDrivesL() );
       
  1803         }
       
  1804     else 
       
  1805         {
       
  1806         TRAP_IGNORE( OpenRemovableDrivesL() );
       
  1807         }
       
  1808     }
       
  1809 
       
  1810 // ---------------------------------------------------------------------------
       
  1811 // CThumbnailServer::ReconnectCallBack()
       
  1812 // ---------------------------------------------------------------------------
       
  1813 //
       
  1814 TInt CThumbnailServer::ReconnectCallBack(TAny* aAny)
       
  1815     {
       
  1816     TN_DEBUG1( "CThumbnailServer::ReconnectCallBack() - reconnect");
       
  1817     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_RECONNECTCALLBACK, "CThumbnailServer::ReconnectCallBack - reconnect" );
       
  1818     
       
  1819     CThumbnailServer* self = static_cast<CThumbnailServer*>( aAny );
       
  1820     
       
  1821     self->iReconnect->Cancel();
       
  1822     
       
  1823     if (self->iMdESession)
       
  1824         {
       
  1825         delete self->iMdESession;
       
  1826         self->iMdESession = NULL;
       
  1827         }
       
  1828     
       
  1829     // reconnect to MDS
       
  1830     TRAP_IGNORE( self->iMdESession = CMdESession::NewL( *self ) );
       
  1831     self->iSessionError = EFalse;
       
  1832     
       
  1833     TN_DEBUG1( "CThumbAGDaemon::ReconnectCallBack() - done");
       
  1834     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_RECONNECTCALLBACK, "CThumbnailServer::ReconnectCallBack - done" );
       
  1835     
       
  1836     return KErrNone;
       
  1837     }
       
  1838 
       
  1839 // -----------------------------------------------------------------------------
       
  1840 // CThumbnailServer::IsPublicPath
       
  1841 // -----------------------------------------------------------------------------
       
  1842 //
       
  1843 
       
  1844 TBool CThumbnailServer::IsPublicPath( const TDesC& aPath )
       
  1845     {
       
  1846     TInt pos = aPath.FindF(KPrivateFolder);
       
  1847     
       
  1848     if ( pos == 1 )
       
  1849         {
       
  1850         TN_DEBUG1( "CThumbnailServer::IsPublicPath() NO");
       
  1851         OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_ISPUBLICPATH, "CThumbnailServer::IsPublicPath - NO" );
       
  1852         return EFalse;
       
  1853         }
       
  1854     
       
  1855     pos = aPath.FindF(KSysFolder);
       
  1856     if ( pos == 1 )
       
  1857         {
       
  1858         TN_DEBUG1( "CThumbnailServer::IsPublicPath() NO");
       
  1859         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_ISPUBLICPATH, "CThumbnailServer::IsPublicPath - NO" );
       
  1860         return EFalse;
       
  1861         }
       
  1862     
       
  1863     return ETrue;
       
  1864     }
       
  1865 
       
  1866 // ---------------------------------------------------------------------------
       
  1867 // CThumbnailServer::StartUnmount()
       
  1868 // ---------------------------------------------------------------------------
       
  1869 //
       
  1870 void CThumbnailServer::StartUnmountTimeout( const TInt aDrive)
       
  1871     {
       
  1872     TN_DEBUG2( "CThumbnailServer::StartUnmountTimeout(%d)", aDrive);
       
  1873     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVER_STARTUNMOUNTTIMEOUT, "CThumbnailServer::StartUnmountTimeout;aDrive=%d", aDrive );
       
  1874     
       
  1875     if(iUnmount )
       
  1876         {
       
  1877         if(iUnmountedDrives.Find( aDrive ) == KErrNotFound)
       
  1878             {
       
  1879             iUnmountedDrives.Append( aDrive );
       
  1880             }
       
  1881         
       
  1882        if(iUnmount->IsActive())
       
  1883            {
       
  1884            iUnmount->Cancel();
       
  1885            }
       
  1886        
       
  1887        TN_DEBUG1( "CThumbnailServer::StartUnmountTimeout() start unmount timer");
       
  1888        OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_STARTUNMOUNTTIMEOUT, "CThumbnailServer::StartUnmountTimeout - start unmount timer" );
       
  1889        iUnmount->Start( KUnmountTimerTimeout, KUnmountTimerTimeout, TCallBack(UnmountCallBack, this));
       
  1890        }
       
  1891        __ASSERT_DEBUG(( iUnmount ), ThumbnailPanic( EThumbnailNullPointer ));
       
  1892     }
       
  1893 
       
  1894 
       
  1895 // ---------------------------------------------------------------------------
       
  1896 // CThumbnailServer::UnmountCallBack()
       
  1897 // ---------------------------------------------------------------------------
       
  1898 //
       
  1899 TInt CThumbnailServer::UnmountCallBack(TAny* aAny)
       
  1900     {
       
  1901     TN_DEBUG1( "CThumbnailServer::UnmountCallBack() - unmount finished");
       
  1902     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVER_UNMOUNTCALLBACK, "CThumbnailServer::UnmountCallBack - unmount finished" );
       
  1903     
       
  1904     CThumbnailServer* self = static_cast<CThumbnailServer*>( aAny );
       
  1905     
       
  1906     self->iUnmount->Cancel();
       
  1907     
       
  1908     self->iUnmountedDrives.Reset();
       
  1909     
       
  1910     TN_DEBUG1( "CThumbAGDaemon::UnmountCallBack() - done");
       
  1911     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVER_UNMOUNTCALLBACK, "CThumbnailServer::UnmountCallBack - done" );
       
  1912     
       
  1913     return KErrNone;
       
  1914     }