diff -r e71858845f73 -r e1758cbb96ac systemswstubs/asyreference/src/ASYReferenceMainServiceBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/systemswstubs/asyreference/src/ASYReferenceMainServiceBase.cpp Mon Oct 04 00:04:35 2010 +0300 @@ -0,0 +1,497 @@ +/* +* 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: Used as an reference implementation +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include "ASYReferenceMainServiceBase.h" +#include "acc_debug.h" + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CASYReferenceMainServiceBase::CASYReferenceMainServiceBase() + : iAccessoryControl() + , iAccConfigFileParser( NULL ) + , iState( EStateUnknown ) + , iConnectedAccessory( NULL ) + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::CASYReferenceMainServiceBase() - Enter" ); + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::CASYReferenceMainServiceBase() - Return" ); + } + +// ----------------------------------------------------------------------------- +// +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +void CASYReferenceMainServiceBase::ConstructL() + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::ConstructL() - Enter" ); + + // ConfigFileParser instance is created for GID parsing. + iAccConfigFileParser = CAccConfigFileParser::NewL( KNullDesC ); + + // AccessoryControl instance is created for Accessory Connection / Disconnection handling. + iAccessoryControl = new ( ELeave ) RAccessoryControl(); + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::ConstructL() - Return" ); + } + +// ----------------------------------------------------------------------------- +// +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CASYReferenceMainServiceBase* CASYReferenceMainServiceBase::NewL() + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::NewL() - Enter" ); + + CASYReferenceMainServiceBase * self = new ( ELeave ) CASYReferenceMainServiceBase(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::NewL() - Return" ); + + return self; + } + +// ----------------------------------------------------------------------------- +// +// destructor. +// ----------------------------------------------------------------------------- +// +CASYReferenceMainServiceBase::~CASYReferenceMainServiceBase() + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::~CASYReferenceMainServiceBase() - Enter" ); + + if( iAccessoryControl ) + { + iAccessoryControl->CloseSubSession(); + } + + delete iConnectedAccessory; + iConnectedAccessory = NULL; + + delete iAccessoryControl; + iAccessoryControl = NULL; + + delete iAccConfigFileParser; + iAccConfigFileParser = NULL; + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::~CASYReferenceMainServiceBase() - Return" ); + + } + +// ---------------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::StartL +// ---------------------------------------------------------------------------------- +// +TInt CASYReferenceMainServiceBase::StartL() + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::StartL() - Enter" ); + + // + //CASYReferenceMainServiceBase internal state is change to InitWait + // + StateChangeL( EStateInitWait ); + + TInt err ( KErrNone ); + + + // + // Following syntax is used from now on to illustrate ASY sequences. + // + + // + // Comments of initialization sequence during terminal boot are marked as [A.n]. + // + + // + // Comments of accessory connection sequence are marked as [B.n] + // + + // + // Comments of accessory disconnection sequence are marked as [C.n] + // + + // + // Comments of internal state change of accessory feature are marked as [D.n] + // Example external headphones are connected to headset control unit. + + // + // Comments of getting/setting accessory internal state are marked as [E.n] + // + + // [A.1] Signals Accessory Server that ASY implementation is ready to receive commands. + // Process command by init parameter is received after signal method call + // (Receiver in this example is CASYReferenceCmdHandlerBase class). + Signal(); + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::StartL() - Return" ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::ProcessResponseL +// ----------------------------------------------------------------------------- +// +void CASYReferenceMainServiceBase::ProcessResponseL( TASYMessage& /*aMessage*/ ) + { + + } + +// ----------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::ProcessErrorResponseL +// ----------------------------------------------------------------------------- +// +void CASYReferenceMainServiceBase::ProcessErrorResponseL( + TInt aErrorCode, + TASYMessage& aMessage ) + { + + (void) aMessage; + (void) aErrorCode; + + } + +// ----------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::RaiseEventL +// ----------------------------------------------------------------------------- +// +void CASYReferenceMainServiceBase::RaiseEventL( TASYMessage& aMessage ) + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::RaiseEventL() - Enter" ); + + // + // [B.1], [C.1], [D.1] Accessory events are received from Accessory Driver/Domestic OS. + // + if( aMessage.GroupId() == KASYMessageGroupAccessoryEvent ) + { + // Event processing according the accessory event. + switch( aMessage.MessageId() ) + { + case KASYMsgAccessoryConnectionStateChangedEvent: + { + + // Accessory connection state is changed. + TASYMsgAccessoryConnectionStateChangedEventBuf package; + package.Copy( aMessage.Data() ); + + ConnectionStateChangedL( package() ); + } + break; + case KASYMsgAccessoryFeatureStateChangedEvent: + { + + // State of accessory feature is changed. + TASYMsgAccessoryFeatureStateChangedEventBuf package; + package.Copy( aMessage.Data() ); + + AccessoryFeatureStateBooleanChangedL( package() ); + } + break; + default: + User::Leave( KErrGeneral ); + break; + }; + } + else + { + User::Leave( KErrGeneral ); + } + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::RaiseEventL() - Return" ); + } + + +// ----------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::StateChangeL +// ----------------------------------------------------------------------------- +// +void CASYReferenceMainServiceBase::StateChangeL( TState aState ) + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::StateChangeL() - Enter" ); + + TInt err ( KErrGeneral ); + + switch ( aState ) + { + case EStateInitWait: + { + + if ( iState != EStateUnknown ) + { + User::Leave( KErrGeneral ); + } + else + { + // + // initialization of event subscribe(s) can be done here. + // + } + } + break; + case EStateInitOngoing: + { + + if ( iState != EStateInitWait ) + { + User::Leave( KErrGeneral ); + } + // + // Current state extra handling can be added here, if needed. + // + } + break; + case EStateInitOk: + { + if ( iState != EStateInitOngoing ) + { + User::Leave( KErrGeneral ); + } + else + { + // + // Initialized sequence is ready, and session can be created to accessory control. + // + err = iAccessoryControl->CreateSubSession( CASYMainServiceBase::Session() ); + + if ( err != KErrNone ) + { + User::Leave( err ); + } + } + } + break; + + default: + { + User::Leave( KErrGeneral ); + } + break; + } + + // + // Example class state change. + // + iState = aState; + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::StateChangeL() - Return" ); + + } + + +// ----------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::ConnectionStateChangedL +// ----------------------------------------------------------------------------- +// +void CASYReferenceMainServiceBase::ConnectionStateChangedL( AccessoryConnection::TConnectionStateInfoStruct& aState ) + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::ConnectionStateChangedL() - Enter" ); + // + // Accessory Connection handling example. + // + TRequestStatus status; + + switch( aState.iState ) + { + case AccessoryConnection::EStateConnected: + { + + // + // [B.2] Event of an accessory connection is raised to ASY from a Accessory Driver/Domestic OS. + // + + // Delete old Generic ID + if( iConnectedAccessory ) + { + + delete iConnectedAccessory; + iConnectedAccessory = NULL; + } + + TUint64 accessoryId( aState.iAccessoryId ); + + + iConnectedAccessory = CAccConGenericID::NewL(); + + // [B.3] Parse a new Generic ID according to the accessory spesific ID. + iAccConfigFileParser->FindL( iConnectedAccessory, accessoryId, KNullDesC ); + + // Check if accessory is not supported + if( ( iConnectedAccessory->GenericID().UniqueID() ) < 0 ) + { + // Accessory is not supported. Debug purpose. + } + else + { + // Accessory is supported. Debug purpose. + } + + // [B.4] Send connect accessory request to Accessory Server + iAccessoryControl->ConnectAccessory( status, iConnectedAccessory, EFalse ); + + // the WaitForRequest method can be used because ConnectAccessory is immediately complete by + // Accessory Server. + User::WaitForRequest( status ); + + } + break; + case AccessoryConnection::EStateNotConnected: + { + + // + // [C.2] Event of an accessory disconnection is raised to ASY from a Accessory Driver/Domestic OS. + // + + // [C.3] Get current Generic ID. + TAccPolGenericID genericId = iConnectedAccessory->GenericID(); + + // [C.4] Send disconnect request to Accessory Server. + iAccessoryControl->DisconnectAccessory( status, genericId ); + + // the WaitForRequest can be used because DisconnectAccessory is immediately complete by + // Accessory Server. + User::WaitForRequest( status ); + + delete iConnectedAccessory; + iConnectedAccessory = NULL; + } + break; + default: + { + User::Leave( KErrGeneral ); + } + break; + } + + if ( status.Int() != KErrNone ) + { + + } + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::ConnectionStateChangedL() - Return" ); + } + + +// ----------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::AccessoryFeatureStateBooleanChangedL +// ----------------------------------------------------------------------------- +void CASYReferenceMainServiceBase::AccessoryFeatureStateBooleanChangedL( AccessoryFeature::TFeatureStateBooleanStruct& aState ) + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::AccessoryFeatureStateBooleanChangedL() - Enter" ); + + // [D.2] the accessory internal state is change. + + TASYCommandParamRecord record; + + // See accessory feature example --> MapAccessoryFeatureL method. + MapAccessoryFeatureL( aState.iFeature, record ); + + TAccValueTypeTBool state; + state.iValue = aState.iState; + + //Current Generic ID + TAccPolGenericID genericId = iConnectedAccessory->GenericID(); + + // [D.4] Accessory internal state change is indicated to Accessory Server. + iAccessoryControl->AccessoryValueChangedNotifyL( genericId, record.iNameRecord, state ); + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::AccessoryFeatureStateBooleanChangedL() - Return" ); + + } + +// ----------------------------------------------------------------------------- +// CASYReferenceMainServiceBase::MapAccessoryFeatureL +// ----------------------------------------------------------------------------- +void CASYReferenceMainServiceBase::MapAccessoryFeatureL( AccessoryFeature::TAccessoryFeature& aAccessoryFeature, + TASYCommandParamRecord& aCommandParamRecord ) + { + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::AccessoryFeatureStateBooleanChangedL() - Enter" ); + + // Couple feature examples + switch( aAccessoryFeature ) + { + + // [D.3] + //A headphone is not connected to the sound adapter which means that the accessory is not detected as a control connection (the headset icon is not shown on the phone display). + //Audio Out Connector capability value is updated by ASY when the headphone is connected to the sound adapter, which means that the accessory connection is updated as a control connection. + + case AccessoryFeature::EHeadphonesConnected: + { + aCommandParamRecord.iNameRecord.SetNameL( KAccAudioOutConnector ); + } + break; + case AccessoryFeature::EExternalPowerSourceConnected: + { + aCommandParamRecord.iNameRecord.SetNameL( KAccExtPowerSupply ); + } + break; + + default: + { + User::Leave( KErrGeneral ); + } + break; + } + + COM_TRACE_( "[AccFW:AsyReference] CASYReferenceMainServiceBase::AccessoryFeatureStateBooleanChangedL() - Return" ); + + } + +// End of file +