diff -r 6385c4c93049 -r 8e6fa1719340 browserui/browser/BrowserAppSrc/BrowserBmOTABinSender.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserui/browser/BrowserAppSrc/BrowserBmOTABinSender.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,453 @@ +/* +* Copyright (c) 2002 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 "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: +* +* +*/ + + +// INCLUDE FILES + // System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + + // User includes +#include "BrowserAppUi.h" +#include "BrowserUtil.h" +#include "BrowserDialogs.h" +#include "BrowserBmOTABinSender.h" + + +// MACROS + +#ifndef _BOOKMARK_SENT_ASCII +// Calculates the byte size of 16bits (a) +#define TUINT16_LEN(a) ( sizeof(a) / sizeof(TUint16) ) +#endif + +// ================= LOCAL CONSTANTS ======================= + +/// Granularity of the bookmark list. +LOCAL_C const TInt KGranularity = 1; + +/// Attachment file name. +_LIT( KAttachmentFilename, "c:\\system\\temp\\Bookmark.txt"); + +#ifndef _BOOKMARK_SENT_ASCII +// Binary encoded BM data. See OTA spec +static const TUint16 Kch_lstart[] = { 0x00, 0x01, 0x00, 0x45 }; +static const TUint16 Kch_lend[] = { 0x01 }; +static const TUint16 Kch_start[] = { 0xC6,0x7F,0x01,0x87,0x15,0x11,0x03 }; +static const TUint16 Kch_mid[] = { 0x00,0x01,0x87,0x17,0x11,0x03 }; +static const TUint16 Kch_end[] = { 0x00,0x01,0x01 }; +#endif // _BOOKMARK_SENT_ASCII + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------------------------- +// CBookmarkOTAItem::CBookmarkOTAItem +// --------------------------------------------------------------------------- +// +CBookmarkOTAItem::CBookmarkOTAItem() + { + } + +// --------------------------------------------------------------------------- +// CBookmarkOTAItem::~CBookmarkOTAItem +// --------------------------------------------------------------------------- +// +CBookmarkOTAItem::~CBookmarkOTAItem() + { + delete iBookmark; + } + +// --------------------------------------------------------------------------- +// CBookmarkOTAItem::NewL +// --------------------------------------------------------------------------- +// +CBookmarkOTAItem* CBookmarkOTAItem::NewL( const TDesC& aUrl, const TDesC& aTitle ) + { + CBookmarkOTAItem *item = new (ELeave) CBookmarkOTAItem(); + CleanupStack::PushL( item ); + + item->ConstructL( aUrl, aTitle ); + + CleanupStack::Pop(); // item + + return item; + } + +// --------------------------------------------------------------------------- +// CBookmarkOTAItem::ConstructL +// --------------------------------------------------------------------------- +// +void CBookmarkOTAItem::ConstructL( const TDesC& aUrl, +#ifdef _BOOKMARK_SENT_ASCII + const TDesC& /*aTitle*/ ) +#else // _BOOKMARK_SENT_ASCII + const TDesC& aTitle ) +#endif // _BOOKMARK_SENT_ASCII + + { +#ifdef _BOOKMARK_SENT_ASCII + iBookmark = aUrl.AllocL(); +#else // _BOOKMARK_SENT_ASCII + TInt length = TUINT16_LEN( Kch_start ) + + TUINT16_LEN( Kch_mid ) + + TUINT16_LEN( Kch_end ); + + // calculate full length of BOOKMARK + length += aTitle.Length() + aUrl.Length(); + + iBookmark = HBufC::NewL( length ); + + TPtrC start( Kch_start, TUINT16_LEN(Kch_start) ); + TPtrC mid( Kch_mid, TUINT16_LEN(Kch_mid) ); + TPtrC end( Kch_end, TUINT16_LEN(Kch_end) ); + + iBookmark->Des().Append( start ); + iBookmark->Des().Append( aTitle ); + iBookmark->Des().Append( mid ); + iBookmark->Des().Append( aUrl ); + iBookmark->Des().Append( end ); + +#endif // _BOOKMARK_SENT_ASCII + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::NewL +// --------------------------------------------------------------------------- +// +CWmlBrowserBmOTABinSender* CWmlBrowserBmOTABinSender::NewL() + { + CWmlBrowserBmOTABinSender* sender = new (ELeave) + CWmlBrowserBmOTABinSender(); + CleanupStack::PushL( sender ); + + sender->ConstructL(); + + CleanupStack::Pop(); // sender + + return sender; + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::~CWmlBrowserBmOTABinSender +// --------------------------------------------------------------------------- +// +CWmlBrowserBmOTABinSender::~CWmlBrowserBmOTABinSender() + { + ResetAndDestroy(); + delete iSendUi; + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::ResetAndDestroy +// --------------------------------------------------------------------------- +// +void CWmlBrowserBmOTABinSender::ResetAndDestroy() + { + iBookmarks.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::AppendL +// --------------------------------------------------------------------------- +// +void CWmlBrowserBmOTABinSender::AppendL( const TText *aUrl, + const TText *aTitle ) + { + __ASSERT_DEBUG( (aUrl != NULL), Util::Panic( Util::EUninitializedData ) ); + TPtrC tempUrl( aUrl ); + CBookmarkOTAItem *item = NULL; + + if( !aTitle ) + { + _LIT( KEmptyText, "" ); + + item = CBookmarkOTAItem::NewL( tempUrl, (TDesC&)KEmptyText ); + } + else + { + TPtrC tempTitle( aTitle ); + + item = CBookmarkOTAItem::NewL( tempUrl, tempTitle ); + } + + CleanupStack::PushL( item ); + + iBookmarks.AppendL( item ); + + CleanupStack::Pop(); // item + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::AppendL +// --------------------------------------------------------------------------- +// +void CWmlBrowserBmOTABinSender::AppendL( const TDesC& aUrl, const TDesC& aTitle ) + { + CBookmarkOTAItem *item = CBookmarkOTAItem::NewL( aUrl, aTitle ); + CleanupStack::PushL( item ); + + iBookmarks.AppendL( item ); + + CleanupStack::Pop(); // item + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::SendAddressL +// --------------------------------------------------------------------------- +// +void CWmlBrowserBmOTABinSender::SendAddressL( ) + { + CMessageData* msgData = CMessageData::NewLC();//Cl St: 1 + __ASSERT_DEBUG( iBookmarks.Length(), + Util::Panic( Util::EUninitializedData ) ); + + // sending error indicator + // used with CreateAndSendMessageL() + // to free up allocated memory + // and than leave at the and of + // this function + TInt error = KErrNone; + + // calculate full length of OTA message + TInt length = 0; + + TSendingCapabilities capa; + CArrayFixFlat* servicesToDim = new(ELeave) CArrayFixFlat( 2 ); + CleanupStack::PushL( servicesToDim ); + servicesToDim->AppendL( KSenduiMtmAudioMessageUid ); + // service: audio message to dim + servicesToDim->AppendL( KSenduiMtmPostcardUid ); + // service: postcard to dim + TUid service = iSendUi->ShowSendQueryL(NULL, capa, servicesToDim, KNullDesC); + iSendUi->ServiceCapabilitiesL( service, capa ); + + CleanupStack::PopAndDestroy(); // destroy serviceToDim + +#ifndef _BOOKMARK_SENT_ASCII + length += TUINT16_LEN( Kch_lstart ) + TUINT16_LEN( Kch_lend ); +#endif // _BOOKMARK_SENT_ASCII + + for( TInt index = 0; index < iBookmarks.Count(); ++index ) + { + length += iBookmarks[index]->iBookmark->Length(); + } + +#ifdef _BOOKMARK_SENT_ASCII + // +1 '\n' per bookmarks + // no need '\n' after the last one + length += iBookmarks.Count() - 1; +#endif // _BOOKMARK_SENT_ASCII + + // body contains the binary sequence + HBufC* body = HBufC::NewLC( length ); + +#ifndef _BOOKMARK_SENT_ASCII + TPtrC lstart( Kch_lstart, TUINT16_LEN( Kch_lstart ) ); + TPtrC lend( Kch_lend, TUINT16_LEN( Kch_lend ) ); + // body starts with CHARACTERISTIC-LIST + body->Des().Append( lstart ); +#endif // _BOOKMARK_SENT_ASCII + + for( TInt index2 = 0; index2 < iBookmarks.Count(); ++index2 ) + { + // Append CHARACTERISTIC to CHARACTERISTIC-LIST + body->Des().Append( iBookmarks[index2]->iBookmark->Des().Ptr(), + iBookmarks[index2]->iBookmark->Length() ); + +#ifdef _BOOKMARK_SENT_ASCII + // append '\n' after ever bookmark except the last one + if( index2 < iBookmarks.Count() - 1 ) + { + _LIT( KNewLine, "\n" ); + body->Des().Append( KNewLine ); + } +#endif // _BOOKMARK_SENT_ASCII + } + +#ifndef _BOOKMARK_SENT_ASCII + // CHARACTERISTIC-LIST termination + body->Des().Append( lend ); +#endif // _BOOKMARK_SENT_ASCII + + // The issue is because of the deletion of the temp file . + // As we are sending address only , we can just create a buffer & send it in message + // body. + + if ( capa.iFlags & (TSendingCapabilities::ESupportsBodyText || TSendingCapabilities::ESupportsAttachments)) + { + CRichText* text = + CRichText::NewL(CEikonEnv::Static()->SystemParaFormatLayerL(), + CEikonEnv::Static()->SystemCharFormatLayerL()); + CleanupStack::PushL(text); + text->InsertL(0, *body); + msgData->SetBodyTextL( text ); + CleanupStack::PopAndDestroy(text ); + +#ifdef _BOOKMARK_SENT_ASCII + TRAP( error, iSendUi->CreateAndSendMessageL( service, msgData ) ); +#else + TRAP( error, iSendUi->CreateAndSendMessageL( service, + msgData, + KMsgBioUidWmlBrSettings ) ); +#endif // _BOOKMARK_SENT_ASCII + } + + ResetAndDestroy(); + + CleanupStack::PopAndDestroy( 2 ); // body, msgData + + // if any error occured during sending process + User::LeaveIfError( error ); + } + + + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::SendOPMLFileL +// --------------------------------------------------------------------------- +// +void CWmlBrowserBmOTABinSender::SendOPMLFileL(const TDesC& aOPMLFileName) + { + CMessageData* msgData = CMessageData::NewLC(); + + // sending error indicator + // used with CreateAndSendMessageL() + // to free up allocated memory + // and than leave at the and of + // this function + TInt error = KErrNone; + + TSendingCapabilities capa; + + CArrayFixFlat* servicesToDim = new(ELeave) CArrayFixFlat( 2 ); + CleanupStack::PushL( servicesToDim ); + servicesToDim->AppendL( KSenduiMtmAudioMessageUid ); + // service: audio message to dim + servicesToDim->AppendL( KSenduiMtmPostcardUid ); + // service: postcard to dim + TUid service = iSendUi->ShowSendQueryL(NULL, capa, servicesToDim, KNullDesC); + iSendUi->ServiceCapabilitiesL( service, capa ); + + CleanupStack::PopAndDestroy(); // destroy serviceToDim + + // body contains the binary sequence + //HBufC* body = HBufC::NewLC( aOPMLFileName.Length() ); + //body->Des().Copy( aOPMLFileName ); + + if ( capa.iFlags & TSendingCapabilities::ESupportsAttachments ) + { + // connect to file session + RFs fsSession; + User::LeaveIfError( fsSession.Connect() ); + CleanupClosePushL( fsSession ); + CFileMan* fman = CFileMan::NewL( fsSession ); + CleanupStack::PushL( fman ); + + // between WriteMessageBodyIntoFile() + // and CreateAndSendMessageL, or + // you have to take care of deleting + // temporary file + //error = WriteMessageBodyIntoFileL( fsSession, *body ); + + // send attachment + // this function has to be trapped + // because I have to be sure that the + // temproray file is removed! + msgData->AppendAttachmentL( aOPMLFileName ); + TRAP( error, iSendUi->CreateAndSendMessageL( service, + msgData ) ); + // delete temporary file + fman->Delete( aOPMLFileName ); + // close file session + fsSession.Close(); + + CleanupStack::PopAndDestroy( 2 ); // fsSession, fman + } + + CleanupStack::PopAndDestroy( 1 ); // msgData + + // if any error occured during sending process + User::LeaveIfError( error ); + } +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::ConstructL +// --------------------------------------------------------------------------- +// +void CWmlBrowserBmOTABinSender::ConstructL() + { + iSendUi = CSendUi::NewL(); + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::CWmlBrowserBmOTABinSender +// --------------------------------------------------------------------------- +// +CWmlBrowserBmOTABinSender::CWmlBrowserBmOTABinSender() +: iBookmarks( KGranularity ) + { + } + +// --------------------------------------------------------------------------- +// CWmlBrowserBmOTABinSender::WriteMessageBodyIntoFileL +// +// This function leaves only if the file creating failed. +// Do not need to be trapped to delete file. +// --------------------------------------------------------------------------- +// +TInt CWmlBrowserBmOTABinSender::WriteMessageBodyIntoFileL( RFs &fs, + TDesC& aBody ) + { + TInt result; + RFile otaFile; + TFileName filename( KAttachmentFilename ); + + if( (result = otaFile.Replace( fs, filename, EFileShareExclusive)) == + KErrNone ) + { + +#ifdef _BOOKMARK_SENT_ASCII + HBufC8 *tempBody = HBufC8::NewL( aBody.Length() ); + // convert 16bits -> 8bits + tempBody->Des().Copy( aBody ); + + // write message into file + result = otaFile.Write( *tempBody ); +#else // _BOOKMARK_SENT_ASCII + // put 16bits binary data to 8bits (double byte -> two byte) + TPtrC8 tempBody( (TUint8*)aBody.Ptr(), aBody.Length() * 2 ); + + // write message into file + result = otaFile.Write( tempBody ); +#endif // _BOOKMARK_SENT_ASCII + + otaFile.Close(); + } + + return result; + } + +// End of File +