messagingfw/msgtestfw/TestActions/Sms/src/CmtfTestActionCompareSmsMessages.cpp
changeset 0 8e480a14352b
--- /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;
+	}