messagingfw/msgsrvnstore/server/test/base/src/TESTSMTM.CPP
changeset 0 8e480a14352b
child 3 28ae839b4c09
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/server/test/base/src/TESTSMTM.CPP	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,382 @@
+// 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 <msvipc.h>
+#include <mtsr.h>
+#include <msventry.h>
+
+
+#define _LOCAL_L(a) (TPtrC8((const TText8 *)(a)))
+
+
+class CMsvWait: public CActive
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	CMsvWait();
+	~CMsvWait();
+	inline void Start();
+protected:
+	void RunL();
+	void DoCancel();
+	};
+
+inline void CMsvWait::Start()
+	{
+	SetActive();
+	}
+
+
+CMsvWait::CMsvWait() : CActive(EPriorityHigh)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CMsvWait::~CMsvWait()
+	{
+	Cancel();
+	}
+
+void CMsvWait::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CMsvWait::DoCancel()
+	{
+	TRequestStatus* s=&iStatus;
+	User::RequestComplete(s, KErrCancel);
+	}
+
+
+class CTestServerMtm : public CBaseServerMtm
+	{
+public:
+	IMPORT_C static CTestServerMtm* NewL(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aInitialEntry);
+	~CTestServerMtm();
+
+	void CopyToLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void CopyFromLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void CopyWithinServiceL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void MoveToLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void MoveFromLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void MoveWithinServiceL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus);
+	void DeleteAllL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus);
+	void CreateL(TMsvEntry aNewEntry, TRequestStatus& aStatus);
+	void ChangeL(TMsvEntry aNewEntry, TRequestStatus& aStatus);
+	//
+	void StartCommandL(CMsvEntrySelection& aSelection, TInt aCommand, const TDesC8& aParameter, TRequestStatus& aStatus);
+	//
+	TBool CommandExpected();
+	//
+	const TDesC8& Progress();
+	//
+	void SetInitialEntry(CMsvServerEntry* aEntry);
+	//
+
+protected:
+	void DoCancel();
+	void DoRunL();
+	void DoComplete(TInt aError);
+
+private:
+	RTimer iTimer;
+	CTestServerMtm(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aInitialEntry);
+	void ConstructL();
+	void DoCopyEntriesL();
+	void DoCopyEntryL(TMsvId aId);
+	void DoMoveEntriesL();
+
+private:
+	const CMsvEntrySelection* iSelection;
+	TInt iIntParam;
+	TRequestStatus* iObserverStatus;
+	CMsvServerEntry* iNewParent;
+	TBuf8<32> iProgress;
+	TBuf8<32> iPersistentBuffer;
+	TBool iPersistent;
+	RFs iFs;
+	};
+
+
+EXPORT_C CTestServerMtm* CTestServerMtm::NewL(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aInitialEntry)
+	{
+	CleanupStack::PushL(aInitialEntry); // Take ownership of aInitialEntry
+	CTestServerMtm* mysvrmtm=new(ELeave) CTestServerMtm(aRegisteredMtmDll, aInitialEntry);
+	CleanupStack::Pop(); // aInitialEntry - Entry now safely stored in member
+
+	CleanupStack::PushL(mysvrmtm);
+	mysvrmtm->ConstructL();
+	CleanupStack::Pop();
+	return mysvrmtm;
+	}
+
+CTestServerMtm::CTestServerMtm(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aInitialEntry):
+	CBaseServerMtm(aRegisteredMtmDll, aInitialEntry), iPersistent(EFalse)
+	{
+	__DECLARE_NAME(_S("CTestServerMtm"));
+	}
+		
+void CTestServerMtm::ConstructL()
+	{
+	CActiveScheduler::Add(this);
+	User::LeaveIfError(iFs.Connect());
+	TUint att;
+	if (iFs.Att(_L("c:\\block test mtm start"), att)==KErrNone)
+		User::Leave(-101);
+	}
+
+CTestServerMtm::~CTestServerMtm()
+	{
+	Cancel();
+	iFs.Close();
+	}
+
+void CTestServerMtm::CopyToLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus)
+	{
+	iSelection = &aSelection;
+	iIntParam = aDestination;
+	iObserverStatus = &aStatus;
+	DoCopyEntriesL();
+	iProgress = _LOCAL_L("copied to local");
+	}
+
+void CTestServerMtm::CopyFromLocalL(const CMsvEntrySelection& aSelection, TMsvId aDestination, TRequestStatus& aStatus)
+	{
+	iSelection = &aSelection;
+	iIntParam = aDestination;
+	iObserverStatus = &aStatus;
+	DoCopyEntriesL();
+	iProgress = _LOCAL_L("copied from local");
+	}
+
+void CTestServerMtm::CopyWithinServiceL(const CMsvEntrySelection& aSelection, TMsvId aDestination, TRequestStatus& aStatus)
+	{
+	iSelection = &aSelection;
+	iIntParam = aDestination;
+	iObserverStatus = &aStatus;
+	DoCopyEntriesL();
+	iProgress = _LOCAL_L("copied within service");
+	}
+
+void CTestServerMtm::MoveToLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus)
+	{
+	iSelection = &aSelection;
+	iIntParam = aDestination;
+	iObserverStatus = &aStatus;
+	DoMoveEntriesL();
+	iProgress = _LOCAL_L("moved to local");
+	}
+
+void CTestServerMtm::MoveFromLocalL(const CMsvEntrySelection& aSelection,TMsvId aDestination, TRequestStatus& aStatus)
+	{
+	iSelection = &aSelection;
+	iIntParam = aDestination;
+	iObserverStatus = &aStatus;
+	DoMoveEntriesL();
+	iProgress = _LOCAL_L("moved from local");
+	}
+
+void CTestServerMtm::MoveWithinServiceL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& aStatus)
+	{
+	TRequestStatus* status=&aStatus;
+	User::RequestComplete(status, KErrNone);
+	iProgress = _LOCAL_L("moved within service");
+	}
+
+
+void CTestServerMtm::DeleteAllL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus)
+	{
+	// set the main server entry up to the parent
+	TInt error = iServerEntry->SetEntry(aSelection.At(0));
+
+	if (error==KErrNone)
+		{
+		iServerEntry->SetEntry(iServerEntry->Entry().Parent());
+		// delete the entry recursively
+		error = iServerEntry->DeleteEntry(aSelection.At(0));
+		}
+
+	iProgress = _LOCAL_L("deleted entry recursively");
+
+	TRequestStatus* status=&aStatus;
+	User::RequestComplete(status, error);
+	}
+
+void CTestServerMtm::CreateL(TMsvEntry aNewEntry, TRequestStatus& aStatus)
+	{
+	TInt error = iServerEntry->SetEntry(aNewEntry.Parent());
+	if (!error)
+		error = iServerEntry->CreateEntry(aNewEntry);
+
+	iProgress = _LOCAL_L("added entry");
+	TRequestStatus* status=&aStatus;
+	User::RequestComplete(status, error);
+	}
+
+void CTestServerMtm::ChangeL(TMsvEntry aNewEntry, TRequestStatus& aStatus)
+	{
+	TInt error = iServerEntry->SetEntry(aNewEntry.Id());
+	if (!error)
+		error = iServerEntry->ChangeEntry(aNewEntry);
+	
+	iProgress = _LOCAL_L("changed entry");
+	TRequestStatus* status=&aStatus;
+	User::RequestComplete(status, error);
+	}
+
+void CTestServerMtm::StartCommandL(CMsvEntrySelection& /*aSelection*/, TInt aCommand, const TDesC8& aParameter, TRequestStatus& aStatus)
+	{
+	iObserverStatus = &aStatus;
+	
+	if (aCommand<5 || aCommand>100)
+		{
+		// completes after aCommand second
+		SetActive();
+		iTimer.CreateLocal();
+		iTimer.After(iStatus, aCommand*1000000);
+		//
+		iProgress = _LOCAL_L("timer running");
+		*iObserverStatus=KRequestPending;
+		return;
+		}
+
+	switch (aCommand)
+		{
+		case 10:
+			// makes the MTM persistent, store the parameter
+			iPersistent = ETrue;
+			iPersistentBuffer = aParameter;
+			iProgress = _LOCAL_L("persistent");
+			break;
+		case 11:
+			// makes the MTM non-persistent, returns the persisted buffer as progress
+			iPersistent = EFalse;
+			iProgress = iPersistentBuffer;
+			iPersistentBuffer = TPtrC8();
+			break;
+		case 12:
+			// sets the progress to the paaremter
+			iProgress = aParameter;
+			break;
+		case 13:
+			// always leave
+			User::Leave(-1300);
+			return;
+		default:
+			break;
+		}
+	*iObserverStatus=KRequestPending;
+	User::RequestComplete(iObserverStatus, KErrNone);
+	}
+
+
+void CTestServerMtm::DoRunL()
+	{
+	User::RequestComplete(iObserverStatus, iStatus.Int());
+	iProgress = _LOCAL_L("timer completed");
+	}
+
+void CTestServerMtm::DoComplete(TInt /*aError*/)
+	{
+	}
+
+TBool CTestServerMtm::CommandExpected()
+	{
+	return iPersistent;
+	}
+
+const TDesC8& CTestServerMtm::Progress()
+	{
+	return iProgress;
+	}
+
+void CTestServerMtm::DoCancel()
+	{
+	iProgress = _LOCAL_L("cancelled");
+	iTimer.Cancel();
+	User::RequestComplete(iObserverStatus, KErrCancel);	
+	}
+
+
+
+
+
+void CTestServerMtm::DoCopyEntriesL()
+//
+// just copies the index entries
+//
+	{
+	// set the main server entry up to the curent parent
+	User::LeaveIfError(iServerEntry->SetEntry(iServerEntry->Entry().Parent()));
+
+	// create a new server entry for the new parent
+	iNewParent = iServerEntry->NewEntryL(iIntParam);
+
+	// copy each index entry
+	for (TInt count=0; count<iSelection->Count(); count++)
+		{
+		TRAPD(leave, DoCopyEntryL(iSelection->At(count)));
+		}
+	
+	User::RequestComplete(iObserverStatus, KErrNone);
+	
+	delete iNewParent;
+	iNewParent=NULL;
+	}
+
+
+
+void CTestServerMtm::DoCopyEntryL(TMsvId aId)
+//
+//
+//
+	{
+	User::LeaveIfError(iServerEntry->SetEntry(aId));
+	
+	// create a new entry
+	TMsvEntry newEntry(iServerEntry->Entry());
+
+	// add the new entry to the index under the new parent
+	User::LeaveIfError(iNewParent->CreateEntry(newEntry));
+	}
+
+
+
+void CTestServerMtm::DoMoveEntriesL()
+//
+// just copies the index entries
+//
+	{
+	User::LeaveIfError(iServerEntry->SetEntry(iSelection->At(0)));
+	User::LeaveIfError(iServerEntry->SetEntry(iServerEntry->Entry().Parent()));
+	CMsvWait* wait = new(ELeave)CMsvWait;
+	CleanupStack::PushL(wait);
+	for (TInt count=0; count<iSelection->Count(); count++)
+		{
+		TRAPD(leave, iServerEntry->MoveEntryL(iSelection->At(count), iIntParam, wait->iStatus));
+		if (leave==KErrNone)
+			{
+			wait->Start();
+			CActiveScheduler::Start();
+			}
+		}
+	CleanupStack::PopAndDestroy();
+	User::RequestComplete(iObserverStatus, KErrNone);
+	}
+