--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtestfw/TestActions/Sms/src/CmtfTestActionCompareSmsMessages.cpp Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,261 @@
+// Copyright (c) 2003-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:
+// __ACTION_INFO_BEGIN__
+// [Action Name]
+// CompareSmsMessages
+// [Action Parameters]
+// TMsvId FolderId1 <input> : Value of Folder Id to be compared with.
+// TMsvId FolderId2 <input> : Value of Folder Id to be compared
+// CMsvSession session <input> : Reference to the session.
+// TInt Result <output-initiation> : Value of enumerated constants if not
+// identical(zero if one folder has
+// corresponding same message in other folder).
+// [Action Description]
+// Compare and check the whether the messages in one folder has corresponding same message
+// in other folder. The output of the Test action should be zero if all parts of
+// the message in both folders are identical, otherwise the corresponding
+// enumerated value of the non-identical part of the message.
+// [APIs Used]
+// CMsvEntrySelection::ChildrenL
+// CMsvEntrySelection::Count
+// CMsvSession::GetEntryL
+// CMsvEntry::Entry
+// CMsvStore::RestoreBodyTextL
+// CSmsHeader::RestoreL
+// __ACTION_INFO_END__
+//
+//
+
+/**
+ @file
+*/
+
+// system includes
+#include <smut.h>
+#include <msvapi.h>
+#include <txtrich.h>
+#include <smuthdr.h>
+
+
+// user includes
+#include "CmtfTestActionCompareSmsMessages.h"
+#include "CMtfTestCase.h"
+#include "CMtfTestActionParameters.h"
+
+CMtfTestAction* CMtfTestActionCompareSmsMessages::NewL(CMtfTestCase& aTestCase,CMtfTestActionParameters* aActionParameters)
+ {
+ CMtfTestActionCompareSmsMessages* self = new (ELeave) CMtfTestActionCompareSmsMessages(aTestCase);
+ CleanupStack::PushL(self);
+ self->ConstructL(aActionParameters);
+ CleanupStack::Pop();
+ return self;
+ }
+
+
+CMtfTestActionCompareSmsMessages::CMtfTestActionCompareSmsMessages(CMtfTestCase& aTestCase)
+ :CMtfSynchronousTestAction(aTestCase)
+ {
+ }
+
+
+CMtfTestActionCompareSmsMessages::~CMtfTestActionCompareSmsMessages()
+ {
+ }
+
+void CMtfTestActionCompareSmsMessages::ExecuteActionL()
+ {
+ TestCase().INFO_PRINTF2(_L("Test Action %S start..."), &KTestActionCompareSmsMessages);
+ TMsvId paramFolderId1 = ObtainValueParameterL<TMsvId>(TestCase(),ActionParameters().Parameter(0));
+ TMsvId paramFolderId2 = ObtainValueParameterL<TMsvId>(TestCase(),ActionParameters().Parameter(1));
+
+ iParamSession = ObtainParameterReferenceL<CMsvSession>(TestCase(),ActionParameters().Parameter(2));
+
+ CMsvEntry* folderEntry1 = CMsvEntry::NewL(*iParamSession,paramFolderId1,TMsvSelectionOrdering());
+ CleanupStack::PushL(folderEntry1);
+ CMsvEntrySelection* folder1Selection =folderEntry1->ChildrenWithMtmL(KUidMsgTypeSMS);
+ CleanupStack::PushL(folder1Selection);
+ folderEntry1->SetEntryL(paramFolderId2);
+ CMsvEntrySelection* folder2Selection =folderEntry1->ChildrenWithMtmL(KUidMsgTypeSMS);
+ CleanupStack::PushL(folder2Selection);
+ TInt count1 = folder1Selection->Count();
+ TInt resCount=0;
+ TInt enumVal;
+ TInt folder1Count=count1;
+ TInt count2 = folder2Selection->Count();
+ if((count1 <= 0)||(count2 < count1))
+ {
+ User::Leave(KErrGeneral);
+ }
+ TMsvId msgId1 = KMsvRootIndexEntryId;
+ CMsvEntry* f1Entry = iParamSession->GetEntryL(KMsvRootIndexEntryId);
+ CleanupStack::PushL(f1Entry);
+ TMsvId msgId2 = KMsvRootIndexEntryId;
+ CMsvEntry* f2Entry = iParamSession->GetEntryL(KMsvRootIndexEntryId);
+ CleanupStack::PushL(f2Entry);
+
+ while (count1--)
+ {
+ msgId1 = (*folder1Selection)[count1];
+ f1Entry->SetEntryL(msgId1);
+ TMsvEntry msgEntry1 = f1Entry->Entry();
+ while (count2--)
+ {
+ msgId2 = (*folder2Selection)[count2];
+ f2Entry->SetEntryL(msgId2);
+ TMsvEntry msgEntry2 = f2Entry->Entry();
+
+ if (IsMatchHeaderL(*f1Entry, *f2Entry))
+ {
+ enumVal = EFailedToMatchHeader;
+ }
+ else if (!IsMatchL(*f1Entry, *f2Entry))
+ {
+ enumVal = EFailedToMatchBody;
+ }
+ else
+ {
+ resCount++;
+ if(resCount == folder1Count)
+ {
+ enumVal = EAllMatched;
+ }
+ break;
+ }
+ }
+ }
+ StoreParameterL<TInt>(TestCase(),enumVal,ActionParameters().Parameter(3));
+ CleanupStack::PopAndDestroy(f2Entry);
+ CleanupStack::PopAndDestroy(f1Entry);
+ CleanupStack::PopAndDestroy(folder2Selection);
+ CleanupStack::PopAndDestroy(folder1Selection);
+ CleanupStack::PopAndDestroy(folderEntry1);
+ TestCase().INFO_PRINTF2(_L("Test Action %S completed."), &KTestActionCompareSmsMessages);
+ TestCase().ActionCompletedL(*this);
+ }
+
+
+
+ TBool CMtfTestActionCompareSmsMessages::IsMatchL(CMsvEntry& aFolder1Msg, CMsvEntry& aFolder2Msg)
+/**
+ * Compares the body text of Folder1 and Folder2
+ *
+ * @return Returns ETrue if the body text matches
+ */
+ {
+ HBufC* folder1MsgBody = GetBodyTextL(aFolder1Msg);
+ HBufC* folder2MsgBody = GetBodyTextL(aFolder2Msg);
+ TBool retVal = (*folder1MsgBody == *folder2MsgBody);
+ return retVal;
+ }
+
+ TBool CMtfTestActionCompareSmsMessages::IsMatchHeaderL(CMsvEntry& aFolder1Msg, CMsvEntry& aFolder2Msg)
+/**
+ * Compares the Message Header of Folder1 and Folder2
+ *
+ * @return Returns ETrue if the body text matches
+ */
+ {
+ CSmsHeader* folder1MsgHeader = GetSubmitHeaderL(aFolder1Msg);
+ CleanupStack::PushL(folder1MsgHeader);
+ CSmsHeader* folder2MsgHeader = GetDeliverHeaderL(aFolder2Msg);
+ CleanupStack::PushL(folder2MsgHeader);
+
+ CArrayPtrFlat<CSmsNumber>& f1Recipients = folder1MsgHeader->Recipients();
+ CArrayPtrFlat<CSmsNumber>& f2Recipients = folder2MsgHeader->Recipients();
+
+ TInt f1Count = f1Recipients.Count();
+ TInt f2Count = f2Recipients.Count();
+ TBool retVal = ETrue;
+ if((f1Count == f2Count)&&(folder1MsgHeader->Type()==folder2MsgHeader->Type()))
+ {
+ for(TInt i=0;i<f1Count;i++)
+ {
+ retVal = (f1Recipients[i] == f2Recipients[i]);
+ if((retVal==EFalse))
+ break;
+ }
+ }
+ else
+ {
+ retVal = EFalse;
+ }
+ CleanupStack::PopAndDestroy(folder2MsgHeader);
+ CleanupStack::PopAndDestroy(folder1MsgHeader);
+ return retVal;
+ }
+
+ CSmsHeader* CMtfTestActionCompareSmsMessages::GetSubmitHeaderL(CMsvEntry& aMessage)
+/**
+ * Returns the CSmsHeader restored from message aMessage.
+ */
+ {
+ CSmsHeader* header = CSmsHeader::NewL(CSmsMessage::NewL(iParamSession->FileSession(), CSmsPDU::ESmsSubmit, CSmsBuffer::NewL()));
+ CleanupStack::PushL(header);
+
+ CMsvStore* store = aMessage.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ CleanupStack::Pop(header);
+ return header;
+ }
+
+ CSmsHeader* CMtfTestActionCompareSmsMessages::GetDeliverHeaderL(CMsvEntry& aMessage)
+ /**
+ * Returns the CSmsHeader restored from message aMessage.
+ */
+ {
+ CSmsHeader* header = CSmsHeader::NewL(CSmsMessage::NewL(iParamSession->FileSession(), CSmsPDU::ESmsDeliver, CSmsBuffer::NewL()));
+ CleanupStack::PushL(header);
+
+ CMsvStore* store = aMessage.ReadStoreL();
+ CleanupStack::PushL(store);
+ header->RestoreL(*store);
+ CleanupStack::PopAndDestroy(store);
+
+ CleanupStack::Pop(header);
+ return header;
+ }
+
+
+HBufC* CMtfTestActionCompareSmsMessages::GetBodyTextL(CMsvEntry& aMessage)
+/**
+ * @return The body text of message aMessage
+ */
+ {
+ CMsvStore* store = aMessage.ReadStoreL();
+ CleanupStack::PushL(store);
+
+ CRichText* richText;
+ CParaFormatLayer* paraFormatLayer;
+ CCharFormatLayer* charFormatLayer;
+ paraFormatLayer=CParaFormatLayer::NewL();
+ CleanupStack::PushL(paraFormatLayer);
+ charFormatLayer=CCharFormatLayer::NewL();
+ CleanupStack::PushL(charFormatLayer);
+
+ richText=CRichText::NewL(paraFormatLayer, charFormatLayer);
+ CleanupStack::PushL(richText);
+ store->RestoreBodyTextL(*richText);
+ const TInt len =richText->DocumentLength();
+ HBufC* buf = HBufC::NewL(len);
+ TPtr ptr(buf->Des());
+ richText->Extract(ptr);
+ CleanupStack::PopAndDestroy(richText);
+ CleanupStack::PopAndDestroy(charFormatLayer);
+ CleanupStack::PopAndDestroy(paraFormatLayer);
+ CleanupStack::PopAndDestroy(store);
+ return buf;
+ }