diff -r 6385c4c93049 -r 8e6fa1719340 pushmtm/MtmUiSrc/PushMessageInfoDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pushmtm/MtmUiSrc/PushMessageInfoDialog.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,536 @@ +/* +* 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: Member definitions of CPushMessageInfoDialog. +* +*/ + + + +// INCLUDES + +#include "PushMessageInfoDialog.h" +#include "PushMtmUiDef.h" +#include "PushMtmUiPanic.h" +#include "PushMtmUtil.h" +#include "PushMtmLog.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "PushMtmPrivateCRKeys.h" +#include +// CONSTANTS +LOCAL_D const TInt KNoResource = 0; +LOCAL_D const TInt KArrayGranularity = 16; +LOCAL_D const TReal KReal1024 = 1024.0; +_LIT( KTab, "\t" ); +_LIT( KSpace, " " ); + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CPushMessageInfoDialog::CPushMessageInfoDialog +// --------------------------------------------------------- +// +CPushMessageInfoDialog::CPushMessageInfoDialog() +: CAknPopupList(), + iResourceLoader( *iCoeEnv ) + { + } + +// --------------------------------------------------------- +// CPushMessageInfoDialog::~CPushMessageInfoDialog +// --------------------------------------------------------- +// +CPushMessageInfoDialog::~CPushMessageInfoDialog() + { + iSecondColumnFont = 0; + iResourceLoader.Close(); + delete iListBox; + delete iListBoxModel; + FeatureManager::UnInitializeLib(); + } + +// --------------------------------------------------------- +// CPushMessageInfoDialog::ExecuteLD +// --------------------------------------------------------- +// +void CPushMessageInfoDialog::ExecuteLD( CMsvSession& aMsvSession, TMsvId aId ) + { + ConstructL( aMsvSession, aId ); + CAknPopupList::ExecuteLD(); + } + +// --------------------------------------------------------- +// CPushMessageInfoDialog::ConstructL +// --------------------------------------------------------- +// +void CPushMessageInfoDialog::ConstructL( CMsvSession& aMsvSession, TMsvId aId ) + { + PUSHLOG_ENTERFN("CPushMessageInfoDialog::ConstructL"); + __ASSERT_DEBUG( !iListBox && + !iListBoxModel, + UiPanic( EPushMtmUiPanAlreadyInitialized ) ); + + FeatureManager::InitializeLibL(); + + CRepository* PushSL = CRepository::NewL( KCRUidPushMtm ); + CleanupStack::PushL( PushSL ); + User::LeaveIfError( PushSL->Get( KPushMtmServiceEnabled , iPushSLEnabled ) ); + PUSHLOG_WRITE_FORMAT(" iPushSLEnabled: <%d>",iPushSLEnabled); + CleanupStack::PopAndDestroy( PushSL ); + + // Add resource file. + TParse* fileParser = new (ELeave) TParse; + // Unnecessary to call CleanupStack::PushL( fileParser ); + fileParser->Set( KPushMtmUiResourceFileAndDrive, &KDC_MTM_RESOURCE_DIR, NULL ); + iResourceFile = fileParser->FullName(); + PUSHLOG_WRITE_FORMAT(" iResourceFile: <%S>",&iResourceFile); + delete fileParser; + fileParser = NULL; + iResourceLoader.OpenL( iResourceFile ); + PUSHLOG_WRITE(" iResourceFile opened"); + + // Construct list box's model first + // This list box will be used by an CAknPopupList object. + __ASSERT_DEBUG( !iListBoxModel && !iListBox, + UiPanic( EPushMtmUiPanAlreadyInitialized ) ); + iListBoxModel = new (ELeave) CDesCArrayFlat( KArrayGranularity ); + // Construct list box. + iListBox = new (ELeave) CAknSingleHeadingPopupMenuStyleListBox; + + // ======================================================== + // Layout info of CAknSingleHeadingPopupMenuStyleListBox + TAknTextLineLayout textLayout = + AknLayout::List_pane_texts__menu_single_heading__Line_2(0); + + // Font of the second column of the given list box + iSecondColumnFont = AknLayoutUtils::FontFromId( textLayout.FontId() ); + + // Line width of the second column of the given list box + TInt itemCount = 0; // No need to set + TInt titleVisible = 1; // known value (we always have title) + TRect main_pane = iAvkonAppUi->ClientRect(); + + TAknLayoutRect popup_menu_graphic_window; + popup_menu_graphic_window.LayoutRect( main_pane, + AknLayout::popup_menu_graphic_window(itemCount) ); + + TAknLayoutRect menu_heading_pane; + menu_heading_pane.LayoutRect( popup_menu_graphic_window.Rect(), + AknLayout::list_menu_heading_pane(titleVisible, itemCount) ); + + TAknLayoutRect list_item; + list_item.LayoutRect( menu_heading_pane.Rect(), + AknLayout::list_single_heading_popup_menu_pane(itemCount) ); + + TAknLayoutText text; + text.LayoutText( list_item.Rect(), textLayout ); + + iSecondColumnWidth = text.TextRect().Width(); + // ======================================================== + + // Add items to the list. + AddMessageInfoItemsL( aMsvSession, aId ); + + CAknPopupList::ConstructL( iListBox, + R_AVKON_SOFTKEYS_OK_EMPTY__OK, + AknPopupLayouts::EMenuGraphicHeadingWindow ); + + iListBox->ConstructL( this, EAknListBoxViewerFlags ); + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL + ( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + CTextListBoxModel* listBoxModel = iListBox->Model(); + listBoxModel->SetItemTextArray( iListBoxModel ); + listBoxModel->SetOwnershipType( ELbmDoesNotOwnItemArray ); + + // Get title text of popup list + HBufC* title = iCoeEnv->AllocReadResourceLC( R_PUSHMID_TITLE ); + PUSHLOG_WRITE(" R_PUSHMID_TITLE read"); + SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); // title + + PUSHLOG_LEAVEFN("CPushMessageInfoDialog::ConstructL"); + } + +// --------------------------------------------------------- +// CPushMessageInfoDialog::AddMessageInfoItemL +// --------------------------------------------------------- +// +void CPushMessageInfoDialog::AddMessageInfoItemL( TInt aHeaderResourceId, + const TDesC& aText ) const + { + __ASSERT_DEBUG( iListBoxModel, UiPanic( EPushMtmUiPanNotInitialized ) ); + + // Make some necessary conversion. + HBufC* paramTextCopy = aText.AllocLC(); + TPtr paramTextCopyPtr = paramTextCopy->Des(); + // Remove tabs, because of the list box... + AknTextUtils::StripCharacters( paramTextCopyPtr, KAknStripListControlChars ); + // Number conversion + if ( paramTextCopyPtr.Length() > 0 ) + { + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( paramTextCopyPtr ); + } + + HBufC* header = ( aHeaderResourceId == KNoResource ? + KNullDesC().AllocLC() : + iCoeEnv->AllocReadResourceLC( aHeaderResourceId ) ); + + CArrayFix* wrappedArray = + new ( ELeave ) CArrayFixFlat( KArrayGranularity ); + CleanupStack::PushL( wrappedArray ); + + AknTextUtils::WrapToArrayL + ( paramTextCopyPtr, iSecondColumnWidth, + *iSecondColumnFont, *wrappedArray ); + // visual is directly not used, but wrappedArray points to it + + // Add the lines in wrappedArray to the list + const TInt lines = wrappedArray->Count(); + for ( TInt loop = 0; loop < lines; ++loop ) + { + TPtrC current = ( *wrappedArray )[loop]; + // Allocate a buffer for the new list box item text + // (including header, separator and wrapped text) + HBufC* currentFormattedLine = HBufC::NewLC + ( ((loop==0) ? header->Length() : /*KSpace().Length()*/1) + + /*KTab().Length()*/1 + current.Length() ); + TPtr currentFormattedLinePtr = currentFormattedLine->Des(); // writeable + + if ( loop == 0 ) + { currentFormattedLinePtr.Copy( *header ); } + else + { currentFormattedLinePtr.Copy( KSpace ); } + + currentFormattedLinePtr.Append( KTab ); + currentFormattedLinePtr.Append( current ); + iListBoxModel->AppendL( currentFormattedLinePtr ); + + CleanupStack::PopAndDestroy( currentFormattedLine ); // currentFormattedLine + } + + CleanupStack::PopAndDestroy( 1, wrappedArray ); // wrappedArray + CleanupStack::PopAndDestroy( 2, paramTextCopy ); // header, paramTextCopy + } + +// --------------------------------------------------------- +// CPushMessageInfoDialog::ConvertUniversalToHomeTime +// --------------------------------------------------------- +// +TTime CPushMessageInfoDialog::ConvertUniversalToHomeTime + ( const TTime& aUniversalTime ) const + { + TTime time( aUniversalTime ); // time stores UTC time. + + TLocale locale; + TTimeIntervalSeconds universalTimeOffset( locale.UniversalTimeOffset() ); + // Add locale's universal time offset to universal time. + time += universalTimeOffset; // time stores Local Time. + + // If home daylight saving in effect, add one hour offset. + if ( locale.QueryHomeHasDaylightSavingOn() ) + { + TTimeIntervalHours daylightSaving(1); + time += daylightSaving; // Now it is Home Time. + } + +#ifdef __TEST_LOG__ + // The following section will call LEAVEable functions, but + // they are only for logging purposes. + _LIT( KDateFormat, "%E%D%X%N%Y %1 %2 %3" ); + _LIT( KTimeFormat, "%-B%:0%J%:1%T%:2%S%:3%+B" ); + TBuf<32> dateHolder; + TBuf<32> timeHolder; + aUniversalTime.FormatL( dateHolder, KDateFormat ); + aUniversalTime.FormatL( timeHolder, KTimeFormat ); + PUSHLOG_WRITE_FORMAT(" UTC date: <%S>",&dateHolder); + PUSHLOG_WRITE_FORMAT(" UTC time: <%S>",&timeHolder); + time.FormatL( dateHolder, KDateFormat ); + time.FormatL( timeHolder, KTimeFormat ); + PUSHLOG_WRITE_FORMAT(" Home date: <%S>",&dateHolder); + PUSHLOG_WRITE_FORMAT(" Home time: <%S>",&timeHolder); +#endif // __TEST_LOG__ + + return time; // Home Time. + } + +// --------------------------------------------------------- +// CPushMessageInfoDialog::AddMessageInfoItemsL +// --------------------------------------------------------- +// +void CPushMessageInfoDialog::AddMessageInfoItemsL( CMsvSession& aMsvSession, + TMsvId aId ) const + { + PUSHLOG_ENTERFN("CPushMessageInfoDialog::AddMessageInfoItemsL"); + + TMsvEntry tEntry; + TMsvId dummyService; + User::LeaveIfError( aMsvSession.GetEntry( aId, dummyService, tEntry ) ); + PUSHLOG_WRITE(" Entry got"); + __ASSERT_DEBUG + ( tEntry.iMtm == KUidMtmWapPush, UiPanic( EPushMtmUiPanBadType ) ); + + // Construct model. + CPushMsgEntryBase* msg = NULL; + const TInt32 bioType( tEntry.iBioType ); + if ( bioType == KUidWapPushMsgSI.iUid ) + { + msg = CSIPushMsgEntry::NewL(); + PUSHLOG_WRITE(" SI"); + } + else if(iPushSLEnabled && bioType == KUidWapPushMsgSL.iUid) + { + msg = CSLPushMsgEntry::NewL(); + PUSHLOG_WRITE(" SL"); + } +#ifdef __SERIES60_PUSH_SP + else if ( bioType == KUidWapPushMsgUnknown.iUid ) + { + msg = CUnknownPushMsgEntry::NewL(); + PUSHLOG_WRITE(" Unknown"); + } +#endif // __SERIES60_PUSH_SP + else + { + PUSHLOG_WRITE(" Bad message type"); + User::Leave( KErrNotSupported ); + } + + CleanupStack::PushL( msg ); + msg->RetrieveL( aMsvSession, tEntry.Id() ); + PUSHLOG_WRITE(" RetreiveL OK"); + + // ************************************************************************ + // Information item: From (push initiator). + // This can be MSISDN number, URL, etc. + // ************************************************************************ + TPtrC8 from8( msg->From() ); + if ( from8.Length() ) + { + // Copy the 8-bit text into a 16-bit one and convert the string to + // decoded form. + HBufC* from16 = HBufC::NewMaxLC( from8.Length() ); + from16->Des().Copy( from8 ); + + HBufC* convertedFrom = + CPushMtmUtil::ConvertUriToDisplayFormL( *from16 ); + CleanupStack::PushL( convertedFrom ); + // + AddMessageInfoItemL( R_PUSHMID_FROM, *convertedFrom ); + PUSHLOG_WRITE(" From added"); + // + CleanupStack::PopAndDestroy( 2, from16 ); // convertedFrom, from16 + } + + // ************************************************************************ + // Information item: Address/URL (SI and SL specific). + // ************************************************************************ + if ( msg->PushMsgType() == KUidWapPushMsgSI.iUid ) + { + CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, msg ); + const TPtrC url = si->Url(); + if ( url.Length() ) + { + // + HBufC* convertedUrl = + CPushMtmUtil::ConvertUriToDisplayFormL( url ); + CleanupStack::PushL( convertedUrl ); + // + AddMessageInfoItemL( R_PUSHMID_URL, *convertedUrl ); + PUSHLOG_WRITE(" URL added"); + // + CleanupStack::PopAndDestroy( convertedUrl ); + } + } + else if ( iPushSLEnabled && msg->PushMsgType() == KUidWapPushMsgSL.iUid ) + { + CSLPushMsgEntry* sl = STATIC_CAST( CSLPushMsgEntry*, msg ); + const TPtrC url = sl->Url(); + if ( url.Length() ) + { + // + HBufC* convertedUrl = + CPushMtmUtil::ConvertUriToDisplayFormL( url ); + CleanupStack::PushL( convertedUrl ); + // + AddMessageInfoItemL( R_PUSHMID_URL, sl->Url() ); + PUSHLOG_WRITE(" URL added"); + // + CleanupStack::PopAndDestroy( convertedUrl ); + } + } + + // ************************************************************************ + // Information item: Message body/text (SI specific). + // ************************************************************************ + if ( msg->PushMsgType() == KUidWapPushMsgSI.iUid ) + { + CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, msg ); + if ( si->Text().Length() ) + { + TPtrC siText = si->Text(); + PUSHLOG_WRITE_FORMAT(" SI text: <%S>",&siText); + AddMessageInfoItemL( R_PUSHMID_BODY, siText ); + PUSHLOG_WRITE(" SI text added"); + } + } + + // ************************************************************************ + // Information item: Type. + // ************************************************************************ + HBufC* value = iCoeEnv->AllocReadResourceLC( R_PUSHMID_TYPE_STR ); + AddMessageInfoItemL( R_PUSHMID_TYPE, *value ); + CleanupStack::PopAndDestroy( value ); // value + PUSHLOG_WRITE(" Msg. type added"); + +#ifdef __SERIES60_PUSH_SP + // ************************************************************************ + // Information item: Content type (SP specific) + // ************************************************************************ + if ( msg->PushMsgType() == KUidWapPushMsgUnknown.iUid ) + { + CUnknownPushMsgEntry* sp = STATIC_CAST( CUnknownPushMsgEntry*, msg ); + TPtrC contType = sp->ContentType(); + if ( contType.Length() ) + { + AddMessageInfoItemL( R_PUSHMID_CONTENT_TYPE, contType ); + PUSHLOG_WRITE(" Content type added "); + } + } +#endif // __SERIES60_PUSH_SP + + TBuf<32> time; + TBuf<32> date; + HBufC* dateFormatString = + iCoeEnv->AllocReadResourceLC( R_QTN_DATE_USUAL_WITH_ZERO ); + HBufC* timeFormatString = + iCoeEnv->AllocReadResourceLC( R_QTN_TIME_USUAL_WITH_ZERO ); + + // ************************************************************************ + // SI specific information item: creation time and date. + // ************************************************************************ + if ( msg->PushMsgType() == KUidWapPushMsgSI.iUid ) + { + CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, msg ); + const TTime created( si->Created() ); + // Check if created time was set. + if ( created != Time::NullTTime() ) + { + // OK. this attribute was set. Render it to the user. + TTime creLocal = ConvertUniversalToHomeTime( created ); + creLocal.FormatL( time, *timeFormatString ); + creLocal.FormatL( date, *dateFormatString ); + AddMessageInfoItemL( R_PUSHMID_CREATED, time ); + AddMessageInfoItemL( KNoResource, date ); + PUSHLOG_WRITE(" Created added"); + } + } + + // ************************************************************************ + // Information item: Arrival time and date. + // ************************************************************************ + const TTime arrivalTime( msg->ReceivedDate() ); + // Arrival time is always set by the wappush framework. Render it to the user. + TTime arrLocal = ConvertUniversalToHomeTime( arrivalTime ); + arrLocal.FormatL( time, *timeFormatString ); + arrLocal.FormatL( date, *dateFormatString ); + AddMessageInfoItemL( R_PUSHMID_RCVD, time ); + AddMessageInfoItemL( KNoResource, date ); + PUSHLOG_WRITE(" Received added"); + + // ************************************************************************ + // SI specific information item: expiration time and date. + // ************************************************************************ + if ( msg->PushMsgType() == KUidWapPushMsgSI.iUid ) + { + CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, msg ); + const TTime expires( si->Expires() ); + // Check expiration if expiration time was set. + if ( expires != Time::NullTTime() ) + { + TTime expLocal = ConvertUniversalToHomeTime( expires ); + expLocal.FormatL( time, *timeFormatString ); + expLocal.FormatL( date, *dateFormatString ); + AddMessageInfoItemL( R_PUSHMID_EXPIRES, time ); + AddMessageInfoItemL( KNoResource, date ); + PUSHLOG_WRITE(" Expires added"); + } + } + + CleanupStack::PopAndDestroy( 2, dateFormatString ); + // timeFormatString, dateFormatString + + // ************************************************************************ + // Information item: Size. + // Convert the message size given in bytes into kilobytes. Round the + // value up, if necessary. + // ************************************************************************ + TReal messageSize( 0 ); + if ( msg->PushMsgType() == KUidWapPushMsgSI.iUid ) + { + CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, msg ); + messageSize = (TReal)si->Text().Size() / KReal1024; + } + else if ( iPushSLEnabled && msg->PushMsgType() == KUidWapPushMsgSL.iUid ) + { + CSLPushMsgEntry* sl = STATIC_CAST( CSLPushMsgEntry*, msg ); + messageSize = (TReal)sl->Url().Size() / KReal1024; + } +#ifdef __SERIES60_PUSH_SP + else if ( msg->PushMsgType() == KUidWapPushMsgUnknown.iUid ) + { + CUnknownPushMsgEntry* sp = STATIC_CAST( CUnknownPushMsgEntry*, msg ); + messageSize = (TReal)sp->MessageData().Size() / KReal1024; + } +#endif // __SERIES60_PUSH_SP + TInt32 messageSizeInt; + User::LeaveIfError( Math::Int( messageSizeInt, messageSize ) ); + TReal fraction; + User::LeaveIfError( Math::Frac( fraction, messageSize ) ); + if ( fraction ) + { + ++messageSizeInt; + } + HBufC* size = + StringLoader::LoadLC( R_QTN_SIZE_KB, messageSizeInt, iCoeEnv ); + // From avkon.loc: + // #define qtn_size_kb " %N kB" + // We don't need white spaces at the beginning of the size string, so + // remove them: + size->Des().Trim(); + AddMessageInfoItemL( R_PUSHMID_SIZE, *size ); + PUSHLOG_WRITE(" Size added"); + CleanupStack::PopAndDestroy( size ); // size + + CleanupStack::PopAndDestroy( msg ); // msg + + PUSHLOG_LEAVEFN("CPushMessageInfoDialog::AddMessageInfoItemsL"); + } + +// End of file.