persistentstorage/store/UFILE/UF_STOR.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/UFILE/UF_STOR.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,449 @@
+// 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 "UF_STD.H"
+
+const TFileStoreFactoryFunction KDefaultFileStoreFactory[]=
+	{
+	KDirectFileStoreFactoryFunction,
+	KPermanentFileStoreFactoryFunction,
+	NULL
+	};
+
+EXPORT_C CFileStore* CFileStore::OpenL(RFs& aFs,const TDesC& aName,TUint aFileMode)
+/** Opens a file containing a store and constructs an appropriate file store object.
+
+The resulting file store object is of concrete type, i.e. either CDirectFileStore 
+or CPermanentFileStore. The specific type is determined from the layout information 
+held in the file store.
+
+@param aFs Handle to a file server session.
+@param aName The full path name of the file containing the store.
+@param aFileMode The mode in which the file is to be accessed. The mode is 
+defined by the TFileMode type.
+@return A pointer to the new file store object. 
+@see TFileMode
+@see CFileStore::Layout() */
+	{
+	return OpenL(aFs,aName,aFileMode,KDefaultFileStoreFactory);
+	}
+
+EXPORT_C CFileStore* CFileStore::OpenLC(RFs& aFs,const TDesC& aName,TUint aFileMode)
+/** Opens a file containing a store, constructs an appropriate file store object 
+and places the pointer onto the cleanup stack.
+
+The resulting file store object is of concrete type, i.e. either CDirectFileStore 
+or CPermanentFileStore. The specific type is determined from the layout information 
+held in the file store.
+
+@param aFs Handle to a file server session. 
+@param aName The full path name of the file containing the store. 
+@param aFileMode The mode in which the file is to be accessed. The mode is 
+defined by the TFileMode type. 
+@return A pointer to the new file store object. 
+@see TFileMode
+@see CFileStore::Layout() */
+	{
+	return OpenLC(aFs,aName,aFileMode,KDefaultFileStoreFactory);
+	}
+
+EXPORT_C CFileStore* CFileStore::FromL(RFile& aFile)
+/** Constructs a file store object from an opened file.
+
+The file must already be open before calling this function.
+
+The resulting file store object is of concrete type, i.e. either CDirectFileStore 
+or CPermanentFileStore. The specific type is determined from the layout information 
+held in the file store.
+
+Note that ownership of the file passes to the store. The referenced RFile 
+is cleared and is no longer valid:
+
+@param aFile A reference to the opened file. 
+@return A pointer to the new file store object. 
+@see CFileStore::Layout() */
+	{
+	return FromL(aFile,KDefaultFileStoreFactory);
+	}
+
+EXPORT_C CFileStore* CFileStore::FromLC(RFile& aFile)
+/** Constructs a file store object from an opened file, and places the pointer 
+onto the cleanup stack.
+
+The file must already be open before calling this function.
+
+The resulting file store object is of concrete type, i.e. either CDirectFileStore 
+or CPermanentFileStore. The specific type is determined from the layout information 
+held in the file store.
+
+Note that ownership of the file passes to the store. The referenced RFile 
+is cleared and is no longer valid:
+
+@param aFile A reference to the opened file. 
+@return A pointer to the new file store object. 
+@see CFileStore::Layout() */
+	{
+	return FromLC(aFile,KDefaultFileStoreFactory);
+	}
+
+EXPORT_C CFileStore* CFileStore::OpenL(RFs& aFs,const TDesC& aName,TUint aFileMode,const TFileStoreFactoryFunction aFactory[])
+//
+// Open a file store of any of the types supported by aFactory.
+//
+	{
+	RFile file;
+	__LEAVE_IF_ERROR(file.Open(aFs,aName,aFileMode));
+	return FromL(file,aFactory);
+	}
+
+EXPORT_C CFileStore* CFileStore::OpenLC(RFs& aFs,const TDesC& aName,TUint aFileMode,const TFileStoreFactoryFunction aFactory[])
+//
+// Open and leave on cleanup stack.
+//
+	{
+	CFileStore* store=OpenL(aFs,aName,aFileMode,aFactory);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C CFileStore* CFileStore::FromL(RFile& aFile,const TFileStoreFactoryFunction aFactory[])
+//
+// Read the file header and let every factory function in turn try to open it.
+//
+	{
+	RFileBuf buf;
+	buf.Attach(aFile);
+	buf.PushL();
+	RReadStream stream(&buf);
+	TCheckedUid chk;
+	stream>>chk;
+	if (chk.UidType().IsValid())
+		{
+		const TFileStoreFactoryFunction* iter=&aFactory[0];
+		TFileStoreFactoryFunction func;
+		while ((func=*iter++)!=NULL)
+			{
+			CFileStore* store=(*func)(buf,chk.UidType());
+			if (store!=NULL)
+				{
+				CleanupStack::Pop(2);
+				return store;
+				}
+			}
+		}
+//
+	__LEAVE(KErrNotSupported);
+	return NULL;
+	}
+
+EXPORT_C CFileStore* CFileStore::FromLC(RFile& aFile,const TFileStoreFactoryFunction aFactory[])
+//
+// Open and leave on cleanup stack.
+//
+	{
+	CFileStore* store=FromL(aFile,aFactory);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C void CFileStore::SetTypeL(const TUidType& aType)
+/** Sets the UID type of the file store.
+
+The first UID, i.e. the first TUid component, of the TUidType must be the 
+file store type as returned by CFileStore::Layout(), otherwise the function 
+raises a STORE-File 9 panic.
+
+@param aType The UID type object containing the file store type. 
+@see TUid */
+	{
+	__ASSERT_ALWAYS(aType[0]==Layout(),Panic(EFileStoreBadType));
+	TCheckedUid chk(aType);
+	if (iHost.IsActive())
+		{
+		RShareWriteStream stream(iHost);
+		stream.PushL();
+		stream<<chk; // failure may mean the file's type information is lost
+		CleanupStack::PopAndDestroy();
+		}
+	else
+		{
+		TInt size=iBuf.SizeL();
+		RWriteStream stream(&iBuf);
+		stream<<chk;
+		if (size==0)
+			{
+			ExternalizeL(stream);
+			iHost.Share(&iBuf);
+			}
+		}
+	iType=aType;
+	}
+
+EXPORT_C void CFileStore::MarshalL()
+//
+// Second-phase construction for opening existing file stores.
+//
+	{
+	__ASSERT_DEBUG(!iHost.IsActive()&&(!iType.IsValid()||iType[0]==Layout()),User::Invariant());
+	RReadStream stream(&iBuf);
+	InternalizeL(stream);
+	iHost.Share(&iBuf);
+	}
+
+EXPORT_C CFileStore::~CFileStore()
+/** Frees resources owned by the object, prior to its destruction. In particular, 
+it closes the associated file. */
+	{
+	Destruct();
+	iBuf.Close();
+	}
+
+EXPORT_C CFileStore* CFileStore::OpenL(RFs& aFs,const TDesC& aName,TUint aFileMode,TFileStoreFactoryFunction aFunction)
+//
+// Open a file store using aFunction.
+//
+	{
+	RFile file;
+	__LEAVE_IF_ERROR(file.Open(aFs,aName,aFileMode));
+	return FromL(file,aFunction);
+	}
+
+EXPORT_C CFileStore* CFileStore::OpenLC(RFs& aFs,const TDesC& aName,TUint aFileMode,TFileStoreFactoryFunction aFunction)
+//
+// Open and leave on cleanup stack.
+//
+	{
+	CFileStore* store=OpenL(aFs,aName,aFileMode,aFunction);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C CFileStore* CFileStore::CreateL(RFs& aFs,const TDesC& aName,TUint aFileMode,TNewFunction aFunction)
+//
+// Create a file store using aFunction. Must not already exist.
+//
+	{
+	RFile file;
+	__LEAVE_IF_ERROR(file.Create(aFs,aName,aFileMode));
+	return DoNewL(file,aFunction);
+	}
+
+EXPORT_C CFileStore* CFileStore::CreateLC(RFs& aFs,const TDesC& aName,TUint aFileMode,TNewFunction aFunction)
+//
+// Create and leave on cleanup stack.
+//
+	{
+	CFileStore* store=CreateL(aFs,aName,aFileMode,aFunction);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C CFileStore* CFileStore::ReplaceL(RFs& aFs,const TDesC& aName,TUint aFileMode,TNewFunction aFunction)
+//
+// Replace a file store using aFunction. May exist already.
+//
+	{
+	RFile file;
+	__LEAVE_IF_ERROR(file.Replace(aFs,aName,aFileMode));
+	return DoNewL(file,aFunction);
+	}
+
+EXPORT_C CFileStore* CFileStore::ReplaceLC(RFs& aFs,const TDesC& aName,TUint aFileMode,TNewFunction aFunction)
+//
+// Replace and leave on cleanup stack.
+//
+	{
+	CFileStore* store=ReplaceL(aFs,aName,aFileMode,aFunction);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C CFileStore* CFileStore::TempL(RFs& aFs,const TDesC& aPath,TFileName& aName,TUint aFileMode,TNewFunction aFunction)
+//
+// Create a temporary file store using aFunction.
+//
+	{
+	RFile file;
+	__LEAVE_IF_ERROR(file.Temp(aFs,aPath,aName,aFileMode));
+	return DoNewL(file,aFunction);
+	}
+
+EXPORT_C CFileStore* CFileStore::TempLC(RFs& aFs,const TDesC& aPath,TFileName& aName,TUint aFileMode,TNewFunction aFunction)
+//
+// Create temporary and leave on cleanup stack.
+//
+	{
+	CFileStore* store=TempL(aFs,aPath,aName,aFileMode,aFunction);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C CFileStore* CFileStore::FromL(RFile& aFile,TFileStoreFactoryFunction aFunction)
+//
+// Open a file store using aFunction, given its file handle.
+//
+	{
+	RFileBuf buf;
+	buf.Attach(aFile);
+	buf.PushL();
+	RReadStream stream(&buf);
+	TCheckedUid chk;
+	stream>>chk;
+	CFileStore* store=(*aFunction)(buf,chk.UidType());
+	if (store==NULL) 
+		{
+		aFile.Close();
+		__LEAVE(KErrNotSupported);
+		}
+//
+	CleanupStack::Pop(2);
+	return store;
+	}
+
+EXPORT_C CFileStore* CFileStore::FromLC(RFile& aFile,TFileStoreFactoryFunction aFunction)
+//
+// Open and leave on cleanup stack.
+//
+	{
+	CFileStore* store=FromL(aFile,aFunction);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C CFileStore* CFileStore::NewL(RFile& aFile,TNewFunction aFunction)
+//
+// Create a file store using aFunction, given its file handle.
+//
+	{
+	TInt r=aFile.SetSize(0);
+	if (r!=KErrNone)
+		{
+		aFile.Close();
+		__LEAVE(r);
+		}
+	return DoNewL(aFile,aFunction);
+	}
+
+EXPORT_C CFileStore* CFileStore::NewLC(RFile& aFile,TNewFunction aFunction)
+//
+// Create and leave on cleanup stack.
+//
+	{
+	CFileStore* store=NewL(aFile,aFunction);
+	CleanupStack::PushL(store);
+	return store;
+	}
+
+EXPORT_C CFileStore::CFileStore(RFile& aFile)
+//
+// Constructor creating a new file store.
+//
+	{
+	iBuf.Attach(aFile);
+	iBuf.iExt = 0;
+	}
+
+EXPORT_C CFileStore::CFileStore(RFileBuf& aBuf,const TUidType& aType)
+//
+// Constructor opening an existing file store.
+//
+	: iBuf(Capture(aBuf)),iType(aType)
+	{}
+
+EXPORT_C void CFileStore::Destruct()
+//
+// Early destruction, for derived classes overriding DoRevertL().
+//
+	{
+	if (iHost.IsActive())
+		{
+		iHost.Release();
+		}
+	}
+
+EXPORT_C void CFileStore::SynchL()
+//
+// Synchronise this file store's file buffer.
+//
+	{
+	TStreamExchange& host=iHost;
+	if (host.IsActive())
+		{
+		MStreamBuf* buf=host.HostL();
+		__ASSERT_DEBUG(IsHost(buf),User::Invariant());
+		host.Release(); // make sure no writes fail silently by shutting down on failure
+		buf->SynchL();
+		host.Share(buf);
+		}
+	else
+		iBuf.SynchL();
+	}
+
+EXPORT_C void CFileStore::ChangedL()
+//
+// Re-write this file store's structure.
+//
+	{
+	__ASSERT_DEBUG(iHost.IsActive(),User::Invariant());
+	RShareWriteStream stream(iHost,KFileStoreStart);
+	stream.PushL();
+	ExternalizeL(stream);
+	CleanupStack::PopAndDestroy();
+	}
+
+EXPORT_C void CFileStore::RefreshL()
+//
+// Re-read this file store's structure.
+//
+	{
+	if (iHost.IsActive())
+		{
+		RShareReadStream stream(iHost,KFileStoreStart);
+		stream.PushL();
+		InternalizeL(stream);
+		CleanupStack::PopAndDestroy();
+		}
+	else
+		{
+		iBuf.SeekL(iBuf.ERead,KFileStoreStart);
+		MarshalL();
+		}
+	}
+
+EXPORT_C void CFileStore::DoCommitL()
+//
+// Default implementation just synchronising.
+//
+	{
+	SynchL();
+	}
+
+EXPORT_C void CFileStore::DoRevertL()
+//
+// Default implementation failing after synchronisation.
+//
+	{
+	SynchL();
+	__LEAVE(KErrNotSupported);
+	}
+
+CFileStore* CFileStore::DoNewL(RFile& aFile,TNewFunction aFunction)
+	{
+	CleanupClosePushL(aFile);
+	CFileStore* store=(*aFunction)(aFile);
+	CleanupStack::Pop();
+	return store;
+	}
+