// --------------------------------------------------------- // // --------------------------------------------------------- void CMmsAttachmentHandler::RemoveAttachmentL( TMsvAttachmentId aAttaId, CMsvStore& aStore ) { MMsvAttachmentManager& attaMan = aStore.AttachmentManagerL(); MMsvAttachmentManagerSync& attaManSync = aStore.AttachmentManagerExtensionsL(); // can only remove synchronously if index is known. TInt count = attaMan.AttachmentCount(); TInt i = count - 1; TBool found = EFalse; while ( i >= 0 && !found ) { CMsvAttachment* attachmentInfo = attaMan.GetAttachmentInfoL( i ); CleanupStack::PushL( attachmentInfo ); if ( attachmentInfo->Id() == aAttaId ) { found = ETrue; } else { i--; } CleanupStack::PopAndDestroy( attachmentInfo ); attachmentInfo = NULL; } if ( i >= 0 && found ) { attaManSync.RemoveAttachmentL( i ); } }
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)); }
void CMtfTestActionRemoveAllAttachments::ExecuteActionL() { TestCase().INFO_PRINTF2(_L("Test Action %S start..."), &KTestActionRemoveAllAttachments); CMsvSession* paramSession = ObtainParameterReferenceL<CMsvSession>(TestCase(),ActionParameters().Parameter(0)); TMsvId messageEntry = ObtainValueParameterL<TMsvId>(TestCase(),ActionParameters().Parameter(1)); TInt attachIdFlag = ObtainValueParameterL<TInt>(TestCase(),ActionParameters().Parameter(2), 0); CMsvEntry* entry = paramSession->GetEntryL(messageEntry); CleanupStack::PushL(entry); CMsvStore* store = entry->EditStoreL(); CleanupStack::PushL(store); MMsvAttachmentManager& manager = store->AttachmentManagerL(); TInt attachmentCount = manager.AttachmentCount(); for ( ; attachmentCount > 0 ; attachmentCount-- ) { CMtfAsyncWaiter* waiter = CMtfAsyncWaiter::NewL(); CleanupStack::PushL(waiter); if( attachIdFlag == 1 ) { CMsvAttachment* attachInfo = manager.GetAttachmentInfoL(0); CleanupStack::PushL(attachInfo); manager.RemoveAttachmentL(attachInfo->Id(), waiter->iStatus); CleanupStack::PopAndDestroy(attachInfo); } else { manager.RemoveAttachmentL(0, waiter->iStatus); } waiter->StartAndWait(); User::LeaveIfError(waiter->Result()); CleanupStack::PopAndDestroy(waiter); } store->CommitL(); CleanupStack::PopAndDestroy(2, entry); // store, entry TestCase().INFO_PRINTF2(_L("Test Action %S completed."), &KTestActionRemoveAllAttachments); TestCase().ActionCompletedL(*this); }
void CMtfTestActionAddEntryAttachment::RunTestL() { CMsvSession* paramSession = ObtainParameterReferenceL<CMsvSession>(TestCase(),ActionParameters().Parameter(0)); TMsvId messageEntry = ObtainValueParameterL<TMsvId>(TestCase(),ActionParameters().Parameter(1)); TMsvId attachmentMessageEntry = ObtainValueParameterL<TMsvId>(TestCase(),ActionParameters().Parameter(2)); CMsvEntry* entry = paramSession->GetEntryL(messageEntry); CleanupStack::PushL(entry); CMsvStore* store = entry->EditStoreL(); CleanupStack::PushL(store); CMtfAsyncWaiter* waiter = CMtfAsyncWaiter::NewL(); CleanupStack::PushL(waiter); CMsvAttachment* attachment = CMsvAttachment::NewL(CMsvAttachment::EMsvMessageEntry); CleanupStack::PushL(attachment); TMsvEntry attachmentEntry; TMsvId attachmentServiceEntry; User::LeaveIfError(paramSession->GetEntry(attachmentMessageEntry, attachmentServiceEntry, attachmentEntry)); attachment->SetSize(attachmentEntry.iSize); MMsvAttachmentManager& manager = store->AttachmentManagerL(); manager.AddEntryAsAttachmentL(attachmentMessageEntry, attachment, waiter->iStatus); CleanupStack::Pop(attachment); // ownership passed to manager waiter->StartAndWait(); User::LeaveIfError(waiter->Result()); CleanupStack::PopAndDestroy(waiter); TMsvAttachmentId attachmentId = attachment->Id(); store->CommitL(); CleanupStack::PopAndDestroy(2, entry); // store, entry StoreParameterL<TMsvAttachmentId>(TestCase(),attachmentId,ActionParameters().Parameter(3)); }
// --------------------------------------------------------- // 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 ); }