--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/cntsrv/src/CCntRequest.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1195 @@
+// 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:
+//
+
+/**
+ @file
+ @internalTechnology
+ @released
+*/
+
+#include "CCntRequest.h"
+#include "CCntStateMachine.h"
+#include "CCntPackager.h"
+#include <cntitem.h>
+
+// CCntRequest
+// CCntRequest is the base class for all Request classes that handle external
+// requests (requests that originate from the CContactDatabase). Internal requests
+// derive from the CReqInternal class.
+// Note 1: All unpacking of objects should be done within Construction.
+// Note 2: The destruction of request objects is a little unusual.
+// The destruction of requests objects is usually the responsibility of the CStatemachine or in the CRequestStore class.
+// The destruction of requests is usually performed using the CCntRequest::CompletePD method. See below
+// Note 3: Each request has a timeout member - the time for which the request remains valid - and a timeouterror member variable.
+// The iTimeOutError is the error that will be returned to the client in the event of the request timing out. The default
+// timeout value is KErrNotReady but the CStateMachine can reset this depending on the last action the statemachine attempted
+// to perform before the request timedout.
+// Timeouts work as follows - the statemachine returns TDeferred indicating it could not process the request in the current state
+// The request is added to the request store, CRequestStore, and the timeout is activated via the CCntRequest::ActivateTimeOutL
+// method. There are two possible outcomes:
+// 1. The state changes, or a contact item is unlocked, and the request is activated and processed by the CStateMachine
+// 2. The request times out, CCntRequestTimer::RunL is called and the request is completed with the iTimeOutError error code.
+
+/**
+ Base CCntRequest constructor
+ @param aSessionId The session from which the request originated
+ @param aMessage The RMessage from the client
+ @param aTimeOut The lenght of time in milliseconds for which the request remains valid
+*/
+
+CCntRequest::CCntRequest(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ :iMessage(aMessage),
+ iSessionId(aSessionId),
+ iTimeOut(aTimeOut),
+ iTimeOutError(KErrNotReady)
+ {
+ ASSERT(aSessionId); // Should never be NULL
+ // All internal requests do not have a session ID, such requests derive from the CReqInternal
+ // and NOT from CCntRequest.
+ }
+
+/**
+ Complete the requests internal iMessage
+
+ @param aErrCode The error code with which the message will be completed
+*/
+void CCntRequest::Complete(TInt aErrCode)
+ {
+ iMessage.Complete(aErrCode);
+ }
+
+CCntRequest::~CCntRequest()
+ {
+ delete iTimer;
+ }
+
+/**
+ Start the timeout
+ A timer is only ever added when it does not exist and a non-zero timeout value has
+ been specified, because the request may be activated, processed and deferred more than once.
+ The result of request processing could be to add the request to the request queue again.
+
+ @param aReqStore When a times out, the timer access the store to complete the request with
+ a timeout error.
+ */
+void CCntRequest::ActivateTimeOutL(CRequestStore& aReqStore)
+ {
+ if ((iTimer == NULL) && (iTimeOut != 0))
+ {
+ iTimer = CCntRequestTimer::NewL(*this, aReqStore);
+ iTimer->Start();
+ }
+ }
+
+/**
+ Stop the timeout
+ */
+void CCntRequest::DeActivateTimeOut()
+ {
+ if (iTimer)
+ {
+ iTimer->Stop();
+ }
+
+ delete iTimer;
+ iTimer = NULL;
+ }
+
+/**
+ Set the timeout error code
+ Inorder to assure binary compatibility with the original Contacts Model,
+ which did not retry processing client requests, the error code - reason
+ why an request can not be processed - needs to be stored and returned to
+ to the client if a subsequest/retry to process the request fails.
+ For example if a contact item has been locked by one session, a request
+ to open the contact item by a second session should complete with KErrInUse
+ however if the server has been put into a transaction state by one session,
+ the seconds session request should complete with KErrNotReady
+ KErrNotReady is the default error timeout value set by the base state CState
+ it is also be set the CCntRequest constructor
+
+ @param aError The error code with which the message will be completed if it times out
+
+ */
+void CCntRequest::SetTimeOutError(TInt aError)
+ {
+ iTimeOutError = aError;
+ }
+
+/**
+ Get the timeout error code
+ @return The timeout error code
+*/
+TInt CCntRequest::TimeOutError()const
+ {
+ return iTimeOutError;
+ }
+
+
+/**
+ Does not complete a RMessage - Internal Request do not contain a RMessage
+ as they don't originate from the client. Do nothing.
+ @param aErrorCode Not used
+*/
+void CReqInternal::Complete(TInt /* aErrorCode*/)
+ {
+ }
+
+
+// Request Helper classes
+// -----------------------
+// CCntRequestTimer
+// CRequestStore
+
+/**
+ CCntRequestTimer constructor
+ CCntRequestTimer is an active object derived from CTimer
+ @param aRequest The request which will timeout
+ @param aReqStore The array that holds the deferred request
+ The request must be removed from the request store after
+ it is completed with an error code.
+*/
+CCntRequestTimer* CCntRequestTimer::NewL(CCntRequest& aRequest, CRequestStore& aReqStore)
+ {
+ CCntRequestTimer* self = new (ELeave) CCntRequestTimer(aRequest, aReqStore);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+CCntRequestTimer::~CCntRequestTimer()
+ {
+ CTimer::Cancel();
+ }
+
+
+CCntRequestTimer::CCntRequestTimer(CCntRequest& aRequest, CRequestStore& aReqStore)
+ : CTimer(CActive::EPriorityIdle),
+ iRequest(aRequest),
+ iReqStore(aReqStore)
+ {
+ }
+
+
+void CCntRequestTimer::ConstructL()
+ {
+ CTimer::ConstructL();
+ CActiveScheduler::Add(this);
+ }
+
+void CCntRequestTimer::RunL()
+ {
+ // Complete the contact with the timeout error
+ iRequest.Complete(iRequest.TimeOutError());
+ CTimer::Cancel();
+ iReqStore.RemoveD(&iRequest);
+ }
+
+void CCntRequestTimer::Start()
+ {
+ CTimer::After(iRequest.TimeOut());
+ }
+
+void CCntRequestTimer::Stop()
+ {
+ CTimer::Cancel();
+ }
+
+
+
+
+/**
+ Object are added when the session requests a Transaction to begin
+ but the database is already in a transaction state for another session
+ There can only ever handle one transaction request - no concurrency!
+
+ @param aStateMachine The request store calls the statemachine to process the
+ request.
+*/
+CRequestStore* CRequestStore::NewL(CCntStateMachine& aStateMachine)
+ {
+ CRequestStore* self = new (ELeave) CRequestStore(aStateMachine);
+ return self;
+ }
+
+CRequestStore::CRequestStore(CCntStateMachine& aStateMachine):
+ iStateMachine(aStateMachine)
+ {
+ }
+
+CRequestStore::~CRequestStore()
+ {
+ iStore.ResetAndDestroy();
+ delete iActive;
+ }
+
+/**
+ Remove the request from the store and delete the request
+
+ @param aRequest The request that should be removed from the store and deleted
+ The Request Store takes ownership of this object
+*/
+void CRequestStore::RemoveD(CCntRequest* aRequest)
+ {
+ TInt index = iStore.Find(aRequest);
+ if (index > KErrNotFound)
+ {
+ iStore.Remove(index);
+ }
+ delete aRequest;
+ aRequest = NULL;
+ }
+
+
+/**
+ Append a request to the request store
+
+ @param aRequest The request that is to be appended to the store
+*/
+void CRequestStore::AppendL(CCntRequest* aRequest)
+ {
+ // The heap is safe since the request is appended to the contained store.
+ // Pop as the stack will be out of sync when the statemachine processes
+ // the request.
+ User::LeaveIfError(iStore.Append(aRequest));
+ }
+
+/**
+ Get the first request from the store
+
+ @return The request a the beginning of the stores array
+ Ownership of the request is given to the calling method
+*/
+CCntRequest* CRequestStore::Request()
+ {
+ CCntRequest* request = iStore[KFirstRequest];
+ iStore.Remove(KFirstRequest);
+
+ return request; // Return ownership
+ }
+
+/**
+ Is there requests in the store
+
+ @return ETrue if there are no request, EFalse otherwise
+*/
+TBool CRequestStore::IsEmpty()
+ {
+ if (iStore.Count() > 0)
+ return EFalse;
+
+ return ETrue;
+ }
+
+/**
+ Activate the store.
+ The request store uses the CActiveLoop for callbacks on each iteration
+ of the CActiveLoop only one request is processed until all
+ requests have been processed.
+ */
+void CRequestStore::ActivateRequestsL()
+ {
+ if (!iActive)
+ {
+ iActive = CActiveLoop::NewL();
+ }
+
+ // Only process the requests in the store when it has been activated.
+ // Don't process any requests added to the store after it has been activated.
+ // Requests may be readded to the store & should not be processed twice
+ // in the same batch.
+ // The store may already have been activated.
+ if ((!iActive->IsActive()) && (iNoOfRequests == 0))
+ {
+ iActive->Register(*this);
+ iNoOfRequests = iStore.Count();
+ }
+ }
+
+/**
+ Process the next request in the store.
+ If the request has timed out return an error
+ otherwise process the request as normal.
+
+ @ return ETrue if another step is required, EFalse if this is the last step
+ */
+TBool CRequestStore::DoStepL()
+ {
+ ASSERT(iCurrentRequest == NULL);
+
+ iCurrentRequest = Request();
+ iStateMachine.ProcessRequestL(iCurrentRequest); // ownership transferred
+
+ // ProcessRequestL received ownership of the request, iCurrentRequest can be
+ // reset to NULL
+ iCurrentRequest = NULL;
+
+ --iNoOfRequests;
+
+ if (iNoOfRequests == 0)
+ {
+ return EFalse; // The store has tried to process all requests it holds
+ }
+
+ return ETrue;
+ }
+
+/**
+ Error callback from the CActiveLoop class.
+
+ @ param aError The error to complete the current request (the request that is
+ being processed)
+*/
+void CRequestStore::DoError(TInt aError)
+ {
+ // there should always be a current request
+ ASSERT(iCurrentRequest);
+ if (iCurrentRequest)
+ {
+ iCurrentRequest->Complete(aError);
+ delete iCurrentRequest;
+
+ iCurrentRequest = NULL;
+ }
+ }
+
+
+/**
+ CReqAsyncOpen constructor
+ Request to open the database asyncronously
+
+ @see CCntRequest constructor
+*/
+CReqAsyncOpen* CReqAsyncOpen::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqAsyncOpen* self = new (ELeave) CReqAsyncOpen(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CReqAsyncOpen::CReqAsyncOpen(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut )
+: CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+void CReqAsyncOpen::ConstructL()
+ {
+ iMessage.ReadL(0,iFilename);
+ }
+
+/**
+ Get the name of the file that is to be opened
+ The DBManager may change this name. If no name has been passed by the client
+ then the default is set by the manager
+
+ @return The name of the file that should be opened
+*/
+TDes& CReqAsyncOpen::FileName()
+ {
+ return iFilename;
+ }
+
+TAccept CReqAsyncOpen::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+/**
+ CReqCloseTables constructor
+ Close the database tables
+
+ @see CCntRequest constructor
+*/
+CReqCloseTables* CReqCloseTables::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqCloseTables* self = new (ELeave) CReqCloseTables(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ };
+
+CReqCloseTables::CReqCloseTables(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ :CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+
+TAccept CReqCloseTables::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqReOpen
+ Re Open the database
+
+ @see CCntRequest constructor
+*/
+CReqReOpen* CReqReOpen::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqReOpen* self = new (ELeave) CReqReOpen(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+CReqReOpen::CReqReOpen(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+TAccept CReqReOpen::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqCancelAsyncOpen
+ Cancel an asyncronous open request
+
+ @see CCntRequest constructor
+*/
+CReqCancelAsyncOpen* CReqCancelAsyncOpen::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqCancelAsyncOpen* self = new (ELeave) CReqCancelAsyncOpen(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+CReqCancelAsyncOpen::CReqCancelAsyncOpen(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+TAccept CReqCancelAsyncOpen::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+
+/**
+ CReqUpdate
+ Parent Class for CReqUpdateCnt & CReqCommitCnt
+
+ @see CCntRequest constructor
+*/
+void CReqUpdate::ConstructL(CCntPackager& aPackager)
+ {
+ aPackager.SetBufferFromMessageL(iMessage);
+ iCntItem = aPackager.UnpackCntItemLC();
+ CleanupStack::Pop(iCntItem);
+ }
+
+CReqUpdate::~CReqUpdate()
+ {
+ delete iCntItem;
+ }
+
+CReqUpdate::CReqUpdate(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+
+
+/** CReqUpdateCnt constructor
+ Update a contact item - derived from CReqUpdate. Used in conjunction with CReqReadCnt.
+ Note: CReqCommitCnt is very similar to CReqUpdateCnt, but CReqCommitCnt is used with CReqOpenCnt
+ and locks the contact. CReqUpdateCnt does not perform locking.
+
+ @see CCntRequest constructor
+*/
+CReqUpdateCnt* CReqUpdateCnt::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut, CCntPackager& aPackager)
+ {
+ CReqUpdateCnt* self = new (ELeave) CReqUpdateCnt(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aPackager);
+ return self;
+ }
+
+CReqUpdateCnt::CReqUpdateCnt(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CReqUpdate(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+TAccept CReqUpdateCnt::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqSetSpeedDial constructor
+ Set a speed dial key
+
+ @see CCntRequest constructor
+*/
+CReqSetSpeedDial* CReqSetSpeedDial::NewLC( const TUint aSessionId,
+ const RMessage2& aMessage,
+ const TInt aTimeOut,
+ CContactItemViewDef& aItemViewDef,
+ CCntServerSpeedDialManager& aSpeedDialManager,
+ const CCntServerSpeedDialTable& aTable,
+ MIniFileManager& aIniFileManager)
+ {
+ CReqSetSpeedDial* self = new (ELeave) CReqSetSpeedDial( aSessionId,
+ aMessage,
+ aTimeOut,
+ aItemViewDef,
+ aSpeedDialManager,
+ aTable,
+ aIniFileManager);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CReqSetSpeedDial::CReqSetSpeedDial( const TUint aSessionId,
+ const RMessage2& aMessage,
+ const TInt aTimeOut,
+ CContactItemViewDef& aItemViewDef,
+ CCntServerSpeedDialManager& aSpeedDialManager,
+ const CCntServerSpeedDialTable& aTable,
+ MIniFileManager& aIniFileManager)
+:CCntRequest(aSessionId, aMessage, aTimeOut), iItemViewDef(&aItemViewDef), iSpeedDialManager(aSpeedDialManager), iTable(aTable), iIniFileManager(aIniFileManager)
+ {
+ }
+
+void CReqSetSpeedDial::ConstructL()
+ {
+ // Read the message
+ // Read position
+ iSpeedDialIndex = iMessage.Int0();
+ // Read contact id
+ iContactId = static_cast<TContactItemId> (iMessage.Int1());
+ // Read Field Index
+ iTheFieldIndex = iMessage.Int2();
+ }
+
+TAccept CReqSetSpeedDial::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+TInt CReqSetSpeedDial::SpeedDialIndex()
+ {
+ return iSpeedDialIndex;
+ }
+
+TContactItemId CReqSetSpeedDial::TheContactId()
+ {
+ return iContactId;
+ }
+
+TInt CReqSetSpeedDial::TheFieldIndex()
+ {
+ return iTheFieldIndex;
+ }
+
+const CContactItemViewDef& CReqSetSpeedDial::ItemViewDef()
+ {
+ return *iItemViewDef;
+ }
+
+CCntServerSpeedDialManager& CReqSetSpeedDial::SpeedDialManager()
+ {
+ return iSpeedDialManager;
+ }
+
+const CCntServerSpeedDialTable& CReqSetSpeedDial::SpeedDialTable()
+ {
+ return iTable;
+ }
+
+MIniFileManager& CReqSetSpeedDial::IniFileManager()
+ {
+ return iIniFileManager;
+ }
+
+/**
+ CReqSetOwnCard constructor
+ Set the own card
+
+ @see CCntRequest constructor
+*/
+CReqSetOwnCard* CReqSetOwnCard::NewLC( const TUint aSessionId,
+ const RMessage2& aMessage,
+ const TInt aTimeOut,
+ CCntPackager& aPackager,
+ CContactItemViewDef& aItemViewDef,
+ MIniFileManager& aIniFileManager)
+ {
+ CReqSetOwnCard* self = new (ELeave) CReqSetOwnCard( aSessionId,
+ aMessage,
+ aTimeOut,
+ aItemViewDef,
+ aIniFileManager);
+ CleanupStack::PushL(self);
+ self->ConstructL(aPackager);
+ return self;
+ }
+
+CReqSetOwnCard::CReqSetOwnCard( const TUint aSessionId,
+ const RMessage2& aMessage,
+ const TInt aTimeOut,
+ CContactItemViewDef& aItemViewDef,
+ MIniFileManager& aIniFileManager)
+:CReqUpdate(aSessionId, aMessage, aTimeOut), iItemViewDef(&aItemViewDef), iIniFileManager(aIniFileManager)
+ {
+ }
+
+
+
+TAccept CReqSetOwnCard::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+TContactItemId CReqSetOwnCard::TheContactId()
+ {
+ return iContactId;
+ }
+
+const CContactItemViewDef& CReqSetOwnCard::ItemViewDef()
+ {
+ return *iItemViewDef;
+ }
+
+
+MIniFileManager& CReqSetOwnCard::IniFileManager()
+ {
+ return iIniFileManager;
+ }
+
+/**
+ CReqCommitCnt constructor
+ Commit a contact item - used in conjunction with CReqOpenCnt
+ Derived from CReqUpdate, and is very similar to CReqUpdateCnt but also locks the contact item
+ so no other session can modify it.
+
+ @see CCntRequest constructor
+*/
+CReqCommitCnt* CReqCommitCnt::NewLC(const TUint aSessionId,
+ const RMessage2& aMessage,
+ const TInt aTimeOut,
+ CCntPackager& aPackager)
+ {
+ CReqCommitCnt* self = new (ELeave) CReqCommitCnt(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aPackager);
+ return self;
+ }
+
+CReqCommitCnt::CReqCommitCnt(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CReqUpdate(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+TAccept CReqCommitCnt::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+
+
+
+/** CReqRead constructor
+ Parent class of CReqReadCnt & CReqOpenCnt
+ CReqOpenCnt and CReqReadCnt are very similar
+ CReqOpenCnt results in the contact item being locked by the session, so no other session
+ can modify the contact item.
+ CReqReadCnt results in no locking.
+ Note: The CRequest::CompleteL method is overridden in this class
+
+ @see CCntRequest constructor
+*/
+CReqRead::CReqRead(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut, CCntPackager& aPackager, CContactItemViewDef& aItemViewDef)
+ :CCntRequest(aSessionId, aMessage, aTimeOut),
+ iPackager(aPackager),
+ iItemViewDef(&aItemViewDef),
+ iViewDefCreated(EFalse)
+ {
+ }
+
+void CReqRead::ConstructL()
+ {
+ if (iMessage.Int3())
+ {
+ iPackager.SetBufferFromMessageL(iMessage);
+ iItemViewDef = iPackager.UnpackCntItemViewDefLC();
+ iViewDefCreated = ETrue;
+ iPackager.Clear();
+ CleanupStack::Pop(iItemViewDef);
+ }
+ }
+
+CReqRead::~CReqRead()
+ {
+ if (iViewDefCreated) // Required - determine CntItemViewdef was extracted from iMessage
+ { // encapsulates ItemViewDef nicely.
+ delete iItemViewDef;
+ }
+ }
+
+const CContactItemViewDef& CReqRead::ItemViewDef()
+ {
+ return *iItemViewDef;
+ }
+
+/** Overridden CompleteL method
+ Completes the request item by packing the contact item into the RMessage slot
+ and returning it to the client
+
+ @param aCntItem The contact item that is returned to the client.
+*/
+void CReqRead::CompleteL(const CContactItem& aCntItem)
+ {
+ TInt size(0);
+ TPtr8 cntItemBuff = iPackager.PackL(aCntItem, size);
+ // Write data if client buffer is large enough
+ // otherwise return the required buffer size.
+ if(iMessage.GetDesMaxLength(1) >= size)
+ {
+ iMessage.WriteL(1, cntItemBuff);
+ Complete(KErrNone);
+ }
+ else
+ {
+ Complete(size);
+ }
+ }
+
+
+/** CReqOpenCnt constructor
+ Open a Contact Item - derived from CReqRead.
+ Very similar to CReqReadCnt but also results in the contact item being locked
+
+ @see CReqRead constructor
+*/
+CReqOpenCnt* CReqOpenCnt::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut, CCntPackager& aPackager, CContactItemViewDef& aItemViewDef)
+ {
+ CReqOpenCnt* self = new (ELeave) CReqOpenCnt(aSessionId, aMessage, aTimeOut, aPackager, aItemViewDef);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CReqOpenCnt::CReqOpenCnt(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut, CCntPackager& aPackager, CContactItemViewDef& aItemViewDef)
+ :CReqRead(aSessionId, aMessage, aTimeOut, aPackager, aItemViewDef)
+ {
+ }
+
+CReqOpenCnt::~CReqOpenCnt()
+ {
+ }
+
+
+TAccept CReqOpenCnt::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqReadCnt constructor
+ Read a contact item - derived from CReqRead
+ Very similar to CReqOpenCnt but does not result in locking the contact item
+
+ @see CReqRead constructor
+
+*/
+CReqReadCnt* CReqReadCnt::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut, CCntPackager& aPackager, CContactItemViewDef& aItemViewDef)
+ {
+ CReqReadCnt* self = new (ELeave) CReqReadCnt(aSessionId, aMessage, aTimeOut, aPackager, aItemViewDef);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CReqReadCnt::CReqReadCnt(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut, CCntPackager& aPackager, CContactItemViewDef& aItemViewDef)
+ :CReqRead(aSessionId, aMessage, aTimeOut, aPackager, aItemViewDef)
+ {
+ }
+
+CReqReadCnt::~CReqReadCnt()
+ {
+ }
+
+
+TAccept CReqReadCnt::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+
+/**
+ CReqDeleteCnt constructor
+ Delete a contact Item
+
+ @see CCntRequest constructor
+*/
+CReqDeleteCnt* CReqDeleteCnt::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqDeleteCnt* self = new (ELeave) CReqDeleteCnt(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+CReqDeleteCnt::CReqDeleteCnt(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+CReqDeleteCnt::~CReqDeleteCnt()
+ {
+ }
+
+TAccept CReqDeleteCnt::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+
+
+/** CReqCloseCnt
+ Close a contact Item - Used in conjunction with CReqOpenCnt to remove the lock on the contact item
+ without committing.
+
+ @see CCntRequest constructor
+*/
+CReqCloseCnt* CReqCloseCnt::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqCloseCnt* self = new (ELeave) CReqCloseCnt(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+CReqCloseCnt::CReqCloseCnt(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+CReqCloseCnt::~CReqCloseCnt()
+ {
+ }
+
+TAccept CReqCloseCnt::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+/**
+ CReqCreateCnt constructor
+ Create a contact item, this request is completed with the new contact item id or an error code.
+
+ @see CCntRequest constructor
+*/
+CReqCreateCnt* CReqCreateCnt::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut, CCntPackager& aPackager)
+ {
+ CReqCreateCnt* self = new (ELeave) CReqCreateCnt(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aPackager);
+ return self;
+ }
+
+CReqCreateCnt::CReqCreateCnt(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+:CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+CReqCreateCnt::~CReqCreateCnt()
+ {
+ delete iCntItem;
+ }
+
+TAccept CReqCreateCnt::VisitStateL(CState& aState)
+ {
+ #if defined(__PROFILE_DEBUG__)
+ RDebug::Print(_L("[CNTMODEL] MTD: CCntStateMachine::ProcessRequestL"));
+ #endif
+
+ return aState.AcceptRequestL(this);
+ }
+
+void CReqCreateCnt::ConstructL(CCntPackager& aPackager)
+ {
+ aPackager.SetBufferFromMessageL(iMessage);
+ iCntItem = aPackager.UnpackCntItemLC();
+ CleanupStack::Pop(iCntItem);
+ }
+
+
+
+
+// Database Transactin Request Class implemenations //
+
+
+/**
+ CReqDbBeginTrans constructor
+ Request to begin a transaction - moves the state machine into a transaction state
+
+ @see CCntRequest constructor
+*/
+CReqDbBeginTrans* CReqDbBeginTrans::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqDbBeginTrans* self = new (ELeave) CReqDbBeginTrans(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqDbBeginTrans::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+
+CReqDbBeginTrans::CReqDbBeginTrans(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ :CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+/**
+ CReqDbCommitTrans constructor
+ Request to Commit a transaction
+ Moves the database out of a transaction state and (usually) into a writable state
+
+ @see CCntRequest constructor
+ */
+CReqDbCommitTrans* CReqDbCommitTrans::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqDbCommitTrans* self = new (ELeave) CReqDbCommitTrans(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqDbCommitTrans::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+CReqDbCommitTrans::CReqDbCommitTrans(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ :CCntRequest(aSessionId, aMessage, aTimeOut)
+
+ {
+ }
+
+
+/**
+ CReqDbRollbackTrans constructor
+ Request to Rollback a transaction - results in a database recovery
+ so it closes and re-opens the database if it has been damaged
+
+ @see CCntRequest constructor
+*/
+CReqDbRollbackTrans* CReqDbRollbackTrans::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqDbRollbackTrans* self = new (ELeave) CReqDbRollbackTrans(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqDbRollbackTrans::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+CReqDbRollbackTrans::CReqDbRollbackTrans(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ :CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+
+/**
+ CReqBackupRestoreBegin constructor
+ Notifys the state machine that a backup/restore is beginning
+
+ @see CCntRequest constructor
+*/
+CReqBackupRestoreBegin* CReqBackupRestoreBegin::NewLC()
+ {
+ CReqBackupRestoreBegin* self = new (ELeave) CReqBackupRestoreBegin();
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqBackupRestoreBegin::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+/**
+ CReqBackupRestoreEnd constructor
+ Notifys the state machine that a restore has ended
+
+ @see CCntRequest constructor
+ */
+CReqBackupRestoreEnd* CReqBackupRestoreEnd::NewLC()
+ {
+ CReqBackupRestoreEnd* self = new (ELeave) CReqBackupRestoreEnd();
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqBackupRestoreEnd::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqDiskSpaceLow constructor
+ @see CCntRequest constructor
+ */
+CReqDiskSpaceLow* CReqDiskSpaceLow::NewLC()
+ {
+ CReqDiskSpaceLow* self = new (ELeave) CReqDiskSpaceLow();
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqDiskSpaceLow::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqDiskSpaceNormal constructor
+ @see CCntRequest constructor
+*/
+CReqDiskSpaceNormal* CReqDiskSpaceNormal::NewLC()
+ {
+ CReqDiskSpaceNormal* self = new (ELeave) CReqDiskSpaceNormal();
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqDiskSpaceNormal::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqAsyncActivity constructor
+ @see CCntRequest constructor
+ */
+CReqAsyncActivity* CReqAsyncActivity::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqAsyncActivity* self = new (ELeave) CReqAsyncActivity(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+CReqAsyncActivity::CReqAsyncActivity(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut )
+: CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+TAccept CReqAsyncActivity::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+/**
+ CReqNoAsyncActivity constructor
+ @see CCntRequest constructor
+*/
+CReqNoAsyncActivity* CReqNoAsyncActivity::NewLC(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut)
+ {
+ CReqNoAsyncActivity* self = new (ELeave) CReqNoAsyncActivity(aSessionId, aMessage, aTimeOut);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+CReqNoAsyncActivity::CReqNoAsyncActivity(const TUint aSessionId, const RMessage2& aMessage, const TInt aTimeOut )
+: CCntRequest(aSessionId, aMessage, aTimeOut)
+ {
+ }
+
+TAccept CReqNoAsyncActivity::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+/**
+ CReqInternalSessionUnlock constructor
+ CReqInternalSessionUnlock unlocks all remaining locked contact items when
+ a session closes. It is called from the session class destructor
+
+ @see CCntReqInternal constructor
+*/
+CReqInternalSessionUnlock* CReqInternalSessionUnlock::NewLC(TInt aSessionId)
+ {
+ CReqInternalSessionUnlock* self = new (ELeave) CReqInternalSessionUnlock(aSessionId);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+TAccept CReqInternalSessionUnlock::VisitStateL(CState& aState)
+ {
+ return aState.AcceptRequestL(this);
+ }
+
+
+//CReqInternalAsyncOpen //
+// Similar to CReqAsyncOpen but the request originates from inside the server.
+CReqInternalAsyncOpen* CReqInternalAsyncOpen::NewLC(const TUint aSessionId, const TDesC& aFileName, TRequestStatus& aStatus)
+ {
+ CReqInternalAsyncOpen* self = new (ELeave) CReqInternalAsyncOpen(aSessionId, aFileName, aStatus);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CReqInternalAsyncOpen::CReqInternalAsyncOpen(const TUint aSessionId, const TDesC& aFileName, TRequestStatus& aStatus)
+ : CReqAsyncOpen(aSessionId), iStatus(&aStatus)
+ {
+ iFilename = aFileName;
+ }
+
+void CReqInternalAsyncOpen::ConstructL()
+ {
+ *iStatus = KRequestPending;
+ }
+
+void CReqInternalAsyncOpen::Complete(TInt aErrorCode)
+ {
+ User::RequestComplete(iStatus, aErrorCode);
+ }
+
+//CReqCancelInternalAsyncOpen //
+// Similar to CReqCancelAsyncOpen but the request originates from inside the server,
+// so there is no need to signal a RMessage that the request has completed
+CReqCancelInternalAsyncOpen* CReqCancelInternalAsyncOpen::NewLC(const TUint aSessionId)
+ {
+ CReqCancelInternalAsyncOpen* self = new (ELeave) CReqCancelInternalAsyncOpen(aSessionId);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+void CReqCancelInternalAsyncOpen::Complete(TInt /*errorCode*/)
+ {
+ }
+