diff -r 000000000000 -r 8e480a14352b messagingfw/msgsrvnstore/server/src/TMsvServerStoreManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgsrvnstore/server/src/TMsvServerStoreManager.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,651 @@ +// Copyright (c) 2004-2009 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 + +#include "TMsvServerStoreManager.h" +#include "MSVUTILS.H" +#include "MSVSERV.H" +#include "MSVPANIC.H" +#include "MSVAPI.H" +#include "msvindexadapter.h" +#include "msvpreferreddrivelist.h" + +TMsvServerStoreManager::TMsvServerStoreManager() : iMsvServer(NULL),iFs(NULL) + { + } + +void TMsvServerStoreManager::SetMsvServerAndFileSession(CMsvServer& aMsvServer,RFs& aFs) + { + iMsvServer = &aMsvServer; + iFs = &aFs; + } + +/** Gets the filepath for the storage of binary files associated with the context + +If the directory specified in the context does not exist, it is created. + +@param aEntryId index id of the entry whose filepath is requested +@param aDirectory On return, contains the binary file directory path +@return KErrNone - success; +@return The server was unable to create the directory.- failure */ +TInt TMsvServerStoreManager::GetFilePath(TMsvId aEntryId, TFileName& aDirectory) const + { + __ASSERT_ALWAYS(iMsvServer != NULL, PanicServer(EMsvServerNotValid)); + + TMsvId owningService = KMsvNullIndexEntryId; + GetOwningServiceAndFilePath(aEntryId,aDirectory,owningService); + + MsvUtils::ConstructEntryName(owningService, aEntryId, aDirectory, MsvUtils::EFolder); + TInt error = iMsvServer->FileSession().MkDirAll(aDirectory); + return (error==KErrAlreadyExists ? KErrNone : error); + } + +/** Gets the filestore name associated with the context + +@param aEntryId Index id of the entry whose store filename is requested +@param aFileName On return, contains the store file name for the context +*/ +void TMsvServerStoreManager::GetStoreFileName(TMsvId aEntryId, TFileName& aFileName) const + { + __ASSERT_ALWAYS(iMsvServer != NULL, PanicServer(EMsvServerNotValid)); + + TMsvId owningService = KMsvNullIndexEntryId; + GetOwningServiceAndFilePath(aEntryId,aFileName,owningService); + + MsvUtils::ConstructEntryName(owningService, aEntryId, aFileName, MsvUtils::EStore); + } + +void TMsvServerStoreManager::GetOwningServiceAndFilePath(TMsvId aEntryId,TDes& aFilePath,TMsvId& aOwningService) const + { + __ASSERT_ALWAYS(iMsvServer != NULL, PanicServer(EMsvServerNotValid)); + +#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT) + //TUint driveId = MsvUtils::GetDriveId(aEntryId); + TUint driveId = GetDriveId(aEntryId); + TDriveNumber driveNum = EDriveC; + CMsvPreferredDriveList::GetDriveList()->GetDriveNumber(driveId, driveNum); + aFilePath.Zero(); + aFilePath.Append(TDriveUnit(driveNum).Name()); + TParse parse; + parse.Set(iMsvServer->Context().MessageFolder(), NULL, NULL); + aFilePath.Append(parse.Path()); +#else + aFilePath = iMsvServer->Context().MessageFolder(); +#endif + + iMsvServer->IndexAdapter().OwningService(aEntryId, aOwningService); + } + +/** Checks if the filename length is greater than KMaxFileName(256) + +If the filename is greater than KMaxFileName then it truncates the filename + +@param aFilePath file path where the file is being created. +@param aFileName name of the file whose length if being checked. +@return ETrue if the filename is changed. +*/ +TBool TMsvServerStoreManager::CheckFileNameLengthAndTrimL(const TDesC& aFilePath,TDes& aFileName) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TParsePtrC filenamePPtr(aFileName); + TPtrC fileExtension(filenamePPtr.Ext()); + +#ifdef __WINS__ + TFileName winsFileName; + TFileName mailStoreDrive; + TDriveUnit drive(MessageServer::CurrentDriveL(*iFs)); + mailStoreDrive.Append(drive.Name()); + mailStoreDrive.Append(KPathDelimiter); + MapEmulatedFileName(winsFileName, mailStoreDrive); // Ignoring return value + TInt KEpocBasePathLen = winsFileName.Length(); + TInt maxFilenameLength = KMaxFileName-(aFilePath).Length()-fileExtension.Length()-KEpocBasePathLen; +#else + TInt maxFilenameLength = KMaxFileName-(aFilePath).Length()-fileExtension.Length(); +#endif + TBool fileNameChanged = EFalse; + // Truncate filename if too long. + if (maxFilenameLength < aFileName.Length()) + { + aFileName.SetLength(maxFilenameLength); + aFileName.Append(fileExtension); + + fileNameChanged = ETrue; + } + return fileNameChanged; + } + +TBool TMsvServerStoreManager::GenerateFileNameIfExistsL(TDes& aFileName) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TParse fileParser; + User::LeaveIfError(fileParser.Set(aFileName, NULL, NULL)); + TInt fileNameGenerator = 1; + TBool fileNameChanged = EFalse; + CDir* dir; + TInt error = iFs->GetDir(fileParser.DriveAndPath(), KEntryAttNormal, ESortNone, dir); + if (error==KErrNone) + { + CleanupStack::PushL(dir); + TInt fileCount=dir->Count(); + while(fileCount--) + { + TBool open; + TFileName filePath(aFileName); + TInt error = iFs->IsFileOpen(aFileName, open); + // file exists + if (error==KErrNone) + { + TFileName tempFileName(fileParser.DriveAndPath()); + tempFileName.Append(fileParser.Name()); + tempFileName.AppendNum(fileNameGenerator++); + tempFileName.Append(fileParser.Ext()); + aFileName = tempFileName; + fileNameChanged = ETrue; + } + else if (error==KErrNotFound) + { + break; + } + else + { + User::Leave(error); + } + } + CleanupStack::PopAndDestroy(dir); + } + return fileNameChanged; + } + +// from MMsvStoreManager +TBool TMsvServerStoreManager::CreateAttachmentForWriteL(TMsvId aEntryId, TDes& aFilename, RFile& aFile) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + return CreateAttachmentL(aEntryId, aFilename, aFile, *iFs); + } + +TBool TMsvServerStoreManager::CreateShareProtectedAttachmentForWriteL(TMsvId aEntryId, TDes& aFilename, RFile& aFile) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + User::LeaveIfError(fs.ShareProtected()); + + return CreateAttachmentL(aEntryId, aFilename, aFile, fs, ETrue); + } + +TBool TMsvServerStoreManager::CreateAttachmentL(TMsvId aEntryId, TDes& aFilename, RFile& aFile, RFs& aFs,TBool aSharedAccess) + { + TFileName filePath; + GetFilePath(aEntryId,filePath); + TBool fileNameChanged = EFalse; + + if(CheckFileNameLengthAndTrimL(filePath,(TDes&)aFilename)) + { + fileNameChanged = ETrue; + } + + //for handling TBuf desc overflow + RBuf newFilePath; + TInt error = KErrNone; + newFilePath.CreateL(KMaxPath); + newFilePath.CleanupClosePushL(); + newFilePath.Copy(filePath); + if(aFilename.Length()+filePath.Length()>KMaxFileName) + { + newFilePath.ReAllocL(aFilename.Length()+filePath.Length()); + } + newFilePath.Append(aFilename); + if (aSharedAccess) + { + //Shared access for reading and writing + error = aFile.Create(aFs,newFilePath,EFileShareAny|EFileWrite); + } + else + { + error = aFile.Create(aFs,newFilePath,EFileWrite); + } + + if(error == KErrAlreadyExists) + { + if(GenerateFileNameIfExistsL(newFilePath)) + { + fileNameChanged = ETrue; + } + if (aSharedAccess) + { + //Shared access for reading and writing + User::LeaveIfError(aFile.Create(aFs,newFilePath, EFileShareAny|EFileWrite)); + } + else + { + User::LeaveIfError(aFile.Create(aFs,newFilePath,EFileWrite)); + } + + aFilename.Copy(newFilePath); + + } + else + { + User::LeaveIfError(error); + // return if error = KErrNone + aFilename.Copy(newFilePath); + } + CleanupStack::PopAndDestroy(&newFilePath);//newFilePath destroy + return fileNameChanged; + } + +void TMsvServerStoreManager::ReplaceAttachmentForWriteL(TMsvId aEntryId, TDes& aFilename, RFile& aFile) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName filePath; + GetFilePath(aEntryId, filePath); + TParsePtrC fileName(aFilename); + filePath.Append(fileName.NameAndExt()); + + User::LeaveIfError(aFile.Replace(*iFs, filePath, EFileWrite)); + + aFilename = filePath; + } + +void TMsvServerStoreManager::OpenAttachmentL(TMsvId aEntryId, const TDesC& aFilePath, RFile& aFile) + { + __ASSERT_ALWAYS(iFs != NULL,PanicServer(EMsvFileSessionNotValid)); + + TFileName filePath; + GetFilePath(aEntryId,filePath); + TParsePtrC fileName(aFilePath); + filePath.Append(fileName.NameAndExt()); + + User::LeaveIfError(aFile.Open(*iFs,filePath,EFileRead|EFileShareReadersOnly)); + } + +void TMsvServerStoreManager::OpenAttachmentForWriteL(TMsvId aEntryId, const TDesC& aFilePath, RFile& aFile) + { + __ASSERT_ALWAYS(iFs != NULL,PanicServer(EMsvFileSessionNotValid)); + + TFileName filePath; + GetFilePath(aEntryId,filePath); + TParsePtrC fileName(aFilePath); + filePath.Append(fileName.NameAndExt()); + + User::LeaveIfError(aFile.Open(*iFs,filePath,EFileWrite)); + } + + +TInt TMsvServerStoreManager::DeleteAttachment(TMsvId aEntryId, const TDesC& aFilePath) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName filePath; + GetFilePath(aEntryId,filePath); + TParsePtrC fileName(aFilePath); + filePath.Append(fileName.NameAndExt()); + + TInt error = iFs->Delete(filePath); + + if(error == KErrNotFound || error == KErrPathNotFound) + return KErrNotFound; + + return error; + } + +TInt TMsvServerStoreManager::RenameAttachment(TMsvId aEntryId, const TDesC& aOldFilePath, const TDesC& aNewName) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName filePath; + TInt err = GetFilePath(aEntryId, filePath); + + TParsePtrC fileToRename(aOldFilePath); + if(err==KErrNone) + { + filePath.Append(fileToRename.NameAndExt()); + TParse newPath; + err = newPath.Set(aNewName, &fileToRename.FullName(), NULL); + if( err==KErrNone ) + { + err = iFs->Rename(filePath, newPath.FullName()); + } + } + + return err; + } + +TBool TMsvServerStoreManager::FileExistsL(const TDesC& aFilePath) + { + // Use the Att method to check if file exists as it does change the + // file and is a light-weight call + TUint attValue = 0; + TInt err = iFs->Att(aFilePath, attValue); + + TBool fileExists = EFalse; + if (err == KErrNotFound || err == KErrPathNotFound) + { + fileExists = EFalse; + } + else if (err == KErrNone) + { + fileExists = ETrue; + } + else + { + User::Leave(err); + } + + return fileExists; + } + +void TMsvServerStoreManager::AttachmentFilePathL(TMsvId aEntryId, TDes& aFilePath) + { + TFileName filePath; + User::LeaveIfError(GetFilePath(aEntryId, filePath)); + + aFilePath = filePath; + } + +TInt TMsvServerStoreManager::OpenFileStoreForRead(TMsvId aEntryId, RFile& aFile) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName filePathAndName; + GetStoreFileName(aEntryId,filePathAndName); + + TInt error = aFile.Open(*iFs,filePathAndName,EFileRead|EFileShareAny); + if(error == KErrNotFound || error == KErrPathNotFound) + return KErrNotFound; + + return error; + } + +void TMsvServerStoreManager::OpenTempStoreFileL(TMsvId aEntryId, RFile& aFile) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName tempFilePathAndName; + GetStoreFileName(aEntryId,tempFilePathAndName); + + tempFilePathAndName.Append(KMsvUtilsNewExtension); + TInt error = iFs->MkDirAll(tempFilePathAndName); + if(error == KErrNone || error == KErrAlreadyExists) + error = aFile.Replace(*iFs,tempFilePathAndName,EFileShareExclusive|EFileWrite); + + User::LeaveIfError(error); + } + +void TMsvServerStoreManager::ReplaceFileStoreL(TMsvId aEntryId) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName filePathAndName; + + GetStoreFileName(aEntryId,filePathAndName); + TFileName tempFilePathAndName(filePathAndName); + + tempFilePathAndName.Append(KMsvUtilsNewExtension); + + TInt error = iFs->Replace(tempFilePathAndName,filePathAndName); + + + if(error !=KErrNone) + { + iFs->Delete(tempFilePathAndName); + User::Leave(error); + } + } + +void TMsvServerStoreManager::DeleteFileStoreL(TMsvId aEntryId) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName filePathAndName; + GetStoreFileName(aEntryId,filePathAndName); + + TInt error = iFs->Delete(filePathAndName); + if(error != KErrNone && error != KErrNotFound && error != KErrPathNotFound) + User::Leave(error); + + // Delete the temporary store file if it exists + filePathAndName.Append(KMsvUtilsNewExtension); + error = iFs->Delete(filePathAndName); + if(error != KErrNone && error != KErrNotFound && error != KErrPathNotFound) + User::Leave(error); + } + +TBool TMsvServerStoreManager::FileStoreExistsL(TMsvId aEntryId) const + { + __ASSERT_ALWAYS(iMsvServer != NULL, PanicServer(EMsvServerNotValid)); + + TMsvId owningService = KMsvNullIndexEntryId; + TFileName filePathAndName; + GetOwningServiceAndFilePath(aEntryId,filePathAndName,owningService); + + return User::LeaveIfError(MsvUtils::HasStore(iMsvServer->FileSession(),filePathAndName,owningService, aEntryId)); + } + + +/** +Gets the path for the file in message store for which the message Id is passed. +@param aBodyTextId The Id of the body text for which the path is required. +@param aFilepath The output parameter which contains filepath. +@return none. +*/ +void TMsvServerStoreManager::BodyTextFilePathL(TMsvId aBodyTextId, TDes& aFilePath) + { + TFileName filePath; + User::LeaveIfError(GetFilePath(aBodyTextId, filePath)); + aFilePath = filePath; + } + +/** +Opens the RFile for which the aFilepath is passed in read mode. +@param RFile Reference to RFile that needs to be opened. +@param aBodyTextId The Id of the bodytext. +@param aFilepath The path of the file to be opened. +@return none. +*/ +void TMsvServerStoreManager::OpenBodyTextFileForReadL(RFile& aFile, TMsvId /*aBodyTextId*/, const TDesC& aFilePath) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + User::LeaveIfError(aFile.Open(*iFs, aFilePath, EFileRead)); + } + +/** +Creates the RFile in the aFilepath is passed. +@param RFile Reference to RFile that will be created. +@param aBodyTextId The Id of the bodytext. +@return none. +*/ +void TMsvServerStoreManager::CreatePlainTextFileL(RFile& aFile, TMsvId aBodyTextId) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + + TFileName filePathAndName; + GetFilePath(aBodyTextId, filePathAndName); + + TBuf fileName; + + fileName.NumFixedWidth(aBodyTextId, EHex, KFileNameFixedWidth); + filePathAndName.Append(fileName); + + TFileName tempFilePathAndName((filePathAndName)); + tempFilePathAndName.Append(KMsvUtilsNewExtension); + User::LeaveIfError(aFile.Replace(*iFs, tempFilePathAndName, EFileShareExclusive|EFileWrite)); + } + +/** +Deletes the RFile in the aFilepath passed. +@param aBodyTextId The Id of the bodytext. +@return none. +*/ +void TMsvServerStoreManager::DeletePlainTextFileL(TMsvId aBodyTextId) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + TFileName filePathAndName; + GetFilePath(aBodyTextId, filePathAndName); + + TBuf fileName; + + fileName.NumFixedWidth(aBodyTextId, EHex, KFileNameFixedWidth); + filePathAndName.Append(fileName); + + TFileName tempFilePathAndName((filePathAndName)); + tempFilePathAndName.Append(KMsvUtilsNewExtension); + // Remove the temporary file if it is there. + TInt err = iFs->Delete(tempFilePathAndName); + + if (err != KErrNone && err != KErrNotFound) + { + User::Leave(err); + } + // There is no temporary file, delete the body text file. + if (err == KErrNotFound) + { + TInt error = iFs->Delete(filePathAndName); + if (error != KErrNone && error != KErrNotFound && error != KErrPathNotFound) + { + User::Leave(error); + } + } + } + +/** +Replaces a temporary RFile with a new RFile. +@param aBodyTextId The Id of the bodytext. +@return none. +*/ +void TMsvServerStoreManager::ReplacePlainTextFileL(TMsvId aBodyTextId) + { + __ASSERT_ALWAYS(iFs != NULL, PanicServer(EMsvFileSessionNotValid)); + TFileName filePathAndName; + GetFilePath(aBodyTextId, filePathAndName); + + TBuf fileName; + + fileName.NumFixedWidth(aBodyTextId, EHex, KFileNameFixedWidth); + filePathAndName.Append(fileName); + + TFileName tempFilePathAndName((filePathAndName)); + tempFilePathAndName.Append(KMsvUtilsNewExtension); + TInt err = iFs->Replace(tempFilePathAndName,filePathAndName); + if(err != KErrNone) + { + iFs->Delete(tempFilePathAndName); + User::Leave(err); + } + } + + + + + +#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) +/** + * LoadHeaderL() + * + * @param aMtmId : a MTM id. + * @param aEntryId: Metadata entry Id of the message body. + * @param iFieldPairList: Array of header fields. + */ + +void TMsvServerStoreManager::LoadHeaderEntryL(const TUid& aMtmId, TMsvId aEntryId, RPointerArray& aFieldPairList) + { + iMsvServer->MessageDBAdapter().LoadHeaderEntryL(aMtmId,aEntryId,aFieldPairList); + } + +/** + * DeleteHeaderL() + * + * + * @param aMtmId : a MTM id. + * @param aEntryId: Metadata entry Id of the message body. + */ + +void TMsvServerStoreManager::DeleteHeaderEntryL(const TUid& aMtmId, TMsvId aEntryId) + { + iMsvServer->MessageDBAdapter().DeleteHeaderEntryL(aMtmId,aEntryId); + } + + +/** + * UpdateHeaderL() + * + * + * @param aMtmId : a MTM id. + * @param aEntryId: Metadata entry Id of the message body. + * @param iFieldPairList: Array of header fields. + */ + +void TMsvServerStoreManager::UpdateHeaderEntryL(const TUid& aMtmId, TMsvId aEntryId, const RPointerArray& aFieldPairList) + { + iMsvServer->MessageDBAdapter().UpdateHeaderEntryL(aMtmId,aEntryId,aFieldPairList); + } + +/** + * CreateHeaderEntryL() + * + * + * @param aMtmId : a MTM id. + * @param aEntryId: Metadata entry Id of the message body. + * @param iFieldPairList: Array of header fields. + */ + +void TMsvServerStoreManager::CreateHeaderEntryL(const TUid& aMtmId, TMsvId aEntryId, const RPointerArray& aFieldPairList) + { + iMsvServer->MessageDBAdapter().CreateHeaderEntryL(aMtmId,aEntryId,aFieldPairList); + } + + + +TBool TMsvServerStoreManager::DoesAnyStoreExists(TMsvId aId, TUid aMtmId) + { + TBool isStoreExists = EFalse; + TRAPD(err, isStoreExists = iMsvServer->MessageDBAdapter().DoesAnyStoreExistsL(aId, aMtmId)); + if(err) + { + return EFalse; + } + else + { + return isStoreExists; + } + + } + +TBool TMsvServerStoreManager::DoesHeaderTableExist(const TUid& aMtmId) + { + TBool doesTableExists = EFalse; + TRAPD(err, doesTableExists = iMsvServer->MessageDBAdapter().IsHeaderTableExistsL(aMtmId)); + if(err) + { + return EFalse; + } + else + { + return doesTableExists; + } + + } + + + + + + +#endif // #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)