diff -r 000000000000 -r 4e1aa6a622a0 accessoryservices/accessoryserver/src/ASYProxy/ASYProxyAsyHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/accessoryservices/accessoryserver/src/ASYProxy/ASYProxyAsyHandler.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,342 @@ +/* +* Copyright (c) 2002-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: Handler for ASY instance +* +*/ + + +// INCLUDE FILES +#include "ASYProxy.h" +#include "ASYProxyAsyHandler.h" +#include "acc_debug.h" +#include +#include +#include + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS +const TInt KMinASYHeapSize = 0x2000; +const TInt KDefaultASYHeapSize = 0x4000; +const TInt KMaxASYHeapSize = 0x8000; + +const TInt KMinASYStackSize = 0x1000; +const TInt KDefaultASYStackSize = 0x2000; +const TInt KMaxASYStackSize = 0x4000; + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::CASYProxyASYHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CASYProxyASYHandler::CASYProxyASYHandler( + CASYProxy* aASYProxy, + const TInt aIndex, + const TUid aHandlerUid, + const CImplementationInformation& aImplementationInformation ) + + : iHandlerUid( aHandlerUid ), + iASYProxy( aASYProxy ), + iASYState( EASYProxyASYReset ), + iIndex( aIndex ), + iHeapValue( KDefaultASYHeapSize ), + iStackValue( KDefaultASYStackSize ) + { + COM_TRACE_4( "[AccFW:AsyProxy] CASYProxyASYHandler::CASYProxyASYHandler(0x%x, %d, 0x%x, 0x%x )", aASYProxy, aIndex, aHandlerUid.iUid, &aImplementationInformation ); + + iImplementationInformation = const_cast + ( &aImplementationInformation ); + + COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyASYHandler::CASYProxyASYHandler( 0x%x )", &iImplementationInformation ); + + SetMemoryValues(); + + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::CASYProxyASYHandler" ); + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CASYProxyASYHandler::ConstructL() + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::ConstructL()" ); + + LoadASYL(); + + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::ConstructL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CASYProxyASYHandler* CASYProxyASYHandler::NewL( + CASYProxy* aASYProxy, + const TInt aIndex, + const TUid aHandlerUid, + const CImplementationInformation& aImplementationInformation ) + { + COM_TRACE_4( "[AccFW:AsyProxy] CASYProxyASYHandler::CASYProxyASYHandler(0x%x, %d, 0x%x, 0x%x )", aASYProxy, aIndex, aHandlerUid.iUid, &aImplementationInformation ); + + CASYProxyASYHandler* self = new ( ELeave ) CASYProxyASYHandler( + aASYProxy, + aIndex, + aHandlerUid, + aImplementationInformation + ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyASYHandler::NewL - return 0x%x", self ); + + return self; + } + +// Destructor +CASYProxyASYHandler::~CASYProxyASYHandler() + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::~CASYProxyASYHandler()" ); + + if ( iASYServiceMain ) + { + // Cancel main service + iASYServiceMain->Cancel(); + delete iASYServiceMain; + iASYServiceMain = NULL; + } + + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::~CASYProxyASYHandler" ); + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::SetMemoryValues +// Sets heap and stack memory values for a new thread +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CASYProxyASYHandler::SetMemoryValues() + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::SetMemoryValues()" ); + + TBuf8 bufOpaqData; + bufOpaqData = iImplementationInformation->OpaqueData(); + + TInt tmpHeapMemValue( 0 ); + TInt tmpStackMemValue( 0 ); + + _LIT8( KMatchHeapAndStack, "Heap=0x????|Stack=0x????" ); + _LIT8( KMatchHeap, "Heap=0x????" ); + _LIT8( KMatchStackAndHeap, "Stack=0x????|Heap=0x????" ); + _LIT8( KMatchStack, "Stack=0x????" ); + + _LIT8(KHeap,"Heap=0x"); + _LIT8(KStack,"Stack=0x"); + + if ( ( KErrNotFound != bufOpaqData.Match( KMatchHeapAndStack ) ) || + ( KErrNotFound != bufOpaqData.Match( KMatchHeap ) ) || + ( KErrNotFound != bufOpaqData.Match( KMatchStackAndHeap ) ) || + ( KErrNotFound != bufOpaqData.Match( KMatchStack ) ) ) + { + tmpHeapMemValue = ReadMemoryItem( bufOpaqData, KHeap ); + tmpStackMemValue = ReadMemoryItem( bufOpaqData, KStack ); + + if ( ( tmpHeapMemValue != KErrGeneral ) && + ( tmpStackMemValue != KErrGeneral ) ) + { + + if ( ( tmpHeapMemValue > KMinASYHeapSize) && + ( tmpHeapMemValue < KMaxASYHeapSize ) ) + { + iHeapValue = tmpHeapMemValue; + } + + if ( ( tmpStackMemValue > KMinASYStackSize) && + ( tmpStackMemValue < KMaxASYStackSize ) ) + { + iStackValue = tmpStackMemValue; + } + } + } + else + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::SetMemoryValues - Opaque data was empty or in wrong format." ); + } + + COM_TRACE_2( "[AccFW:AsyProxy] CASYProxyASYHandler::SetMemoryValues(iHeapValue == 0x%x, iStackValue == 0x%x)", iHeapValue, iStackValue ); + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::SetMemoryValues - return void" ); + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::ReadMemoryItem +// Sets heap and stack memory values for a new thread +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CASYProxyASYHandler::ReadMemoryItem( const TDesC8& aOpaqData, + const TDesC8& aMemKey ) + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::ReadMemoryItem( TDesC8, TDesC8 )" ); + + TPtrC8 ptrValue; + TChar tmpChar; + TLex8 lex; + TBool hDigitsOK( ETrue ); + TUint memValue( 0 ); + const TInt KValueLength( 4 ); + TInt valueBeg(0); + TInt valueFind( 0 ); + TInt retValue( KErrGeneral ); + + valueFind = aOpaqData.Find( aMemKey ); + if ( KErrNotFound != valueFind ) + { + valueBeg = valueFind + aMemKey.Length(); + ptrValue.Set( aOpaqData.Mid( valueBeg, KValueLength ) ); + + for ( TInt i=0; i < KValueLength; i++ ) + { + tmpChar = ptrValue[i]; + if ( !tmpChar.IsHexDigit() ) + { + hDigitsOK = EFalse; + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::ReadMemoryItem - Opaque data was in wrong format." ); + break; + } + } + + if ( hDigitsOK ) + { + lex.Assign( ptrValue ); + if ( !lex.Val( memValue, EHex ) ) + { + retValue = memValue; + } + } + } + else + { + retValue = 0; + } + + COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyASYHandler::ReadMemoryItem - return 0x%x", retValue ); + + return retValue; + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::LoadAsysL +// Creates a new CASYProxyMainService object and orders it to start a new thread +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CASYProxyASYHandler::LoadASYL() + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL()" ); + + COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL - iIndex == %d", iIndex ); + COM_TRACE_2( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL[%d] - ImplementationUid == 0x%x", iIndex, iImplementationInformation->ImplementationUid() ); + COM_TRACE_2( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL[%d] - iHandlerUid == 0x%x", iIndex, iHandlerUid ); + COM_TRACE_2( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL[%d] - dllUid == display_name == %S", iIndex, &iImplementationInformation->DisplayName() ); + + COM_TRACE_2( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL[%d] - iHeapValue == 0x%x", iIndex, iHeapValue ); + COM_TRACE_2( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL[%d] - iStackValue == 0x%x", iIndex, iStackValue ); + + iASYServiceMain = CASYProxyMainService::NewL( this ); + + iASYServiceMain->StartThreadL( + iImplementationInformation->ImplementationUid(), + iHandlerUid, + iHeapValue, + iStackValue ); + + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::LoadASYL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::UpdateASYStateL +// Updates the status information of ASY +// Informs ASYProxy about changes of status +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CASYProxyASYHandler::UpdateASYStateL( TASYProxyASYState aASYState ) + { + COM_TRACE_2( "[AccFW:AsyProxy] CASYProxyASYHandler::UpdateASYStateL(iIndex == %d, aAsyState == %d)", iIndex, aASYState ); + + iASYState = aASYState; + + if ( aASYState == EASYProxyASYConnectionReady ) + { + iASYProxy->LoadCompleteL( iIndex ); + } + + else if ( aASYState == EASYProxyASYThreadKills ) + { + iASYProxy->ThreadKills( iIndex ); + } + + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::UpdateASYStateL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::CurrentState +// Returns the current status of ASY +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TASYProxyASYState CASYProxyASYHandler::CurrentState() const + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::CurrentState()" ); + COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyASYHandler::CurrentState - iIndex == %d", iIndex ); + COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyASYHandler::CurrentState - return %d", iASYState ); + return iASYState; + } + +// ----------------------------------------------------------------------------- +// CASYProxyASYHandler::Index +// Returns the index of this ASY +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CASYProxyASYHandler::Index() const + { + COM_TRACE_( "[AccFW:AsyProxy] CASYProxyASYHandler::Index()" ); + COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyASYHandler::Index - return %d", iIndex ); + return iIndex; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File