diff -r 000000000000 -r 8e480a14352b messagingfw/sendas/test/sendastestmtm/src/csendastestservermtm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/sendas/test/sendastestmtm/src/csendastestservermtm.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,345 @@ +// Copyright (c) 2004-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: +// csendastestservermtm.cpp +// +#include "csendastestservermtm.h" + +#include +#include +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "msvconsts.h" +#endif + +const TInt KSendAsTestServerSendDelay = 1000000; + +EXPORT_C CSendAsTestServerMtm* CSendAsTestServerMtm::NewL(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aServerEntry) + { + CSendAsTestServerMtm* self = new (ELeave) CSendAsTestServerMtm(aRegisteredMtmDll, aServerEntry); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CSendAsTestServerMtm::~CSendAsTestServerMtm() + { + Cancel(); + + iTimer.Close(); + delete iSelection; + } + +CSendAsTestServerMtm::CSendAsTestServerMtm(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aServerEntry) +: CBaseServerMtm(aRegisteredMtmDll, aServerEntry) + { + CActiveScheduler::Add(this); + } + +void CSendAsTestServerMtm::ConstructL() + { + User::LeaveIfError(iTimer.CreateLocal()); + } + +void CSendAsTestServerMtm::SendMessagesL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus) + { + aStatus = KRequestPending; + iRequestStatus = &aStatus; + + iProgress.iMessagesDone = 0; + iProgress.iMessageCount = aSelection.Count(); + + // Are there any messages to send? + if( iProgress.iMessageCount > 0 ) + { + // Copy the selection of messages... + delete iSelection; + iSelection = NULL; + iSelection = aSelection.CopyL(); + + iProgress.iState = TSendAsTestMtmProgress::ESendAsTestInitSend; + CompleteSelf(); + } + else + { + // Complete the request... + DoComplete(KErrNone); + } + } + +void CSendAsTestServerMtm::DoInitialiseSendL() + { + // Set the message send state to waiting. + TInt count = iSelection->Count(); + for( TInt i=0; iSetEntry(iSelection->At(i))); + iEntry = iServerEntry->Entry(); + iEntry.SetSendingState(KMsvSendStateWaiting); + User::LeaveIfError(iServerEntry->ChangeEntry(iEntry)); + } + iServerEntry->SetEntry(KMsvNullIndexEntryId); // ignore error... + + // Set the current message to first message in selection and move onto the + // next one. + iCurrentMessage = iSelection->At(0); + ++iProgress.iMessagesDone; + + iProgress.iState = TSendAsTestMtmProgress::ESendAsTestSendNext; + CompleteSelf(); + } + +void CSendAsTestServerMtm::DoSendMessageL() + { + // Get the current message. + User::LeaveIfError(iServerEntry->SetEntry(iCurrentMessage)); + iEntry = iServerEntry->Entry(); + + // Change the message send state to sending. + iEntry.SetSendingState(KMsvSendStateSending); + User::LeaveIfError(iServerEntry->ChangeEntry(iEntry)); + + // Pretend to send - just wait a bit... + iProgress.iState = TSendAsTestMtmProgress::ESendAsTestSending; + iTimer.After(iStatus, KSendAsTestServerSendDelay); + SetActive(); + } + +void CSendAsTestServerMtm::DoMoveToSentFolderL() + { + __ASSERT_DEBUG( iCurrentMessage == iEntry.Id(), User::Invariant() ); + __ASSERT_DEBUG( iEntry == iServerEntry->Entry(), User::Invariant() ); + + // Update the sending state and move to the sent folder. + iEntry.SetSendingState(KMsvSendStateSent); + User::LeaveIfError(iServerEntry->ChangeEntry(iEntry)); + + User::LeaveIfError(iServerEntry->SetEntry(iEntry.Parent())); + User::LeaveIfError(iServerEntry->MoveEntryWithinService(iEntry.Id(),KMsvSentEntryId)); + User::LeaveIfError(iServerEntry->SetEntry(KMsvNullIndexEntryId)); + + iProgress.iState = TSendAsTestMtmProgress::ESendAsTestMoving; + CompleteSelf(); + } + +void CSendAsTestServerMtm::HandleSendErrorL(TInt aSendingState) + { + // Update the current message to reflect the error. + User::LeaveIfError(iServerEntry->SetEntry(iCurrentMessage)); + iEntry = iServerEntry->Entry(); + iEntry.iError = iProgress.iError; + iEntry.SetSendingState(aSendingState); + User::LeaveIfError(iServerEntry->ChangeEntry(iEntry)); + + // Change the state of the remaining messages. + for(TInt i=iProgress.iMessagesDone; iSetEntry(iSelection->At(i))); + iEntry = iServerEntry->Entry(); + iEntry.iError = iProgress.iError; + iEntry.SetSendingState(aSendingState); + User::LeaveIfError(iServerEntry->ChangeEntry(iEntry)); + } + iServerEntry->SetEntry(KMsvNullIndexEntryId); // ignore error... + } + +void CSendAsTestServerMtm::CompleteSelf() + { + TRequestStatus* status=&iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + +/* + * Methods from CServerBaseMtm + */ + +void CSendAsTestServerMtm::CopyToLocalL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::CopyFromLocalL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::CopyWithinServiceL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::DeleteAllL(const CMsvEntrySelection& /*aSelection*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::CreateL(TMsvEntry /*aNewEntry*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::ChangeL(TMsvEntry /*aNewEntry*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::StartCommandL(CMsvEntrySelection& aSelection, TInt aCommand, const TDesC8& /*aParameter*/, TRequestStatus& aStatus) + { + __ASSERT_ALWAYS( iProgress.iState == TSendAsTestMtmProgress::ESendAsTestWaiting, User::Invariant() ); + + switch( aCommand ) + { + case KMTMStandardFunctionsSendMessage: + { + // Send request - do the 'send'... + SendMessagesL(aSelection, aStatus); + } break; + default: + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + break; + }; + } + +TBool CSendAsTestServerMtm::CommandExpected() + { + return EFalse; + } + +const TDesC8& CSendAsTestServerMtm::Progress() + { + iProgressBuf = TSendAsTestMtmProgressBuf(iProgress); + return iProgressBuf; + } + +void CSendAsTestServerMtm::MoveToLocalL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::MoveFromLocalL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::MoveWithinServiceL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& aStatus) + { + TRequestStatus* status=&aStatus; + User::RequestComplete(status,KErrNotSupported); + } + +void CSendAsTestServerMtm::DoRunL() + { + User::LeaveIfError(iStatus.Int()); + + switch( iProgress.iState ) + { + case TSendAsTestMtmProgress::ESendAsTestInitSend: + { + DoInitialiseSendL(); + } break; + case TSendAsTestMtmProgress::ESendAsTestSendNext: + { + DoSendMessageL(); + } break; + case TSendAsTestMtmProgress::ESendAsTestSending: + { + // Check the error value of the message entry - this has been set to + // indicate whether the send should have succeeded or not. + User::LeaveIfError(iEntry.iError); + + // The message was sent ok - move message to the sent folder. + DoMoveToSentFolderL(); + } break; + case TSendAsTestMtmProgress::ESendAsTestMoving: + { + if( iProgress.iMessagesDone < iProgress.iMessageCount ) + { + // There are still messages to send - move onto the next... + iCurrentMessage = iSelection->At(iProgress.iMessagesDone); + + // Move onto the next message... + ++iProgress.iMessagesDone; + + iProgress.iState = TSendAsTestMtmProgress::ESendAsTestSending; + CompleteSelf(); + } + else + { + // All messages sent - complete request + DoComplete(KErrNone); + } + } break; + case TSendAsTestMtmProgress::ESendAsTestWaiting: + default: + User::Invariant(); + break; + } + } + +void CSendAsTestServerMtm::DoComplete(TInt aError) + { + iProgress.iError = aError; + + if( iProgress.iError != KErrNone ) + { + TRAPD(err, HandleSendErrorL(KMsvSendStateFailed)); + } + else + { + // Make sure that the server MTM is not locking any entries. + iServerEntry->SetEntry(KMsvNullIndexEntryId); // ignore error... + } + + // Complete the request with the KErrNone - the progress has the error code. + User::RequestComplete(iRequestStatus, KErrNone); + } + +/* + * Methods from CActive + */ + +void CSendAsTestServerMtm::DoCancel() + { + switch( iProgress.iState ) + { + case TSendAsTestMtmProgress::ESendAsTestSending: + { + iTimer.Cancel(); + iProgress.iState = TSendAsTestMtmProgress::ESendAsTestWaiting; + } break; + case TSendAsTestMtmProgress::ESendAsTestWaiting: + case TSendAsTestMtmProgress::ESendAsTestInitSend: + case TSendAsTestMtmProgress::ESendAsTestSendNext: + case TSendAsTestMtmProgress::ESendAsTestMoving: + default: + // Do nothing... + break; + } + // Suspend the messages that have not been sent. + iProgress.iError = KErrCancel; + TRAPD(err, HandleSendErrorL(KMsvSendStateSuspended)); + + // Complete the request with the KErrNone - the progress has the error code. + User::RequestComplete(iRequestStatus, KErrNone); + }