diff -r e8c1ea2c6496 -r 8758140453c0 email/email/smtp/src/T_SmtpCreateNewMessageWithPlainBodyText.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/email/smtp/src/T_SmtpCreateNewMessageWithPlainBodyText.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,313 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// @file +// [TestStep Name] +// SmtpCreateNewMessageWithPlainBodyText +// [Paramaters] +// Subject : Subject line of the message. +// FolderName : Destination local folder where message is to be created. +// RecipientsAddress: Recepient's address. +// EmailFileName : Plain text file name from which body text part would be populated. +// Creates a new message entry with plain body text. For creating the message entry it uses +// CImEmailOperation::CreateNewL() static metod. After creating the message entry +// it populates the body part with the contents of a plain text file. +// [APIs Used] +// CImPlainBodyText::CommitL +// CImPlainBodyText::StoreChunkL +// CImEmailOperation::CreateNewL +// CImEmailMessage::OpenPlainBodyTextForWriteL +// +// + + + +// User includes +#include "t_smtpcreatenewmessagewithplainbodytext.h" +#include +#include +#include + +// Epoc includes +#include +#include + +// Literals Used +_LIT(KSubject, "Subject"); +_LIT(KFolderName, "FolderName"); +_LIT(KEmailFileName, "EmailFileName"); +_LIT(KRecipientsAddress, "RecipientsAddress"); + +const TInt KChunkSize = 1024; + +/** + Function : CT_SmtpCreateNewMessageWithPlainBodyText + Description : Constructor + @param : aSharedDataSMTP Reference to CT_MsgSharedDataSmtp + @return : N/A +*/ +CT_SmtpCreateNewMessageWithPlainBodyText::CT_SmtpCreateNewMessageWithPlainBodyText(CT_MsgSharedDataSmtp& aSharedDataSMTP) +: CT_MsgAsyncStepSMTP(aSharedDataSMTP) +, iOperation(NULL) + { + SetTestStepName(KSmtpCreateNewMessageWithPlainBodyText); + } + + +/** + Function : NewL + Description : Creates an object of CT_SmtpCreateNewMessageWithPlainBodyText + @return : N/A +*/ +CT_SmtpCreateNewMessageWithPlainBodyText* CT_SmtpCreateNewMessageWithPlainBodyText::NewL(CT_MsgSharedDataSmtp& aSharedDataSMTP) + { + CT_SmtpCreateNewMessageWithPlainBodyText* self = new(ELeave) CT_SmtpCreateNewMessageWithPlainBodyText(aSharedDataSMTP); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +/** + Function : ~CT_SmtpCreateNewMessageWithPlainBodyText + Description : Destructor + @return : N/A +*/ +CT_SmtpCreateNewMessageWithPlainBodyText::~CT_SmtpCreateNewMessageWithPlainBodyText() + { + delete iRecipientAddress; + delete iOperation; + } + +/** + Function : ProgressL + Description : Displays the status of the asynchronous operation + @return : N/A +*/ +void CT_SmtpCreateNewMessageWithPlainBodyText::ProgressL(TBool /*bFinal*/) + {} + + +/** + Function : CancelStep + Description : Cancels the asynchronous operation + @return : N/A +*/ +void CT_SmtpCreateNewMessageWithPlainBodyText::CancelStep() + { + iOperation->Cancel(); + } + + +/** + Function : doTestStepL + Description : Reads the SMTP account name, folder names, download limts and the command name from + the ini file. A selection of the entries uner the remote folder is obtained and passed to + InvokeAsyncFunctionL based on the command. + @return : TVerdict - Test step result +*/ +TVerdict CT_SmtpCreateNewMessageWithPlainBodyText::doTestStepL() + { + INFO_PRINTF1(_L("TestStep: SmtpCreateNewMessageWithPlainBodyText")); + + // Read the name of the target folder from the ini file + TPtrC folderName; + if(!GetStringFromConfig( ConfigSection(), KFolderName, folderName)) + { + ERR_PRINTF1(_L("Folder name is not specified")); + SetTestStepResult(EFail); + } + + TMsvId folderId; + // Get the Id of the local folder + folderId= CT_MsgUtilsEnumConverter::FindFolderIdByName(folderName); + iSharedDataSMTP.iMtm->SwitchCurrentEntryL(folderId); + TImCreateMessageOptions createMessageOptions; + createMessageOptions.iMsvPartList = KMsvMessagePartBody; + createMessageOptions.iMessageType = KUidMsgTypeSMTP; + + TPckgBuf paramPack(createMessageOptions); + + CT_MsgActive& active=Active(); + delete iOperation; + iOperation = NULL; + TRAPD(err2, iOperation = CImEmailOperation::CreateNewL(active.iStatus, *iSharedDataSMTP.iSession, folderId,KMsvNullIndexEntryId, paramPack().iMsvPartList, paramPack().iMsvEmailTypeList, paramPack().iMessageType, CActive::EPriorityStandard, ETrue)); + active.Activate(); + CActiveScheduler::Start(); + + SetHeaderPartL(); + PopulateBodyPartL(); + User::LeaveIfError(active.Result()); + INFO_PRINTF2(_L("err2 : %d"), err2); + return TestStepResult(); + } + + +/** + Function : PopulateBodyPartL + Description : Populates body part with the contents of a plain text file. + @return : N/A +*/ +void CT_SmtpCreateNewMessageWithPlainBodyText::PopulateBodyPartL() + { + //Get the message ID from the CMsvOperation object + TMsvId temp; + TPckgC paramPack(temp); + const TDesC8& progBuf = iOperation->ProgressL(); + paramPack.Set(progBuf); + TMsvId newMessageId = paramPack(); + if (newMessageId!=NULL) + { + CMsvEntry *entry = CMsvEntry::NewL(*(iSharedDataSMTP.iSession), newMessageId, TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone,ETrue)); + CleanupStack::PushL(entry); + entry->SetEntryL(newMessageId); + CImEmailMessage *emailMessage = CImEmailMessage::NewLC(*entry); + CImPlainBodyText* bodytext = emailMessage->OpenPlainBodyTextForWriteL(); + CleanupStack::PushL(bodytext); + + + TPtrC emailFileName; + // Read the name of the email file from the ini + if(!GetStringFromConfig(ConfigSection(),KEmailFileName,emailFileName)) + { + ERR_PRINTF1(_L("Email file name not specified")); + SetTestStepResult(EFail); + } + else + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFile file; + User::LeaveIfError(file.Open(fs,emailFileName,EFileRead)); + CleanupClosePushL(file); + + + TBuf8 line; + TBuf8<1> aChar; // To read one character from the file + TBool finished = FALSE; + + // Read text from the file + do + { + line.FillZ(); + line.SetLength(0); + // Read one line from email file + do + { + file.Read(aChar, 1); + if(aChar.Length()) + { + line.Append(aChar); + } + else + { + finished = TRUE; + } + }while(aChar.Length() && aChar[0] != 0x0A); + if(!line.Length()) + { + break; + } + CT_MsgActive& active=Active(); + bodytext->StoreChunkL(line,active.iStatus); + active.Activate(); + CActiveScheduler::Start(); + }while(!finished); + + CT_MsgActive& active=Active(); + bodytext->CommitL(active.iStatus); + active.Activate(); + CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy(2); // delete file,fs + } + CleanupStack::PopAndDestroy(3, entry); // delete bodytext,emailMessage,entry + } + } + + +/** + Function : GetDefaultAddressL + Description : Retrieve the default email address from the default SMTP service. + @return : N/A +*/ +void CT_SmtpCreateNewMessageWithPlainBodyText::GetDefaultAddressL() + { + CImSmtpSettings* settings = new(ELeave) CImSmtpSettings(); + CleanupStack::PushL(settings); + + CEmailAccounts* accounts = CEmailAccounts::NewLC(); + TSmtpAccount smtpAccount; + smtpAccount.iSmtpService = KMsvNullIndexEntryId; + accounts->DefaultSmtpAccountL(smtpAccount); + accounts->LoadSmtpSettingsL(smtpAccount, *settings); + CleanupStack::PopAndDestroy(accounts); // accounts + iRecipientAddress = settings->EmailAddress().AllocL(); + INFO_PRINTF2(_L("Default Email Address is %s"),iRecipientAddress->Ptr()); + CleanupStack::PopAndDestroy(settings); // settings + } + + +/** + Function : SetHeaderPartL + Description : Sets the message header fields. If the field values are not provided + as input, it takes the default values. + @return : N/A +*/ +void CT_SmtpCreateNewMessageWithPlainBodyText::SetHeaderPartL() + { + //check progress + TMsvId temp; + TPckgC paramPack(temp); + const TDesC8& progBuf = iOperation->ProgressL(); + paramPack.Set(progBuf); + TMsvId newMessageId = paramPack(); + if (newMessageId!=NULL) + { + CMsvEntry *entry = CMsvEntry::NewL(*(iSharedDataSMTP.iSession), newMessageId, TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone,ETrue)); + CleanupStack::PushL(entry); + entry->SetEntryL(newMessageId); // + CMsvStore* store = entry->EditStoreL(); + CleanupStack::PushL(store); + + CImHeader* header = CImHeader::NewLC(); + header->RestoreL(*store); // Retrieves the email message header part from the message store + TPtrC subject; + if(GetStringFromConfig(ConfigSection(), KSubject, subject)) + { + header->SetSubjectL(subject); + } + TPtrC recipientsAddress; + if(GetStringFromConfig(ConfigSection(), KRecipientsAddress, recipientsAddress)) + { + header->ToRecipients().AppendL(recipientsAddress); + } + else + { + GetDefaultAddressL(); + header->ToRecipients().AppendL(*iRecipientAddress); + } + header->StoreL(*store); + store->CommitL(); // Saves the modifications to message store + TMsvEntry indexEntry = entry->Entry(); + indexEntry.iDescription.Set(header->Subject()); + INFO_PRINTF2(_L("Subject field created message : %S"), &(indexEntry.iDescription)); + indexEntry.SetVisible(ETrue); + entry->ChangeL(indexEntry); // Modify the corresponding index entry permanently + + CleanupStack::PopAndDestroy(3,entry); // header, store, entry + } + }