messagingfw/msgsrvnstore/server/src/MSVUTILS.CPP
changeset 22 bde600d88860
parent 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/server/src/MSVUTILS.CPP	Fri Jun 04 10:32:16 2010 +0100
@@ -0,0 +1,252 @@
+// Copyright (c) 1998-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 "MSVUTILS.H"
+#include "MSVUIDS.H"
+#include "MSVIDS.H"
+#include "MSVPANIC.H"
+
+#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
+	// Code change for PREQ 557.
+#include "msvpreferreddrivelist.h"
+#endif		// #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
+	
+
+// static 
+EXPORT_C TBool MsvUtils::ValidEntry(const TMsvEntry& aEntry)
+//
+// Returns true if the contents of the entry confrom to policy
+// 
+	{
+	return ValidEntry(aEntry, EFalse);
+	}
+
+TBool MsvUtils::ValidEntry(const TMsvEntry& aEntry, TBool aCreate)
+//
+// Returns true if the contents of the entry confrom to policy
+// 
+	{
+	if ((aEntry.iType!=KUidMsvNullEntry) && (aEntry.iMtm!=KUidMsvNullEntry) && (aEntry.Parent()!=KMsvNullIndexEntryId))
+		{
+		// it has a type, MTM and parent defined
+		if (aEntry.iType!=KUidMsvServiceEntry)
+			{
+			// a non-service entry cannot be owned by root and must have a service id
+			if (aEntry.Parent()!=KMsvRootIndexEntryId && aEntry.iServiceId!=KMsvNullIndexEntryId)
+				return ETrue;
+			}
+		else 
+			{
+			// a service entry must be owned by root and has to have the service id pointed to itself
+			// unless the entry is being created in which case we don't know the Id yet
+			if (aEntry.Parent()==KMsvRootIndexEntryId && (aCreate || aEntry.iServiceId==aEntry.Id()))
+				{
+				return ETrue;
+				}
+			}
+		}
+	return EFalse;
+	}
+
+// static
+EXPORT_C void MsvUtils::ConstructEntryName(TMsvId aService, TMsvId aEntry, TDes& aName, TNameMode aMode)
+//
+// Construct the name of the store, or the directory for binary files
+// The aName should already be seeded with the main message folder.
+//
+	{
+#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
+	// Code change for PREQ 557.
+	// Unmask the TMsvIds supplied.
+	TInt driveId = GetDriveId(aEntry);
+#ifdef SYMBIAN_MESSAGESTORE_UNIT_TESTCODE
+	TInt drive = 0;
+	if(0 == driveId)
+		drive = TDriveUnit(aName.Left(1));
+#endif
+	aService = UnmaskTMsvId(aService);
+	aEntry = UnmaskTMsvId(aEntry);
+#endif
+	
+	__ASSERT_DEBUG(aEntry!=KMsvRootIndexEntryId||aMode==EStore, PanicServer(EMsvAskingForRootFolderOrPath));
+	__ASSERT_DEBUG(aEntry!=aService || aMode!=EFolder || aService!=KMsvRootIndexEntryId, PanicServer(EMsvAskingForRootFolder));
+	__ASSERT_DEBUG(aMode!=EPath || (aEntry==aService && aService!=KMsvRootIndexEntryId), PanicServer(EMsvPathAsForNonService));
+
+	TBuf<KFileNameFixedWidth> dir;
+	
+	dir.NumFixedWidth(aService, EHex, KFileNameFixedWidth);
+
+	// Change required for Preq557
+#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
+	// Delete the drive letter from the path as the drive can now be any 
+	// other drive unlike C: earlier.
+	// We can get the correct drive information from aEntry.
+	TInt colonPos = aName.Locate(':');
+	aName.Delete(0, colonPos + 1);
+	
+	// Add the appropriate drive letter.
+	TDriveNumber driveNum;
+#ifdef SYMBIAN_MESSAGESTORE_UNIT_TESTCODE
+	if(0 == driveId)
+		{
+		driveNum = TDriveNumber(drive);
+		}
+	else
+		{
+		CMsvPreferredDriveList::GetDriveList()->GetDriveNumber(driveId, driveNum);
+		}
+#else
+	CMsvPreferredDriveList::GetDriveList()->GetDriveNumber(driveId, driveNum);
+#endif		
+
+	aName.Insert(0, TDriveUnit(driveNum).Name());
+#endif		// #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
+	
+	aName.Append(dir);
+
+	// root or service entry
+	if (aService==aEntry) // Both are unmasked, so this comparison is safe.
+		{
+		if (aMode==EPath)
+			// path - ...\[aService]_S\.
+			aName.Append(KMsvDirectoryExt);
+		else if (aMode==EFolder)
+			// folder - ...\[aService]_F\.
+			aName.Append(KMsvBinaryFolderExt);
+		// else
+			// store - ...\[aService]
+		return;
+		}
+
+	aName.Append(KMsvDirectoryExt);
+	// service path - ...\[aService]_S\.
+	if (aMode==EPath)
+		return;
+
+	_LIT(KDirSep,"\\");
+	dir.NumFixedWidth(aEntry&0xf, EHex,1);
+	aName.Append(dir);
+	aName.Append(KDirSep);
+	dir.NumFixedWidth(aEntry, EHex, KFileNameFixedWidth);
+	aName.Append(dir);
+
+	
+	// entry store - ..\[aService]_S\[aEntry]
+	if (aMode==EStore)
+		return;
+
+	aName.Append(KMsvBinaryFolderExt);
+	// entry folder - ..\[aService]_S\[aEntry]_F
+	
+
+	}
+
+// static
+EXPORT_C TInt MsvUtils::HasDirectory(const RFs& aFs, const TDesC& aMessageFolder, TMsvId aService, TMsvId aEntry)
+	{
+	TFileName filename(aMessageFolder);
+	ConstructEntryName(aService, aEntry, filename, EFolder);
+
+	TUint attributes;
+	TInt err = aFs.Att(filename, attributes);
+
+	if (err == KErrNotFound || err == KErrPathNotFound)
+		return 0;
+	else if (err == KErrNone)
+		return 1;
+	
+	return err;
+	}
+
+// static
+EXPORT_C TInt MsvUtils::HasStore(const RFs& aFs, const TDesC& aMessageFolder, TMsvId aService, TMsvId aEntry)
+	{
+	TFileName filename(aMessageFolder);
+	ConstructEntryName(aService, aEntry, filename, EStore);
+
+	TUint attributes;
+	TInt err = aFs.Att(filename, attributes);
+
+	if (err == KErrNotFound || err == KErrPathNotFound)
+		return 0;
+	else if (err == KErrNone)
+		return 1;
+	
+	return err;
+	}
+
+// static
+EXPORT_C void MsvUtils::AddPathAndExtensionToResFileL(TFileName& aFileName)
+//	Uses the following rules to make sure aFileName has a path and extension:
+//	1. If aFileName has no extension add ".rsc"
+//	2. If aFileName does have an extension then replace it with ".rsc"
+//	3. If aFileName contains a path leave it
+//	4. If aFileName contains no path prepend "z:\system\data\"
+
+//	@param aFileName file name to be altered by this function
+//	@leave system-wide error codes 
+	{
+	_LIT(KFileExtension, ".rsc");
+	_LIT(KFileLocation, "z:\\resource\\messaging\\");
+
+	TParse parser;
+	User::LeaveIfError(parser.Set(KFileExtension, &aFileName, &KFileLocation));
+
+
+	aFileName = parser.FullName();
+	}
+
+
+#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
+//Code added for Preq557
+//static
+TMsvId MsvUtils::UnmaskTMsvId(TMsvId aMaskedId)
+	{
+	return (aMaskedId & KDriveMask);
+	}
+
+	
+//static
+TUint MsvUtils::GetDriveId(TMsvId aMaskedId)
+	{
+	TUint driveId = ( (aMaskedId & ~KDriveMask) >> 28);
+	if(0 == driveId)
+		{
+	        return KCurrentDriveId;
+		}
+	return driveId;
+	}
+
+
+//static	
+TBool MsvUtils::IsStandardId(TMsvId aId)
+	{
+	if(UnmaskTMsvId(aId) < KMsvUnkownServiceIndexEntryIdValue &&
+	   UnmaskTMsvId(aId) > KMsvLocalServiceIndexEntryIdValue)
+		{
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+
+//static
+TMsvId MsvUtils::MaskTMsvId(TUint aDriveId, TMsvId aUnmaskedId)
+	{
+	return (UnmaskTMsvId(aUnmaskedId) | (aDriveId << 28));
+	}
+	
+	
+#endif