--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/src/ConnTestAppUi.cpp Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,368 @@
+/*
+* Copyright (c) 2006-2009 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 application UI class for ConnTest
+*
+*/
+
+// INCLUDE FILES
+#include <avkon.hrh>
+#include <AknsUtils.h>
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h>
+#include <CMessageData.h>
+#include <TSendingCapabilities.h>
+#include <sendui.h>
+
+#include "ConnTestAppUi.h"
+#include "ConnTestView.h"
+#include <ConnTest.rsg>
+#include "conntest.hrh"
+#include "SettingData.h"
+#include "ipdumpengine.h"
+
+// ================= MEMBER FUNCTIONS =======================
+//
+// ----------------------------------------------------------
+// CConnTestAppUi::ConstructL()
+// Default Symbian two phase constructor
+// ----------------------------------------------------------
+//
+void CConnTestAppUi::ConstructL()
+ {
+ RDebug::Print(_L("ConnTest: CConnTestAppUi::ConstructL()"));
+ BaseConstructL();
+
+ AknsUtils::SetAvkonSkinEnabledL( ETrue );
+
+ // Show tabs for main views from resources
+ CEikStatusPane* sp = StatusPane();
+
+ // Fetch pointer to the default navi pane control
+ iNaviPane = (CAknNavigationControlContainer*)sp->ControlL(
+ TUid::Uid(EEikStatusPaneUidNavi));
+
+ // Tabgroup has been read from resource and it were pushed to the navi pane.
+ // Get pointer to the navigation decorator with the ResourceDecorator() function.
+ // Application owns the decorator and it has responsibility to delete the object.
+ iDecoratedTabGroup = iNaviPane->ResourceDecorator();
+ if (iDecoratedTabGroup)
+ {
+ iTabGroup = (CAknTabGroup*) iDecoratedTabGroup->DecoratedControl();
+ }
+
+ TUid uid;
+ CConnTestView* view1;
+
+ // Create views; each view has same UI, but the data differs.
+ for(TInt i = 1; i <= KConnTestViews; i++)
+ {
+ RDebug::Print(_L("ConnTest: CConnTestAppUi::ConstructL() View=%d"), i);
+ uid.iUid = i;
+ view1 = new (ELeave) CConnTestView(uid, iSettingDataArray[i-1], iCustomPrefsDataArray[i-1]);
+ CleanupStack::PushL( view1 );
+ view1->ConstructL();
+ AddViewL( view1 ); // transfer ownership to CAknViewAppUi
+ CleanupStack::Pop(view1); // view1
+
+ iConnTestViews.Append(view1);
+ // First view must be set to default, otherwise views and their
+ // data are not in sync.
+ if(i == 1)
+ {
+ SetDefaultViewL(*view1);
+ }
+ }
+ }
+
+
+// ----------------------------------------------------
+// CConnTestAppUi::CConnTestAppUi()
+// Constructor
+// ----------------------------------------------------
+//
+CConnTestAppUi::CConnTestAppUi(
+ TFixedArray<CSettingData*, KConnTestViews>& aSettings,
+ TFixedArray<CCustomPrefsData*, KConnTestViews>& aCustomPrefs)
+ : iSettingDataArray(aSettings), iCustomPrefsDataArray(aCustomPrefs)
+ {
+ }
+
+// ----------------------------------------------------
+// CConnTestAppUi::~CConnTestAppUi()
+// Destructor
+// Frees reserved resources
+// ----------------------------------------------------
+//
+CConnTestAppUi::~CConnTestAppUi()
+ {
+ RDebug::Print(_L("ConnTest: CConnTestAppUi::~CConnTestAppUi"));
+ if(iIpdumpEngine)
+ {
+ delete iIpdumpEngine;
+ iIpdumpEngine = NULL;
+ }
+ delete iDecoratedTabGroup;
+ iConnTestViews.Reset();
+ delete iSendUi;
+ // currently used with ->ExecuteLD, so deleted automatically elsewhere
+ // delete iWarningDialog;
+ }
+
+// ----------------------------------------------------
+// CConnTestAppUi::IsLogging()
+// Is the ip packet logging on
+// ----------------------------------------------------
+//
+TBool CConnTestAppUi::IsLogging()
+ {
+ TBool res = EFalse;
+ if(iIpdumpEngine)
+ res = iIpdumpEngine->LoggingEnabled();
+ return res;
+ }
+
+// ----------------------------------------------------
+// CConnTestAppUi::HandleStatusPaneSizeChange()
+// This is called when ever the screen size has changed
+// Takes care that the view components are resized
+// ----------------------------------------------------
+//
+void CConnTestAppUi::HandleStatusPaneSizeChange()
+ {
+ CAknViewAppUi::HandleStatusPaneSizeChange();
+ for (TInt i = 0; i < KConnTestViews; i++)
+ {
+ iConnTestViews[i]->SizeChanged();
+ }
+ }
+
+// ------------------------------------------------------------------------------
+// CConnTestAppUi::::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+// This function is called by the EIKON framework just before it displays
+// a menu pane. Its default implementation is empty, and by overriding it,
+// the application can set the state of menu items dynamically according
+// to the state of application data.
+// ------------------------------------------------------------------------------
+//
+void CConnTestAppUi::DynInitMenuPaneL(TInt /*aResourceId*/,CEikMenuPane* /*aMenuPane*/)
+ {
+ }
+
+// ----------------------------------------------------
+// CConnTestAppUi::HandleCommandL(TInt aCommand)
+// Handles some of the users commands.
+// ----------------------------------------------------
+//
+void CConnTestAppUi::HandleCommandL(TInt aCommand)
+ {
+ switch ( aCommand )
+ {
+ // Parallel GET
+ case EConnTestCmdParallelGet:
+ {
+
+ TInt viewCount = 2;
+ CAknNumberQueryDialog* dlg =
+ CAknNumberQueryDialog::NewL(viewCount);
+ if( dlg->ExecuteLD(R_CONNTEST_PARALLEL_NUMBER_LAYOUT))
+ {
+ // ask engine to handle combining.
+ if ((viewCount > 0) && (viewCount <= KConnTestViews))
+ {
+ ParallelGetL(viewCount);
+ }
+ }
+ }
+ break;
+ // Start logging
+ case EConnTestCmdStartIpLog:
+ StartIpLoggingL();
+ break;
+ // Stop logging
+ case EConnTestCmdStopIpLog:
+ StopIpLoggingL();
+ break;
+ // Send log
+ case EConnTestCmdSendIpLog:
+ SendLogFileL();
+ break;
+
+ case EEikCmdExit:
+ SaveL();
+ Exit();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+// ----------------------------------------------------
+// CConnTestAppUi::HandleKeyEventL(
+// const TKeyEvent& aKeyEvent,TEventCode /*aType*/)
+// Handles UI key events.
+// ----------------------------------------------------
+//
+TKeyResponse CConnTestAppUi::HandleKeyEventL( const TKeyEvent& aKeyEvent,
+ TEventCode /*aType*/ )
+ {
+ if (!iTabGroup)
+ {
+ return EKeyWasNotConsumed;
+ }
+
+ TInt active = iTabGroup->ActiveTabIndex();
+ TInt count = iTabGroup->TabCount();
+
+ switch ( aKeyEvent.iCode )
+ {
+ case EKeyLeftArrow:
+ if ( active > 0 )
+ {
+ active--;
+ RDebug::Print(_L("ConnTest: CConnTestAppUi::HandleKeyEventL Switching to view %d"), active);
+ iTabGroup->SetActiveTabByIndex( active );
+ ActivateLocalViewL(TUid::Uid(iTabGroup->TabIdFromIndex(active)));
+ }
+ break;
+ case EKeyRightArrow:
+ if( (active + 1) < count )
+ {
+ active++;
+ RDebug::Print(_L("ConnTest: CConnTestAppUi::HandleKeyEventL Switching to view %d"), active);
+ iTabGroup->SetActiveTabByIndex( active );
+ ActivateLocalViewL(TUid::Uid(iTabGroup->TabIdFromIndex(active)));
+ }
+ break;
+ default:
+ return EKeyWasNotConsumed;
+ // break; get rid of cmpiler warning
+ }
+
+ return EKeyWasConsumed;
+ }
+
+// ----------------------------------------------------------------------------
+// CConnTestView::ParallelGet
+// Executes multiple HTTP gets over socket
+// ----------------------------------------------------------------------------
+//
+void CConnTestAppUi::ParallelGetL(TInt aCount)
+ {
+ for (TInt i = 0; i < aCount; i++)
+ {
+ if (!iConnTestViews[i]->IsReadyForHTTPGet())
+ {
+ _LIT(KWarning, "Not enough open connections" );
+ iWarningDialog = new (ELeave) CAknWarningNote(&iWarningDialog);
+ // notice, will be deleted automatically
+ iWarningDialog->ExecuteLD(KWarning);
+ return;
+ }
+ iConnTestViews[i]->HandleCommandL(EConnTestCmdSendPerformanceHttpGet);
+ }
+ }
+
+// ----------------------------------------------------
+// CConnTestAppUi::SendLogFileL()
+// Launches the send ui for the ip log
+// ----------------------------------------------------
+//
+void CConnTestAppUi::SendLogFileL()
+ {
+ if(!iIpdumpEngine)
+ {
+ iIpdumpEngine = CIpdumpEngine::NewL();
+ }
+ if(!iSendUi)
+ {
+ iSendUi = CSendUi::NewL();
+ }
+ CMessageData* messageData = CMessageData::NewL();
+ CleanupStack::PushL(messageData);
+
+ //
+ // Since CSendUi doesn't support sending .log or .cap files,
+ // the file is renamed here.
+ //
+ _LIT(KNewName, "c:\\logs\\tcpdump\\probe.cap.txt");
+ RFs fs;
+ if (fs.Connect() == KErrNone)
+ {
+ fs.Replace(iIpdumpEngine->LogFileName(), KNewName);
+ }
+ fs.Close();
+
+ messageData->AppendAttachmentL(KNewName);
+
+ TSendingCapabilities cap(0, 1024, TSendingCapabilities::ESupportsAttachments);
+ iSendUi->ShowQueryAndSendL(messageData, cap);
+ CleanupStack::PopAndDestroy(messageData); // messageData
+ }
+
+// ----------------------------------------------------
+// CConnTestAppUi::StartIpLoggingL()
+// Starts the logging of the ip traffic
+// ----------------------------------------------------
+//
+void CConnTestAppUi::StartIpLoggingL()
+{
+ _LIT(KLogEnabled, "IP logging enabled: " );
+ _LIT(KLogError, "Error %d starting logging, Protocol not loaded. Try rebooting." );
+
+ if(!iIpdumpEngine)
+ {
+ iIpdumpEngine = CIpdumpEngine::NewL();
+ }
+ if(!iIpdumpEngine->LoggingEnabled())
+ {
+
+ TRAPD(r, iIpdumpEngine->EnableLoggingL());
+ if(r == KErrNone)
+ {
+ TBuf<256> tt;
+ tt.Format(KLogEnabled);
+ tt.Append(iIpdumpEngine->LogFileName());
+
+ CAknInformationNote* note = new (ELeave) CAknInformationNote();
+ note->ExecuteLD(tt);
+ }
+ else
+ {
+ TBuf<64> tt;
+ tt.Format(KLogError, r);
+ iWarningDialog = new (ELeave) CAknWarningNote(&iWarningDialog);
+ // notice, will be deleted automatically
+ iWarningDialog->ExecuteLD(tt);
+ }
+ }
+}
+
+// ----------------------------------------------------
+// CConnTestAppUi::StopIpLoggingL()
+// Stops the logging of the ip traffic
+// ----------------------------------------------------
+//
+void CConnTestAppUi::StopIpLoggingL()
+{
+ _LIT(KLogDisabled, "IP logging disabled" );
+ if(iIpdumpEngine && iIpdumpEngine->LoggingEnabled())
+ {
+ iIpdumpEngine->DisableLogging();
+ CAknInformationNote* note = new (ELeave) CAknInformationNote();
+ note->ExecuteLD(KLogDisabled);
+ }
+}
+
+// End of File