diff -r 9f5ae1728557 -r db3f5fa34ec7 messagingfw/msgtestfw/TestActionUtils/src/CMtfTestActionUtilsMessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtestfw/TestActionUtils/src/CMtfTestActionUtilsMessage.cpp Wed Nov 03 22:41:46 2010 +0530 @@ -0,0 +1,366 @@ +// 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: +// + +/** + @file +*/ + +#include "MtfTestActionUtilsUser.h" +#include "CMtfTestActionUtilsMessage.h" +#include "TestFrameworkActionsUtils.h" + + +#include "txtfmlyr.h" +#include "txtrich.h" +#include "smuthdr.h" +#include "miuthdr.h" +#include "miutmsg.h" + +#include +#include + +#include "obexheader.h" + +#include +#include + + +/* + Compare the Body text contents of the message with the file contents +*/ +TInt CMtfTestActionUtilsMessage::VerifyBodyTextContentsL(CMsvEntry& aEntry, HBufC* aFileName ) + { + TInt returnValue = KErrNone; + + // Create a Rich Text object + CPlainText::TTextOrganisation ttOrg = {CPlainText::EOrganiseByLine}; + + CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL(); + CleanupStack::PushL(paraFormatLayer); + CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL(); + CleanupStack::PushL(charFormatLayer); + CRichText* bodyRichText1 = CRichText::NewL(paraFormatLayer, charFormatLayer); + CleanupStack::PushL(bodyRichText1); + + // Store the file contents into the CRichText object + bodyRichText1->ImportTextFileL(0, aFileName->Des(), ttOrg); + + TInt len1 = bodyRichText1->DocumentLength(); + HBufC* buf1 = HBufC::NewL(len1); + CleanupStack::PushL(buf1); + TPtr fileContents = buf1->Des(); + bodyRichText1->Extract(fileContents,0,(len1)); + + // Get the type of the message + TUid msgMtmType = aEntry.Entry().iMtm; + + + CRichText* bodyRichText = CRichText::NewL(paraFormatLayer, charFormatLayer); + CleanupStack::PushL(bodyRichText); + + // Email message + if((msgMtmType.operator==(KUidMsgTypeSMTP)) || (msgMtmType.operator==(KUidMsgTypePOP3)) || (msgMtmType.operator==(KUidMsgTypeIMAP4)) ) + { + CImEmailMessage* emailMsg = CImEmailMessage::NewLC(aEntry); + CImEmailMessage::TImEmailEntryType tt = CImEmailMessage::EThisMessageOnly; + + emailMsg->GetBodyTextL(aEntry.EntryId(),tt,*bodyRichText,*paraFormatLayer,*charFormatLayer); + + TInt len = bodyRichText->DocumentLength(); + HBufC* buf = HBufC::NewL(len); + CleanupStack::PushL(buf); + TPtr bodyContents = buf->Des(); + bodyRichText->Extract(bodyContents,0,(len)); + + returnValue = bodyContents.Compare(fileContents); + CleanupStack::PopAndDestroy(2,emailMsg); + } + else if((msgMtmType.operator==(KUidMsgTypeSMS))) + { + // SMS message + CMsvStore* store = aEntry.ReadStoreL(); + CleanupStack::PushL(store); + + store->RestoreBodyTextL(*bodyRichText); + TInt len = bodyRichText->DocumentLength(); + + HBufC* buf = HBufC::NewL(len); + CleanupStack::PushL(buf); + TPtr bodyContents = buf->Des(); + bodyRichText->Extract(bodyContents,0,(len)); + + returnValue = bodyContents.Compare(fileContents); + CleanupStack::PopAndDestroy(2,store); + } + else if((msgMtmType.operator==(KUidMsgTypeIrUID)) ||(msgMtmType.operator==(KUidMsgTypeBt))) + { + returnValue = KErrNotSupported; + } + else + { + returnValue = KErrUnknown; + } + CleanupStack::PopAndDestroy(5,paraFormatLayer); + return returnValue; + } + +TInt CMtfTestActionUtilsMessage::VerifySmsRecipientsL(CMsvStore& aMsgStore,CDesC16Array& aRecipientArray) + { + CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL(); + CleanupStack::PushL(paraFormatLayer); + CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL(); + CleanupStack::PushL(charFormatLayer); + CRichText* richText = CRichText::NewL(paraFormatLayer, charFormatLayer); + CleanupStack::PushL(richText); + richText->Reset(); + + CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsDeliver, *richText); + CleanupStack::PushL(header); + + header->RestoreL(aMsgStore); + + TInt returnValue = KErrNone; + + // Get the recipient addresses set for the SMS message + CArrayPtrFlat& recipientList = header->Recipients(); + + // Verify the count of the recipient address set + if(aRecipientArray.Count() != recipientList.Count()) + { + returnValue = KErrGeneral; + } + else + { + TBool foundFlag = EFalse; + + for(TInt index = 0; index < aRecipientArray.Count(); index++, foundFlag = EFalse) + { + for(TInt indexRcptArray = 0; indexRcptArray < recipientList.Count(); indexRcptArray++) + { + TPtrC address = recipientList.At(indexRcptArray)->Address(); + if(aRecipientArray.MdcaPoint(index).Compare(address) == 0) + { + foundFlag = ETrue; + break; + } + }//End of inner For Loop + + if (foundFlag == EFalse) + { + returnValue = KErrNotFound; + break; + } + }// End If + }// End else + + CleanupStack::PopAndDestroy(4,paraFormatLayer); + + return returnValue; + } + + +TInt CMtfTestActionUtilsMessage::VerifyEmailRecipientsL(CMsvStore& aMsgStore,CDesC16Array& aRecipientArray, TImHeaderEncodingInfo::TFieldList aFieldType) + { + CImHeader* header = CImHeader::NewLC(); + header->RestoreL(aMsgStore); + + TInt returnValue = KErrNone; + CDesCArray* rcptArray = NULL; + + switch(aFieldType) + { + case TImHeaderEncodingInfo::ETo: + rcptArray = &(header->ToRecipients()); + break; + case TImHeaderEncodingInfo::ECc: + rcptArray = &(header->CcRecipients()); + break; + case TImHeaderEncodingInfo::EBcc: + rcptArray = &(header->BccRecipients()); + break; + default: + returnValue = KErrNotSupported; + } + + if( returnValue == KErrNone) + { + if( aRecipientArray.Count() != rcptArray->Count()) + { + returnValue = KErrGeneral; + } + else + { + TInt recipientArrayCount = aRecipientArray.Count(); + + TBool foundFlag = EFalse; + for(TInt index = 0; index < recipientArrayCount; index++, foundFlag = EFalse) + { + for(TInt indexRcptArray = 0; indexRcptArray < recipientArrayCount; indexRcptArray++) + { + TPtrC ptr = aRecipientArray.MdcaPoint(index); + TPtrC ptr1 =rcptArray->MdcaPoint(indexRcptArray); + if (ptr.Match(ptr1) == 0) + { + foundFlag = ETrue; + break; + } + }//End of inner For Loop + + if (foundFlag == EFalse) + { + returnValue = KErrNotFound; + break; + } + }//End of FOR loop + }//End Else + }//End If + + CleanupStack::PopAndDestroy(header); + return returnValue; + } + + + +/** + The function is called if IR or Bluetooth + The recipient address set for the message is verified against + the expected valuse +*/ + /*TPtrC8*/ +TInt CMtfTestActionUtilsMessage::VerifyObexRecipientL (CMsvEntry& aEntry, CMsvStore& aStore, CDesC16Array& aRecipientArray) + { + TInt returnValue = KErrNone; + TUid msgMtmType = aEntry.Entry().iMtm; + + CObexMtmHeader* header; + + if(msgMtmType.operator == (KUidMsgTypeBt)) + { + header = CBtHeader::NewL(); + } + else if(msgMtmType.operator == (KUidMsgTypeIrUID)) + { + header = CIrHeader::NewL(); + } + else + { + return KErrUnknown; + } + CleanupStack::PushL(header); + + header->RestoreL(aStore); + + TPtrC8 tmp = header->Addr(); + HBufC* itemBuff = HBufC::NewLC(tmp.Length()); + itemBuff->Des().Copy(tmp); + TPtrC16 msgRecipientAddr = itemBuff->Des(); + + if(aRecipientArray.MdcaPoint(0).Compare(msgRecipientAddr) != 0) + { + returnValue = KErrGeneral; + } + + CleanupStack::PopAndDestroy(itemBuff); + CleanupStack::PopAndDestroy(header); + return returnValue; + } + + + +TInt CMtfTestActionUtilsMessage::VerifyEmailSubjectL (CMsvEntry& aEntry,HBufC* aSubject) + { + TInt returnValue = KErrNone; + + CMsvStore* store = aEntry.ReadStoreL(); + CleanupStack::PushL(store); + + CImHeader* messageHeader = CImHeader::NewLC(); + messageHeader->RestoreL(*store); + + TPtrC messageSubject = messageHeader->Subject(); + + if(messageSubject.Compare(*aSubject) != 0) + { + returnValue = KErrGeneral; + } + + CleanupStack::PopAndDestroy(messageHeader); + CleanupStack::PopAndDestroy(store); + + return returnValue; + } + + +TInt CMtfTestActionUtilsMessage::VerifyObexSubjectL (CMsvEntry& aEntry, HBufC* aSubject) + { + TInt returnValue = KErrNone; + TUid msgMtmType = aEntry.Entry().iMtm; + + CObexMtmHeader* header; + + if(msgMtmType.operator==(KUidMsgTypeBt)) + { + header = CBtHeader::NewL(); + } + else if(msgMtmType.operator==(KUidMsgTypeIrUID)) + { + header = CIrHeader::NewL(); + } + else + { + return KErrUnknown; + } + CleanupStack::PushL(header); + + CMsvStore* msgStore = aEntry.ReadStoreL(); + + CleanupStack::PushL(msgStore); + + header->RestoreL(*msgStore); + + TPtrC messageSubject = header->Subject(); + + if( messageSubject.Compare(*aSubject) != 0 ) + { + returnValue = KErrGeneral; + } + + CleanupStack::PopAndDestroy(msgStore); + CleanupStack::PopAndDestroy(header); + + return returnValue; + } + +void CMtfTestActionUtilsMessage::FormatBtRecipientAddress(TDesC& aRecipient, TDes& formattedAddr) + { + TPtrC16 ptr16 = aRecipient; + + for(int index = 0; index < 12; index+=4) + { + // do 4 characters to get one out. We're going to force the compiler to do the character endianness. + TUint8 byte1 = TestFrameworkActionsUtils::GetByteFromUnicodeHexTextChar(&ptr16[index]); + TUint8 byte2 = TestFrameworkActionsUtils::GetByteFromUnicodeHexTextChar(&ptr16[index+1]); + TUint8 byte3 = TestFrameworkActionsUtils::GetByteFromUnicodeHexTextChar(&ptr16[index+2]); + TUint8 byte4 = TestFrameworkActionsUtils::GetByteFromUnicodeHexTextChar(&ptr16[index+3]); + + byte1 = (TUint8) ( ((byte1 & 0x0F) << 4) | (byte2 & 0x0f) ); + byte3 = (TUint8) ( ((byte3 & 0x0F) << 4) | (byte4 & 0x0f) ); + + // make sure this is put together in network endianness + TUint16 result = (TUint16)( (TUint16)(byte3 << 8) | byte1 ); + + formattedAddr.Append( result ); + } + }