--- a/hti/HtiFramework/src/HtiDispatcher.cpp Thu Jul 15 20:25:38 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1334 +0,0 @@
-/*
-* 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: This file contains the implementations of the CHTIDispatcher
-* class.
-*
-*/
-
-
-#include "HtiDispatcher.h"
-#include "HtiMessage.h"
-#include "HtiMessageQueue.h"
-#include "HtiLogging.h"
-#include "HtiCommAdapter.h"
-#include "HtiServicePluginInterface.h"
-#include "HtiCommPluginInterface.h"
-#include "HtiSecurityManager.h"
-#include "HtiVersion.h"
-
-#include <e32debug.h>
-
-//active objects priorities
-const static TInt KHtiIdlePriority = 2;
-
-const static TInt KDefaultMaxQueueSize = 4 * 1024 * 1024; // 4 MB
-
-//HTI system service commands
-enum THtiCommand
- {
- EHtiAuthentication = 0x01,
- EHtiVersion = 0x02,
- EHtiServiceList = 0x03,
- EHtiStop = 0x04,
- EHtiReboot = 0x05,
- EHtiFormat = 0x06,
- EHtiReset = 0x07,
- EHtiShowConsole = 0x08,
- EHtiHideConsole = 0x09,
- EHtiInstanceId = 0x0A,
- EHtiDebugPrint = 0x0B,
- EHtiRestartServices= 0x0C,
- EHtiError = 0xFF
- };
-
-//HTI error messages
-const static TInt KMaxErrMessageLength = KErrorDescriptionMaxLength + 10;
-
-//error descriptions
-_LIT8( KHtiSystemCmdErrDescr, "Unknown HTI command" );
-_LIT8( KErrDescrDispatchOut, "Failed to dispatch message" );
-_LIT8( KErrDescrWrap, "Failed to wrap message" );
-_LIT8( KErrDescrDispatchOutError, "Failed to dispatch error message" );
-_LIT8( KErrDescrInvalidParameter, "Invalid command parameter" );
-_LIT8( KErrDescrNotInRom, "Command supported only if HTI is running from ROM" );
-
-const static TChar KSpChar = ' ';
-const static TChar KNewLineChar = '\n';
-const static TInt KHtiServiceNameLength = 124;
-const static TInt KHtiServiceListRecordLength = KHtiServiceNameLength + 4;
-
-_LIT( KHtiWatchDogMatchPattern, "HtiWatchDog*" );
-_LIT( KHtiDeviceRebootExeOS, "HtiDeviceRebootOS.exe" );
-_LIT( KHtiDeviceRebootExeUI, "HtiDeviceRebootUI.exe" );
-_LIT( KHtiRestartExeName, "HtiRestart.exe");
-
-_LIT( KParamNormalRfs, "rfsnormal" );
-_LIT( KParamDeepRfs, "rfsdeep" );
-
-TDesC8* THtiSystemProtocolHelper::ErrorMessageL( TInt aHtiErrorCode,
- const TUid aTargetServiceUid )
- {
- HBufC8* msg = HBufC8::NewL( KMaxErrMessageLength );
- msg->Des().Append( EHtiError ); //one byte
- msg->Des().Append( aHtiErrorCode ); //one byte
- msg->Des().AppendFill( 0x00, 4 ); //missed service error code
- //append uid as TInt32 by copying 4 bytes through pointer
- msg->Des().Append( ( TUint8* )( &( aTargetServiceUid.iUid ) ), 4 );
- return msg;
- }
-
-TDesC8* THtiSystemProtocolHelper::ErrorMessageL( TInt aHtiErrorCode,
- const TUid aTargetServiceUid,
- TInt aErrorCode,
- const TDesC8& aErrorDescription )
- {
- HBufC8* msg = HBufC8::NewL( KMaxErrMessageLength );
- msg->Des().Append( EHtiError ); //one byte
- msg->Des().Append( aHtiErrorCode ); //one byte
- msg->Des().Append( ( TUint8* ) ( &aErrorCode ), 4 ); //4 bytes
- //append uid as TInt32 by copying 4 bytes through pointer
- msg->Des().Append( ( TUint8* )( &( aTargetServiceUid.iUid ) ), 4 );
- msg->Des().Append( aErrorDescription );
- return msg;
- }
-
-TDesC8* THtiSystemProtocolHelper::AuthMessageL( const TDesC8& aToken )
- {
- HBufC8* msg = HBufC8::NewL( aToken.Length() + 1 );
- msg->Des().Append( EHtiAuthentication );
- msg->Des().Append( aToken );
- return msg;
- }
-
-/*************************************************************************
-* CHtiDispatcher implementation
-*
-**************************************************************************/
-CHtiDispatcher::CHtiDispatcher( TInt aMaxQueueMemorySize,
- TInt aReconnectDelay, TBool aShowErrorDialogs ):
- iIdleActive( EFalse ),
- iMaxQueueMemorySize( aMaxQueueMemorySize > 0 ?
- aMaxQueueMemorySize : KDefaultMaxQueueSize ),
- iToReboot( EFalse ),
- iRfsMode( ERfsUnknown ),
- iConsole( NULL ),
- iIdleOverCommAdapter( EFalse ),
- iHtiInstanceId( 0 ),
- iShowErrorDialogs( aShowErrorDialogs ),
- iReconnectDelay(aReconnectDelay),
- iRebootReason(-1)
- {
- HTI_LOG_FORMAT( "MaxQueueMemorySize %d", iMaxQueueMemorySize );
- iQueueSizeLowThresold = ( iMaxQueueMemorySize / 2 ) / 2;
- iQueueSizeHighThresold = ( iMaxQueueMemorySize / 2 ) * 4 / 5;
- HTI_LOG_FORMAT( "QueueSizeThresholds low : %d", iQueueSizeLowThresold );
- HTI_LOG_FORMAT( "QueueSizeThresholds high: %d", iQueueSizeHighThresold );
- }
-
-void CHtiDispatcher::ConstructL( const TDesC8& aCommPlugin,
- TInt aMaxMsgSize,
- TBool aShowConsole )
- {
- HTI_LOG_FUNC_IN( "CHTIDispatcher::ConstructL()" );
-#ifdef __ENABLE_LOGGING__
- DebugListPlugins();
-#endif
-
- if ( aShowConsole )
- {
- // Create the HTI console
- iConsole = Console::NewL( _L( "HtiFramework" ),
- TSize( KConsFullScreen, KConsFullScreen ) );
- iConsole->Printf( _L( "HTI Framework\n" ) );
- iConsole->Printf( _L( "=============\n\n" ) );
- iConsole->Printf( _L( "Version %u.%u\n" ),
- KHtiVersionMajor, KHtiVersionMinor );
- iConsole->Printf( _L( "Starting up...\n" ) );
- }
-
- //create queues
- iIncomingQueue = CHtiMessageQueue::NewL();
- iOutgoingQueue = CHtiMessageQueue::NewL();
-
- //security manager init
- iSecurityManager = CHtiSecurityManager::NewL();
-
- //plugins array
- iLoadedServices = new (ELeave)
- RArray<TServiceItem>( KServiceArrayGranularity );
-
- iMemoryObservers = new (ELeave)
- RPointerArray<MHtiMemoryObserver>( KServiceArrayGranularity );
-
- //try to load default plugin if specified can't be found
- if ( aCommPlugin.Length() == 0 )
- {
- HTI_LOG_TEXT( "load default comm plugin" );
- iCommPlugin = CHTICommPluginInterface::NewL();
- }
- else
- {
- HTI_LOG_TEXT( "load Comm plugin" );
- HTI_LOG_DES( aCommPlugin );
- iCommPlugin = CHTICommPluginInterface::NewL( aCommPlugin );
- }
-
- if ( iConsole )
- {
- iConsole->Printf( _L( "Communication plugin loaded.\n" ) );
- }
-
- iListener = CHtiCommAdapter::NewL( iCommPlugin, this, aMaxMsgSize );
- iSender = CHtiCommAdapter::NewL( iCommPlugin, this, aMaxMsgSize );
-
- //!!!!!!!!!!!!! -=IMPORTANT=- !!!!!!!!!!!!!!!!!!!!!!!!!!!!
- // idle should be created (added to AS) AFTER comm adapters
- //!!!!!!!!!!!!! -=IMPORTANT=- !!!!!!!!!!!!!!!!!!!!!!!!!!!!
- //create CIdle object
- iIdle = CIdle::NewL( KHtiIdlePriority );
-
- // start listening for incoming messages
- Reset();
-
- HTI_LOG_FUNC_OUT( "CHTIDispatcher::ConstructL()" );
- }
-
-CHtiDispatcher::~CHtiDispatcher()
- {
- HTI_LOG_FUNC_IN( "CHTIDispatcher::~CHTIDispatcher" );
-
- if ( iIdle )
- {
- iIdle->Cancel();
- delete iIdle;
- }
-
- UnloadAllServices();
-
- if ( iLoadedServices )
- {
- iLoadedServices->Close();
- delete iLoadedServices;
- }
-
- if ( iMemoryObservers )
- {
- iMemoryObservers->Close();
- delete iMemoryObservers;
- }
-
- delete iIncomingQueue;
- delete iOutgoingQueue;
-
- delete iListener;
- delete iSender;
-
- delete iCommPlugin;
-
- REComSession::FinalClose();
-
- delete iSecurityManager;
-
- if ( iRfsMode == ERfsNormal || iRfsMode == ERfsDeep )
- {
- HTI_LOG_FORMAT( "Activating Restore Factory Settings %d", iRfsMode );
- RestoreFactorySettings();
- }
-
- if ( iToReboot )
- {
- HTI_LOG_TEXT( "Reboot now" );
- Reboot();
- }
-
- delete iConsole;
-
- HTI_LOG_FUNC_OUT( "CHTIDispatcher::~CHTIDispatcher" );
- }
-
-
-CHtiDispatcher* CHtiDispatcher::NewLC( const TDesC8& aCommPlugin,
- TInt aMaxMsgSize,
- TInt aMaxQueueMemory,
- TInt aReconnectDelay,
- TBool aShowConsole,
- TBool aShowErrorDialogs )
- {
- CHtiDispatcher* obj = new (ELeave) CHtiDispatcher(
- aMaxQueueMemory, aReconnectDelay,aShowErrorDialogs );
- CleanupStack::PushL( obj );
- obj->ConstructL( aCommPlugin, aMaxMsgSize, aShowConsole );
- return obj;
- }
-
-CHtiDispatcher* CHtiDispatcher::NewL( const TDesC8& aCommPlugin,
- TInt aMaxMsgSize,
- TInt aMaxQueueMemory,
- TInt aReconnectDelay,
- TBool aShowConsole,
- TBool aShowErrorDialogs )
- {
- CHtiDispatcher* obj = NewLC( aCommPlugin, aMaxMsgSize, aMaxQueueMemory,
- aReconnectDelay,aShowConsole, aShowErrorDialogs );
- CleanupStack::Pop();
- return obj;
- }
-
-CConsoleBase* CHtiDispatcher::GetConsole()
- {
- return iConsole;
- }
-
-TBool CHtiDispatcher::GetShowErrorDialogs()
- {
- return iShowErrorDialogs;
- }
-
-void CHtiDispatcher::CheckPriorities()
- {
- // If incoming queue reaches some high limit then lower its priority
- // below idle object priority.
- // Make opposite when incoming queue size reaches some low limit
- if ( iIncomingQueue->QueueSize() > iQueueSizeHighThresold )
- {
- if ( !( iListener->IsActive() || iIdleOverCommAdapter ) )
- {
- HTI_LOG_TEXT( "Set listener priority low" );
- iListener->Deque();
- CActiveScheduler::Add( iListener );
- iIdleOverCommAdapter = ETrue;
- }
- }
- }
-
-void CHtiDispatcher::DispatchIncomingMessage( CHtiMessage* aMessage )
- {
- HTI_LOG_FUNC_IN( "DispatchIncomingMessage" );
-
- iIncomingQueue->Add( *aMessage );
-
- //start CIdle if needed
- Start();
- CheckPriorities();
-
- HTI_LOG_FUNC_OUT( "DispatchIncomingMessage" );
- }
-
-TInt CHtiDispatcher::DispatchOutgoingMessage( TDesC8* aMessage,
- const TUid aTargetServiceUid,
- TBool aWrappedFlag,
- THtiMessagePriority aPriority )
- {
- HTI_LOG_FUNC_IN( "DispatchOutgoingMessage" );
- HTI_LOG_TEXT( "Construct HTI message" );
-
- //send only if enough memory
- TInt returnErr = KErrNone;
- if ( aMessage->Size() <= GetFreeMemory() )
- {
- //call here wrapping
- CHtiMessage* msg = NULL;
- if ( aWrappedFlag )
- {
- TDesC8* wrapped = NULL;
- TRAP( returnErr, wrapped = iSecurityManager->WrapL( *aMessage ) );
- if ( returnErr == KErrNone )
- {
- TRAP( returnErr,
- msg = CHtiMessage::NewL( wrapped, aTargetServiceUid,
- aWrappedFlag, aPriority ) );
- if ( returnErr != KErrNone )
- {
- UrgentReboot( returnErr, KErrDescrDispatchOut );
- }
- //wrapped message is kept, original is deleted
- delete aMessage;
- }
- else
- {
- UrgentReboot( returnErr, KErrDescrWrap );
- }
- }
- else
- {
- TRAP( returnErr, msg = CHtiMessage::NewL( aMessage,
- aTargetServiceUid, aWrappedFlag, aPriority ) );
-
- if ( returnErr != KErrNone )
- {
- UrgentReboot( returnErr, KErrDescrDispatchOut );
- }
- }
-
- // put in a queue
- if ( msg )
- iOutgoingQueue->Add( *msg );
-
- //start CIdle if needed
- Start();
- }
- else
- {
- returnErr = KErrNoMemory;
- }
-
- HTI_LOG_FUNC_OUT( "DispatchOutgoingMessage" );
- return returnErr;
- }
-
-TInt CHtiDispatcher::DispatchOutgoingErrorMessage( TInt aErrorCode,
- const TDesC8& aErrorDescription,
- const TUid aTargetServiceUid )
- {
- HTI_LOG_FUNC_IN( "DispatchError" );
-
- if ( aTargetServiceUid == TUid::Null() )
- {
- return KErrArgument;
- }
-
- HTI_LOG_FORMAT( "ErrorCode %d", aErrorCode );
- TInt err = KErrNone;
- TDesC8* msg = NULL;
- TRAP( err, msg = THtiSystemProtocolHelper::ErrorMessageL(
- EHtiErrServiceError,
- aTargetServiceUid,
- aErrorCode,
- aErrorDescription ) );
-
- if ( err != KErrNone )
- {
- UrgentReboot( err, KErrDescrDispatchOutError );
- }
-
- err = DispatchOutgoingMessage( msg, KHtiSystemServiceUid,
- EFalse, EHtiPriorityDefault );
-
- if ( err == KErrNoMemory )
- {
- delete msg;
- }
-
- HTI_LOG_FUNC_OUT( "DispatchError" );
- return err;
- }
-
-TInt CHtiDispatcher::DispatchOutgoingErrorMessage( THtiError aHtiErroreCode,
- TInt aLeaveCode,
- const TUid aTargetServiceUid )
- {
- HTI_LOG_FORMAT( "leaveCode %d", aLeaveCode );
- TInt err = KErrNone;
- TDesC8* msg = NULL;
-
- TRAP( err, msg = THtiSystemProtocolHelper::ErrorMessageL(
- aHtiErroreCode,
- aTargetServiceUid,
- aLeaveCode,
- KNullDesC8 ) );
-
- if ( err != KErrNone )
- {
- UrgentReboot( err, KErrDescrDispatchOutError );
- }
-
- err = DispatchOutgoingMessage( msg, KHtiSystemServiceUid,
- EFalse, EHtiPriorityDefault );
-
- if ( err == KErrNoMemory )
- {
- delete msg;
- }
-
- return err;
- }
-
-TInt CHtiDispatcher::DispatchOutgoingErrorMessage( THtiError aHtiErrorCode,
- const TUid aTargetServiceUid )
- {
- HTI_LOG_FORMAT( "HtiErrorCode %d", aHtiErrorCode );
- TInt err = KErrNone;
- TDesC8* msg = NULL;
-
- TRAP( err, msg = THtiSystemProtocolHelper::ErrorMessageL( aHtiErrorCode,
- aTargetServiceUid ) );
-
- if ( err != KErrNone )
- {
- UrgentReboot( err, KErrDescrDispatchOutError );
- }
-
- err = DispatchOutgoingMessage( msg, KHtiSystemServiceUid,
- EFalse, EHtiPriorityDefault );
-
- if ( err == KErrNoMemory )
- {
- delete msg;
- }
-
- return err;
- }
-
-TInt CHtiDispatcher::DispatchOutgoingMessage(TDesC8* aMessage,
- const TUid aTargetServiceUid)
- {
- return DispatchOutgoingMessage( aMessage, aTargetServiceUid,
- EFalse, EHtiPriorityDefault );
- }
-
-void CHtiDispatcher::AddMemoryObserver( MHtiMemoryObserver* anObserver )
- {
- if ( iMemoryObservers->FindInAddressOrder( anObserver ) == KErrNotFound )
- {
- iMemoryObservers->InsertInAddressOrder( anObserver );
- }
- }
-
-void CHtiDispatcher::RemoveMemoryObserver( MHtiMemoryObserver* anObserver )
- {
- TInt removeIndex = iMemoryObservers->FindInAddressOrder( anObserver );
- if ( removeIndex != KErrNotFound )
- {
- iMemoryObservers->Remove( removeIndex );
- }
- }
-
-void CHtiDispatcher::DoMemoryNotification()
- {
- if ( iMemoryObservers->Count() > 0 )
- {
- TInt memory = GetFreeMemory();
- for ( TInt i = 0; i < iMemoryObservers->Count(); ++i )
- {
- ( *iMemoryObservers )[i]->NotifyMemoryChange( memory );
- }
- }
- }
-
-TInt CHtiDispatcher::GetFreeMemory()
- {
- return iMaxQueueMemorySize
- - iIncomingQueue->QueueSize()
- - iOutgoingQueue->QueueSize();
- }
-
-void CHtiDispatcher::Start()
- {
- if ( !( iIdle->IsActive() || iIdleActive ) )
- {
- HTI_LOG_TEXT( "Start CIdle" );
- iIdleActive = ETrue;
- iIdle->Start( TCallBack( DispatchCallback, this ) );
- }
- }
-
-void CHtiDispatcher::Notify( TInt anError )
- {
- HTI_LOG_FORMAT( "CHtiDispatcher::Notify: %d", anError );
- anError = anError;
- //start CIdle to check for messages
- Start();
- }
-
-TInt CHtiDispatcher::DoDispatch()
- {
- HTI_LOG_FUNC_IN( "DoDispatch" );
-
- TBool isFailed = ETrue;
-
- //dispatch
- CHtiMessage* msg = NULL;
-
- //Process message from the queues
- if ( !iSender->IsActive() )
- {
- msg = iOutgoingQueue->Remove();
- if ( msg )
- {
- //process outgoing
- iSender->SendMessage( msg );
- isFailed = EFalse;
- }
-
- //after some messages removed do memory notification
- DoMemoryNotification();
- }
-
- iIncomingQueue->StartServiceIteration();
- TBool msgProcessed = EFalse;
- while ( ( msg = iIncomingQueue->GetNext() ) != NULL && !msgProcessed )
- {
- //processing of incoming HTI message
- HTI_LOG_TEXT( "incoming msg" );
-
- //1. find service
- HTI_LOG_TEXT( "service uid" );
- TUid cmd = msg->DestinationServiceUid();
- THtiMessagePriority msgPriority = ( msg->Priority() && KPriorityMask ) ?
- EHtiPriorityControl:
- EHtiPriorityData;
- HTI_LOG_FORMAT( "UID: %d", cmd.iUid );
-
- //check if it's a system message
- if ( cmd == KHtiSystemServiceUid )
- {
- TPtrC8 body = msg->Body();
- TRAPD( err, HandleSystemMessageL( body ) );
- if ( err != KErrNone )
- {
- //do nothing
- HTI_LOG_FORMAT( "Failed handle HTI service, err %d", err );
- }
- msgProcessed = ETrue;
- }
- else
- {
- if ( iSecurityManager->IsContextEstablashed() )
- {
- CHTIServicePluginInterface* service = GetService( cmd );
- if ( service )
- {
- //2. call service
- if ( !service->IsBusy() )
- {
- TInt err;
- if ( msg->IsWrapped() )
- {
- TDesC8* unwrapped = NULL;
- TRAP( err,
- unwrapped = iSecurityManager->UnwrapL(
- msg->Body() ) );
- if ( err == KErrNone && unwrapped )
- {
- TRAP( err, service->ProcessMessageL(
- *unwrapped,
- msgPriority ) );
-
- delete unwrapped;
- }
- else
- {
- HTI_LOG_FORMAT( "ERROR: Unwrap %d", err );
- DispatchOutgoingErrorMessage( EHtiErrUnwrap,
- err, cmd );
- err = KErrNone;
- }
- }
- else
- {
- TPtrC8 body = msg->Body();
- TRAP( err, service->ProcessMessageL( body,
- msgPriority ) );
- }
-
- if ( err != KErrNone )
- {
- HTI_LOG_FORMAT( "ERROR: Service Error %d", err );
- DispatchOutgoingErrorMessage( EHtiErrServiceError,
- err, cmd );
- }
-
- msgProcessed = ETrue;
- }
- else
- {
- HTI_LOG_TEXT( "service is busy" );
- }
- }
- else
- {
- //send error message ServiceNotFound
- HTI_LOG_TEXT( "ERROR: service not found" );
- DispatchOutgoingErrorMessage( EHtiErrServiceNotFound, cmd );
- msgProcessed = ETrue;
- }
- }
- else
- {
- //not authorized acces
- HTI_LOG_TEXT( "ERROR: not authorized acces" );
- DispatchOutgoingErrorMessage( EHtiErrNotAuthorized, cmd );
- msgProcessed = ETrue;
- }
- }
- if ( msgProcessed )
- {
- //remove msg from dispatcher
- if ( iIncomingQueue->Remove( msg ) )
- {
- delete msg;
- }
-
- isFailed = EFalse;
- }
- }
-
- HTI_LOG_FORMAT( "IQ:%d", iIncomingQueue->QueueSize() );
- HTI_LOG_FORMAT( "OQ:%d", iOutgoingQueue->QueueSize() );
-
- HTI_LOG_FREE_MEM();
- HTI_LOG_ALLOC_HEAP_MEM();
-
- //if queues are empty & listener stopped - stop all
- if ( iIncomingQueue->IsEmpty() && iOutgoingQueue->IsEmpty() &&
- !iListener->IsActive() )
- {
- CActiveScheduler::Stop();
- }
-
- if ( iIncomingQueue->QueueSize() < iQueueSizeLowThresold && iIdleOverCommAdapter )
- {
- HTI_LOG_TEXT( "set listener priority high" );
- iIdle->Deque();
- CActiveScheduler::Add( iIdle );
- iIdleOverCommAdapter = EFalse;
- }
-
- if ( isFailed )
- {
- HTI_LOG_TEXT( "dispatch failed, stop CIdle" );
- //stop iIdle if there are long outgoing requests
- iIdleActive = EFalse;
- }
- else
- {
- iIdleActive = !iIncomingQueue->IsEmpty() || !iOutgoingQueue->IsEmpty();
- }
-
- HTI_LOG_FUNC_OUT( "DoDispatch" );
- return iIdleActive;
- }
-
-CHTIServicePluginInterface* CHtiDispatcher::GetService(
- const TUid aServiceUid )
- {
- CHTIServicePluginInterface* result = NULL;
- for ( TInt i = 0; i < iLoadedServices->Count(); ++i )
- {
- if ( aServiceUid == (*iLoadedServices)[i].iServiceUid )
- return (*iLoadedServices)[i].iService;
- }
-
- HTI_LOG_FORMAT( "Load service: %d", aServiceUid.iUid );
-
- TRAPD( err, result = CHTIServicePluginInterface::NewL(
- MapServicePluginUid( aServiceUid ) ) );
- if ( err == KErrNone )
- {
- //set dispatcher
- result->SetDispatcher( this );
- //call InitL()
- TRAP( err, result->InitL() );
- if ( err != KErrNone )
- {
- HTI_LOG_TEXT( "Failed at InitL()" );
- delete result;
- result = NULL;
- }
- else
- {
- //add service to the array
- TServiceItem serviceItem;
- serviceItem.iServiceUid = aServiceUid;
- serviceItem.iService = result;
-
- if ( iLoadedServices->Append( serviceItem ) != KErrNone )
- {
- HTI_LOG_TEXT( "Failed to load service" );
- delete result;
- result = NULL;
- }
- }
- }
- else
- {
- result = NULL;
- HTI_LOG_FORMAT( "Failed to load service %d", err );
- }
-
- return result;
- }
-
-void CHtiDispatcher::UnloadAllServices()
- {
- if ( iLoadedServices )
- {
- for ( TInt i=0; i < iLoadedServices->Count(); ++i )
- {
- delete (*iLoadedServices)[i].iService;
- }
- iLoadedServices->Reset();
- }
- if ( iMemoryObservers )
- {
- iMemoryObservers->Reset();
- }
- }
-
-TInt CHtiDispatcher::DispatchCallback( TAny* aObj )
- {
- return ( reinterpret_cast<CHtiDispatcher*>( aObj ) )->DoDispatch();
- }
-
-void CHtiDispatcher::Reset()
- {
- UnloadAllServices();
- iIncomingQueue->RemoveAll();
- iOutgoingQueue->RemoveAll();
- iSecurityManager->ResetSecurityContext();
-
- iListener->Reset();
- iSender->Reset();
-
- iListener->ReceiveMessage();
- }
-
-void CHtiDispatcher::HandleSystemMessageL( const TDesC8& aMessage )
- {
- HTI_LOG_FUNC_IN( "HandleSystemMessage" );
-
- if ( aMessage.Length() > 0 )
- {
- HTI_LOG_FORMAT( "cmd %d", aMessage[0] );
- if ( aMessage[0] == EHtiAuthentication )
- {
- //pass token to security manager
- TPtrC8 token = aMessage.Mid( 1 );//token start at the second byte
-
- TDesC8* replyToken = iSecurityManager->SetSecurityContext( token );
- CleanupStack::PushL( replyToken );
- //prepare reply message
- TDesC8* reply = THtiSystemProtocolHelper::AuthMessageL(
- *replyToken );
-
- CleanupStack::PushL( reply );
-
- User::LeaveIfError( DispatchOutgoingMessage(
- reply,
- KHtiSystemServiceUid ) );
-
- CleanupStack::Pop(); //reply
- CleanupStack::PopAndDestroy(); //replyToken
- }
- else if ( iSecurityManager->IsContextEstablashed() )
- {
- switch ( aMessage[0] )
- {
- case EHtiServiceList:
- {
- TDesC8* list = ServicePluginsListL();
- CleanupStack::PushL( list );
- User::LeaveIfError( DispatchOutgoingMessage( list,
- KHtiSystemServiceUid ) );
- CleanupStack::Pop();
- }
- break;
-
- case EHtiVersion:
- {
- HBufC8* msg = HBufC8::NewLC( 2 );
- msg->Des().Append( KHtiVersionMajor );
- msg->Des().Append( KHtiVersionMinor );
- User::LeaveIfError(
- DispatchOutgoingMessage( msg, KHtiSystemServiceUid ) );
- CleanupStack::Pop(); // msg
- }
- break;
-
- case EHtiInstanceId:
- {
- if ( iHtiInstanceId == 0 )
- {
- CreateInstanceId();
- }
- HBufC8* msg = HBufC8::NewLC( sizeof( TUint32 ) );
- msg->Des().Append( ( TUint8* ) ( &iHtiInstanceId ), sizeof( TUint32 ) );
- User::LeaveIfError(
- DispatchOutgoingMessage( msg, KHtiSystemServiceUid ) );
- CleanupStack::Pop(); // msg
- if ( iConsole )
- {
- iConsole->Printf( _L( "Instance ID = %u\n" ), iHtiInstanceId );
- }
- }
- break;
-
- case EHtiReboot:
- {
- if(aMessage.Length() == 2)
- {
- iRebootReason = aMessage[1];
- }
- else if(aMessage.Length() == 1)
- {
- iRebootReason = -1;
- }
- else
- {
- User::LeaveIfError(DispatchOutgoingErrorMessage( KErrArgument,
- KErrDescrInvalidParameter,
- KHtiSystemServiceUid ) );
- break;
- }
- ShutdownAndRebootDeviceL();
- }
- break;
-
- case EHtiStop:
- {
- HTI_LOG_TEXT( "STOP" );
- //stop all requests
- //cancel just incoming request
- //after all outgoing messages sent system will go down
- iListener->Cancel();
-
- // kill the watchdog, so HTI stays stopped
- KillHtiWatchDogL();
- }
- break;
-
- case EHtiRestartServices:
- {
- HTI_LOG_TEXT("RESTARTSERVISE");
- if(aMessage.Length() != 1 && aMessage.Length() != 5)
- {
- User::LeaveIfError(DispatchOutgoingErrorMessage( KErrArgument,
- KErrDescrInvalidParameter,
- KHtiSystemServiceUid ) );
- break;
- }
-
- //stop all requests
- //cancel just incoming request
- //after all outgoing messages sent system will go down
- iListener->Cancel();
-
- // kill the watchdog, so HTI stays stopped
- KillHtiWatchDogL();
-
- TUint milliseconds = 0;
- if(aMessage.Length() == 5)
- {
- milliseconds = aMessage[1] + ( aMessage[2] << 8 )
- + ( aMessage[3] << 16 )
- + ( aMessage[4] << 24 );
- }
-
- TBuf<20> buf;
- buf.Format(_L("%d"), milliseconds * 1000);
-
- RProcess htiProcess;
- User::LeaveIfError( htiProcess.Create(
- KHtiRestartExeName, buf ) );
- htiProcess.Resume();
- htiProcess.Close();
- break;
- }
- case EHtiReset:
- {
- HTI_LOG_TEXT( "RESET" );
- Reset();
- }
- break;
-
- case EHtiFormat:
- {
- HTI_LOG_TEXT( "RESET FACTORY SETTINGS" );
- if ( aMessage.Length() == 2 )
- {
- //set the flag to do rfs
- iRfsMode = ( TRfsType ) aMessage[1];
- }
- if ( iRfsMode != ERfsNormal && iRfsMode != ERfsDeep )
- {
- iRfsMode = ERfsUnknown;
- User::LeaveIfError(
- DispatchOutgoingErrorMessage( KErrArgument,
- KErrDescrInvalidParameter,
- KHtiSystemServiceUid ) );
- }
- else
- {
- RProcess thisProcess;
- // ERfsDeep is supported only if HTI running from ROM
- if ( iRfsMode == ERfsNormal ||
- IsFileInRom( thisProcess.FileName() ) )
- {
- //stop
- iListener->Cancel();
- }
- else
- {
- iRfsMode = ERfsUnknown;
- User::LeaveIfError(
- DispatchOutgoingErrorMessage( KErrNotSupported,
- KErrDescrNotInRom,
- KHtiSystemServiceUid ) );
- }
- }
- }
- break;
-
- case EHtiShowConsole:
- {
- HTI_LOG_TEXT( "SHOW CONSOLE" );
- if ( !iConsole )
- {
- iConsole = Console::NewL( _L( "HtiFramework" ),
- TSize( KConsFullScreen,
- KConsFullScreen ) );
- iConsole->Printf( _L( "HTI Framework\n" ) );
- iConsole->Printf( _L( "=============\n\n" ) );
- }
-
- HBufC8* msg = HBufC8::NewLC( 1 );
- msg->Des().Append( 0 );
- User::LeaveIfError(
- DispatchOutgoingMessage( msg, KHtiSystemServiceUid ) );
- CleanupStack::Pop(); // msg
- }
- break;
-
- case EHtiHideConsole:
- {
- HTI_LOG_TEXT( "HIDE CONSOLE" );
- delete iConsole;
- iConsole = NULL;
-
- HBufC8* msg = HBufC8::NewLC( 1 );
- msg->Des().Append( 0 );
- User::LeaveIfError(
- DispatchOutgoingMessage( msg, KHtiSystemServiceUid ) );
- CleanupStack::Pop(); // msg
- }
- break;
-
- case EHtiDebugPrint:
- {
- if ( aMessage.Length() > 1 )
- {
- RDebug::RawPrint( aMessage.Mid( 1 ) );
- }
- HBufC8* msg = HBufC8::NewLC( 1 );
- msg->Des().Append( 0 );
- User::LeaveIfError(
- DispatchOutgoingMessage( msg, KHtiSystemServiceUid ) );
- CleanupStack::Pop(); // msg
- }
- break;
-
- default:
- {
- //unknown command
- HTI_LOG_TEXT( "Error: Unknown HTI system command:" );
- DispatchOutgoingErrorMessage( KErrArgument,
- KHtiSystemCmdErrDescr,
- KHtiSystemServiceUid );
- }
- }
- }
- else
- {
- HTI_LOG_TEXT( "ERROR: not authorized acces" );
- DispatchOutgoingErrorMessage( EHtiErrNotAuthorized );
- }
- }
- else
- {
- HTI_LOG_TEXT( "Error: empty command" );
- DispatchOutgoingErrorMessage( KErrArgument,
- KHtiSystemCmdErrDescr,
- KHtiSystemServiceUid );
- }
- HTI_LOG_FUNC_OUT( "HandleSystemMessage" );
- }
-
-void CHtiDispatcher::UrgentReboot( TInt aReason, const TDesC8& aReasonDescr )
- {
- HTI_LOG_FORMAT( "UrgentReboot: %d", aReason );
- HTI_LOG_DES( aReasonDescr );
- aReason = aReason;
- aReasonDescr.Size();
- //empty queues
- delete iIncomingQueue;
- iIncomingQueue = NULL;
- delete iOutgoingQueue;
- iOutgoingQueue = NULL;
- //stop
- iListener->Cancel();
- //reboot
- Reboot();
- }
-
-void CHtiDispatcher::Reboot()
- {
- if ( iConsole )
- {
- iConsole->Printf( _L( "Reboot requested.\n" ) );
- }
- TInt err = KErrNone;
- RProcess rebootProcess;
- // First try the UI layer rebooter
- if(iRebootReason == -1)
- {
- err = rebootProcess.Create( KHtiDeviceRebootExeUI, KNullDesC );
- }
- else
- {
- TBuf<8> reasonNumber;
- reasonNumber.Num(iRebootReason);
- err = rebootProcess.Create( KHtiDeviceRebootExeUI, reasonNumber );
- }
- if ( err != KErrNone )
- {
- HTI_LOG_FORMAT( "UI layer rebooter failed with %d", err );
- // Try if there is OS layer rebooter present
- err = rebootProcess.Create( KHtiDeviceRebootExeOS, KNullDesC );
- }
- if ( err == KErrNone )
- {
- rebootProcess.Resume();
- rebootProcess.Close();
- }
- else
- {
- HTI_LOG_FORMAT( "Reboot err %d", err );
- if ( iConsole )
- {
- iConsole->Printf( _L( "Reboot error %d.\n" ), err );
- User::After( 3000000 ); // to let the console display a while
- }
- // Can't send any error message here - communications have been stopped
- }
- }
-
-void CHtiDispatcher::RestoreFactorySettings()
- {
- HTI_LOG_FUNC_IN( "CHtiDispatcher::RestoreFactorySettings" );
- if ( iConsole )
- {
- iConsole->Printf( _L( "RFS requested, type %d.\n" ), iRfsMode );
- }
- TInt err = KErrNone;
- RProcess rebootProcess;
- if ( iRfsMode == ERfsNormal )
- {
- err = rebootProcess.Create( KHtiDeviceRebootExeUI, KParamNormalRfs );
- }
- else if ( iRfsMode == ERfsDeep )
- {
- err = rebootProcess.Create( KHtiDeviceRebootExeUI, KParamDeepRfs );
- }
-
-
- if ( err == KErrNone )
- {
- rebootProcess.Resume();
- rebootProcess.Close();
- }
- else
- {
- HTI_LOG_FORMAT( "RFS err %d", err );
- if ( iConsole )
- {
- iConsole->Printf( _L( "RFS error %d.\n" ), err );
- User::After( 3000000 ); // to let the console display a while
- }
- // Can't send any error message here - communications have been stopped
- }
- HTI_LOG_FUNC_OUT( "CHtiDispatcher::RestoreFactorySettings" );
- }
-
-TBool CHtiDispatcher::IsFileInRom( const TDesC& aFileName )
- {
- HTI_LOG_FUNC_IN( "CHtiDispatcher::IsFileInRom" );
- HTI_LOG_DES( aFileName );
- TBool isInRom = EFalse;
- _LIT( KDriveZ, "z:" );
- if ( aFileName.FindF( KDriveZ ) == 0 )
- {
- isInRom = ETrue;
- }
-
- HTI_LOG_FORMAT( "IsFileInRom returning %d", isInRom );
- HTI_LOG_FUNC_OUT( "CHtiDispatcher::IsFileInRom" );
- return isInRom;
- }
-
-void CleanupRArray( TAny* object )
- {
- ( ( RImplInfoPtrArray* ) object )->ResetAndDestroy();
- }
-
-TDesC8* CHtiDispatcher::ServicePluginsListL()
- {
- RImplInfoPtrArray aImplInfoArray;
- CleanupStack::PushL( TCleanupItem( CleanupRArray, &aImplInfoArray ) );
-
- REComSession::ListImplementationsL(
- KHTIServiceInterfaceUid,
- aImplInfoArray );
-
- //alloc memory for the list
- TInt maxMemory = aImplInfoArray.Count() * KHtiServiceListRecordLength;
- HBufC8* list = HBufC8::NewLC( maxMemory );
-
- for ( TInt i = 0; i < aImplInfoArray.Count(); ++i )
- {
- //add uid
- TUid uid = MapServicePluginUid(
- aImplInfoArray[i]->ImplementationUid() );
-
- list->Des().Append( ( TUint8* )( &( uid.iUid ) ), 4 );
-
- //add display name, converted to 8-bit text
- TBuf8<KHtiServiceNameLength> serviceName8;
- serviceName8.Copy(
- aImplInfoArray[i]->DisplayName().Left( KHtiServiceNameLength ) );
-
- list->Des().Append( serviceName8 );
- list->Des().AppendFill( 0,
- KHtiServiceNameLength - serviceName8.Length() );
- }
-
- CleanupStack::Pop();//list
- CleanupStack::PopAndDestroy();//aImplInfoArray
-
- return list;
- }
-
-void CHtiDispatcher::KillHtiWatchDogL()
- {
- HTI_LOG_FUNC_IN( "CHtiDispatcher::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( 1 );
- prs.Close();
- HTI_LOG_TEXT( "HTI watchdog killed" );
- }
-
- HTI_LOG_FUNC_OUT( "CHtiDispatcher::KillHtiWatchDogL" );
- }
-
-
-#ifdef __ENABLE_LOGGING__
-void CHtiDispatcher::DebugListPlugins()
- {
- HTI_LOG_FUNC_IN( "ListPlugins" );
- RImplInfoPtrArray aImplInfoArray;
- HTI_LOG_TEXT( "COMM PLUGINS" );
- REComSession::ListImplementationsL( KHTICommInterfaceUid, aImplInfoArray );
- HTI_LOG_FORMAT( "Num of implementations: %d", aImplInfoArray.Count() );
- TInt i;
- for ( i = 0; i < aImplInfoArray.Count(); ++i )
- {
- HTI_LOG_FORMAT( "uid: %d", aImplInfoArray[i]->ImplementationUid().iUid );
- HTI_LOG_DES( aImplInfoArray[i]->DataType() );
- HTI_LOG_DES( aImplInfoArray[i]->DisplayName() );
- }
- aImplInfoArray.ResetAndDestroy();
-
- HTI_LOG_TEXT( "SERVICE PLUGINS" );
- REComSession::ListImplementationsL( KHTIServiceInterfaceUid, aImplInfoArray );
- HTI_LOG_FORMAT( "Num of implementations: %d", aImplInfoArray.Count() );
- for ( i = 0; i < aImplInfoArray.Count(); ++i )
- {
- HTI_LOG_FORMAT( "uid: %d", aImplInfoArray[i]->ImplementationUid().iUid );
- HTI_LOG_DES( aImplInfoArray[i]->DataType() );
- HTI_LOG_DES( aImplInfoArray[i]->DisplayName() );
-
- }
- aImplInfoArray.ResetAndDestroy();
- HTI_LOG_FUNC_OUT( "ListPlugins" );
- }
-#endif
-
-void CHtiDispatcher::ShutdownAndRebootDeviceL()
- {
- HTI_LOG_TEXT( "REBOOT" );
- //stop
- iListener->Cancel();
- //and set flag to reboot
- iToReboot = ETrue;
- }
-
-void CHtiDispatcher::CreateInstanceId()
- {
- iHtiInstanceId = User::FastCounter();
- HTI_LOG_FORMAT( "Generated instance ID %u", iHtiInstanceId );
- }
-
-TUid CHtiDispatcher::MapServicePluginUid( const TUid aUid )
- {
- TUid mappedUid = TUid::Uid( aUid.iUid );
- switch ( aUid.iUid )
- {
- case 0x10210CCD:
- mappedUid.iUid = 0x200212C4;
- break;
- case 0x10210CCF:
- mappedUid.iUid = 0x200212C6;
- break;
- case 0x10210CD1:
- mappedUid.iUid = 0x200212C8;
- break;
- case 0x10210CD3:
- mappedUid.iUid = 0x200212CA;
- break;
- case 0x200212C4:
- mappedUid.iUid = 0x10210CCD;
- break;
- case 0x200212C6:
- mappedUid.iUid = 0x10210CCF;
- break;
- case 0x200212C8:
- mappedUid.iUid = 0x10210CD1;
- break;
- case 0x200212CA:
- mappedUid.iUid = 0x10210CD3;
- break;
- default:
- break;
- }
- return mappedUid;
- }
-
-TBool CHtiDispatcher::CommReconnect()
- {
- if(iReconnectDelay == 0)
- {
- return EFalse;
- }
-
- //Delay
- HTI_LOG_FORMAT( "Reconnect deley : %d seconds", iReconnectDelay);
- User::After(iReconnectDelay * 1000 * 1000);
-
- //Reconnect
- iIncomingQueue->RemoveAll();
- iOutgoingQueue->RemoveAll();
-
- iListener->Reset();
- iSender->Reset();
- iListener->ReceiveMessage();
-
- return ETrue;
- }