--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/src/ncdpreviewmanager.cpp Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,544 @@
+/*
+* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Contains CNcdPreviewManager class implementation
+*
+*/
+
+
+#include "ncdpreviewmanager.h"
+
+#include "ncdnodeidentifier.h"
+#include "ncdstoragemanager.h"
+#include "ncdstorage.h"
+#include "ncdfilestorage.h"
+#include "ncdproviderdefines.h"
+#include "ncdpanics.h"
+#include "catalogsutils.h"
+#include "ncdstorage.h"
+#include "ncdstorageitem.h"
+#include "ncddatabasestorage.h"
+#include "ncdgeneralmanager.h"
+
+#include "catalogsdebug.h"
+
+// ======== CNcdPreviewData ========
+
+
+// ---------------------------------------------------------------------------
+// Creators
+// ---------------------------------------------------------------------------
+//
+CNcdPreviewManager::CNcdPreviewData*
+ CNcdPreviewManager::CNcdPreviewData::NewLC(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri,
+ const TDesC& aPreviewFile,
+ const TDesC& aMimeType )
+ {
+ CNcdPreviewData* self = new( ELeave ) CNcdPreviewData;
+ CleanupStack::PushL( self );
+ self->ConstructL( aId, aUri, aPreviewFile, aMimeType );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CNcdPreviewManager::CNcdPreviewData::~CNcdPreviewData()
+ {
+ DLTRACEIN((""));
+ delete iId;
+ delete iUri;
+ delete iFilename;
+ delete iMimeType;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Equals
+// ---------------------------------------------------------------------------
+//
+TBool CNcdPreviewManager::CNcdPreviewData::Equals(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri ) const
+ {
+ return aId.Equals( *iId ) && aUri.Compare( *iUri ) == 0;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Id getter
+// ---------------------------------------------------------------------------
+//
+const CNcdNodeIdentifier& CNcdPreviewManager::CNcdPreviewData::Id() const
+ {
+ DASSERT( iId );
+ return *iId;
+ }
+
+
+// ---------------------------------------------------------------------------
+// URI getter
+// ---------------------------------------------------------------------------
+//
+const TDesC& CNcdPreviewManager::CNcdPreviewData::Uri() const
+ {
+ DASSERT( iUri );
+ return *iUri;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Filename getter
+// ---------------------------------------------------------------------------
+//
+const TDesC& CNcdPreviewManager::CNcdPreviewData::Filename() const
+ {
+ DASSERT( iFilename );
+ return *iFilename;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Mime type getter
+// ---------------------------------------------------------------------------
+//
+const TDesC& CNcdPreviewManager::CNcdPreviewData::MimeType() const
+ {
+ DASSERT( iMimeType );
+ return *iMimeType;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CNcdPreviewManager::CNcdPreviewData::CNcdPreviewData()
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::CNcdPreviewData::ConstructL(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri,
+ const TDesC& aPreviewFile,
+ const TDesC& aMimeType )
+ {
+ DLTRACEIN((""));
+ iId = CNcdNodeIdentifier::NewL( aId );
+ iUri = aUri.AllocL();
+ iFilename = aPreviewFile.AllocL();
+ iMimeType = aMimeType.AllocL();
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::CNcdPreviewData::ExternalizeL( RWriteStream& aStream )
+ {
+ iId->ExternalizeL( aStream );
+ ExternalizeDesL( *iUri, aStream );
+ ExternalizeDesL( *iFilename, aStream );
+ ExternalizeDesL( *iMimeType, aStream );
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::CNcdPreviewData::InternalizeL( RReadStream& aStream )
+ {
+ iId = CNcdNodeIdentifier::NewL();
+ iId->InternalizeL( aStream );
+ InternalizeDesL( iUri, aStream );
+ InternalizeDesL( iFilename, aStream );
+ InternalizeDesL( iMimeType, aStream );
+ }
+
+
+// ======== PUBLIC MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Creator
+// ---------------------------------------------------------------------------
+//
+CNcdPreviewManager* CNcdPreviewManager::NewL(
+ CNcdGeneralManager& aGeneralManager, TInt aMaxCount )
+ {
+ CNcdPreviewManager* self = new( ELeave ) CNcdPreviewManager(
+ aGeneralManager, aMaxCount );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CNcdPreviewManager::~CNcdPreviewManager()
+ {
+ DLTRACEIN((""));
+ // delete previews
+ iPreviews.ResetAndDestroy();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Add preview
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::AddPreviewL(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri,
+ const TDesC& aPreviewFile,
+ const TDesC& aMimeType )
+ {
+ DLTRACEIN((""));
+
+ // Check if the client already has a matching preview
+ TInt previewIndex = FindPreview( aId, aUri );
+ if ( previewIndex != KErrNotFound )
+ {
+ // Remove old preview
+ RemovePreviewL( aId, aUri );
+ }
+
+ DLTRACE(("Create preview data"));
+
+ // If we already have maximum number of previews, remove the oldest
+ while ( iPreviews.Count() >= iMaxCount )
+ {
+ DLTRACE(("Removing old preview"));
+ CNcdPreviewData& data( *iPreviews[0] );
+ RemovePreviewL( data.Id(), data.Uri() );
+ }
+
+ MNcdFileStorage& fileStorage = FileStorageL( aId );
+ TParsePtrC target( aPreviewFile );
+
+ // Create new preview data
+ CNcdPreviewData* data = CNcdPreviewData::NewLC( aId, aUri,
+ target.NameAndExt(), aMimeType );
+
+ DLTRACE(("Moving the file"));
+ fileStorage.AddFileL( aPreviewFile, ETrue );
+
+ DLTRACE(("Add preview data"));
+ iPreviews.AppendL( data );
+ CleanupStack::Pop( data );
+
+ SaveDataL();
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CNcdPreviewManager::RemovePreviewL(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri )
+ {
+ DLTRACEIN((""));
+
+ TInt previewIndex = FindPreview( aId, aUri );
+ if ( previewIndex != KErrNotFound )
+ {
+ MNcdFileStorage& fileStorage = FileStorageL( aId );
+ TRAPD( err, fileStorage.RemoveFileL(
+ iPreviews[previewIndex]->Filename() ) );
+
+ DLINFO(("File removal error code: %i", err ));
+
+ // We don't want to delete previewdata if we couldn't
+ // delete the file
+ if ( err == KErrNone || err == KErrNotFound )
+ {
+ delete iPreviews[ previewIndex ];
+ iPreviews.Remove( previewIndex );
+ SaveDataL();
+ }
+ return err;
+ }
+
+ return KErrNotFound;
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+RFile CNcdPreviewManager::PreviewL(
+ RFs& aFs,
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri )
+ {
+ DLTRACEIN((""));
+
+ TInt previewIndex = FindPreview( aId, aUri );
+ if ( previewIndex == KErrNotFound )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ MNcdFileStorage& fileStorage = FileStorageL( aId );
+
+ RFile file;
+
+ DLTRACE(("Opening preview file"));
+ TRAPD( trapError, file =
+ fileStorage.OpenFileL( aFs,
+ iPreviews[ previewIndex ]->Filename(),
+ NcdProviderDefines::KNcdSharableFileOpenFlags ) );
+
+ if( trapError != KErrNone )
+ {
+ TRAP_IGNORE( RemovePreviewL( aId, aUri ) );
+ User::Leave( trapError );
+ }
+
+ return file;
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CNcdPreviewManager::PreviewExists(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri ) const
+ {
+ DLTRACEIN((""));
+ return FindPreview( aId, aUri ) != KErrNotFound;
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+const TDesC& CNcdPreviewManager::PreviewMimeType(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri ) const
+ {
+ DLTRACEIN((""));
+ TInt previewIndex = FindPreview( aId, aUri );
+ if ( previewIndex != KErrNotFound )
+ {
+ return iPreviews[ previewIndex ]->MimeType();
+ }
+
+ return KNullDesC();
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::RemoveAllPreviewsL()
+ {
+ DLTRACEIN((""));
+
+ iStorageManager.RemoveStorageL(
+ iGeneralManager.FamilyName(),
+ NcdProviderDefines::KPreviewStorageNamespace );
+
+ iPreviews.ResetAndDestroy();
+
+ SaveDataL();
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::ExternalizeL( RWriteStream& aStream )
+ {
+ DLTRACEIN((""));
+ TInt previewCount = iPreviews.Count();
+ aStream.WriteInt32L( previewCount );
+
+ for( TInt i = 0; i < previewCount; i++ )
+ {
+ iPreviews[ i ]->ExternalizeL( aStream );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::InternalizeL( RReadStream& aStream )
+ {
+ DLTRACEIN((""));
+ iPreviews.ResetAndDestroy();
+
+ TInt previewCount = aStream.ReadInt32L();
+ iPreviews.ReserveL( previewCount );
+
+ for( TInt i = 0; i < previewCount; i++ )
+ {
+ CNcdPreviewData* previewData = new( ELeave ) CNcdPreviewData;
+ CleanupStack::PushL( previewData );
+ previewData->InternalizeL( aStream );
+ iPreviews.Append( previewData );
+ CleanupStack::Pop( previewData );
+ previewData = NULL;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CNcdPreviewManager::CNcdPreviewManager(
+ CNcdGeneralManager& aGeneralManager, TInt aMaxCount ) :
+ iGeneralManager( aGeneralManager ),
+ iStorageManager( aGeneralManager.StorageManager() ),
+ iMaxCount( aMaxCount )
+ {
+ NCD_ASSERT_ALWAYS( iMaxCount > 0, ENcdPanicInvalidArgument );
+ }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::ConstructL()
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// Find preview
+// ---------------------------------------------------------------------------
+//
+TInt CNcdPreviewManager::FindPreview(
+ const CNcdNodeIdentifier& aId,
+ const TDesC& aUri ) const
+ {
+ TInt count = iPreviews.Count();
+ for ( TInt i = 0; i < count; ++i )
+ {
+ if ( iPreviews[ i ]->Equals( aId, aUri ) )
+ {
+ return i;
+ }
+ }
+ return KErrNotFound;
+ }
+
+
+// ---------------------------------------------------------------------------
+// FileStorageL
+// ---------------------------------------------------------------------------
+//
+MNcdFileStorage& CNcdPreviewManager::FileStorageL(
+ const CNcdNodeIdentifier& aId )
+ {
+ DLTRACEIN(( _L("Namespace: %S"), &aId.NodeNameSpace() ));
+
+ MNcdStorage& storage = iStorageManager.CreateOrGetStorageL(
+ iGeneralManager.FamilyName(),
+ NcdProviderDefines::KPreviewStorageNamespace );
+
+ // Get rid of invalid characters in the namespace since it'll be
+ // used as a directory name
+ HBufC* id = EncodeFilenameLC(
+ aId.NodeNameSpace(),
+ iStorageManager.FileSession() );
+
+ MNcdFileStorage& fileStorage( storage.FileStorageL( *id ) );
+
+ CleanupStack::PopAndDestroy( id );
+ return fileStorage;
+ }
+
+// ---------------------------------------------------------------------------
+// SaveDataL
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::SaveDataL()
+ {
+ DLTRACEIN((""));
+
+ MNcdDatabaseStorage& database =
+ iStorageManager.ProviderStorageL(
+ iGeneralManager.FamilyName() ).DatabaseStorageL(
+ NcdProviderDefines::KDefaultDatabaseUid );
+
+ MNcdStorageItem* item =
+ database.StorageItemL( KNullDesC(),
+ NcdProviderDefines::ENcdPreviewManager );
+
+ item->SetDataItem( this );
+ item->OpenL();
+
+ item->WriteDataL();
+
+ item->SaveL();
+ DLTRACEOUT((""));
+ }
+
+
+// ---------------------------------------------------------------------------
+// Loads data
+// ---------------------------------------------------------------------------
+//
+void CNcdPreviewManager::LoadDataL()
+ {
+ DLTRACEIN((""));
+
+ MNcdDatabaseStorage& database =
+ iStorageManager.ProviderStorageL(
+ iGeneralManager.FamilyName() ).DatabaseStorageL(
+ NcdProviderDefines::KDefaultDatabaseUid );
+
+ if( !database.ItemExistsInStorageL( KNullDesC(),
+ NcdProviderDefines::ENcdPreviewManager ) )
+ {
+ return;
+ }
+
+ MNcdStorageItem* item =
+ database.StorageItemL( KNullDesC(),
+ NcdProviderDefines::ENcdPreviewManager );
+
+ item->SetDataItem( this );
+ item->ReadDataL();
+
+ DLTRACEOUT((""));
+ }
+