diff -r 000000000000 -r 9736f095102e buildverification/smoketest/messaging/Src/TestMessCreateSMS.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buildverification/smoketest/messaging/Src/TestMessCreateSMS.cpp Tue Jan 26 15:16:33 2010 +0200 @@ -0,0 +1,417 @@ +// Copyright (c) 2002-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: +// This contains CTestMessCreateSMS. This class creates the sms message +// for GSM or CDMA. For CDMA mtm, it uses utility classes to create +// the respective GSM or CDMA sms message +// +// + +#include "Configuration.cfg" + +#include "TestMessCreateSMS.h" +#include "TestMessEditEntryUtil.h" + +//Usage of macros of Cdma mtm +#include "TestMessCreateGsmSmsUtil.h" +#if (defined CDMA_API_ENABLED) +#include "TestMessCreateCdmaSmsUtil.h" +#endif + +// EPOC includes +#include +#include +#include +#include +#include //For CSmsMessageSettings + +/*@{*/ +// Literal constants read from the ini file +_LIT(KRecipients, "recipients"); +_LIT(KTo, "to%d"); +_LIT(KPtSaveDraft, "SaveInDraft"); +_LIT(KDefTo, "smsto"); + +_LIT(KPtMsgBearerGsm, "GSM"); +//Usage of macros for Cdma mtm +#if (defined CDMA_API_ENABLED) +_LIT(KPtMsgBearerType, "MessageBearerType"); +_LIT(KPtMsgBearerCdma, "CDMA"); +#endif +/*@}*/ + +#if (defined CDMA_API_ENABLED) +#define KPtDefaultCount 1 +#endif + +CTestMessCreateSMS::CTestMessCreateSMS() +: CTestMessBase(EFalse) +, iSimInDatabase(EFalse) + { + SetTestStepName(_L("CreateSms")); + } + +/** + Creates the SMS message for GSM or CDMA. + @return TVerdict +*/ + +TVerdict CTestMessCreateSMS::doTestStepPreambleL() + { + TVerdict ret=CTestMessBase::doTestStepPreambleL(); + // IMK iSimInDatabase=(GetPhoneSmsNumberL(iSimPhoneNumber)==KErrNone); + iSimInDatabase=false; //IMK (GetPhoneSmsNumberL(iSimPhoneNumber)==KErrNone); + return ret; + } + +/** + Creates the SMS message for GSM or CDMA. + @return TVerdict +*/ +TVerdict CTestMessCreateSMS::doTestStepL() + { + // Get scheduling data + TTimeIntervalMinutes scheduledTime=ReadScheduleTime(); + + //create the message + TBool saveDraft = EFalse; + GetBoolFromConfig(ConfigSection(), KPtSaveDraft, saveDraft); + + if ( saveDraft ) + { + //Create the message in Draft + CreateSmsL(KMsvDraftEntryId, scheduledTime); + } + else + { + //Creates the message in Outbox + CreateSmsL(KMsvGlobalOutBoxIndexEntryId, scheduledTime); + } + + return TestStepResult(); + } + +void CTestMessCreateSMS::CreateSmsL(const TMsvId aMsvId, TTimeIntervalMinutes aScheduledTime) + { + // Get the bearertype (CDMA/GSM) + TPtrC messageBearerType; + messageBearerType.Set(KPtMsgBearerGsm); +#if (defined CDMA_API_ENABLED) + GetStringFromConfig(ConfigSection(), KPtMsgBearerType, messageBearerType); + INFO_PRINTF2(_L("The message bearertype is : %S"), &messageBearerType); +#endif + + CTestMessCreateSmsUtilBase* createSmsUtil = NULL; + // Create the repective util class + if ( messageBearerType.Compare(KPtMsgBearerGsm)==0 ) + { + createSmsUtil=new (ELeave) CTestMessCreateGsmSmsUtil(*this); + } +#if (defined CDMA_API_ENABLED) + else if ( messageBearerType.Compare(KPtMsgBearerCdma)==0 ) + { + createSmsUtil=new (ELeave) CTestMessCreateCdmaSmsUtil(*this); + } +#endif + else + { + WARN_PRINTF1(_L("Unknown bearer type using Gsm")); + createSmsUtil=new (ELeave) CTestMessCreateGsmSmsUtil(*this); + } + CleanupStack::PushL(createSmsUtil); + +// All references to PrepareAccountL can be removed when DEF054045 is fixed +// createSmsUtil->PrepareAccountL(*iSession); + + if(!iBodyAvailable) + { + ERR_PRINTF1(_L("No Body")); + SetTestStepResult(EFail); + } + + if ( TestStepResult()==EPass ) + { + TInt err=KErrNone; + RSendAs sendAsServer; + User::LeaveIfError(sendAsServer.Connect()); + CleanupClosePushL(sendAsServer); + AddMtmCapabilitiesL(sendAsServer); + + RSendAsMessage sendAs; + TRAP(err, sendAs.CreateL(sendAsServer, KUidMsgTypeSMS)); + PrepareSendAsL(sendAs); + + if ( err!=KErrNone ) + { + SetTestStepError(err); + } + else + { + INFO_PRINTF1(_L("sendAs.SetBodyTextL")); + sendAs.SetBodyTextL(*iBodyText); + +#if (!defined CDMA_API_ENABLED) + TInt recipients=1; + GetIntFromConfig(ConfigSection(), KRecipients, recipients); + + TPtrC to(iSimPhoneNumber.iTelNumber); + TBool returnValue=ETrue; + for ( TInt recipient=0; (recipient tempStore; + tempStore.Format(KTo(), recipient); + returnValue=GetStringFromConfig(ConfigSection(), tempStore, to); + if ( !returnValue ) + { + returnValue=GetStringFromConfig(KDef, KDefTo, to); + } + } + if ( !returnValue ) + { + ERR_PRINTF1(_L("No To")); + SetTestStepResult(EFail); + } + else + { + INFO_PRINTF2(_L("To = %S"), &to); + sendAs.AddRecipientL(to, RSendAsMessage::ESendAsRecipientTo); + } + } +#endif + + TRAP(err, sendAs.SaveMessageAndCloseL()); + if ( err!=KErrNone ) + { + ERR_PRINTF1(_L("Save Message Failiure")); + SetTestStepResult(EFail); + sendAs.Close(); + } + else + { + TMsvId messageId=KMsvNullIndexEntryId; + CMsvEntry* parent=iSession->GetEntryL(KMsvDraftEntryIdValue); + CleanupStack::PushL(parent); + parent->SetSortTypeL(SelectionOrdering()); + CMsvEntrySelection* selection=parent->ChildrenL(); + CleanupStack::PushL(selection); + + if ( selection->Count()>0 ) + { + messageId=selection->At(0); + } + if ( messageId!=KMsvNullIndexEntryId ) + { + SetEntryL(messageId); + TMsvEntry child=EntryL().Entry(); + + //Get the message header + CSmsHeader* smsHeader = createSmsUtil->NewHeaderL(*iBodyText); + CleanupStack::PushL(smsHeader); + + //If message is too big lets concatenate..... + ConCatMessageTextL(*smsHeader); + + CMsvStore* store =NULL; + TRAPD(error, store = EntryL().EditStoreL()); + if(error != KErrNone) + { + ERR_PRINTF2(_L("Edit Store Failed. Error %d"), error); + SetTestStepError(error); + } + else + { + CleanupStack::PushL(store); + smsHeader->RestoreL(*store); +#if (defined CDMA_API_ENABLED) + //Adding the recipients... + CArrayPtrFlat& recips = smsHeader->Recipients(); + + TInt recipients=KPtDefaultCount; + GetIntFromConfig(ConfigSection(), KRecipients, recipients); + + TBool returnValue; + for ( TInt recipient=1; recipient<=recipients; recipient++) + { + TBuf tempStore; + + tempStore.Format(KTo(), recipient); + + TPtrC to; + returnValue=GetStringFromConfig(ConfigSection(), tempStore, to); + if ( !returnValue ) + { + returnValue=GetStringFromConfig(KDef, KDefTo, to); + } + if ( !returnValue ) + { + ERR_PRINTF1(_L("No To")); + SetTestStepResult(EFail); + } + else + { + INFO_PRINTF2(_L("To = %S"), &to); + + //Get the recipient array + CSmsNumber* newRecip = CSmsNumber::NewL(); + CleanupStack::PushL(newRecip); + + // Check for the email address in recipient + // This is for email over sms feature + if(to.Locate('@') != KErrNotFound) + { + newRecip->SetAddressL(to, EMsvAddressTypeEMail); + } + else + { + newRecip->SetAddressL(to, EMsvAddressTypeISDN); + } + + //Append the recipients + recips.AppendL(newRecip); + CleanupStack::Pop(newRecip); + } + } +#endif + child.SetSendingState(KMsvSendStateSuspended); + child.SetInPreparation(EFalse); + child.SetVisible(ETrue); + + //Get the details + TBuf details; + +//Usage of macros of Cdma mtm +#if (!defined CDMA_API_ENABLED) + if ( TSmsUtilities::GetDetails(EntryL().Session().FileSession(), smsHeader->Message(), details) == KErrNone ) + { + child.iDetails.Set(details); + } +#else + //if ( TSmsUtilities::GetDetails(EntryL().Session().FileSession(), smsHeader->Message(), details) == KErrNone ) + CArrayPtrFlat& smsNumberArray = smsHeader->Recipients(); + if ( smsNumberArray.Count() ) + { + details.Copy(smsNumberArray[0]->Address()); + } + if ( details.Length() ) + { + child.iDetails.Set(details); + } +#endif + + //Get the description + TBuf desc; + if ( TSmsUtilities::GetDescription(smsHeader->Message(), desc) == KErrNone ) + { + child.iDescription.Set(desc); + } + + //fill up the fields of the message header + PrepareHeaderL(*createSmsUtil, *smsHeader); + + //set the scheduled time if any + if ( aScheduledTime!=TTimeIntervalMinutes(0) ) + { + child.SetSendingState(KMsvSendStateScheduled); + child.SetScheduled(ETrue); + child.iDate.UniversalTime(); + child.iDate+=aScheduledTime; + } + + // Update entry with data set from .ini file + EntryL().ChangeL(child); + smsHeader->StoreL(*store); + store->CommitL(); + CleanupStack::PopAndDestroy(store); + + CTestMessEditEntryUtil* editUtil=new (ELeave) CTestMessEditEntryUtil(*this, ETrue, iSimInDatabase, iSimPhoneNumber); + CleanupStack::PushL(editUtil); + editUtil->ProcessEntryL(EntryL().EntryId()); + CleanupStack::PopAndDestroy(editUtil); + + if ( aMsvId==KMsvGlobalOutBoxIndexEntryId ) + { + // Move the selected message to out box + CTestActive* active=CTestActive::NewLC(*this); + CMsvOperation* op=parent->MoveL(child.Id(), KMsvGlobalOutBoxIndexEntryIdValue, active->iStatus); + CleanupStack::PushL(op); + active->Activate(); + CActiveScheduler::Start(); + CleanupStack::PopAndDestroy(2, active); + } + } + CleanupStack::PopAndDestroy(smsHeader); + } + CleanupStack::PopAndDestroy(2, parent); + } + } + + CleanupStack::PopAndDestroy(&sendAsServer); + } + CleanupStack::PopAndDestroy(createSmsUtil); + } + +void CTestMessCreateSMS::AddMtmCapabilitiesL(RSendAs& aSendAs) + { + aSendAs.ResetMessageFilter(); + } + +void CTestMessCreateSMS::PrepareSendAsL(RSendAsMessage& /*aSendAs*/) + { + } + +void CTestMessCreateSMS::PrepareHeaderL(CTestMessCreateSmsUtilBase& aCreateUtil, CSmsHeader& aSmsHeader) + { + aCreateUtil.PrepareHeaderL(aSmsHeader); + } + +//Usage of macro for CDMA mtm +#if (defined CDMA_API_ENABLED) +void CTestMessCreateSMS::ConCatMessageTextL(CSmsHeader& /*aHeader*/) + { + } +#else +void CTestMessCreateSMS::ConCatMessageTextL(CSmsHeader& aHeader) + //Doxygen compatible comments + /** + This method Concatenates the long message. Checks for the length of + body, if it is greater than 160 characters sets the concatenation + option on for the Sms. + + @param aHeader + Header for which the concatenation option is set on... + + */ + { + CSmsSettings* smsSettings = CSmsSettings::NewL(); + CleanupStack::PushL(smsSettings); + //if the length of the iBodyText is greater than the sms maximum length + //i.e 160 chars...Set the Concatenation On.... + if( aHeader.Message().MessageLengthL() > aHeader.Message().MaxMessageLength() ) + { + INFO_PRINTF1(_L("Concatenate Message...")); + INFO_PRINTF1(_L("Message Exceeds max length setting Concatenate On...")); + aHeader.GetSmsSettingsL(*smsSettings); + smsSettings->SetCanConcatenate(ETrue); + aHeader.SetSmsSettingsL(*smsSettings); + } + CleanupStack::PopAndDestroy(smsSettings); + } +#endif