diff -r 473321461bba -r e06095241a65 vpnui/vpnmanagementui/src/vpnmanagementuilogcontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnui/vpnmanagementui/src/vpnmanagementuilogcontainer.cpp Wed Sep 01 12:23:21 2010 +0100 @@ -0,0 +1,692 @@ +/* +* Copyright (c) 2003-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: The container is responsible of showing log viewer. +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include //for LOG details message query +#include +#include "vpnuiloader.h" +#include "vpnmanagementuilogcontainer.h" +#include "vpnmanagementuidefs.h" +#include "vpnmanagementui.hrh" +#ifdef __SCALABLE_ICONS +#include +#include +#endif //__SCALABLE_ICONS + + +#ifdef __SERIES60_HELP +#include // for help context of VPN Management UI +#endif //__SERIES60_HELP + +//CONSTANTS +const TInt KVpnLogNumberOfIcons = 3; + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::CVpnManagementUiLogContainer( +// CVpnManagementUiLogView& aParent, CVpnUiLoader& aLoader) +// Constructor with parent +// --------------------------------------------------------- +// +CVpnManagementUiLogContainer::CVpnManagementUiLogContainer( + CVpnManagementUiLogView& aParent, CVpnUiLoader& aLoader ) : + iParent ( aParent ), iLoader ( aLoader ) + { + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::~CVpnManagementUiLogContainer() +// Destructor +// --------------------------------------------------------- +// +CVpnManagementUiLogContainer::~CVpnManagementUiLogContainer() + { + if(iEventViewer) + { + delete iEventViewer; + iEventViewer = NULL; + } + if(iLogList) + { + delete iLogList; + iLogList = NULL; + } + delete iListBox; + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::ConstructL( +// const TRect& aRect, TInt& aCurrentPosition, TInt& aTopItem) +// EPOC two phased constructor +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::ConstructL( + const TRect& aRect, TInt& /*aCurrentPosition*/ ) + { + CreateWindowL(); + CreateListBoxL(); + + ShowLogsL(); + SetRect( aRect ); + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::SizeChanged() +// Called by framework when the view size is changed +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::SizeChanged() + { + iListBox->SetRect(Rect()); + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::FocusChanged(TDrawNow aDrawNow) +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::FocusChanged(TDrawNow aDrawNow) + { + if ( iListBox ) + { + iListBox->SetFocus( IsFocused(), aDrawNow ); + } + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::HandleResourceChange +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange(aType); + + //Handle change in layout orientation + if (aType == KEikDynamicLayoutVariantSwitch || aType == KAknsMessageSkinChange ) + { + iListBox->HandleResourceChange(aType); + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); + SetRect(mainPaneRect); + DrawNow(); + } + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::HandleListBoxEventL( +// CEikListBox* /*aListBox*/, TListBoxEvent aEventType) +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::HandleListBoxEventL( + CEikListBox* /*aListBox*/, TListBoxEvent aEventType ) + { + switch(aEventType) + { + case EEventEnterKeyPressed: + case EEventItemSingleClicked: + iParent.HandleCommandL(EVpnUiCmdLogDetails); + break; + default: + //Do nothing + break; + } + } +enum { EListBoxControl, ENumberOfControls }; + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::CountComponentControls() const +// --------------------------------------------------------- +// +TInt CVpnManagementUiLogContainer::CountComponentControls() const + { + // return number of controls inside this container + return ENumberOfControls; // return nbr of controls inside this container + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::ComponentControl(TInt aIndex) const +// --------------------------------------------------------- +// +CCoeControl* CVpnManagementUiLogContainer::ComponentControl(TInt aIndex) const + { + switch ( aIndex ) + { + case 0: + return iListBox; + default: + return NULL; + } + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::HandleControlEventL( +// CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/) +// Cannot be changed to non-leaving function. +// L-function is required by the class definition, even if empty. +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::HandleControlEventL( + CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/) + { + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::OfferKeyEventL( +// const TKeyEvent& aKeyEvent, TEventCode aType) +// Handles the key events OK button, arrow keys, delete key. +// OK button show VPN log details, +// if list is empty then arrow keys and OK inactive. +// Delete active only if list not empty. +// --------------------------------------------------------- +// +TKeyResponse CVpnManagementUiLogContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType) + { + TKeyResponse retval = EKeyWasNotConsumed; + if ( aType==EEventKey ) + { + if ( (aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter) && // select or enter + iListBox->CurrentItemIndex() > -1) //This is for empty list + { + // Selection key pressed. + LogDetailsL(iListBox->CurrentItemIndex()); + + retval = EKeyWasConsumed; + } + + else if ( aKeyEvent.iCode == EKeyUpArrow ) + { + retval = iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + else if ( aKeyEvent.iCode == EKeyDownArrow ) + { + TEventProperties eventProperties; + HBufC* eventText = NULL; + TInt currentPosition = iListBox->CurrentItemIndex(); + if((iEventViewer != NULL) && (iLogList->Count() > 0)) + { + iEventViewer->GetEventUsingEventNumber(eventText, iLogList->At(iLogList->Count() - 1).iEventNumber, eventProperties); + delete eventText; + } + UpdateListBoxL(currentPosition); + retval = iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + } + else + { + retval = iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + + + return retval; + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::CreateListBoxL() +// Creates listbox, sets empty listbox text. +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::CreateListBoxL() + { + iListBox = new( ELeave ) CAknDoubleGraphicStyleListBox; + iListBox->SetContainerWindowL( *this ); + iListBox->ConstructL( this, EAknListBoxSelectionList ); + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()-> + SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,CEikScrollBarFrame::EAuto ); + iListBox->SetListBoxObserver(this); + +#ifdef __SCALABLE_ICONS + + CArrayPtr< CGulIcon >* icons = new( ELeave ) CAknIconArray( KVpnLogNumberOfIcons ); + CleanupStack::PushL( icons ); + + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + + TFileName fileName = GetIconFilenameL(); + + icons->AppendL( AknsUtils::CreateGulIconL( skinInstance, + KAknsIIDQgnPropVpnLogInfo, + fileName, + EMbmVpnmanagementuiQgn_prop_vpn_log_info, + EMbmVpnmanagementuiQgn_prop_vpn_log_info_mask ) ); + + icons->AppendL( AknsUtils::CreateGulIconL( skinInstance, + KAknsIIDQgnPropVpnLogWarn, + fileName, + EMbmVpnmanagementuiQgn_prop_vpn_log_warn, + EMbmVpnmanagementuiQgn_prop_vpn_log_warn_mask ) ); + + icons->AppendL( AknsUtils::CreateGulIconL( skinInstance, + KAknsIIDQgnPropVpnLogError, + fileName, + EMbmVpnmanagementuiQgn_prop_vpn_log_error, + EMbmVpnmanagementuiQgn_prop_vpn_log_error_mask ) ); + + iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + + CleanupStack::Pop(); // icons +#else + CAknIconArray* icons = new(ELeave) CAknIconArray(KVpnLogNumberOfIcons); + icons->ConstructFromResourceL(R_VPN_LOG_ICON_ARRAY); + + iListBox->ItemDrawer()->ColumnData()->SetIconArray(icons); + +#endif //__SCALABLE_ICONS + + EmptyViewTextL(); + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::EmptyViewTextL() +// Reads text from resource to empty log view +// and put text to the listbox. +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::EmptyViewTextL() + { + HBufC* stringHolder = StringLoader::LoadLC( R_VPN_LOG_EMPTY ); + iListBox->View()->SetListEmptyTextL( *stringHolder ); + CleanupStack::PopAndDestroy(); // stringHolder + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::RemoveAllFromListBoxL() +// Removes all from listbox. +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::RemoveAllFromListBoxL() + { + MDesCArray* itemList = iListBox->Model()->ItemTextArray(); + CDesCArray* itemArray = (CDesCArray*) itemList; + itemArray->Reset(); + iListBox->HandleItemRemovalL(); + iListItemCount = 0; + DrawNow(); + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::DrawListBoxL(TInt aCurrentPosition, TInt aTopItem) +// Draws listbox, fetches graphic icons for markable list +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::DrawListBoxL( + TInt aCurrentPosition, TInt aTopItem ) + { + + if (aCurrentPosition >= 0) + { + iListBox->SetTopItemIndex( aTopItem ); + iListBox->SetCurrentItemIndex( aCurrentPosition ); + } + ActivateL(); + DrawNow(); + + } + +void CVpnManagementUiLogContainer::ShowLogsL() + { + iListItemCount = 0; + + //Create CEventViewer object + delete iEventViewer; + iEventViewer = NULL; + TRAPD(error, iEventViewer = CEventViewer::NewL()); + if (error != KErrNone) + return; + + delete iLogList; + iLogList = NULL; + iLogList = new (ELeave) CArrayFixFlat(3); + + CDesCArrayFlat* itemTextArray = static_cast(iListBox->Model()->ItemTextArray()); + + itemTextArray->Reset(); + iListBox->Reset(); + + TEventProperties eventProperties; + HBufC* eventText = NULL; + + //First item + TBuf<100> itemName; + TInt ret = iEventViewer->GetMostRecentEvent(eventText, eventProperties); + if(ret==KErrNone) + { + CleanupStack::PushL(eventText); + + iLogList->AppendL(eventProperties); + + //append index of icon array + itemName.AppendNum(GetIconArrayIndex(eventProperties.iCategory)); + + itemName.Append(_L("\t")); + + TPtr eventTextDesc(eventText->Des()); + TInt length = eventTextDesc.Length(); + if(length > KMaxLogListLength) + { + eventTextDesc.Delete(KMaxLogListLength, length-KMaxLogListLength); + } + itemName.Append(eventTextDesc); + CleanupStack::PopAndDestroy(); //eventText + itemName.Append(_L("\t")); + + //Format time stamp for LOG view + TBuf<2 * KMaxLengthTextDateString + 3> logEntry; + TimeLogEntryL(logEntry, eventProperties.iTimeStamp); + + itemName.Append(logEntry); + + itemTextArray->AppendL(itemName); + iListBox->HandleItemAdditionL(); + iListItemCount++; + //Get rest of events + while (ret==KErrNone) + { + TInt currentPosition = iListBox->CurrentItemIndex(); + ret = UpdateListBoxL(currentPosition); + } + + } + + } + +TInt CVpnManagementUiLogContainer::GetIconArrayIndex(TLogCategory2& aCategory) + { + //index of icon array + if (aCategory == ELogInfo) + return 0; //index of icon array + else if (aCategory == ELogWarning) + return 1; //index of icon array + else if (aCategory == ELogError) + return 2; //index of icon array + else + return 2; + } + + +void CVpnManagementUiLogContainer::TimeLogEntryL(TDes& aDes, TTime aTime) + { + // Date + HBufC* dateFormat = StringLoader::LoadLC(R_QTN_DATE_USUAL_WITH_ZERO); + TBuf dateString; + aTime.FormatL(dateString, *dateFormat); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion(dateString); + CleanupStack::PopAndDestroy(); //dateFormat + + // Time + dateFormat = StringLoader::LoadLC(R_QTN_TIME_USUAL_WITH_ZERO); + TBuf timeString; + aTime.FormatL(timeString, *dateFormat); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion(timeString); + CleanupStack::PopAndDestroy(); //dateFormat + +// TBuf dateBuffer; // KMaxShortDateFormatSpec is defined in e32std.h +// TBuf timeBuffer; // KMaxTimeFormatSpec is defined in e32std.h + + TBuf<2 * KMaxLengthTextDateString + 3> logEntry; + + TTime now; + now.HomeTime(); + if ( (now.YearsFrom( aTime ).Int() > 0) || + (aTime.DayNoInYear() < now.DayNoInYear()) ) + { + logEntry.Append(dateString); + logEntry.Append(KVpnManagementUiSpaceHyphenSpace); + } + + logEntry.Append(timeString); + aDes = logEntry; + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::UpdateListBoxL(TInt& aCurrentPosition) +// +// --------------------------------------------------------- +// +TInt CVpnManagementUiLogContainer::UpdateListBoxL(TInt& /*aCurrentPosition*/) + { + MDesCArray* itemList = iListBox->Model()->ItemTextArray(); + CDesCArray* itemArray = ( CDesCArray* )itemList; + + TEventProperties eventProperties; + HBufC* eventText = NULL; + TBuf<100> itemName; + + //next item + if(iEventViewer != NULL) + { + TInt ret = iEventViewer->GetPreviousEvent(eventText, eventProperties); + if(ret==KErrNone) + { + CleanupStack::PushL(eventText); + iLogList->AppendL(eventProperties); + + //append index of icon array + itemName.AppendNum(GetIconArrayIndex(eventProperties.iCategory)); + + itemName.Append(_L("\t")); + + TPtr eventTextDesc(eventText->Des()); + TInt length = eventTextDesc.Length(); + if(length > KMaxLogListLength) + eventTextDesc.Delete(KMaxLogListLength, length-KMaxLogListLength); + itemName.Append(eventTextDesc); + CleanupStack::PopAndDestroy(); //eventText + itemName.Append(_L("\t")); + + //Format time stamp for LOG view + TBuf<2 * KMaxLengthTextDateString + 3> logEntry; + TimeLogEntryL(logEntry, eventProperties.iTimeStamp); + + itemName.Append(logEntry); + + itemArray->AppendL(itemName); + iListBox->HandleItemAdditionL(); + iListItemCount++; + } + + iParent.SetMiddleSoftKeyL(ETrue); + return ret; + + } + + iParent.SetMiddleSoftKeyL(ETrue); + return KErrNotFound; + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::LogDetailsL() +// Creates the log details message query +// Appends strings from resource and eventviewer to one +// message body text and displays it. +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::LogDetailsL(TInt aIndex) + { + TEventProperties eventProperties; + eventProperties = iLogList->At(aIndex); + + HBufC* message = NULL; + HBufC* eventText = NULL; + iEventViewer->GetEventUsingEventNumber(eventText, eventProperties.iEventNumber, eventProperties); + CleanupStack::PushL( eventText ); + + if(eventProperties.iCategory == ELogInfo) + { + // Info: + message = StringLoader::LoadLC( R_VPN_DETAIL_LOG_ENTRY_INFO ); + } + + if(eventProperties.iCategory == ELogWarning) + { + // Warning: + message = StringLoader::LoadLC( R_VPN_DETAIL_LOG_ENTRY_WARNING ); + } + + if(eventProperties.iCategory == ELogError) + { + // Error: + message = StringLoader::LoadLC( R_VPN_DETAIL_LOG_ENTRY_ERROR ); + } + + __ASSERT_DEBUG(message != NULL, User::Invariant()); + + HBufC* messageText = HBufC::NewLC(message->Length() + eventText->Length() + 2); + + messageText->Des().Append(*message); //Append category + messageText->Des().Append(KVpnManagementUiSpace); + messageText->Des().Append(*eventText); //Append log entry message + + // Heading is the date and the time of the log entry + //Format time stamp for LOG view + TBuf<2 * KMaxLengthTextDateString + 3> logEntry; + TimeLogEntryL(logEntry, eventProperties.iTimeStamp); + + CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL(*messageText); + + CleanupStack::PopAndDestroy(3); // message Text, message, eventText + + dlg->PrepareLC(R_MESSAGE_QUERY_DETAILS_VIEW); + dlg->QueryHeading()->SetTextL(logEntry); + dlg->RunLD(); + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::ReadResourceL(HBufC& aText, TInt aResource); +// Reads text from resource +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::ReadResourceL(HBufC& aText, TInt aResource) + { + HBufC* text = StringLoader::LoadLC( aResource ); + aText.Des().Append(text->Des()); + CleanupStack::PopAndDestroy(); // text + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::ClearLogL() +// Asks confirmation from user. +// Clears VPN log view. +// Calls eventviewer to clear log. +// --------------------------------------------------------- +// +void CVpnManagementUiLogContainer::ClearLogL() + { + // Read query text from resource + HBufC* temp; + temp = StringLoader::LoadLC( R_VPN_QUEST_CLEAR_LOG ); + + // Asks confirmation from user + CAknQueryDialog* query = CAknQueryDialog::NewL( CAknQueryDialog::EConfirmationTone ); + TInt retval = query->ExecuteLD( R_CONFIRMATION_QUERY, *temp ); + CleanupStack::PopAndDestroy(); // temp + if ( retval ) + { + // Clear VPN log listbox + RemoveAllFromListBoxL(); + + // Calls eventviewer to clear log. + iEventViewer->DeleteLogFile(); + } + + iParent.SetMiddleSoftKeyL(ETrue); + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::IconArrayResourceId +// Loads Mark/Unmark icons from resource +// --------------------------------------------------------- +// +TInt CVpnManagementUiLogContainer::IconArrayResourceId() const + { + return 0; //TVA + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::CreateIconArrayL +// Creates Icon Array +// --------------------------------------------------------- +// +CAknIconArray* CVpnManagementUiLogContainer::CreateIconArrayL() const + { + CAknIconArray* icons = new (ELeave) CAknIconArray( KGranularity ); + CleanupStack::PushL( icons ); + icons->ConstructFromResourceL( IconArrayResourceId() ); + CleanupStack::Pop(); // icons + return icons; + } + +TFileName CVpnManagementUiLogContainer::GetIconFilenameL() + { + RFs& fsSession = CCoeEnv::Static()->FsSession(); + + TDriveList driveList; + User::LeaveIfError(fsSession.DriveList(driveList)); + + TInt driveNumber; + TDriveName drive = _L("a:"); + + TFileName iconName; + + for (driveNumber = EDriveA, drive[0] = 'a'; + driveNumber <= EDriveZ; + driveNumber++, drive[0]++) + { + if (!driveList[driveNumber]) + { + continue; + } + + TParse parse; + parse.Set(drive, &KVpnLogIcons, NULL); + iconName.Copy(parse.DriveAndPath()); + iconName.Append(parse.Name()); + iconName.Append(_L(".mif")); + + TEntry entry; + if (fsSession.Entry(iconName, entry) == KErrNone) + { + //icon founded + break; + } + } + + return iconName; + } + +// --------------------------------------------------------- +// CVpnManagementUiLogContainer::GetHelpContext +// This function is called when Help application is launched. +// (other items were commented in a header). +// --------------------------------------------------------- +// +#ifdef __SERIES60_HELP +void CVpnManagementUiLogContainer::GetHelpContext( + TCoeHelpContext& aContext ) const + { + aContext.iMajor = KUidVpnManagementUi; + aContext.iContext = KSET_HLP_VPN_LOG_VIEW; + } +#endif //__SERIES60_HELP + +// End of File