--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/engine/src/creator_file.cpp Tue Aug 31 15:15:20 2010 +0300
@@ -0,0 +1,831 @@
+/*
+* Copyright (c) 2010 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:
+*
+*/
+
+
+#include <DRMRights.h>
+
+#include "engine.h"
+#include "enginewrapper.h"
+#include "creator_file.h"
+#include "creator_traces.h"
+
+using namespace ContentAccess;
+
+static const TInt KFilesFieldLength = 256;
+
+//_LIT(KCreatorFilesPrefixName, "CR_");
+//_LIT(KCreatorFilesPrefixFolderName, "CR_FLDR_");
+
+//----------------------------------------------------------------------------
+
+CFilesParameters::CFilesParameters()
+ {
+ LOGSTRING("Creator: CFilesParameters::CFilesParameters");
+ iFullFilePath = HBufC::New(KFilesFieldLength);
+ }
+
+CFilesParameters::CFilesParameters( CFilesParameters& aCopy )
+ {
+ LOGSTRING("Creator: CFilesParameters::CFilesParameters");
+ iFullFilePath = HBufC::New(KFilesFieldLength);
+ iFullFilePath->Des().Copy( *aCopy.iFullFilePath );
+ iFileCommand = aCopy.iFileCommand;
+ iEncrypt = aCopy.iEncrypt;
+ if ( aCopy.iPermission )
+ {
+ TRAP_IGNORE(
+ iPermission = CDRMPermission::NewL();
+ iPermission->DuplicateL( *aCopy.iPermission );
+ );
+ }
+ }
+
+CFilesParameters::~CFilesParameters()
+ {
+ LOGSTRING("Creator: CFilesParameters::~CFilesParameters");
+ delete iFullFilePath;
+ delete iPermission;
+ }
+
+//----------------------------------------------------------------------------
+
+CCreatorFiles* CCreatorFiles::NewL(CCreatorEngine* aEngine)
+ {
+ CCreatorFiles* self = CCreatorFiles::NewLC(aEngine);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CCreatorFiles* CCreatorFiles::NewLC(CCreatorEngine* aEngine)
+ {
+ CCreatorFiles* self = new (ELeave) CCreatorFiles;
+ CleanupStack::PushL(self);
+ self->ConstructL(aEngine);
+ return self;
+ }
+
+CCreatorFiles::CCreatorFiles() :
+ iFs ( CEikonEnv::Static()->FsSession() )
+ {
+ }
+
+void CCreatorFiles::ConstructL(CCreatorEngine* aEngine)
+ {
+ LOGSTRING("Creator: CCreatorFiles::ConstructL");
+
+ iEngine = aEngine;
+
+ User::LeaveIfError( iApaLs.Connect() );
+
+ iFilePaths = new (ELeave) CDesCArrayFlat( 4 );
+
+ // Restore file id
+ CDictionaryFileStore* store = iEngine->FileStoreLC();
+ User::LeaveIfNull( store );
+ if ( store->IsPresentL( KUidDictionaryUidFiles ) )
+ {
+ RDictionaryReadStream in;
+ in.OpenLC( *store, KUidDictionaryUidFiles );
+ TRAPD( err, iFileId = in.ReadInt32L() );
+ if ( err )
+ {
+ iFileId = 1;
+ }
+ CleanupStack::PopAndDestroy(); // in
+ }
+ else
+ {
+ iFileId = 1;
+ }
+ CleanupStack::PopAndDestroy( store );
+ }
+
+CCreatorFiles::~CCreatorFiles()
+ {
+ LOGSTRING("Creator: CCreatorFiles::~CCreatorFiles");
+
+ // this is done only once per file operation:
+ if ( iFilePaths && iFilePaths->Count() )
+ {
+ TRAP_IGNORE( StorePathsForDeleteL( *iFilePaths ) );
+ }
+ delete iFilePaths;
+ delete iParameters;
+ delete iUserParameters;
+ iApaLs.Close();
+ }
+
+//----------------------------------------------------------------------------
+
+void CCreatorFiles::QueryDialogClosedL(TBool aPositiveAction, TInt aUserData)
+ {
+ LOGSTRING("Creator: CCreatorFiles::QueryDialogClosedL");
+
+ if( aPositiveAction == EFalse )
+ {
+ iEngine->ShutDownEnginesL();
+ return;
+ }
+
+ const TDesC* showText = &KSavingText;
+ TBool finished(EFalse);
+ TBool retval(ETrue);
+ switch(aUserData)
+ {
+ case ECreatorFilesDelete:
+ showText = &KDeletingText;
+ iEntriesToBeCreated = 1;
+ finished = ETrue;
+ break;
+ case ECreatorFilesStart:
+ {
+ // set a default directory (eg. c:\Nokia\Images\)
+ iEngine->SetDefaultPathForFileCommandL(iCommand, iDirectoryQueriedFromUser);
+ TBuf<50> promptText;
+ if (iCommand == ECmdCreateFileEntryEmptyFolder)
+ promptText.Copy( _L("Specify the folder path and name") );
+ else
+ promptText.Copy( _L("Specify the directory") );
+
+ // show directory query dialog
+ retval = iEngine->GetEngineWrapper()->DirectoryQueryDialog(promptText, iDirectoryQueriedFromUser, this, ECreatorFilesGetDirectory );
+ }
+ break;
+ case ECreatorFilesGetDirectory:
+ // check that the root folder is correct
+ if ( iDirectoryQueriedFromUser.Length() < 3 || BaflUtils::CheckFolder( iFs, iDirectoryQueriedFromUser.Left(3) ) != KErrNone )
+ {
+ iEngine->GetEngineWrapper()->ShowErrorMessage(_L("Invalid path"));
+ retval = EFalse;
+ }
+ else
+ {
+ // check the directory contains a trailing backlash
+ if ( iDirectoryQueriedFromUser.Right(1) != _L("\\") )
+ {
+ iDirectoryQueriedFromUser.Append(_L("\\"));
+ }
+ // copy the directory name to a class member
+ if ( iCommand == ECmdCreateFileEntryEmptyFolder )
+ {
+ finished = ETrue;
+ }
+ else
+ {
+ retval = AskDRMDataFromUserL();
+ }
+ }
+ break;
+ case ECreatorFilesAskDRMData:
+ if ( iDummy > 0 )
+ {
+ iUserParameters->iEncrypt = ETrue;
+ }
+ if ( iDummy == 2 )
+ {
+ iUserParameters->iPermission = CDRMPermission::NewL();
+ CDRMPermission* perm = iUserParameters->iPermission;
+ perm->iTopLevel->iActiveConstraints = EConstraintNone;
+ perm->iPlay->iActiveConstraints = EConstraintNone;
+ perm->iDisplay->iActiveConstraints = EConstraintNone;
+ perm->iPrint->iActiveConstraints = EConstraintNone;
+ perm->iExecute->iActiveConstraints = EConstraintNone;
+ perm->iUniqueID = 0;
+ // DRM Combined Delivery
+ iDummy = 0;
+ retval = iEngine->GetEngineWrapper()->EntriesQueryDialog( &iDummy, _L("How many counts(0=unlimited)?"), ETrue, this, ECreatorFilesAskDRM_CD_Counts );
+ }
+ else
+ {
+ finished = ETrue;
+ }
+ break;
+ case ECreatorFilesAskDRM_CD_Counts:
+ if ( iDummy > 0 )
+ {
+ TInt count = iDummy;
+ CDRMPermission* perm = iUserParameters->iPermission;
+ // apply constraints to all permission types
+ // applied type will be selected by setting iAvailableRights
+ // when determining the file type
+ perm->iDisplay->iActiveConstraints |= EConstraintCounter;
+ perm->iDisplay->iCounter = count;
+ perm->iDisplay->iOriginalCounter = count;
+
+ perm->iPlay->iActiveConstraints |= EConstraintCounter;
+ perm->iPlay->iCounter = count;
+ perm->iPlay->iOriginalCounter = count;
+
+ perm->iPrint->iActiveConstraints |= EConstraintCounter;
+ perm->iPrint->iCounter = count;
+ perm->iPrint->iOriginalCounter = count;
+
+ perm->iExecute->iActiveConstraints |= EConstraintCounter;
+ perm->iExecute->iCounter = count;
+ perm->iExecute->iOriginalCounter = count;
+ }
+ iDummy = 0;
+ retval = iEngine->GetEngineWrapper()->EntriesQueryDialog( &iDummy, _L("How many minutes until expire(0=unlimited)?"), ETrue,
+ this, ECreatorFilesAskDRM_CD_Minutes
+ );
+ break;
+ case ECreatorFilesAskDRM_CD_Minutes:
+ if ( iDummy > 0 )
+ {
+ TInt minutes = iDummy;
+ CDRMPermission* perm = iUserParameters->iPermission;
+ // apply constraints to all permission types
+ // applied type will be selected by setting iAvailableRights
+ // when determining the file type
+ perm->iDisplay->iActiveConstraints |= EConstraintInterval;
+ perm->iDisplay->iInterval = TTimeIntervalSeconds( 60 * minutes );
+ perm->iDisplay->iIntervalStart = Time::NullTTime();
+
+ perm->iPlay->iActiveConstraints |= EConstraintInterval;
+ perm->iPlay->iInterval = TTimeIntervalSeconds( 60 * minutes );
+ perm->iPlay->iIntervalStart = Time::NullTTime();
+
+ perm->iPrint->iActiveConstraints |= EConstraintInterval;
+ perm->iPrint->iInterval = TTimeIntervalSeconds( 60 * minutes );
+ perm->iPrint->iIntervalStart = Time::NullTTime();
+
+ perm->iExecute->iActiveConstraints |= EConstraintInterval;
+ perm->iExecute->iInterval = TTimeIntervalSeconds( 60 * minutes );
+ perm->iExecute->iIntervalStart = Time::NullTTime();
+ }
+ finished = ETrue;
+ break;
+ default:
+ //some error
+ retval = EFalse;
+ break;
+ }
+ if( retval == EFalse )
+ {
+ iEngine->ShutDownEnginesL();
+ }
+ else if( finished )
+ {
+ // add this command to command array
+ iEngine->AppendToCommandArrayL(iCommand, NULL, iEntriesToBeCreated);
+ // started exucuting commands
+ iEngine->ExecuteFirstCommandL( *showText );
+ }
+ }
+
+//----------------------------------------------------------------------------
+
+TBool CCreatorFiles::AskDataFromUserL(TInt aCommand)
+ {
+ LOGSTRING("Creator: CCreatorFiles::AskDataFromUserL");
+
+ CCreatorModuleBase::AskDataFromUserL( aCommand );
+
+ if ( aCommand == ECmdDeleteCreatorFiles )
+ {
+ return iEngine->GetEngineWrapper()->YesNoQueryDialog( _L("Delete all files created with Creator?"), this, ECreatorFilesDelete );
+ }
+
+ delete iUserParameters;
+ iUserParameters = NULL;
+ iUserParameters = new(ELeave) CFilesParameters();
+
+ iDirectoryQueriedFromUser.Copy( KNullDesC );
+
+ return iEngine->GetEngineWrapper()->EntriesQueryDialog(&iEntriesToBeCreated, _L("How many entries to create?"), EFalse, this, ECreatorFilesStart );
+ }
+
+
+//----------------------------------------------------------------------------
+
+TInt CCreatorFiles::CreateFileEntryL(CFilesParameters *aParameters, TInt aCommand)
+ {
+ LOGSTRING("Creator: CCreatorFiles::CreateFileEntryL");
+
+ // clear any existing parameter definations
+ delete iParameters;
+ iParameters = NULL;
+ TFileName directoryToBeCreated;
+
+ CFilesParameters* parameters = aParameters;
+
+ if (!parameters)
+ {
+ if ( iUserParameters )
+ {
+ iParameters = new (ELeave) CFilesParameters( *iUserParameters );
+ // iUserParameters = NULL;
+ }
+ else
+ {
+ // random data needed if no predefined data available
+ iParameters = new (ELeave) CFilesParameters;
+ }
+ parameters = iParameters;
+ }
+
+ TInt err = KErrNone;
+
+ // if we just create directories
+ if ( aCommand == ECmdCreateFileEntryEmptyFolder)
+ {
+ // strip the last backslash from the path
+ if( iDirectoryQueriedFromUser.Length() > 0)
+ directoryToBeCreated = iDirectoryQueriedFromUser;
+ else if( parameters->iFullFilePath && parameters->iFullFilePath->Des().Length() > 0 )
+ directoryToBeCreated = parameters->iFullFilePath->Des();
+ else
+ return err;
+
+ _LIT(KSlash, "\\");
+ if( directoryToBeCreated.Right(1) == KSlash )
+ directoryToBeCreated.SetLength ( directoryToBeCreated.Length() - 1 );
+
+ // generate a unique file name
+ err = CApaApplication::GenerateFileName( iFs, directoryToBeCreated);
+ if (err != KErrNone)
+ return err;
+
+ // now append the backslah back
+ directoryToBeCreated.Append( _L("\\") );
+
+ // now create the new directory
+ err = iFs.MkDirAll( directoryToBeCreated );
+
+ // Add directoryToBeCreated to store
+ iFilePaths->AppendL( directoryToBeCreated );
+
+ LOGSTRING3("Creator: CCreatorFiles::CreateFileEntryL creating empty directory %S returns err", &directoryToBeCreated, err);
+ }
+
+ else // files
+ {
+ LOGSTRING2("Creator: CCreatorFiles::CreateFileEntryL file id is %d", aCommand);
+
+ // get source
+ TFileName fullSourcePath;
+ switch (aCommand)
+ {
+ case ECmdCreateFileEntryJPEG_25kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EJPEG_25kB ); break; }
+ case ECmdCreateFileEntryJPEG_200kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EJPEG_200kB ); break; }
+ case ECmdCreateFileEntryJPEG_500kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EJPEG_500kB ); break; }
+ case ECmdCreateFileEntryPNG_15kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EPNG_15kB ); break; }
+ case ECmdCreateFileEntryGIF_2kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EGIF_2kB ); break; }
+ case ECmdCreateFileEntryRNG_1kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ERNG_1kB ); break; }
+ case ECmdCreateFileEntryMIDI_10kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EMIDI_10kB ); break; }
+ case ECmdCreateFileEntryWAV_20kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EWAVE_20kB ); break; }
+ case ECmdCreateFileEntryAMR_20kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EAMR_20kB ); break; }
+ case ECmdCreateFileEntryXLS_15kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EExcel_15kB ); break; }
+ case ECmdCreateFileEntryDOC_20kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EWord_20kB ); break; }
+ case ECmdCreateFileEntryPPT_40kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EPowerPoint_40kB ); break; }
+ case ECmdCreateFileEntryTXT_10kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EText_10kB ); break; }
+ case ECmdCreateFileEntryTXT_70kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EText_70kB ); break; }
+ case ECmdCreateFileEntry3GPP_70kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::E3GPP_70kB ); break; }
+ case ECmdCreateFileEntryMP3_250kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EMP3_250kB ); break; }
+ case ECmdCreateFileEntryAAC_100kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EAAC_100kB ); break; }
+ case ECmdCreateFileEntryRM_95kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ERM_95kB ); break; }
+ case ECmdCreateFileEntryBMP_25kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EBMP_25kB ); break; }
+ case ECmdCreateFileEntryDeck_1kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ESavedDeck_1kB ); break; }
+ case ECmdCreateFileEntryHTML_20kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EHTML_20kB ); break; }
+ case ECmdCreateFileEntryJAD_1kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EJAD_1kB ); break; }
+ case ECmdCreateFileEntryJAR_10kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EJAR_10kB ); break; }
+ case ECmdCreateFileEntryJP2_65kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EJP2_65kB ); break; }
+ case ECmdCreateFileEntryMP4_200kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EMP4_200kB ); break; }
+ case ECmdCreateFileEntryMXMF_40kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EMXMF_40kB ); break; }
+ case ECmdCreateFileEntryRAM_1kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ERAM_1kB ); break; }
+ case ECmdCreateFileEntrySVG_15kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ESVG_15kB ); break; }
+ case ECmdCreateFileEntrySWF_15kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ESWF_15kB ); break; }
+ case ECmdCreateFileEntryTIF_25kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ETIF_25kB ); break; }
+ case ECmdCreateFileEntryVCF_1kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EVCF_1kB ); break; }
+ case ECmdCreateFileEntryVCS_1kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EVCS_1kB ); break; }
+ case ECmdCreateFileEntrySISX_10kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::ESISX_10kB ); break; }
+ case ECmdCreateFileEntryWMA_50kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EWMA_50kB ); break; }
+ case ECmdCreateFileEntryWMV_200kB: { fullSourcePath = iEngine->TestDataPathL( CCreatorEngine::EWMV_200kB ); break; }
+ case ECmdCreateFileEntryEmptyFolder: { User::Panic(_L("EmptyFolder"), 801); break; }
+ default: { return KErrPathNotFound; }
+ }
+
+
+ // define the full target path
+ TFileName fullTargetPath;
+
+ if ( parameters->iFullFilePath && parameters->iFullFilePath->Des().Length() > 3 )
+ {
+ _LIT(KSlash, "\\");
+ // check the path is ok
+ fullTargetPath = parameters->iFullFilePath->Des();
+
+ if(fullTargetPath.Right(1) == KSlash)
+ {
+ // Remove '\' from the end, because the filename check does not work with it:
+ fullTargetPath.SetLength ( fullTargetPath.Length() - 1 );
+ }
+
+ if (!iFs.IsValidName( fullTargetPath ))
+ User::Leave(KErrBadName);
+
+ // target path = directory + the file name from source path
+ TParse parser;
+ parser.Set(fullSourcePath, NULL, NULL);
+
+ // Add '\' to the end:
+ fullTargetPath.Append(KSlash);
+ // Add filename:
+ fullTargetPath.Append( parser.NameAndExt() );
+
+ LOGSTRING2("Creator: CCreatorFiles::CreateFileEntryL iFullFilePath used, fullTargetPath: %S", &fullTargetPath);
+ }
+
+ else if ( iDirectoryQueriedFromUser.Length() > 0 )
+ {
+ // target path = directory + the file name from source path
+ TParse parser;
+ parser.Set(fullSourcePath, NULL, NULL);
+
+ fullTargetPath = iDirectoryQueriedFromUser;
+ fullTargetPath.Append( parser.NameAndExt() );
+
+ LOGSTRING2("Creator: CCreatorFiles::CreateFileEntryL iDirectoryQueriedFromUser used, fullTargetPath: %S", &fullTargetPath);
+ }
+
+ else
+ {
+ LOGSTRING("Creator: CCreatorFiles::CreateFileEntryL leaving with KErrPathNotFound");
+ User::Leave(KErrPathNotFound);
+ }
+
+ TBool encrypt = parameters->iEncrypt;
+ if ( encrypt ) fullTargetPath.Append( KOma2DcfExtension );
+ // check the target path has a unique filename ie we won't overwrite existing files
+ // also generates any missing directories
+ if ( BaflUtils::FileExists( iFs, fullTargetPath ) )
+ {
+ GenerateFileNameL( fullTargetPath );
+ }
+ User::LeaveIfError(CApaApplication::GenerateFileName( iFs, fullTargetPath ) );
+
+ if ( encrypt )
+ {
+ EncryptFileL( fullSourcePath, fullTargetPath, parameters );
+ }
+ else
+ {
+ // copy the file (synchronous function)
+ err = BaflUtils::CopyFile(iFs, fullSourcePath, fullTargetPath);
+ LOGSTRING4("Creator: CCreatorFiles::CreateFileEntryL copy %S to %S, err=%d", &fullSourcePath, &fullTargetPath, err);
+ }
+
+ if (err != KErrNone)
+ User::Leave(err); // leave because copying failed
+
+ // Add fullTargetPath to store
+ iFilePaths->AppendL( fullTargetPath );
+
+ // make sure that the file won't have a read only attribute
+ TEntry fileEntry;
+ iFs.Entry(fullTargetPath, fileEntry);
+ iFs.SetEntry(fullTargetPath, fileEntry.iModified, NULL, KEntryAttReadOnly);
+
+ // clear variables
+ parameters->iFullFilePath->Des().Copy ( KNullDesC );
+ }
+
+ return err;
+ }
+
+//----------------------------------------------------------------------------
+
+void CCreatorFiles::EncryptFileL( const TDesC& aInFileName, const TDesC& aOutFileName, CFilesParameters *aParameters )
+ {
+ LOGSTRING("Creator: CCreatorFiles::EncryptFileL");
+ TBuf8<64> mime;
+ SetMimeTypeL( aInFileName, mime, aParameters );
+ CSupplier* supplier = CSupplier::NewLC();
+
+ CMetaDataArray* metaData = CMetaDataArray::NewLC();
+
+ // Tell the agent which MIME type to use for the encrypted data
+ metaData->AddL( KOmaImportMimeTypeField, mime );
+
+ if ( aParameters && aParameters->iPermission )
+ {
+ // Combined Delivery file will be created
+ SetPermissionsL( metaData, aOutFileName, aParameters );
+ }
+
+ supplier->SetOutputDirectoryL( iDirectoryQueriedFromUser );
+
+ // The KOmaImportContentType is a OMA DRM agent specific MIME type which
+ // indicates that plain content is to be encrypted
+ CImportFile* importFile = supplier->ImportFileL( KOmaImportContentType,
+ *metaData,
+ aOutFileName );
+ CleanupStack::PushL( importFile );
+
+ // Peek the source file size:
+ TInt fileLen( 0 );
+ RFile file;
+ User::LeaveIfError( file.Open( iFs, aInFileName, EFileRead ) );
+ CleanupClosePushL( file );
+ User::LeaveIfError( file.Size( fileLen ) );
+ CleanupStack::PopAndDestroy( &file );
+
+ // Read the source file to inmemory buffer
+ RFileReadStream rs;
+ User::LeaveIfError( rs.Open( iFs,
+ aInFileName,
+ EFileStream | EFileRead ) );
+ CleanupClosePushL( rs );
+ HBufC8* fileBuf = HBufC8::NewLC( fileLen );
+ TPtr8 p = fileBuf->Des();
+ rs.ReadL( p, fileLen );
+
+ // Start encryption
+ TInt err = importFile->WriteData( p );
+ if ( err == KErrCANewFileHandleRequired )
+ {
+ RFile file;
+ User::LeaveIfError( file.Create( iFs, aOutFileName, EFileWrite ) );
+ CleanupClosePushL( file );
+ importFile->ContinueWithNewOutputFile( file, aOutFileName );
+ CleanupStack::PopAndDestroy( &file );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+ User::LeaveIfError( importFile->WriteDataComplete() );
+ CleanupStack::PopAndDestroy( fileBuf );
+ CleanupStack::PopAndDestroy( &rs );
+ CleanupStack::PopAndDestroy( importFile );
+ CleanupStack::PopAndDestroy( metaData );
+ CleanupStack::PopAndDestroy( supplier );
+ }
+
+//----------------------------------------------------------------------------
+
+void CCreatorFiles::SetPermissionsL( CMetaDataArray* aMetaData, const TDesC& aOutFileName, CFilesParameters *aParameters )
+ {
+ LOGSTRING("Creator: CCreatorFiles::SetPermissionsL");
+ CDRMRights* rights = CDRMRights::NewL();
+ CleanupStack::PushL( rights );
+
+ HBufC8* cnturi = HBufC8::NewL( KMaxFileName );
+ cnturi->Des().Copy( aOutFileName );
+
+ CDRMAsset* asset = CDRMAsset::NewLC();
+ asset->iUid = cnturi;
+ // Set the asset to the rights class, it will duplicate the asset
+ rights->SetAssetL( *asset );
+ CleanupStack::PopAndDestroy( asset );
+
+ rights->SetPermissionL( *aParameters->iPermission );
+
+ // Construct externalized presentation of the rights object
+ TInt rightsSize = 1024 *100;
+ HBufC8* rightBuf = HBufC8::NewLC( rightsSize );
+ TPtr8 bptr = rightBuf->Des();
+ bptr.SetLength( rightsSize );
+ RMemWriteStream iWriteStream;
+ iWriteStream.Open( (TAny*)(rightBuf->Ptr() ), rightsSize );
+ CleanupClosePushL( iWriteStream );
+ iWriteStream << *rights;
+ iWriteStream.CommitL();
+ TPtr8 rp = rightBuf->Des();
+
+ // Add rights to metadata
+ aMetaData->AddL( KOmaImportRightsField, rp );
+ CleanupStack::PopAndDestroy( &iWriteStream );
+ CleanupStack::PopAndDestroy( rightBuf );
+ CleanupStack::PopAndDestroy( rights );
+ }
+
+//----------------------------------------------------------------------------
+
+void CCreatorFiles::SetMimeTypeL( const TDesC& aFileName, TDes8& aMime, CFilesParameters *aParameters )
+ {
+ LOGSTRING("Creator: CCreatorFiles::SetMimeTypeL");
+ TUid appUid;
+ TDataType dataType;
+ User::LeaveIfError( iApaLs.AppForDocument( aFileName, appUid, dataType ) );
+ if ( dataType.Des().Length() )
+ {
+ aMime.Copy( dataType.Des() );
+ }
+ else
+ {
+ // set default mime, because it was not recognized by iApaLs
+ aMime.Copy( _L("text/plain") );
+ }
+
+ // set DRM permissions according the type of the file
+ if ( aParameters->iPermission )
+ {
+ if ( dataType.Des().FindF( _L("image") ) > KErrNotFound )
+ {
+ aParameters->iPermission->iAvailableRights = ERightsDisplay | ERightsPrint;
+ }
+ else if ( dataType.Des().FindF( _L("audio") ) > KErrNotFound ||
+ dataType.Des().FindF( _L("video") ) > KErrNotFound ||
+ dataType.Des().FindF( _L("tone") ) > KErrNotFound || // e.g. application/vnd.nokia.ringing-tone
+ dataType.Des().FindF( _L("realmedia") ) > KErrNotFound )
+ {
+ // media files
+ aParameters->iPermission->iAvailableRights = ERightsPlay;
+ }
+ else if ( dataType.Des().FindF( _L("archive") ) > KErrNotFound ||
+ dataType.Des().FindF( _L("x-sis") ) > KErrNotFound )
+ {
+ // application/java-archive
+ // x-epoc/x-sisx-app
+ aParameters->iPermission->iAvailableRights = ERightsExecute;
+ }
+ else if ( dataType.Des().FindF( _L("application") ) > KErrNotFound ||
+ dataType.Des().FindF( _L("text") ) > KErrNotFound )
+ {
+ // application/msexcel
+ // application/msword
+ // text/plain
+ // etc.
+ aParameters->iPermission->iAvailableRights = ERightsDisplay | ERightsPrint;
+ }
+ else
+ {
+ // other filetype
+ aParameters->iPermission->iAvailableRights = ERightsDisplay;
+ }
+ }
+ }
+
+//----------------------------------------------------------------------------
+
+TBool CCreatorFiles::AskDRMDataFromUserL()
+ {
+ LOGSTRING("Creator: CCreatorFiles::AskDRMDataFromUserL");
+ // Encryption -dialog
+ CDesCArrayFlat* items = new(ELeave) CDesCArrayFlat(5);
+ CleanupStack::PushL(items);
+
+ // Add entires to list
+ items->AppendL( _L("None") );
+ items->AppendL( _L("DRM Forward Lock") );
+ items->AppendL( _L("DRM Combined Delivery") );
+
+
+ // create a popup list
+ iDummy = 0;
+ TBool retval = iEngine->GetEngineWrapper()->PopupListDialog(_L("Encryption"), items, &iDummy, this, ECreatorFilesAskDRMData );
+ CleanupStack::PopAndDestroy( items );
+ return retval;
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorFiles::DeleteAllL()
+ {
+ LOGSTRING("Creator: CCreatorFiles::DeleteAllL");
+ User::Leave( KErrNotSupported ); // will not be supported
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorFiles::DeleteAllCreatedByCreatorL()
+ {
+ LOGSTRING("Creator: CCreatorFiles::DeleteAllCreatedByCreatorL");
+ iFileId = 1;
+ CDictionaryFileStore* store = iEngine->FileStoreLC();
+ User::LeaveIfNull( store );
+
+ if ( store->IsPresentL( KUidDictionaryUidFiles ) )
+ {
+ RDictionaryReadStream in;
+ in.OpenLC( *store, KUidDictionaryUidFiles );
+ CFileMan* fileMan = CFileMan::NewL( iFs );
+ CleanupStack::PushL( fileMan );
+ TFileName fullPath;
+ // ignore return value, don't update iFileId here:
+ TRAPD( err, in.ReadInt32L() );
+ while ( !err )
+ {
+ TInt len( KErrNotFound );
+ TRAP( err, len = in.ReadInt8L() ); // will leave with KErrEof
+ if ( !err )
+ {
+ TRAP( err, in.ReadL( fullPath, len ) );
+ }
+ if ( !err )
+ {
+ TEntry fileEntry;
+ iFs.Entry( fullPath, fileEntry );
+ if ( fileEntry.IsDir() )
+ {
+ fileMan->RmDir( fullPath ); // ignore return value
+ }
+ else
+ {
+ iFs.Delete( fullPath ); // ignore return value
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( fileMan );
+ CleanupStack::PopAndDestroy( &in );
+
+ // files deleted, remove the Creator internal file registry
+ store->Remove( KUidDictionaryUidFiles );
+ store->CommitL();
+ }
+ CleanupStack::PopAndDestroy( store );
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorFiles::StorePathsForDeleteL( CDesCArray& aPaths )
+ {
+ LOGSTRING("Creator: CCreatorFiles::StorePathsForDeleteL");
+ CDictionaryFileStore* store = iEngine->FileStoreLC();
+ User::LeaveIfNull( store );
+
+ // backup previous filepaths from store
+ // otherwise they would be overwritten when calling out.WriteL
+ CDesCArray* previousPaths = new (ELeave) CDesCArrayFlat( 4 );
+ CleanupStack::PushL( previousPaths );
+
+ TFileName fullPath;
+
+ if ( store->IsPresentL( KUidDictionaryUidFiles ) )
+ {
+ RDictionaryReadStream in;
+ in.OpenLC( *store, KUidDictionaryUidFiles );
+ // ignore return value, don't update iFileId here:
+ TRAPD( err, in.ReadInt32L() );
+ while ( !err )
+ {
+ TRAP( err,
+ TInt len = in.ReadInt8L(); // will leave with KErrEof
+ in.ReadL( fullPath, len );
+ previousPaths->AppendL( fullPath );
+ );
+ }
+ CleanupStack::PopAndDestroy(); // in
+ }
+
+ RDictionaryWriteStream out;
+ out.AssignLC( *store, KUidDictionaryUidFiles );
+
+ // write latest file id to store
+ out.WriteInt32L( iFileId );
+
+ // restore previous paths to store
+ for ( TInt i = 0; i < previousPaths->Count(); i++ )
+ {
+ out.WriteInt8L( (*previousPaths)[i].Length() );
+ out.WriteL( (*previousPaths)[i] );
+ }
+
+ // write new paths to store
+ for ( TInt i = 0; i < aPaths.Count(); i++ )
+ {
+ out.WriteInt8L( aPaths[i].Length() );
+ out.WriteL( aPaths[i] );
+ }
+
+ out.CommitL();
+ CleanupStack::PopAndDestroy(); // out
+
+ store->CommitL();
+ CleanupStack::PopAndDestroy( previousPaths );
+ CleanupStack::PopAndDestroy( store );
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorFiles::GenerateFileNameL( TFileName& aRootName )
+ {
+ LOGSTRING("Creator: CCreatorFiles::GenerateFileNameL");
+ if ( iFileId )
+ {
+ TBuf<16> extension;
+ if ( iFileId < 10 )
+ {
+ extension.Format( _L("(0%d)"), iFileId );
+ }
+ else
+ {
+ extension.Format( _L("(%d)"), iFileId );
+ }
+ aRootName.Insert( aRootName.Locate( '.' ), extension );
+ }
+ iFileId++;
+ }
+
+// End of file