multimediacommsengine/tsrc/testdriver/testclient/ui/src/CTcAppUi.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/testdriver/testclient/ui/src/CTcAppUi.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,439 @@
+/*
+* Copyright (c) 2004 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:  Implementation.
+*
+*/
+
+#include <bldvariant.hrh>
+#include <uikon.hrh>	// EEikCmdExit
+#include <eikmenup.h>
+#include <eikdoc.h>
+#include <barsread.h>
+
+#ifdef __SERIES60_
+#include <errorui.h>
+#include <aknquerydialog.h>
+#else
+#ifdef _SERIES_90_
+#include <cknconf.h>
+#else
+#include <eikinfo.h>
+#endif
+#include <eikcore.rsg>
+#endif
+
+#include "CTcBearer.h"
+#include "TTcBtFactory.h"
+#include "TTcTcpFactory.h"
+#include "TTcSerialFactory.h"
+#include "CTcTestRunner.h"
+#include "CTcWatcher.h"
+
+#include "CTcAppUi.h"
+#include "CTcContainer.h"
+#include "CTcSettingsDialog.h"
+#include "CTcBacklight.h"
+#include "TestClientConstants.h"
+#include "TestClient.hrh"
+#include <TestClient.rsg>
+	
+CTcAppUi::CTcAppUi()
+	{
+	}
+
+CTcAppUi::~CTcAppUi()
+	{
+	// These must be deleted first, they might generate some observer
+	// calls to the container
+	delete iRunner;
+	delete iBearer;
+
+#ifdef __SERIES60_
+	delete iErrorUi;
+#endif
+
+	// Remove the container from the control stack and destroy
+	if( iContainer )
+		{
+		RemoveFromStack( iContainer );
+		delete iContainer;
+		}
+
+	delete iWatcher;
+	delete iBacklight;
+	}
+
+void CTcAppUi::ConstructL()
+	{
+	// Have to use this one with the SIP stack
+	CCoeEnv::Static()->DisableExitChecks( ETrue );
+
+#ifdef __SERIES60_
+    // Skin support is required by S60 3.0 sdk (wk02 and later?)
+	BaseConstructL( EAknEnableSkin );	
+#else
+    BaseConstructL();
+#endif
+
+	// Load settings
+	iSettings.Load();
+
+#ifdef __SERIES60_
+	// Construct error ui
+	iErrorUi = CErrorUI::NewL();
+#endif
+
+	// Construct our main view
+	iContainer = CTcContainer::NewL( ClientRect() );
+	AddToStackL( iContainer );
+
+	// If this is the first we are running, automatically display settings.
+	if( iSettings.iIsFirstRun )
+		{
+		iSettings.iIsFirstRun = EFalse;
+		CmdSettingsL();
+		}
+
+	// Initiate connect if AutoConnect is requested by user settings
+	if( iSettings.iAutoConnect )
+		{
+		CmdConnectL();
+		}
+	else
+		{
+		SetStatus( KTcNotConnected );
+		}
+
+/*  causes crash!! 
+	iWatcher = CTcWatcher::NewL( Document()->Application()->DllName(),
+								 KWatcherTimeout );*/
+	iBacklight = CTcBacklight::NewL();
+	}
+
+void CTcAppUi::HandleCommandL( TInt aCommand )
+	{
+	// Dispatch commands
+	switch( aCommand )
+		{
+		case ECmdConnect:
+			{
+			CmdConnectL();
+			break;
+			}
+		case ECmdDisconnect:
+			{
+			CmdDisconnect();
+			break;
+			}
+		case ECmdSettings:
+			{
+			CmdSettingsL();
+			break;
+			}
+		case ECmdLocalAddress:
+			{
+			CmdLocalAddressL();
+			break;
+			}
+		case EEikCmdExit:
+			{
+			Exit();
+			break;
+			}
+		default:
+			{
+			// do nothing
+			break;
+			}
+		}
+	}
+
+void CTcAppUi::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
+	{
+	switch( aResourceId )
+		{
+		// Hide "Connect" in connected mode and "Disconnect" in disconnected mode
+		case R_TC_MENU:
+			{
+			TBool state( EFalse );
+			if( iBearer )
+				{
+				state = ETrue;
+				}
+			aMenuPane->SetItemDimmed( ECmdConnect, state );
+			aMenuPane->SetItemDimmed( ECmdDisconnect, !state );
+			aMenuPane->SetItemDimmed( ECmdLocalAddress, !state );
+			break;
+			}
+		default:
+			{
+			// not for us..
+			break;
+			}
+		}
+	}
+
+void CTcAppUi::BearerCompletion( MTcBearerObserver::TOperation aOp,
+							     TInt aStatus )
+	{
+	// If there are any errors, disconnect and show an appropriate error note
+	if( aStatus != KErrNone )
+		{
+		ShowErrorNote( aStatus );
+		CmdDisconnect();
+		return;
+		}
+
+	switch( aOp )
+		{
+		// Bearer is now listening for incoming connections
+		case MTcBearerObserver::EListen:
+			{
+			SetStatus( KTcListening );
+			break;
+			}
+
+		case MTcBearerObserver::EConnecting:
+		    {
+		    SetStatus( KTcConnecting );
+		    break;
+		    }
+		// Bearer is now connected
+		case MTcBearerObserver::EConnect:
+			{
+			SetStatus( KTcConnected );
+			TRAPD( err,
+				{
+				// CTcTestRunner takes observer role for iBearer
+				iRunner = CTcTestRunner::NewL( *iBearer, *this, iSettings.iIAPId );
+				// Start test case runner
+				iRunner->Start();
+				} );
+			// Report any errors and disconnect
+			if( err != KErrNone )
+				{
+				ShowErrorNote( err );
+				CmdDisconnect();
+				}
+			break;
+			}
+
+		default:
+			{
+			// do nothing for other events (basically not encountered)
+			break;
+			}
+		}
+
+	}
+
+void CTcAppUi::NotifyDisconnect()
+	{
+	// Test Runner has detected a remote disconnect, connect again
+	TRAP_IGNORE( CmdConnectL() )
+	}
+
+void CTcAppUi::NotifyStatusChange()
+	{
+	// iRunner may be NULL if CTestRunner construction failed but
+	// it still caused a status change notification.
+	if( iRunner )
+		{
+		// Test Runner status has changed, update main view labels
+		iContainer->Update( *iRunner );
+		}
+	}
+
+void CTcAppUi::CmdConnectL()
+	{
+	// Make sure we're properly disconnected
+	CmdDisconnect();
+	SetStatus( KTcInitializing );
+
+	// Create bearer
+	TTcSettingsBearerType btype = static_cast<TTcSettingsBearerType>( iSettings.iBearerType );
+	
+	switch ( btype )
+	    {
+	    case EBearerBluetooth:
+	        {
+	        TTcBtFactory factory;
+		    iBearer = CTcBearer::NewL( factory );
+	        break;
+	        }
+	    case EBearerTCP:
+	        {
+	        TTcTcpFactory factory( iSettings.iTCPPort, iSettings.iIAPId );
+		    iBearer = CTcBearer::NewL( factory );
+	        break;
+	        }
+	    case EBearerSerial:
+	        {
+	        HBufC* csyName = ReadFromResourceArrayLC( R_TC_SETTINGS_CSYNAME, iSettings.iCSYName );
+	        HBufC* commPort = ReadFromResourceArrayLC( R_TC_SETTINGS_COMMPORT, iSettings.iCommPort );
+	        TTcSerialFactory factory( *csyName, *commPort, iSettings.iBaudrate ); 
+	        CleanupStack::PopAndDestroy( 2 );
+		    iBearer = CTcBearer::NewL( factory );
+	        break;
+	        }
+	    default:
+	        {
+	        User::Leave( KErrArgument );
+	        break;
+	        }
+	    }
+
+	// Register for bearer events (->CTcAppUi::BearerCompletion)
+	iBearer->SetObserver( this );
+	// Start the connect sequence
+	
+	TInetAddr* addr = NULL;
+	if ( !iSettings.iTCPRemoteAddr.IsUnspecified() )
+	    {
+	    addr = new ( ELeave ) TInetAddr;
+	    if(iSettings.iTCPRemoteAddr.Family() == KAfInet6)
+	        {
+	        addr->SetAddress( iSettings.iTCPRemoteAddr.Ip6Address() );
+	        }
+	    else
+	        {
+	        addr->SetAddress( iSettings.iTCPRemoteAddr.Address() );
+	        }
+	    addr->SetPort( iSettings.iTCPPort );
+	    }
+	
+	TRAPD( err, iBearer->ConnectL( addr ) );
+	if( err != KErrNone )
+		{
+		delete addr;
+		CmdDisconnect();
+		User::Leave( err );
+		}
+    delete addr;
+	}
+
+void CTcAppUi::CmdDisconnect()
+	{
+	SetStatus( KTcNotConnected );
+
+	// Delete Test Runner and Bearer
+	delete iRunner;
+	iRunner = NULL;
+	delete iBearer;
+	iBearer = NULL;
+	}
+
+void CTcAppUi::CmdSettingsL()
+	{
+	// Construct the settings dialog
+	CTcSettingsDialog* dlg = new( ELeave ) CTcSettingsDialog( iSettings );
+	CleanupStack::PushL( dlg );
+	dlg->ConstructL();
+	CleanupStack::Pop();	// dlg
+
+	// ..and display it. It is automatically deleted
+	dlg->ExecuteLD( R_TC_SETTINGS_DLG );
+	}
+
+void CTcAppUi::CmdLocalAddressL()
+	{
+	// Fetch local address(es)
+	TBuf<200> address;
+	iBearer->GetLocalAddressL( address );
+	address.Insert( 0, _L("Local IP:\n") );
+
+#ifdef __SERIES60_
+	// Construct and show a query dialog
+	CAknQueryDialog* dlg = new( ELeave ) CAknQueryDialog;
+	dlg->ExecuteLD( R_TC_LOCAL_ADDRESS_DLG, address );
+#else
+#ifdef _SERIES_90_
+	// Construct and show a confirmation dialog
+	CCknConfirmationDialog::RunDlgWithDefaultIconLD( address, R_EIK_BUTTONS_CONTINUE );
+#else
+	CEikInfoDialog::RunDlgLD( _L("Local IP"), address, CEikInfoDialog::EAllowEnter );
+#endif
+#endif
+	}
+
+void CTcAppUi::SetStatus( const TDesC8& aText )
+	{
+	iContainer->UpdateStatus( aText );
+	}
+
+#ifdef __SERIES60_
+
+HBufC* CTcAppUi::ReadFromResourceArrayLC( TInt aResourceId, TInt aSettingIndex )
+    {
+    __ASSERT_ALWAYS( aSettingIndex >= 0, User::Leave( KErrArgument ) );
+    
+    TResourceReader reader;
+    CEikonEnv::Static()->CreateResourceReaderLC( reader, aResourceId );
+    
+    TInt numberOfItems = reader.ReadInt16(); // item count
+
+    __ASSERT_ALWAYS( aSettingIndex < numberOfItems, User::Leave( KErrArgument ) );
+    
+    TBool done( EFalse );
+    HBufC* temp = 0;
+    for ( TInt i = 0; i < numberOfItems && !done; i++ )
+        {
+        TInt value = reader.ReadInt16();  
+        TPtrC text = reader.ReadTPtrC();
+        if ( i == aSettingIndex )
+            {
+            done = ETrue;
+            temp = text.AllocL();
+            }
+        }
+    CleanupStack::PopAndDestroy(); // reader
+    CleanupStack::PushL( temp );
+    return temp;
+    }
+    
+#else
+
+HBufC* CTcAppUi::ReadFromResourceArrayLC( TInt aResourceId, TInt aSettingIndex )
+    {
+    __ASSERT_ALWAYS( aSettingIndex >= 0, User::Leave( KErrArgument ) );
+    CDesC16ArrayFlat* array = iCoeEnv->ReadDesC16ArrayResourceL( aResourceId );
+    CleanupStack::PushL( array );
+    __ASSERT_ALWAYS( aSettingIndex < array->MdcaCount(), User::Leave( KErrArgument ) );
+    HBufC* temp = array->MdcaPoint( aSettingIndex ).AllocL();
+    CleanupStack::PopAndDestroy( array );
+    CleanupStack::PushL( temp );
+    return temp;
+    }
+    
+#endif
+    
+void CTcAppUi::ShowErrorNote( TInt aStatus )
+	{
+	if( aStatus != KErrNone )
+		{
+#ifdef __SERIES60_
+		// If we run out of memory (etc.), just ignore the error
+		TRAP_IGNORE( iErrorUi->ShowGlobalErrorNoteL( aStatus ) )
+#else
+		// Construct and show a confirmation dialog
+		TBuf< 32 > errorMsg;
+		errorMsg.Format( _L("Fatal error: %d"), aStatus );
+#ifdef _SERIES_90_
+		TRAP_IGNORE( CCknConfirmationDialog::RunDlgWithDefaultIconLD( errorMsg, R_EIK_BUTTONS_CONTINUE ) )
+#else
+		TRAP_IGNORE( CEikInfoDialog::RunDlgLD( _L("Error"), errorMsg, CEikInfoDialog::EAllowEnter ) )
+#endif
+#endif
+		}
+	}