ncdengine/provider/server/src/ncdpreviewmanager.cpp
changeset 0 ba25891c3a9e
equal deleted inserted replaced
-1:000000000000 0:ba25891c3a9e
       
     1 /*
       
     2 * Copyright (c) 2006-2008 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:   Contains CNcdPreviewManager class implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "ncdpreviewmanager.h"
       
    20 
       
    21 #include "ncdnodeidentifier.h"
       
    22 #include "ncdstoragemanager.h"
       
    23 #include "ncdstorage.h"
       
    24 #include "ncdfilestorage.h"
       
    25 #include "ncdproviderdefines.h"
       
    26 #include "ncdpanics.h"
       
    27 #include "catalogsutils.h"
       
    28 #include "ncdstorage.h"
       
    29 #include "ncdstorageitem.h"
       
    30 #include "ncddatabasestorage.h"
       
    31 #include "ncdgeneralmanager.h"
       
    32 
       
    33 #include "catalogsdebug.h"
       
    34 
       
    35 // ======== CNcdPreviewData ========
       
    36 
       
    37 
       
    38 // ---------------------------------------------------------------------------
       
    39 // Creators
       
    40 // ---------------------------------------------------------------------------
       
    41 //        
       
    42 CNcdPreviewManager::CNcdPreviewData* 
       
    43     CNcdPreviewManager::CNcdPreviewData::NewLC( 
       
    44     const CNcdNodeIdentifier& aId,
       
    45     const TDesC& aUri, 
       
    46     const TDesC& aPreviewFile,
       
    47     const TDesC& aMimeType )
       
    48     {
       
    49     CNcdPreviewData* self = new( ELeave ) CNcdPreviewData;
       
    50     CleanupStack::PushL( self );
       
    51     self->ConstructL( aId, aUri, aPreviewFile, aMimeType );
       
    52     return self;
       
    53     }
       
    54     
       
    55     
       
    56 // ---------------------------------------------------------------------------
       
    57 // Destructor
       
    58 // ---------------------------------------------------------------------------
       
    59 //        
       
    60 CNcdPreviewManager::CNcdPreviewData::~CNcdPreviewData()
       
    61     {
       
    62     DLTRACEIN((""));
       
    63     delete iId;
       
    64     delete iUri;
       
    65     delete iFilename;
       
    66     delete iMimeType;
       
    67     }
       
    68 
       
    69 
       
    70 // ---------------------------------------------------------------------------
       
    71 // Equals
       
    72 // ---------------------------------------------------------------------------
       
    73 //        
       
    74 TBool CNcdPreviewManager::CNcdPreviewData::Equals( 
       
    75     const CNcdNodeIdentifier& aId, 
       
    76     const TDesC& aUri ) const
       
    77     {
       
    78     return aId.Equals( *iId ) && aUri.Compare( *iUri ) == 0;
       
    79     }
       
    80     
       
    81 
       
    82 // ---------------------------------------------------------------------------
       
    83 // Id getter
       
    84 // ---------------------------------------------------------------------------
       
    85 //        
       
    86 const CNcdNodeIdentifier& CNcdPreviewManager::CNcdPreviewData::Id() const
       
    87     {
       
    88     DASSERT( iId );
       
    89     return *iId;
       
    90     }
       
    91     
       
    92     
       
    93 // ---------------------------------------------------------------------------
       
    94 // URI getter
       
    95 // ---------------------------------------------------------------------------
       
    96 //        
       
    97 const TDesC& CNcdPreviewManager::CNcdPreviewData::Uri() const
       
    98     {
       
    99     DASSERT( iUri );
       
   100     return *iUri;
       
   101     }
       
   102     
       
   103     
       
   104 // ---------------------------------------------------------------------------
       
   105 // Filename getter
       
   106 // ---------------------------------------------------------------------------
       
   107 //        
       
   108 const TDesC& CNcdPreviewManager::CNcdPreviewData::Filename() const
       
   109     {
       
   110     DASSERT( iFilename );
       
   111     return *iFilename;
       
   112     }
       
   113 
       
   114 
       
   115 // ---------------------------------------------------------------------------
       
   116 // Mime type getter
       
   117 // ---------------------------------------------------------------------------
       
   118 //        
       
   119 const TDesC& CNcdPreviewManager::CNcdPreviewData::MimeType() const
       
   120     {
       
   121     DASSERT( iMimeType );
       
   122     return *iMimeType;
       
   123     }
       
   124 
       
   125 
       
   126 // ---------------------------------------------------------------------------
       
   127 // Constructor
       
   128 // ---------------------------------------------------------------------------
       
   129 //        
       
   130 CNcdPreviewManager::CNcdPreviewData::CNcdPreviewData()
       
   131     {
       
   132     }
       
   133 
       
   134 
       
   135 // ---------------------------------------------------------------------------
       
   136 // ConstructL
       
   137 // ---------------------------------------------------------------------------
       
   138 //        
       
   139 void CNcdPreviewManager::CNcdPreviewData::ConstructL( 
       
   140     const CNcdNodeIdentifier& aId,
       
   141     const TDesC& aUri, 
       
   142     const TDesC& aPreviewFile,
       
   143     const TDesC& aMimeType )
       
   144     {
       
   145     DLTRACEIN((""));
       
   146     iId = CNcdNodeIdentifier::NewL( aId );
       
   147     iUri = aUri.AllocL();
       
   148     iFilename = aPreviewFile.AllocL();
       
   149     iMimeType = aMimeType.AllocL();
       
   150     }
       
   151 
       
   152 
       
   153 // ---------------------------------------------------------------------------
       
   154 // 
       
   155 // ---------------------------------------------------------------------------
       
   156 //        
       
   157 void CNcdPreviewManager::CNcdPreviewData::ExternalizeL( RWriteStream& aStream )
       
   158     {
       
   159     iId->ExternalizeL( aStream );
       
   160     ExternalizeDesL( *iUri, aStream );
       
   161     ExternalizeDesL( *iFilename, aStream );
       
   162     ExternalizeDesL( *iMimeType, aStream );
       
   163     }
       
   164 
       
   165 
       
   166 // ---------------------------------------------------------------------------
       
   167 // 
       
   168 // ---------------------------------------------------------------------------
       
   169 //        
       
   170 void CNcdPreviewManager::CNcdPreviewData::InternalizeL( RReadStream& aStream )
       
   171     {
       
   172     iId = CNcdNodeIdentifier::NewL();
       
   173     iId->InternalizeL( aStream );
       
   174     InternalizeDesL( iUri, aStream );
       
   175     InternalizeDesL( iFilename, aStream );
       
   176     InternalizeDesL( iMimeType, aStream );
       
   177     }
       
   178 
       
   179 
       
   180 // ======== PUBLIC MEMBER FUNCTIONS ========
       
   181 
       
   182 
       
   183 // ---------------------------------------------------------------------------
       
   184 // Creator
       
   185 // ---------------------------------------------------------------------------
       
   186 //        
       
   187 CNcdPreviewManager* CNcdPreviewManager::NewL( 
       
   188     CNcdGeneralManager& aGeneralManager, TInt aMaxCount )
       
   189     {
       
   190     CNcdPreviewManager* self = new( ELeave ) CNcdPreviewManager(
       
   191         aGeneralManager, aMaxCount );
       
   192     CleanupStack::PushL( self );
       
   193     self->ConstructL();
       
   194     CleanupStack::Pop( self );
       
   195     return self;
       
   196     }
       
   197 
       
   198 
       
   199 // ---------------------------------------------------------------------------
       
   200 // Destructor
       
   201 // ---------------------------------------------------------------------------
       
   202 //        
       
   203 CNcdPreviewManager::~CNcdPreviewManager()
       
   204     {
       
   205     DLTRACEIN((""));
       
   206     // delete previews
       
   207     iPreviews.ResetAndDestroy();
       
   208     }
       
   209     
       
   210 
       
   211 // ---------------------------------------------------------------------------
       
   212 // Add preview
       
   213 // ---------------------------------------------------------------------------
       
   214 //        
       
   215 void CNcdPreviewManager::AddPreviewL( 
       
   216     const CNcdNodeIdentifier& aId, 
       
   217     const TDesC& aUri, 
       
   218     const TDesC& aPreviewFile,
       
   219     const TDesC& aMimeType )
       
   220     {
       
   221     DLTRACEIN((""));
       
   222 
       
   223     // Check if the client already has a matching preview
       
   224     TInt previewIndex = FindPreview( aId, aUri );
       
   225     if ( previewIndex != KErrNotFound ) 
       
   226         {   
       
   227         // Remove old preview         
       
   228         RemovePreviewL( aId, aUri );
       
   229         }
       
   230     
       
   231     DLTRACE(("Create preview data"));
       
   232     
       
   233     // If we already have maximum number of previews, remove the oldest
       
   234     while ( iPreviews.Count() >= iMaxCount ) 
       
   235         {
       
   236         DLTRACE(("Removing old preview"));
       
   237         CNcdPreviewData& data( *iPreviews[0] );
       
   238         RemovePreviewL( data.Id(), data.Uri() );
       
   239         }
       
   240 
       
   241     MNcdFileStorage& fileStorage = FileStorageL( aId );
       
   242     TParsePtrC target( aPreviewFile );
       
   243     
       
   244     // Create new preview data
       
   245     CNcdPreviewData* data = CNcdPreviewData::NewLC( aId, aUri, 
       
   246         target.NameAndExt(), aMimeType );
       
   247     
       
   248     DLTRACE(("Moving the file"));
       
   249     fileStorage.AddFileL( aPreviewFile, ETrue );
       
   250         
       
   251     DLTRACE(("Add preview data"));
       
   252     iPreviews.AppendL( data );
       
   253     CleanupStack::Pop( data );
       
   254     
       
   255     SaveDataL();    
       
   256     }
       
   257 
       
   258 
       
   259 // ---------------------------------------------------------------------------
       
   260 // 
       
   261 // ---------------------------------------------------------------------------
       
   262 //        
       
   263 TInt CNcdPreviewManager::RemovePreviewL( 
       
   264     const CNcdNodeIdentifier& aId, 
       
   265     const TDesC& aUri )
       
   266     {
       
   267     DLTRACEIN((""));
       
   268     
       
   269     TInt previewIndex = FindPreview( aId, aUri );
       
   270     if ( previewIndex != KErrNotFound ) 
       
   271         {
       
   272         MNcdFileStorage& fileStorage = FileStorageL( aId );        
       
   273         TRAPD( err, fileStorage.RemoveFileL( 
       
   274             iPreviews[previewIndex]->Filename() ) );
       
   275         
       
   276         DLINFO(("File removal error code: %i", err ));
       
   277         
       
   278         // We don't want to delete previewdata if we couldn't
       
   279         // delete the file
       
   280         if ( err == KErrNone || err == KErrNotFound ) 
       
   281             {           
       
   282             delete iPreviews[ previewIndex ];
       
   283             iPreviews.Remove( previewIndex );
       
   284             SaveDataL();
       
   285             }
       
   286         return err;
       
   287         }
       
   288         
       
   289     return KErrNotFound;
       
   290     }
       
   291        
       
   292     
       
   293 // ---------------------------------------------------------------------------
       
   294 // 
       
   295 // ---------------------------------------------------------------------------
       
   296 //        
       
   297 RFile CNcdPreviewManager::PreviewL( 
       
   298     RFs& aFs,
       
   299     const CNcdNodeIdentifier& aId,
       
   300     const TDesC& aUri )
       
   301     {
       
   302     DLTRACEIN((""));
       
   303         
       
   304     TInt previewIndex = FindPreview( aId, aUri );
       
   305     if ( previewIndex == KErrNotFound ) 
       
   306         {
       
   307         User::Leave( KErrNotFound );
       
   308         }
       
   309     
       
   310     MNcdFileStorage& fileStorage = FileStorageL( aId );
       
   311         
       
   312     RFile file;
       
   313 
       
   314     DLTRACE(("Opening preview file"));
       
   315     TRAPD( trapError, file = 
       
   316           fileStorage.OpenFileL( aFs,
       
   317             iPreviews[ previewIndex ]->Filename(), 
       
   318             NcdProviderDefines::KNcdSharableFileOpenFlags ) );
       
   319             
       
   320     if( trapError != KErrNone )
       
   321         {
       
   322         TRAP_IGNORE( RemovePreviewL( aId, aUri ) );
       
   323         User::Leave( trapError );
       
   324         }
       
   325     
       
   326     return file;                                    
       
   327     }   
       
   328     
       
   329 
       
   330 // ---------------------------------------------------------------------------
       
   331 // 
       
   332 // ---------------------------------------------------------------------------
       
   333 //        
       
   334 TBool CNcdPreviewManager::PreviewExists( 
       
   335     const CNcdNodeIdentifier& aId,
       
   336     const TDesC& aUri ) const
       
   337     {
       
   338     DLTRACEIN((""));    
       
   339     return FindPreview( aId, aUri ) != KErrNotFound;
       
   340     }
       
   341 
       
   342 
       
   343 // ---------------------------------------------------------------------------
       
   344 // 
       
   345 // ---------------------------------------------------------------------------
       
   346 //        
       
   347 const TDesC& CNcdPreviewManager::PreviewMimeType(
       
   348     const CNcdNodeIdentifier& aId,
       
   349     const TDesC& aUri ) const
       
   350     {
       
   351     DLTRACEIN((""));
       
   352     TInt previewIndex = FindPreview( aId, aUri );
       
   353     if ( previewIndex != KErrNotFound ) 
       
   354         {            
       
   355         return iPreviews[ previewIndex ]->MimeType();
       
   356         }
       
   357     
       
   358     return KNullDesC();
       
   359     }
       
   360        
       
   361                
       
   362 // ---------------------------------------------------------------------------
       
   363 // 
       
   364 // ---------------------------------------------------------------------------
       
   365 //        
       
   366 void CNcdPreviewManager::RemoveAllPreviewsL()
       
   367     {
       
   368     DLTRACEIN((""));
       
   369 
       
   370     iStorageManager.RemoveStorageL( 
       
   371         iGeneralManager.FamilyName(), 
       
   372         NcdProviderDefines::KPreviewStorageNamespace );
       
   373     
       
   374     iPreviews.ResetAndDestroy();
       
   375 
       
   376     SaveDataL();
       
   377     }
       
   378 
       
   379 
       
   380 // ---------------------------------------------------------------------------
       
   381 // 
       
   382 // ---------------------------------------------------------------------------
       
   383 //        
       
   384 void CNcdPreviewManager::ExternalizeL( RWriteStream& aStream )
       
   385     {
       
   386     DLTRACEIN((""));
       
   387     TInt previewCount = iPreviews.Count();
       
   388     aStream.WriteInt32L( previewCount );
       
   389 
       
   390     for( TInt i = 0; i < previewCount; i++ )
       
   391         {
       
   392         iPreviews[ i ]->ExternalizeL( aStream );
       
   393         }    
       
   394     }
       
   395 
       
   396 
       
   397 // ---------------------------------------------------------------------------
       
   398 // 
       
   399 // ---------------------------------------------------------------------------
       
   400 //        
       
   401 void CNcdPreviewManager::InternalizeL( RReadStream& aStream )
       
   402     {
       
   403     DLTRACEIN((""));
       
   404     iPreviews.ResetAndDestroy();
       
   405     
       
   406     TInt previewCount = aStream.ReadInt32L();
       
   407     iPreviews.ReserveL( previewCount );
       
   408     
       
   409     for( TInt i = 0; i < previewCount; i++ )
       
   410         {
       
   411         CNcdPreviewData* previewData = new( ELeave ) CNcdPreviewData;
       
   412         CleanupStack::PushL( previewData );
       
   413         previewData->InternalizeL( aStream );
       
   414         iPreviews.Append( previewData );
       
   415         CleanupStack::Pop( previewData );
       
   416         previewData = NULL;
       
   417         }    
       
   418     }
       
   419 
       
   420 
       
   421 // ---------------------------------------------------------------------------
       
   422 // 
       
   423 // ---------------------------------------------------------------------------
       
   424 //        
       
   425 CNcdPreviewManager::CNcdPreviewManager( 
       
   426     CNcdGeneralManager& aGeneralManager, TInt aMaxCount ) :
       
   427     iGeneralManager( aGeneralManager ),
       
   428     iStorageManager( aGeneralManager.StorageManager() ), 
       
   429     iMaxCount( aMaxCount )
       
   430     {
       
   431     NCD_ASSERT_ALWAYS( iMaxCount > 0, ENcdPanicInvalidArgument );
       
   432     }
       
   433 
       
   434 
       
   435 // ---------------------------------------------------------------------------
       
   436 // ConstructL
       
   437 // ---------------------------------------------------------------------------
       
   438 //        
       
   439 void CNcdPreviewManager::ConstructL()
       
   440     {
       
   441     }
       
   442 
       
   443 
       
   444 // ---------------------------------------------------------------------------
       
   445 // Find preview
       
   446 // ---------------------------------------------------------------------------
       
   447 //        
       
   448 TInt CNcdPreviewManager::FindPreview( 
       
   449     const CNcdNodeIdentifier& aId,
       
   450     const TDesC& aUri ) const
       
   451     {        
       
   452     TInt count = iPreviews.Count();
       
   453     for ( TInt i = 0; i < count; ++i )
       
   454         {
       
   455         if ( iPreviews[ i ]->Equals( aId, aUri ) ) 
       
   456             {
       
   457             return i;
       
   458             }
       
   459         }
       
   460     return KErrNotFound;
       
   461     }
       
   462 
       
   463 
       
   464 // ---------------------------------------------------------------------------
       
   465 // FileStorageL
       
   466 // ---------------------------------------------------------------------------
       
   467 //        
       
   468 MNcdFileStorage& CNcdPreviewManager::FileStorageL(
       
   469     const CNcdNodeIdentifier& aId )
       
   470     {
       
   471     DLTRACEIN(( _L("Namespace: %S"), &aId.NodeNameSpace() ));        
       
   472     
       
   473     MNcdStorage& storage = iStorageManager.CreateOrGetStorageL( 
       
   474         iGeneralManager.FamilyName(), 
       
   475         NcdProviderDefines::KPreviewStorageNamespace ); 
       
   476         
       
   477     // Get rid of invalid characters in the namespace since it'll be
       
   478     // used as a directory name
       
   479     HBufC* id = EncodeFilenameLC( 
       
   480         aId.NodeNameSpace(), 
       
   481         iStorageManager.FileSession() );
       
   482     
       
   483     MNcdFileStorage& fileStorage( storage.FileStorageL( *id ) );
       
   484     
       
   485     CleanupStack::PopAndDestroy( id );
       
   486     return fileStorage;        
       
   487     }
       
   488 
       
   489 // ---------------------------------------------------------------------------
       
   490 // SaveDataL
       
   491 // ---------------------------------------------------------------------------
       
   492 //        
       
   493 void CNcdPreviewManager::SaveDataL()
       
   494     {
       
   495     DLTRACEIN((""));
       
   496     
       
   497     MNcdDatabaseStorage& database =
       
   498         iStorageManager.ProviderStorageL( 
       
   499             iGeneralManager.FamilyName() ).DatabaseStorageL( 
       
   500                 NcdProviderDefines::KDefaultDatabaseUid );
       
   501             
       
   502     MNcdStorageItem* item = 
       
   503         database.StorageItemL( KNullDesC(), 
       
   504             NcdProviderDefines::ENcdPreviewManager );        
       
   505     
       
   506     item->SetDataItem( this );
       
   507     item->OpenL();
       
   508     
       
   509     item->WriteDataL();
       
   510     
       
   511     item->SaveL();      
       
   512     DLTRACEOUT((""));      
       
   513     }
       
   514 
       
   515 
       
   516 // ---------------------------------------------------------------------------
       
   517 // Loads data
       
   518 // ---------------------------------------------------------------------------
       
   519 //        
       
   520 void CNcdPreviewManager::LoadDataL()
       
   521     {
       
   522     DLTRACEIN((""));
       
   523 
       
   524     MNcdDatabaseStorage& database =
       
   525         iStorageManager.ProviderStorageL( 
       
   526             iGeneralManager.FamilyName() ).DatabaseStorageL( 
       
   527                 NcdProviderDefines::KDefaultDatabaseUid );
       
   528             
       
   529     if( !database.ItemExistsInStorageL( KNullDesC(),
       
   530                                         NcdProviderDefines::ENcdPreviewManager ) )
       
   531         {
       
   532         return;
       
   533         }
       
   534     
       
   535     MNcdStorageItem* item = 
       
   536         database.StorageItemL( KNullDesC(), 
       
   537             NcdProviderDefines::ENcdPreviewManager );        
       
   538                
       
   539     item->SetDataItem( this );
       
   540     item->ReadDataL();    
       
   541     
       
   542     DLTRACEOUT((""));      
       
   543     }
       
   544