diff -r 000000000000 -r 08ec8eefde2f persistentstorage/sql/SRC/Client/IPC/IPCBuf.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/SRC/Client/IPC/IPCBuf.h Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,106 @@ +// Copyright (c) 2005-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: +// + +#ifndef __IPCBUF_H__ +#define __IPCBUF_H__ + +#include +#include "IpcDefs.h" + +//Forward declarations +class TIpcArgs; +class RSqlDbSession; + +/** +HIpcBuf class manages the "client to server" transfer of large data blocks. + +It caches the data to be sent/retrieved on the client side and sychronises the content of the client-side cache +with the content of a similar server-side cache, sending appropriate read/write/sync commands to the server. + +An instance of TIpcStreamBuf class is uased as a client-side cache. + +The following code fragment shows how the class can be used to send to the server large blocks of data: + +@code +//Step 1: Create the HIpcBuf instance. +HIpcBuf* ipcBuf = HIpcBuf::NewLC(params, function, args); + +//Step 2: Create a stream instance. It will be used for sending the data to the server. All details about +// the data transfer will be performed by the ipcBuf object. +RWriteStream out(ipcBuf); + +//Step 3: "TheObject" is some large data object which has to be sent to the server. Let's assume +// "TheObject" has ExternalizeL() function which can be used to externalize the object into an output stream. +TheObject.ExternalizeL(out); + +//Step 4: Commit the output stream. After the commit command the server will have all the data transferred. +out.CommitL(); + +//Step 5: Cleanup. +CleanupStack::PopAndDestroy(ipcBuf); +@endcode + +@see RSqlDbSession; +@see TIpcStreamBuf +@see RSessionBase + +@internalComponent +*/ +NONSHARABLE_CLASS(HIpcBuf) : public TStreamBuf + { +public: + static HIpcBuf* NewL(RSqlDbSession& aSession, TInt aFunction, TIpcArgs& aArgs); + static HIpcBuf* NewLC(RSqlDbSession& aSession, TInt aFunction, TIpcArgs& aArgs); + virtual ~HIpcBuf(); + +private: + HIpcBuf(RSqlDbSession& aSession); + void ConstructL(TInt aFunction, TIpcArgs& aArgs); + + // from TStreamBuf + TInt UnderflowL(TInt aMaxLength); + void OverflowL(); + void DoRelease(); + void DoSynchL(); + TInt DoReadL(TAny* aPtr, TInt aMaxLength); + void DoWriteL(const TAny* aPtr, TInt aLength); + TStreamPos DoSeekL(TMark aMark, TStreamLocation aLocation, TInt anOffset); + +private: + inline void SetPos(TRead, TInt aPos); + inline void SetPos(TWrite, TInt aPos); + inline TInt Pos(TRead) const; + inline TInt Pos(TWrite) const; + inline TInt MovePos(TRead, TInt aOffset); + TInt IpcReadL(TAny* aPtr, TInt aMaxLength); + void IpcWriteL(const TAny* aPtr, TInt aLength); + TInt EndL(); + + inline TInt Lag(TRead) const; + inline TInt Lag(TWrite) const; + inline TInt Mark(TRead) const; + inline TInt Mark(TWrite) const; + +private: + RSqlDbSession& iSession; + TInt iHandle; + TInt iRPos; + TInt iWPos; + TIpcStreamBuf iBuf; + }; + +#include "IPCBuf.inl" + +#endif//__IPCBUF_H__