void CMtfTestActionAddAttachmentAsLink::RunTestL() { CMsvStore* paramStore = ObtainParameterReferenceL<CMsvStore>(TestCase(),ActionParameters().Parameter(0)); HBufC* paramFilePath = ObtainParameterReferenceL<HBufC>(TestCase(),ActionParameters().Parameter(1)); HBufC8* paramMimeType = ObtainParameterReferenceL<HBufC8>(TestCase(),ActionParameters().Parameter(2)); CMtfAsyncWaiter* waiter = CMtfAsyncWaiter::NewL(); CleanupStack::PushL(waiter); CMsvAttachment* attachment = CMsvAttachment::NewL(CMsvAttachment::EMsvLinkedFile); CleanupStack::PushL(attachment); attachment->SetMimeTypeL(*paramMimeType); TParse fileNameParser; User::LeaveIfError(fileNameParser.Set(*paramFilePath, NULL, NULL)); attachment->SetAttachmentNameL(fileNameParser.NameAndExt()); MMsvAttachmentManager& manager = paramStore->AttachmentManagerL(); manager.AddLinkedAttachmentL(*paramFilePath, attachment, waiter->iStatus); CleanupStack::Pop(attachment); // ownership passed to manager waiter->StartAndWait(); User::LeaveIfError(waiter->Result()); CleanupStack::PopAndDestroy(waiter); TMsvAttachmentId attachmentId = attachment->Id(); paramStore->CommitL(); StoreParameterL<TMsvAttachmentId>(TestCase(),attachmentId,ActionParameters().Parameter(3)); }
void CMtfTestActionSmtpAddLinkedAttachment::RunTestL() { CMsvSession* paramSession = ObtainParameterReferenceL<CMsvSession>(TestCase(),ActionParameters().Parameter(0)); TMsvId messageEntry = ObtainValueParameterL<TMsvId>(TestCase(),ActionParameters().Parameter(1)); HBufC* paramFilePath = ObtainParameterReferenceL<HBufC>(TestCase(),ActionParameters().Parameter(2)); HBufC8* paramMimeType = ObtainParameterReferenceL<HBufC8>(TestCase(),ActionParameters().Parameter(3)); CMsvEntry* entry = paramSession->GetEntryL(messageEntry); CleanupStack::PushL(entry); CImEmailMessage* emailMsg = CImEmailMessage::NewL(*entry); CleanupStack::PushL(emailMsg); CMtfAsyncWaiter* waiter = CMtfAsyncWaiter::NewL(); CleanupStack::PushL(waiter); CMsvAttachment* attachment = CMsvAttachment::NewL(CMsvAttachment::EMsvLinkedFile); CleanupStack::PushL(attachment); attachment->SetMimeTypeL(*paramMimeType); TParse fileNameParser; User::LeaveIfError(fileNameParser.Set(*paramFilePath, NULL, NULL)); attachment->SetAttachmentNameL(fileNameParser.NameAndExt()); TEntry fileEntry; User::LeaveIfError(paramSession->FileSession().Entry( fileNameParser.FullName(), fileEntry)); attachment->SetSize(fileEntry.iSize); MMsvAttachmentManager& manager = emailMsg->AttachmentManager(); manager.AddLinkedAttachmentL(*paramFilePath, attachment, waiter->iStatus); CleanupStack::Pop(attachment); // ownership passed to manager waiter->StartAndWait(); User::LeaveIfError(waiter->Result()); CleanupStack::PopAndDestroy(waiter); attachment = NULL; TInt attachmentCount = manager.AttachmentCount(); attachment = manager.GetAttachmentInfoL(attachmentCount - 1); CleanupStack::PushL(attachment); TMsvAttachmentId attachmentId = attachment->Id(); CleanupStack::PopAndDestroy(attachment); CleanupStack::PopAndDestroy(2, entry); // emailMsg, entry StoreParameterL<TMsvAttachmentId>(TestCase(),attachmentId,ActionParameters().Parameter(4)); }
EXPORT_C void CSmtpClientMtm::AddLinkedAttachmentL(const TDesC& aFilePath, const TDesC8& aMimeType, TUint aCharset, TRequestStatus& aStatus) { __ASSERT_DEBUG(iMsvEntry->Entry().iType.iUid==KUidMsvMessageEntryValue, gPanic(ESmtcMTMNotAMessageEntry)); if( iAttachmentWaiter == NULL ) { iAttachmentWaiter = CImAttachmentWaiter::NewL(); } if (iEmailMessage == NULL) { iEmailMessage = CImEmailMessage::NewL(*iMsvEntry); } else if (iEmailMessage->EmailEntryId() != iMsvEntry->EntryId()) { delete iEmailMessage; iEmailMessage = NULL; iEmailMessage = CImEmailMessage::NewL(*iMsvEntry); } CMsvAttachment* attachmentInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvLinkedFile); CleanupStack::PushL(attachmentInfo); attachmentInfo->SetMimeTypeL(aMimeType); TParse fileNameParser; User::LeaveIfError(fileNameParser.Set(aFilePath, NULL, NULL)); attachmentInfo->SetAttachmentNameL(fileNameParser.NameAndExt()); if( aCharset!=0 ) { CMsvMimeHeaders* headers = CMsvMimeHeaders::NewLC(); headers->SetMimeCharset(aCharset); headers->StoreL(*attachmentInfo); CleanupStack::PopAndDestroy(headers); } iEmailMessage->AttachmentManager().AddLinkedAttachmentL(aFilePath, attachmentInfo, iAttachmentWaiter->iStatus); CleanupStack::Pop(attachmentInfo);// ownership passed to attachment manager iAttachmentWaiter->StartWaitingL(aStatus, iEmailMessage, EFalse); }
// --------------------------------------------------------- // CMmsAttachmentHandler::CreateUTF8TextAttachmentFromFileL // --------------------------------------------------------- EXPORT_C void CMmsAttachmentHandler::CreateUTF8TextAttachmentFromFileL( CMsvStore& aStore, TMsvAttachmentId& aAttachmentId, RFile& aFile, RFs& aFs, TDriveUnit aMessageDrive ) { _LIT8 ( KMmsCrLf8, "\x00D\x00A" ); // 8 bit line feed TInt size = 0; TInt error = KErrNone; error = aFile.Size( size ); User::LeaveIfError( error ); // if can't get file size, we are in trouble TFileName* filename = new( ELeave ) TFileName; CleanupStack::PushL( filename ); // 256 characters for each read HBufC* textBuffer = HBufC::NewL( KMmsTextBufferSize ); CleanupStack::PushL( textBuffer ); TPtr textPtr = textBuffer->Des(); HBufC8* buffer = HBufC8::NewL( KMmsTextBufferSize * KMmsMaxBytesPerCharacter ); // paranoid. TInt fileSize = 0; // we don't know how big the file will be after conversion CleanupStack::PushL( buffer ); TPtr8 buf8 = buffer->Des(); CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL(); CleanupStack::PushL( mimeHeaders ); // attaInfo must be on top of stack because the ownership will be transferred // to attacment manager. CMsvAttachment* attaInfo = CMsvAttachment::NewL( CMsvAttachment::EMsvFile ); CleanupStack::PushL( attaInfo ); TPtrC8 contentType; contentType.Set( KMmsTextPlain ); TInt position = contentType.Find( KMmsSlash8 ); mimeHeaders->SetContentTypeL( contentType.Left( position ) ); mimeHeaders->SetContentSubTypeL( contentType.Mid( position + 1 ) ); attaInfo->SetMimeTypeL( contentType ); filename->Copy( TPtrC() ); aFile.Name( *filename ); // if this returns error, filename should be empty - no suggestion. attaInfo->SetAttachmentNameL( *filename ); mimeHeaders->SetSuggestedFilenameL( *filename ); mimeHeaders->SetMimeCharset( KMmsUtf8 ); if ( TMmsGenUtils::DiskSpaceBelowCriticalLevelL( &aFs, size * KMmsUnicodeToUtf2MaxIncrease + mimeHeaders->Size() + KMmsIndexEntryExtra, aMessageDrive ) ) { // we use standard error code here User::Leave( KErrDiskFull ); } mimeHeaders->StoreL( *attaInfo ); // Mime headers are streamed into atta info MMsvAttachmentManagerSync& attaManSync = aStore.AttachmentManagerExtensionsL(); RFile attaFile; attaManSync.CreateAttachmentL( *filename, attaFile, attaInfo ); CleanupStack::Pop( attaInfo ); // attaInfo ownership was transferred. aAttachmentId = attaInfo->Id(); // Now our file handle is open for writing error = KErrNone; TMmsFileText textFile; textFile.Set( aFile ); while ( error == KErrNone || error == KErrTooBig ) { error = textFile.Read( textPtr ); TBool appendCRLF = ETrue; if ( error == KErrTooBig ) { appendCRLF = EFalse; error = KErrNone; } if ( error != KErrEof ) { // if conversion fails, something is really seriously wrong error = CnvUtfConverter::ConvertFromUnicodeToUtf8( buf8, textPtr ); } if ( error == KErrNone ) { error = attaFile.Write( buf8 ); if ( error == KErrNone ) { fileSize += buf8.Length(); if ( appendCRLF ) { error = attaFile.Write( KMmsCrLf8 ); fileSize += KMmsLengthOfCRlf; // add length of carriage return/line feed } } } } if ( error == KErrEof ) { // end of file has been reached successfully error = KErrNone; } if ( error == KErrNone ) { error = attaFile.Flush(); } attaFile.Close(); if ( error != KErrNone ) { // Something went wrong when we tried to write our data. // We must delete the attachment as it does not contain the // intended data. RemoveAttachmentL( aAttachmentId, aStore ); aAttachmentId = 0; } else { // If data writing was successful, the amount of data written // is now stored in fileSize. // Attachment info structure must be updated MMsvAttachmentManager& attaMan = aStore.AttachmentManagerL(); attaInfo = attaMan.GetAttachmentInfoL( aAttachmentId ); CleanupStack::PushL( attaInfo ); attaInfo->SetSize( fileSize ); attaManSync.ModifyAttachmentInfoL( attaInfo ); // attachment manager now owns the attachment info CleanupStack::Pop( attaInfo ); // attaInfo } CleanupStack::PopAndDestroy( mimeHeaders ); CleanupStack::PopAndDestroy( buffer ); CleanupStack::PopAndDestroy( textBuffer ); CleanupStack::PopAndDestroy( filename ); User::LeaveIfError( error ); }
// --------------------------------------------------------- // CMmsAttachmentHandler::CreateTextAttachmentL // --------------------------------------------------------- EXPORT_C void CMmsAttachmentHandler::CreateTextAttachmentL( CMsvStore& aStore, TMsvAttachmentId& aAttachmentId, const TDesC& aText, const TDesC& aFile, RFs& aFs, TDriveUnit aMessageDrive, TBool aConvertParagraphSeparator /*= ETrue*/ ) { HBufC* convertedText = NULL; TPtrC text; if ( aConvertParagraphSeparator ) { convertedText = CMsgTextUtils::ConvertParagraphSeparatorsLC( aText ); text.Set( convertedText->Des() ); } else { text.Set( aText ); } const TInt KMmsMaxBytesPerCharacter = 4; // coverity[incorrect_multiplication][buffer_alloc] HBufC8* buffer = HBufC8::NewL( text.Length() * KMmsMaxBytesPerCharacter ); // paranoid. CleanupStack::PushL( buffer ); TPtr8 buf8 = buffer->Des(); CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL(); CleanupStack::PushL( mimeHeaders ); // attaInfo must be on top of stack because the ownership will be transferred // to attacment manager. CMsvAttachment* attaInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvFile); CleanupStack::PushL( attaInfo ); TPtrC8 contentType; contentType.Set( KMmsTextPlain ); TInt position = contentType.Find( KMmsSlash8 ); mimeHeaders->SetContentTypeL( contentType.Left( position ) ); mimeHeaders->SetContentSubTypeL( contentType.Mid( position + 1 ) ); attaInfo->SetMimeTypeL( contentType ); attaInfo->SetAttachmentNameL( aFile ); mimeHeaders->SetMimeCharset( KMmsUtf8 ); mimeHeaders->SetSuggestedFilenameL( aFile ); // if conversion fails, something is really seriously wrong TInt error = CnvUtfConverter::ConvertFromUnicodeToUtf8( buf8, text ); if ( TMmsGenUtils::DiskSpaceBelowCriticalLevelL( &aFs, buf8.Length() + mimeHeaders->Size() + KMmsIndexEntryExtra, aMessageDrive ) ) { // we use standard error code here User::Leave( KErrDiskFull ); } else { User::LeaveIfError( error ); } attaInfo->SetSize( buf8.Length() ); mimeHeaders->StoreL( *attaInfo ); // Mime headers are streamed into atta info MMsvAttachmentManagerSync& attaManSync = aStore.AttachmentManagerExtensionsL(); RFile attaFile; attaManSync.CreateAttachmentL( aFile, attaFile, attaInfo ); CleanupStack::Pop( attaInfo ); // attaInfo ownership was transferred. aAttachmentId = attaInfo->Id(); // Now our file handle is open for writing if ( buf8.Length() > 0 ) { attaFile.Write( buf8 ); error = attaFile.Flush(); } attaFile.Close(); if ( error != KErrNone ) { // Something went wrong when we tried to write our data. // We must delete the attachment as it does not contain the // intended data. RemoveAttachmentL( aAttachmentId, aStore ); aAttachmentId = 0; } CleanupStack::PopAndDestroy( mimeHeaders ); CleanupStack::PopAndDestroy( buffer ); if ( convertedText ) { CleanupStack::PopAndDestroy( convertedText ); convertedText = NULL; } User::LeaveIfError( error ); }