htiui/HtiAdmin/src/HtiAdminAppUi.cpp
changeset 0 d6fe6244b863
child 3 2703485a934c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiAdmin/src/HtiAdminAppUi.cpp	Tue Feb 02 00:17:27 2010 +0200
@@ -0,0 +1,1144 @@
+/*
+* Copyright (c) 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:  AppUi implementation, all functions here
+*
+*/
+
+// INCLUDE FILES
+#include <avkon.hrh>
+#include <aknnotewrappers.h>
+#include <aknquerydialog.h>
+#include <aknmessagequerydialog.h>
+#include <w32std.h>
+#include <eikmenup.h>
+#include <commdb.h>
+
+#include <HtiAdmin.rsg>
+#include <HtiCommPluginInterface.h> // for KHTICommInterfaceUid
+#include <HtiCfg.h>
+#include <HtiVersion.h>
+
+#include "HtiAdmin.pan"
+#include "HtiAdminAppUi.h"
+#include "HtiAdminAppView.h"
+#include "HtiAdmin.hrh"
+
+
+#ifdef __ENABLE_LOGGING__
+
+#include <flogger.h>
+
+_LIT(KLogFolder, "hti");
+_LIT(KLogFile, "htiadmin.txt");
+#define HTI_LOG_TEXT(a1) {_LIT(temp, a1); RFileLogger::Write(KLogFolder, KLogFile, EFileLoggingModeAppend, temp);}
+#define HTI_LOG_FORMAT(a1,a2) {_LIT(temp, a1); RFileLogger::WriteFormat(KLogFolder, KLogFile, EFileLoggingModeAppend, temp, (a2));}
+#define HTI_LOG_DES(a1) {RFileLogger::Write(KLogFolder, KLogFile, EFileLoggingModeAppend, (a1));}
+
+#else // __ENABLE_LOGGING__
+
+#define HTI_LOG_TEXT(a1)
+#define HTI_LOG_FORMAT(a1,a2)
+#define HTI_LOG_DES(a1)
+
+#endif // __ENABLE_LOGGING__
+
+// CONSTANTS
+_LIT( KHtiWatchDogMatchPattern, "HtiWatchDog*" );
+_LIT( KHtiFrameworkExe, "HtiFramework.exe" );
+_LIT( KHtiMatchPattern, "HtiFramework*" );
+_LIT( KHtiFrameworkCaption, "HTI status: " );
+_LIT( KHtiAutoStartCaption, "AutoStart: " );
+_LIT( KHtiVersionCaption, "Version: " );
+_LIT( KHtiSelectedCommCaption, "Communication: " );
+_LIT( KHtiAdminStartParameter, "admin" );
+_LIT( KHtiAdminVersionFormat, "%u.%u.%u (%uwk%02u)" );
+_LIT( KHtiAdminAboutVersionFormat, "Version %u.%u.%u - " );
+const static TInt KTerminateReason = 1;
+
+
+const TInt32 KHTIImplUidSerial    = {0x10210CCA};
+const TInt32 KHTIImplUidBluetooth = {0x200212CC};
+const TInt32 KHTIImplUidIPComm    = {0x200212CE};
+
+// configuration file constants
+_LIT( KCfgFilePath,         "\\");
+_LIT( KHtiCfg,              "hti.cfg" );
+_LIT( KHtiBtCommCfg,        "HTIBtComm.cfg" );
+_LIT( KHtiSerialCommCfg ,   "HTISerialComm.cfg" );
+_LIT( KHtiIPCommCfg,        "HTIIPComm.cfg" );
+// hti.cfg
+_LIT8( KCommPlugin,         "CommPlugin" );
+_LIT8( KPriority,           "Priority" );
+_LIT8( KShowConsole,        "ShowConsole" );
+_LIT8( KEnableHtiWatchDog,  "EnableHtiWatchDog" );
+_LIT8( KEnableHtiAutoStart, "EnableHtiAutoStart" );
+_LIT8( KShowErrorDialogs,   "ShowErrorDialogs" );
+// HtiBtComm.cfg
+_LIT8( KBtDeviceAddress,    "BtDeviceAddress" );
+_LIT8( KBtDeviceName,       "BtDeviceName" );
+// HtiSerialComm.cfg
+_LIT8( KCommPortNumber,     "CommPort" );
+// HTIIPComm.cfg
+_LIT8( KLocalPort,          "LocalPort" );
+_LIT8( KRemoteHost,         "RemoteHost" );
+_LIT8( KRemotePort,         "RemotePort" );
+_LIT8( KIAPName,            "IAPName" );
+
+
+// ConstructL is called by the application framework
+void CHtiAdminAppUi::ConstructL()
+    {
+    BaseConstructL( EAknEnableSkin );
+    iAppView = CHtiAdminAppView::NewL( ClientRect() );
+    AddToStackL( iAppView );
+
+    iAppView->SetCaption( KHtiFrameworkCaption );
+    iAppView->SetVersionCaption( KHtiVersionCaption );
+    iAppView->SetAutoStartCaption( KHtiAutoStartCaption );
+    iAppView->SetSelectedCommCaption( KHtiSelectedCommCaption );
+    UpdateVersion();
+    UpdateStatusL();
+    iHtiCfg = CHtiCfg::NewL();
+    UpdateAutoStartStatus(); // uses iHtiCfg
+    UpdateSelectedComm(); // uses iHtiCfg
+    }
+
+CHtiAdminAppUi::CHtiAdminAppUi()
+    {
+    iHtiCfg = NULL;
+    }
+
+CHtiAdminAppUi::~CHtiAdminAppUi()
+    {
+    KillTimer();
+    if ( iAppView )
+        {
+        RemoveFromStack( iAppView );
+        delete iAppView;
+        iAppView = NULL;
+        }
+
+    if ( iHtiCfg )
+        delete iHtiCfg;
+    }
+
+void CHtiAdminAppUi::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane *aMenuPane)
+    {
+    HTI_LOG_FORMAT( "DynInitMenuPaneL 0x%x", aResourceId );
+
+    if ( aResourceId == R_HTIADMIN_MENU )
+        {
+        RProcess prs;
+        if ( OpenHtiProcess( prs ) )
+            {
+            if ( prs.ExitType() == EExitPending )
+                {
+                aMenuPane->SetItemDimmed( EHtiAdminStart, ETrue );
+                aMenuPane->SetItemDimmed( EHtiAdminSubOptions, ETrue );
+                prs.Close();
+                return;
+                }
+            }
+        aMenuPane->SetItemDimmed( EHtiAdminStop, ETrue );
+        prs.Close();
+        }
+
+    else if ( aResourceId == R_HTIADMIN_SUBMENU_OPTIONS )
+        {
+#if !defined(__ENABLE_LOGGING__)
+        aMenuPane->SetItemDimmed( EHtiAdminSubLogs, ETrue );
+#endif
+        }
+    else if ( aResourceId == R_HTIADMIN_SUBMENU_PRIORITY )
+        {
+        TInt priority = 3; // default value
+        TRAPD( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+        if ( !err )
+            {
+            TRAP( err, priority = iHtiCfg->GetParameterIntL( KPriority ) );
+            }
+
+        switch ( priority )
+            {
+            case 1:
+                aMenuPane->SetItemButtonState( EHtiAdminPriorityBackground, EEikMenuItemSymbolOn );
+                break;
+            case 2:
+                aMenuPane->SetItemButtonState( EHtiAdminPriorityForeground, EEikMenuItemSymbolOn );
+                break;
+            case 4:
+                aMenuPane->SetItemButtonState( EHtiAdminPriorityAbsoluteHigh, EEikMenuItemSymbolOn );
+                break;
+            default:
+                aMenuPane->SetItemButtonState( EHtiAdminPriorityHigh, EEikMenuItemSymbolOn );
+                break;
+            }
+        }
+
+    else if ( aResourceId == R_HTIADMIN_SUBMENU_AUTOSTART )
+        {
+#ifdef __WINS__
+        TInt value = 0; // default value for emulator
+#else
+        TInt value = 1; // default value for hardware
+#endif
+        TRAPD( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+        if ( !err )
+            {
+            TRAP( err, value = iHtiCfg->GetParameterIntL( KEnableHtiAutoStart ) );
+            }
+
+        if ( value )
+            aMenuPane->SetItemButtonState( EHtiAdminAutoStartEnable, EEikMenuItemSymbolOn );
+        else
+            aMenuPane->SetItemButtonState( EHtiAdminAutoStartDisable, EEikMenuItemSymbolOn );
+        }
+
+    else if ( aResourceId == R_HTIADMIN_SUBMENU_WATCHDOG )
+        {
+        TInt value = 0; // default value
+        TRAPD( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+        if ( !err )
+            {
+            TRAP( err, value = iHtiCfg->GetParameterIntL( KEnableHtiWatchDog ) );
+            }
+
+        if ( value )
+            aMenuPane->SetItemButtonState( EHtiAdminWatchDogEnable, EEikMenuItemSymbolOn );
+        else
+            aMenuPane->SetItemButtonState( EHtiAdminWatchDogDisable, EEikMenuItemSymbolOn );
+        }
+
+    else if ( aResourceId == R_HTIADMIN_SUBMENU_CONSOLE )
+        {
+        TInt value = 0; // default value
+        TRAPD( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+        if ( !err )
+            {
+            TRAP( err, value = iHtiCfg->GetParameterIntL( KShowConsole ) );
+            }
+
+        if ( value )
+            aMenuPane->SetItemButtonState( EHtiAdminConsoleEnable, EEikMenuItemSymbolOn );
+        else
+            aMenuPane->SetItemButtonState( EHtiAdminConsoleDisable, EEikMenuItemSymbolOn );
+        }
+
+    else if ( aResourceId == R_HTIADMIN_SUBMENU_ERROR_DIALOGS )
+        {
+        TInt value = 1; // default value
+        TRAPD( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+        if ( !err )
+            {
+            TRAP( err, value = iHtiCfg->GetParameterIntL( KShowErrorDialogs ) );
+            }
+
+        if ( value )
+            aMenuPane->SetItemButtonState( EHtiAdminErrorDialogsEnable, EEikMenuItemSymbolOn );
+        else
+            aMenuPane->SetItemButtonState( EHtiAdminErrorDialogsDisable, EEikMenuItemSymbolOn );
+        }
+    }
+
+
+// Helper function to get data from a dialog
+TInt ShowDialog(TInt aResourceId, const TDesC &aText, TDes8 &aValue)
+    {
+    TBuf<KMaxParameterValueLength> data;
+
+    CAknTextQueryDialog* dlg;
+    dlg = new (ELeave) CAknTextQueryDialog(data);
+    CleanupStack::PushL(dlg);
+    dlg->SetPromptL(aText);
+    dlg->SetMaxLength(KMaxParameterValueLength);
+    CleanupStack::Pop(); // dlg
+
+    if ( dlg->ExecuteLD( aResourceId ) )
+        {
+        aValue.Copy(data);
+        return KErrNone;
+        }
+
+    return KErrCancel;
+    }
+
+void CHtiAdminAppUi::ShowBTListQueryL()
+	{
+	TInt selectedOption( KErrNotFound );
+	        	 
+	CDesCArrayFlat* array = new (ELeave) CDesCArrayFlat(20);
+	CleanupStack::PushL(array);
+	
+	array->AppendL(_L("By BT address"));
+	array->AppendL(_L("By BT Name"));
+	array->AppendL(_L("Search when starting"));
+				 
+	CAknListQueryDialog* dlg = new(ELeave) CAknListQueryDialog( &selectedOption );
+	dlg->PrepareLC(R_QUERY_DIALOG);
+	dlg->SetItemTextArray(array);
+	dlg->SetOwnershipType(ELbmDoesNotOwnItemArray);
+	dlg->RunLD();
+	
+	CleanupStack::PopAndDestroy(array); 
+	
+	if(selectedOption == 0)
+		{
+		HandleBtByAddress();
+		}
+	else if(selectedOption == 1)
+		{
+		HandleBtByName();
+		}
+	else if (selectedOption == 2)
+		{
+		HandleBtSearch();
+		}
+	}
+
+void CHtiAdminAppUi::ShowIPListQueryL()
+	{
+	TInt selectedOption( KErrNotFound );
+	        	 
+	CDesCArrayFlat* array = new (ELeave) CDesCArrayFlat(10);
+	CleanupStack::PushL(array);
+	
+	array->AppendL(_L("Listen"));
+	array->AppendL(_L("Connect"));
+	
+	CAknListQueryDialog* dlg = new(ELeave) CAknListQueryDialog( &selectedOption );
+	dlg->PrepareLC(R_QUERY_DIALOG);
+	dlg->SetItemTextArray(array);
+	dlg->SetOwnershipType(ELbmDoesNotOwnItemArray);
+	dlg->RunLD();
+	
+	CleanupStack::PopAndDestroy(array); 
+	
+	if(selectedOption == 0)
+		{
+		HandleIPListen();
+		}
+	else if(selectedOption == 1)
+		{
+		HandleIPConnect();
+		}
+	}
+
+void CleanupRArray( TAny* object )
+    {
+    ( ( RImplInfoPtrArray* ) object )->ResetAndDestroy();
+    }
+
+void CHtiAdminAppUi::ShowCommsListQueryL()
+	{
+	TInt selectedOption( KErrNotFound );
+	        	 
+	const TInt pluginNameArrayGranularity (15);
+	CDesCArrayFlat* pluginNameArray = new (ELeave) CDesCArrayFlat(pluginNameArrayGranularity);
+	CleanupStack::PushL(pluginNameArray);
+		
+	RImplInfoPtrArray implInfoArray;
+	CleanupStack::PushL( TCleanupItem( CleanupRArray, &implInfoArray ) );
+	
+	REComSession::ListImplementationsL( KHTICommInterfaceUid, implInfoArray );
+
+	for ( TInt i = 0; i < implInfoArray.Count(); ++i )
+		{
+		pluginNameArray->AppendL(implInfoArray[i]->DisplayName());
+		}
+	
+	CAknListQueryDialog* dlg = new(ELeave) CAknListQueryDialog( &selectedOption );
+	
+	dlg->PrepareLC(R_QUERY_DIALOG);
+	dlg->SetHeaderTextL(_L("Select communication"));
+	dlg->SetItemTextArray(pluginNameArray);
+	dlg->SetOwnershipType(ELbmDoesNotOwnItemArray);
+	
+	if(dlg->RunLD())
+		{
+		TInt32 uid = implInfoArray[selectedOption]->ImplementationUid().iUid;
+		switch(uid)
+			{
+			case KHTIImplUidSerial:  
+				{
+				TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+				iHtiCfg->SetParameterL( KCommPlugin, _L8( "SERIAL" ) );
+				iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+
+				TBuf8<KMaxParameterValueLength> portNum;
+				if ( !ShowDialog( R_NUMERIC_QUERY, _L("Com port number:"), portNum ) )
+					{
+					TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiSerialCommCfg ) );
+					iHtiCfg->SetParameterL( KCommPortNumber, portNum );
+					iHtiCfg->SaveCfgL( KCfgFilePath, KHtiSerialCommCfg );
+					}
+				UpdateSelectedComm();
+				}
+				break;
+				
+			case KHTIImplUidBluetooth:  
+				{
+				ShowBTListQueryL();				
+				}
+				break;
+				
+			case KHTIImplUidIPComm:  
+				{
+				ShowIPListQueryL();
+				}
+				break;
+			default:
+				{
+				//Just save the conf info for other plugins
+				TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+				iHtiCfg->SetParameterL( KCommPlugin, implInfoArray[selectedOption]->DataType() );
+				iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+				UpdateSelectedComm();
+				}
+			}
+		}
+	CleanupStack::PopAndDestroy(2, pluginNameArray);  
+	}
+
+void CHtiAdminAppUi::HandleBtByAddress()
+	{
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath,  KHtiCfg ) );
+	iHtiCfg->SetParameterL( KCommPlugin, _L8( "BTSERIAL" ) );
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiBtCommCfg ) );
+	iHtiCfg->RemoveParameterL( KBtDeviceName );
+	iHtiCfg->RemoveParameterL( KBtDeviceAddress );
+
+	TBuf8<KMaxParameterValueLength> address;
+	if ( !ShowDialog( R_TEXT_QUERY, _L("BT address:"), address) )
+		{
+		iHtiCfg->SetParameterL( KBtDeviceAddress, address);
+		}
+
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiBtCommCfg);
+	UpdateSelectedComm();
+	}
+
+void CHtiAdminAppUi::HandleBtByName()
+	{
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+	iHtiCfg->SetParameterL( KCommPlugin, _L8( "BTSERIAL" ) );
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiBtCommCfg ) );
+	iHtiCfg->RemoveParameterL( KBtDeviceName );
+	iHtiCfg->RemoveParameterL( KBtDeviceAddress );
+
+	TBuf8<KMaxParameterValueLength> name;
+	if ( !ShowDialog( R_TEXT_QUERY, _L( "BT name:" ), name ) )
+		{
+		iHtiCfg->SetParameterL( KBtDeviceName, name );
+		}
+
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiBtCommCfg );
+	UpdateSelectedComm();
+	}
+
+void CHtiAdminAppUi::HandleBtSearch()
+	{
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+	iHtiCfg->SetParameterL( KCommPlugin, _L8( "BTSERIAL" ) );
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiBtCommCfg ) );
+	iHtiCfg->RemoveParameterL( KBtDeviceName );
+	iHtiCfg->RemoveParameterL( KBtDeviceAddress );
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiBtCommCfg );
+	UpdateSelectedComm();
+	}
+
+void CHtiAdminAppUi::HandleIPListen()
+	{
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+	iHtiCfg->SetParameterL( KCommPlugin, _L8("IPCOMM"));
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiIPCommCfg ) );
+	iHtiCfg->RemoveParameterL( KRemotePort );
+	iHtiCfg->RemoveParameterL( KRemoteHost );
+	
+	TBuf8<KMaxParameterValueLength> localPort;
+	if ( !ShowDialog( R_TEXT_QUERY, _L( "Local port:" ), localPort ) )
+		{
+		iHtiCfg->SetParameterL( KLocalPort, localPort );
+		ShowCommsDBListQueryL();
+		}
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiIPCommCfg );
+	UpdateSelectedComm();
+	}
+	
+void CHtiAdminAppUi::HandleIPConnect()
+	{
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+	iHtiCfg->SetParameterL( KCommPlugin, _L8( "IPCOMM" ) );
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+
+	TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiIPCommCfg ) );
+	iHtiCfg->RemoveParameterL( KLocalPort );
+	TBuf8<KMaxParameterValueLength> remoteHost;
+	TBuf8<KMaxParameterValueLength> remotePort;
+	if ( !ShowDialog( R_TEXT_QUERY, _L("Remote host:"), remoteHost ) )
+		{
+		iHtiCfg->SetParameterL( KRemoteHost, remoteHost );
+		if ( !ShowDialog( R_TEXT_QUERY, _L( "Remote port:" ), remotePort ) )
+			{
+			iHtiCfg->SetParameterL( KRemotePort, remotePort );
+			ShowCommsDBListQueryL();
+			}
+		}
+	iHtiCfg->SaveCfgL( KCfgFilePath, KHtiIPCommCfg );
+	UpdateSelectedComm();
+	}
+	
+
+// handle any menu commands
+void CHtiAdminAppUi::HandleCommandL(TInt aCommand)
+    {
+    TFileName cfgFile;
+
+    switch ( aCommand )
+        {
+        case EEikCmdExit:
+        case EAknSoftkeyExit:
+            Exit();
+            break;
+
+        case EHtiAdminStart:
+            {
+            HTI_LOG_TEXT( "Start" );
+            RProcess prs;
+            TInt err;
+            TBool isRunning = EFalse;
+            if ( OpenHtiProcess( prs ) )
+                {
+                if ( prs.ExitType() == EExitPending )
+                    {
+                    isRunning = ETrue;
+                    _LIT(KText, "Already running");
+                    iAppView->SetStatus( KText );
+                    }
+                prs.Close();
+                }
+
+            if ( !isRunning )
+                {
+                HTI_LOG_TEXT( "create process" );
+                err = prs.Create( KHtiFrameworkExe, KHtiAdminStartParameter );
+                if ( err == KErrNone )
+                    {
+                    prs.Resume();
+                    prs.Close();
+                    UpdateStatusL();
+                    HTI_LOG_TEXT("create done");
+                    }
+                else
+                    {
+                    TBuf<64> msg;
+                    msg.Format( _L("Error in starting: %d"), err );
+                    iAppView->SetStatus( msg );
+                    HTI_LOG_TEXT("create error");
+                    }
+                }
+            }
+            break;
+
+        case EHtiAdminStop:
+            {
+            HTI_LOG_TEXT("Stop");
+
+            // kill the watchdog to prevent it from restarting HTI again
+            KillHtiWatchDogL();
+
+            RProcess prs;
+            if ( OpenHtiProcess( prs ) )
+                {
+                if ( prs.ExitType() == EExitPending )
+                    {
+                    HTI_LOG_TEXT("try to kill");
+                    prs.Kill( KTerminateReason );
+                    UpdateStatusL();
+                    }
+                else
+                    {
+                    _LIT(KText, "Already stopped");
+                    iAppView->SetStatus( KText );
+                    }
+                prs.Close();
+                }
+            }
+            break;
+
+        case EHtiAdminAbout:
+            {
+            HTI_LOG_TEXT("About");
+            TDateSuffix suffix( KHtiVersionDay - 1 );
+            TMonthName month( ( TMonth ) ( KHtiVersionMonth - 1 ) );
+            TBuf<64> msgPart1;
+            msgPart1.Format( KHtiAdminAboutVersionFormat,
+                    KHtiVersionMajor, KHtiVersionMinor, KHtiVersionBuild );
+            msgPart1.AppendNum( KHtiVersionDay );
+            msgPart1.Append( suffix );
+            msgPart1.Append( ' ' );
+            msgPart1.Append( month );
+            msgPart1.Append( ' ' );
+            msgPart1.AppendNum( KHtiVersionYear );
+            msgPart1.Append( '.' );
+            msgPart1.Append( ' ' );
+            HBufC* msgPart2 = iEikonEnv->AllocReadResourceLC( R_HTIADMIN_ABOUT_TEXT );
+            HBufC* fullMsg = HBufC::NewLC( msgPart1.Length() + msgPart2->Length() );
+            fullMsg->Des().Append( msgPart1 );
+            fullMsg->Des().Append( *msgPart2 );
+            CAknMessageQueryDialog* dialog = new ( ELeave ) CAknMessageQueryDialog;
+            dialog->PrepareLC( R_HTIADMIN_ABOUT_DIALOG );
+            dialog->SetMessageTextL( *fullMsg );
+            dialog->RunLD();
+            CleanupStack::PopAndDestroy( 2 ); // fullMsg, msgPart2
+            }
+            break;
+
+        case EHtiAdminSubOptions:
+            break;
+
+        case EHtiAdminSubLogs:
+            break;
+
+        case EHtiAdminCreateLogFolder:
+#ifdef __ENABLE_LOGGING__
+            {
+            TInt err = KErrNone;
+            RFs fs;
+            err = fs.Connect();
+            if ( err == KErrNone )
+                {
+                err = fs.MkDirAll(_L("c:\\logs\\hti\\"));
+                }
+            fs.Close();
+            }
+#endif
+            break;
+
+        case EHtiAdminRemoveLogFolder:
+#ifdef __ENABLE_LOGGING__
+            {
+            TInt err = KErrNone;
+            RFs fs;
+            err = fs.Connect();
+            if ( err == KErrNone )
+                {
+                CFileMan *fileman = CFileMan::NewL( fs );
+                fileman->RmDir( _L( "c:\\logs\\hti\\" ) );
+                delete fileman;
+                }
+            fs.Close();
+            }
+#endif
+            break;
+
+        case EHtiAdminClearLogs:
+#ifdef __ENABLE_LOGGING__
+            {
+            TInt err = KErrNone;
+            RFs fs;
+            err = fs.Connect();
+            if ( err == KErrNone )
+                {
+                CFileMan *fileman = CFileMan::NewL( fs );
+                fileman->Delete( _L( "c:\\logs\\hti\\*" ) );
+                fileman->Delete( _L( "c:\\HTI_*.log" ) );
+                delete fileman;
+                }
+            fs.Close();
+            }
+#endif
+            break;
+
+        case EHtiAdminSubComms:
+        	{
+        	ShowCommsListQueryL();
+        	}
+            break;
+
+        case EHtiAdminSubPriority:
+            break;
+
+        case EHtiAdminPriorityBackground:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KPriority, _L8("1"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminPriorityForeground:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KPriority, _L8("2"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminPriorityHigh:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KPriority, _L8("3"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminPriorityAbsoluteHigh:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KPriority, _L8("4"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminSubAutoStart:
+            break;
+
+        case EHtiAdminAutoStartEnable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KEnableHtiAutoStart, _L8("1"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            UpdateAutoStartStatus();
+            break;
+
+        case EHtiAdminAutoStartDisable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KEnableHtiAutoStart, _L8("0"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            UpdateAutoStartStatus();
+            break;
+
+        case EHtiAdminSubWatchDog:
+            break;
+
+        case EHtiAdminWatchDogEnable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KEnableHtiWatchDog, _L8("1"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminWatchDogDisable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KEnableHtiWatchDog, _L8("0"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminSubConsole:
+            break;
+
+        case EHtiAdminConsoleEnable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KShowConsole, _L8("1"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminConsoleDisable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KShowConsole, _L8("0"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminErrorDialogsEnable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KShowErrorDialogs, _L8("1"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminErrorDialogsDisable:
+            TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+            iHtiCfg->SetParameterL( KShowErrorDialogs, _L8("0"));
+            iHtiCfg->SaveCfgL( KCfgFilePath, KHtiCfg );
+            break;
+
+        case EHtiAdminSubSetParam:
+            break;
+
+        case EHtiAdminHtiCfg:
+            cfgFile = KHtiCfg;
+
+        case EHtiAdminHtiBtCommCfg:
+            if ( !cfgFile.Length() )
+                cfgFile = KHtiBtCommCfg;
+
+        case EHtiAdminHtiIPCommCfg:
+            if ( !cfgFile.Length() )
+                cfgFile = KHtiIPCommCfg;
+
+        case EHtiAdminHtiSerialCommCfg:
+            {
+            if ( !cfgFile.Length() )
+                cfgFile = KHtiSerialCommCfg;
+
+            TBuf8<KMaxParameterNameLength> parameterName;
+            if ( !ShowDialog( R_TEXT_QUERY, _L("Parameter name:"), parameterName) )
+                {
+                TBuf8<KMaxParameterValueLength> parameterValue;
+                if ( !ShowDialog( R_TEXT_QUERY, _L("Parameter value:"), parameterValue ) )
+                    {
+                    TRAP_IGNORE( iHtiCfg->LoadCfgL( KCfgFilePath, cfgFile ) );
+                    iHtiCfg->SetParameterL( parameterName, parameterValue );
+                    iHtiCfg->SaveCfgL( KCfgFilePath, cfgFile);
+                    }
+                }
+            }
+            break;
+
+        default:
+        	{
+			CAknErrorNote* dialog = new(ELeave)CAknErrorNote(ETrue);			 
+			dialog->ExecuteLD(_L("Unknown Command Recieved"));
+			}
+        	break;
+        }
+    }
+
+void CHtiAdminAppUi::HandleForegroundEventL( TBool aForeground )
+    {
+    CAknAppUi::HandleForegroundEventL( aForeground );
+
+    if ( aForeground )
+        {
+        UpdateStatusL();
+        UpdateAutoStartStatus();
+        }
+    else
+        {
+        KillTimer();
+        }
+    }
+
+TBool CHtiAdminAppUi::OpenHtiProcess( RProcess& aPrs )
+    {
+    HTI_LOG_TEXT( "OpenHtiProcess" );
+
+    TFullName processName;
+    TInt err;
+
+    TFindProcess finder( KHtiMatchPattern );
+    err = finder.Next( processName );
+    if ( err == KErrNone )
+        {
+        HTI_LOG_TEXT( "try to open..." );
+        err = aPrs.Open( finder );
+        HTI_LOG_TEXT( "opened" );
+
+        if ( err == KErrNone )
+            {
+            HTI_LOG_TEXT( "OpenHtiProcess OK" );
+            return ETrue;
+            }
+        else
+            {
+            HTI_LOG_TEXT( "Failed to open process" );
+            TBuf<64> msg;
+            msg.Format( _L( "Error: %d" ), err );
+            iAppView->SetStatus( msg );
+            }
+        }
+    else if ( err == KErrNotFound )
+        {
+        HTI_LOG_TEXT( "Not found" );
+        _LIT( KNotFound, "Stopped" );
+        iAppView->SetStatus( KNotFound );
+        }
+    else
+        {
+        TBuf<64> msg;
+        msg.Format( _L( "Error: %d" ), err );
+        iAppView->SetStatus( msg );
+        }
+
+    HTI_LOG_TEXT( "OpenHtiProcess NOK" );
+
+    return EFalse;
+    }
+
+
+void CHtiAdminAppUi::UpdateVersion()
+    {
+    HTI_LOG_TEXT( "UpdateVersion" );
+    TBuf<128> tmp;
+    tmp.Format( KHtiAdminVersionFormat, KHtiVersionMajor, KHtiVersionMinor,
+        KHtiVersionBuild, KHtiVersionYear, KHtiVersionWeek );
+     iAppView->SetVersion( tmp );
+    }
+
+
+void CHtiAdminAppUi::UpdateStatusL()
+    {
+    HTI_LOG_TEXT( "UpdateStatusL" );
+    RProcess prs;
+    if ( OpenHtiProcess( prs ) )
+        {
+        HTI_LOG_TEXT( "Update display" );
+        TExitType exT = prs.ExitType();
+
+        switch ( exT )
+            {
+            case EExitPending:
+                {
+                _LIT( KTxt, "Running" );
+                iAppView->SetStatus( KTxt );
+
+                // start timer to watch the status
+                if ( !iPeriodic )
+                    {
+                    iPeriodic = CPeriodic::NewL( CActive::EPriorityStandard );
+                    iPeriodic->Start( 5 * 1000 * 1000,
+                                      5 * 1000 * 1000,
+                                      TCallBack( TimerCallBackL, this ) );
+                    }
+                }
+                break;
+
+            case EExitKill:
+            case EExitTerminate:
+                {
+                _LIT( KTxt, "Stopped" );
+                iAppView->SetStatus( KTxt );
+                KillTimer();
+                }
+                break;
+
+            case EExitPanic:
+                {
+                _LIT( KTxt, "Panic" );
+                iAppView->SetStatus( KTxt );
+                KillTimer();
+                }
+                break;
+            };
+        prs.Close();
+        }
+    else
+        {
+        KillTimer();
+        }
+    }
+
+void CHtiAdminAppUi::UpdateAutoStartStatus()
+    {
+    HTI_LOG_TEXT( "UpdateAutoStartStatus" );
+    TInt value = KErrNotFound;
+    TRAPD( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+    if ( !err )
+        {
+        TRAP( err, value = iHtiCfg->GetParameterIntL(KEnableHtiAutoStart) );
+        }
+
+    if ( value == KErrNotFound )
+        {
+        // Use default values if not found from config.
+#ifdef __WINS__
+        value = 0;
+#else
+        value = 1;
+#endif
+        }
+
+    if ( value == 0 )
+        {
+        _LIT( KTxt, "Disabled" );
+        iAppView->SetAutoStartStatus( KTxt );
+        }
+    else if ( value == 1 )
+        {
+        _LIT( KTxt, "Enabled" );
+        iAppView->SetAutoStartStatus( KTxt );
+        }
+    else
+        {
+        _LIT( KTxt, "Unknown" );
+        iAppView->SetAutoStartStatus( KTxt );
+        }
+    }
+
+void CHtiAdminAppUi::UpdateSelectedComm()
+    {
+    HTI_LOG_TEXT( "UpdateSelectedComm" );
+    TBuf<64> commPlugin;
+    TRAPD( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiCfg ) );
+    if ( !err )
+        {
+        TBuf8<KMaxParameterValueLength> commValue;
+        TRAP( err, commValue = iHtiCfg->GetParameterL( KCommPlugin ) );
+        if ( err == KErrNone )
+            {
+            commPlugin.Copy( commValue );
+            }
+        }
+    // Use default if not found from config
+    if ( commPlugin.Length() == 0 )
+        {
+        commPlugin.Copy(KCommDefaultImplementation  );        
+        }
+    iAppView->SetSelectedComm( commPlugin );
+
+    if ( commPlugin.Compare( _L( "SERIAL" ) ) == 0 )
+        {
+        TInt portNum = 0;
+        TRAP( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiSerialCommCfg ) );
+        if ( err == KErrNone )
+            {
+            TRAP( err, portNum = iHtiCfg->GetParameterIntL( KCommPortNumber ) );
+            }
+        TBuf<16> portBuf;
+        portBuf.Copy( _L( "Port: " ) );
+        portBuf.AppendNum( portNum );
+        iAppView->SetCommDetails( portBuf );
+        }
+
+    else if ( commPlugin.Compare( _L( "BTSERIAL" ) ) == 0 )
+        {
+        TBuf<64> hostBuf;
+        TRAP( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiBtCommCfg ) );
+        if ( err == KErrNone )
+            {
+            TBuf8<KMaxParameterValueLength> hostValue;
+            TRAP( err, hostValue = iHtiCfg->GetParameterL( KBtDeviceAddress ) );
+            if ( err != KErrNone )
+                {
+                TRAP( err, hostValue = iHtiCfg->GetParameterL( KBtDeviceName ) );
+                }
+            if ( err == KErrNone )
+                {
+                hostBuf.Copy( hostValue );
+                }
+            }
+        if ( hostBuf.Length() > 0 )
+            {
+            hostBuf.Insert( 0, _L( "Host: " ) );
+            }
+        iAppView->SetCommDetails( hostBuf );
+        }
+
+    else if ( commPlugin.Compare( _L( "IPCOMM" ) ) == 0 )
+        {
+        TBuf<128> hostBuf;
+        TRAP( err, iHtiCfg->LoadCfgL( KCfgFilePath, KHtiIPCommCfg ) );
+        if ( err == KErrNone )
+            {
+            TInt localPort = 0;
+            TRAP( err, localPort = iHtiCfg->GetParameterIntL( KLocalPort ) );
+            if ( err == KErrNone && localPort > 0 )
+                {
+                hostBuf.Copy( _L( "Listen: " ) );
+                hostBuf.AppendNum( localPort );
+                }
+            else
+                {
+                TBuf8<KMaxParameterValueLength> remoteHost;
+                TInt remotePort = 0;
+                TRAP( err, remoteHost = iHtiCfg->GetParameterL( KRemoteHost ) );
+                if ( err == KErrNone )
+                    {
+                    TRAP( err, remotePort = iHtiCfg->GetParameterIntL(
+                            KRemotePort ) );
+                    }
+                if ( err == KErrNone )
+                    {
+                    hostBuf.Copy( remoteHost );
+                    hostBuf.Insert( 0, _L("Connect: " ) );
+                    hostBuf.Append( ':' );
+                    hostBuf.AppendNum( remotePort );
+                    }
+                else
+                    {
+                    hostBuf.Copy( _L( "Invalid config!" ) );
+                    }
+                }
+            }
+        iAppView->SetCommDetails( hostBuf );
+        }
+
+    else
+        {
+        iAppView->SetCommDetails( KNullDesC );
+        }
+    }
+
+void CHtiAdminAppUi::KillHtiWatchDogL()
+    {
+    TFullName processName;
+    TFindProcess finder( KHtiWatchDogMatchPattern );
+    TInt err = finder.Next( processName );
+    if ( err == KErrNone )
+        {
+        HTI_LOG_TEXT( "HTI watchdog process found. Trying to open and kill it..." );
+        RProcess prs;
+        User::LeaveIfError( prs.Open( finder ) );
+        prs.Kill( KTerminateReason );
+        prs.Close();
+        HTI_LOG_TEXT( "HTI watchdog killed" );
+        }
+    }
+
+void CHtiAdminAppUi::KillTimer()
+    {
+    if ( iPeriodic )
+        {
+        iPeriodic->Cancel();
+        delete iPeriodic;
+        iPeriodic = NULL;
+        }
+    }
+
+TInt CHtiAdminAppUi::TimerCallBackL( TAny* aPtr )
+    {
+    ( (CHtiAdminAppUi*)aPtr )->UpdateStatusL();
+    return ETrue;
+    }
+
+void CHtiAdminAppUi::ShowCommsDBListQueryL()
+    {
+    TInt selectedOption( KErrNotFound );
+    TBuf<KMaxParameterValueLength> name;
+                 
+    CDesCArrayFlat* array = new (ELeave) CDesCArrayFlat(16);
+    CleanupStack::PushL(array);
+
+    // Get IAP names from the database
+    CCommsDatabase* db = CCommsDatabase::NewL(EDatabaseTypeIAP);;
+    CleanupStack::PushL(db);
+    db->ShowHiddenRecords();
+    CCommsDbTableView* view = db->OpenTableLC(TPtrC(IAP));
+    TInt res = view->GotoFirstRecord();
+
+    while(res == KErrNone)
+        {
+        view->ReadTextL(TPtrC(COMMDB_NAME), name);
+        array->InsertL(0, name);
+        res = view->GotoNextRecord();
+        }
+
+    CleanupStack::PopAndDestroy(view); //view
+    CleanupStack::PopAndDestroy(db); //db    
+
+    // Show IAP selection dialog
+    CAknListQueryDialog* dlg = new(ELeave) CAknListQueryDialog(&selectedOption);
+    dlg->PrepareLC(R_SELECT_IAP_DIALOG);
+    dlg->SetItemTextArray(array);
+    dlg->SetOwnershipType(ELbmDoesNotOwnItemArray);
+    dlg->RunLD();
+
+    if(selectedOption != KErrNotFound)
+        {
+        // Write selected IAP name to config file
+        name = array->MdcaPoint(selectedOption); 
+        TBuf8<KMaxParameterValueLength> iapName;
+        iapName.Copy(name);
+        iHtiCfg->SetParameterL(KIAPName, iapName);
+        }
+    CleanupStack::PopAndDestroy(array); 
+    }
+// End of file