diff -r 000000000000 -r 4e1aa6a622a0 accessoryservices/accessoryserver/src/Server/AccSrvSubControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/accessoryservices/accessoryserver/src/Server/AccSrvSubControl.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,953 @@ +/* +* 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: Server-side sub-session of Accessory Control +* +*/ + + +// INCLUDE FILES +#include "AccSrvSubControl.h" +#include "AccSrvMainSession.h" +#include "AccClientServerMessages.h" +#include "AccPolGenericID.h" +#include "AccPolGenericIDAccessor.h" +#include "acc_debug.h" +#include "AccSrvServerModel.h" +#include "AccSrvASYProxyHandler.h" +#include "AccPolAccessoryPolicy.h" +#include "AccPolNameValueArraySerial.h" +#include +#include + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +const TUid KAccFwUiNoteNotifierUid = { 0x10205061 }; +//const TUid KAccFwUiDialogNotifierUid = { 0x10205062 } +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::CAccSrvSubControl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CAccSrvSubControl::CAccSrvSubControl( + CASYProxyAPI* aProxy, + CAccSrvConnectionController* aConnectionController, + CAccSrvServerModel* aServerModel ) + : CAccSrvSubConnection ( aProxy, aConnectionController, aServerModel ), + iOutstandingTrId( 0 ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::CAccSrvSubControl()" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::ConstructL() + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConstructL()" ); + CAccSrvSubConnection::ConstructL(); + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConstructL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CAccSrvSubControl* CAccSrvSubControl::NewL( + CASYProxyAPI* aProxy, + CAccSrvConnectionController* aConnectionController, + CAccSrvServerModel* aServerModel ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::NewL()" ); + + if ( !aProxy ) + { + User::Leave( KErrArgument ); + } + + CAccSrvSubControl* self = new (ELeave) CAccSrvSubControl( aProxy, + aConnectionController, + aServerModel ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::NewL - return self" ); + return self; + } + +// Destructor +CAccSrvSubControl::~CAccSrvSubControl() + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::~CAccSrvSubControl()" ); + // Cancel any outstanding request + if ( !iConnectAccessoryMsg.IsNull() ) + { + iConnectAccessoryMsg.Complete( KErrCancel ); + } + + if ( !iSetValueTBoolMsg.IsNull() ) + { + iSetValueTBoolMsg.Complete( KErrCancel ); + } + + if ( !iSetValueTIntMsg.IsNull() ) + { + iSetValueTIntMsg.Complete( KErrCancel ); + } + + if ( !iSetValueObjectMsg.IsNull() ) + { + iSetValueObjectMsg.Complete( KErrCancel ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::~CAccSrvSubControl - return" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::DispatchMessageL +// Handles client request. If request is not handled here, it is passed to +// parent class for handling +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::DispatchMessageL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DispatchMessageL()" ); + + TInt function = aMessage.Function(); + + switch ( function ) + { + case EAccSrvConnectAccessory2: + { + ConnectAccessory2L( aMessage ); + break; + } + case EAccSrvDisconnectAccessory: + { + DisconnectAccessoryL( aMessage ); + break; + } + case EAccSrvSetValueTBool: + { + SetValueTBoolL( aMessage ); + break; + } + case EAccSrvSetValueTInt: + { + SetValueTIntL( aMessage ); + break; + } + case EAccSrvSetValueObject: + { + SetValueObjectBaseL( aMessage ); + break; + } + case EAccSrvAccessoryValueChangedTBoolNotify: + { + AccessoryValueChangedTBoolNotifyL( aMessage ); + break; + } + case EAccSrvAccessoryValueChangedTIntNotify: + { + AccessoryValueChangedTIntNotifyL( aMessage ); + break; + } + case EAccSrvAccessoryValueChangedObjectNotify: + { + AccessoryValueChangedObjectNotifyL( aMessage ); + break; + } + default: + { + // Not handled here, pass to base class + CAccSrvSubConnection::DispatchMessageL( aMessage ); + break; + } + } // switch( function ) + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DispatchMessageL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::ConnectAccessoryL +// +// Preconditions: if unsupported accessory (Unique Id = KErrNotFound) +// is connected, "Unsupported accessory connected" +// note is shown in UI. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::ConnectAccessory2L( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL()" ); + + TAccPolGenericID genericID; + TAccSrvGenericIDPckg genericIDPckg( genericID ); + TAccSrvConnectRecord connectRecord; + TAccSrvConnectRecordPckg connectRecordPckg( connectRecord ); + + aMessage.ReadL( KAccServParamPosFirst, genericIDPckg ); + aMessage.ReadL( KAccServParamPosSecond, connectRecordPckg ); + + //Preconditions + if ( KErrNotFound == genericID.UniqueID() ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - Accessory not supported!" ); + // Show a notification to the user + RNotifier notifier; + TInt err = notifier.Connect(); + if ( err != KErrNone ) + { + COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - Couldn't connect to notifier: err = %d", err); + } + else + { + err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, KNullDesC8 ); + if ( err != KErrNone ) + { + COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - Couldn't start notifier: err = %d", err); + } + notifier.Close(); + } + } + else + { + //generate uniques if for connection if not update... + if ( genericID.UniqueID() == KAccSrvGenerateGID ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL() Generate new unique ID" ); + iServerModel->CapabilityStorage().GenerateUniqueId( genericID ); + } + else + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL() Updated connection" ); + } + + //read capability buffer + CBufFlat* buf = CBufFlat::NewL( connectRecord.iNameValueBufSize ); + CleanupStack::PushL( buf ); + buf->ResizeL( connectRecord.iNameValueBufSize ); + buf->Write( 0, connectRecord.iCapsPtr ); + + //open capability steam and read caps to storage + RBufReadStream rStrm; + (void) rStrm.Open( *buf ); // void is used to prevent warnings from code scanner. + rStrm.PushL(); // RBufReadStream::Open does not return any values + TBool isUpdate = iServerModel->CapabilityStorage().NewCapabilityListL( genericID, rStrm); + rStrm.Close(); + rStrm.Pop(); + + CleanupStack::PopAndDestroy( buf); + + //Pass handling to Connection Controller + iConnectionController->HandleConnectL( genericIDPckg(), + connectRecord.iThreadID, + connectRecord.iEvaluateConnectionRules, + isUpdate ); + + // return modified generic id to client + genericIDPckg() = genericID; + aMessage.WriteL( KAccServParamPosFirst, genericIDPckg ); + } + + Write( aMessage, KAccSrvConnectAccessoryBit ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::DisconnectAccessoryL +// +// Preconditions: if unsupported accessory (Unique Id = KErrNotFound) +// is disconnected, RMessage2 is just completed. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::DisconnectAccessoryL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DisconnectAccessoryL()" ); + + TAccPolGenericID genericID; + TAccSrvGenericIDPckg disconnectGenericIDPackage( genericID ); + + aMessage.ReadL( KAccServParamPosFirst, disconnectGenericIDPackage ); + + //Preconditions + if ( KErrNotFound != genericID.UniqueID() ) + { + iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected + iConnectionController->HandleDisconnectL( disconnectGenericIDPackage() ); //Pass handling to Connection Controller + } + + Write( aMessage, KAccSrvDisconnectAccessoryBit ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DisconnectAccessoryL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::SetValueTBoolL +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::SetValueTBoolL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueTBoolL()" ); + + TAccPolGenericID genericID; + TAccSrvGenericIDPckg genericIDPckg( genericID ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + TAccSrvValueTypeTBoolPckgBuf valuePckgBuf; + TASYCommandParamRecord asyCommandParamRecord; + + aMessage.ReadL( KAccServParamPosFirst, genericIDPckg ); + aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg ); + aMessage.ReadL( KAccServParamPosThird, valuePckgBuf ); + + //Precondition + iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected + + asyCommandParamRecord.iNameRecord = nameRecordPckg(); + asyCommandParamRecord.iCmdValue = valuePckgBuf().iValue; + asyCommandParamRecord.iGenericID = genericID; + + //get capability + TUint32 name; + nameRecordPckg().GetName( name ); + CCapValue* value = iServerModel->CapabilityStorage().GetCapability( genericID, name ); + if ( !value ) + { + User::Leave( KErrArgument ); + } + + switch ( value->Location() ) + { + case EAPVPolicy: + { + //Value is located in Accessory Policy DB, request can be completed. + //The value is stored to Accessory Policy DB in HandleValueMessageL. + iSetValueTBoolMsg = aMessage; + HandleValueMessageL( ESetValue, + valuePckgBuf(), + KErrNone, //ErrorCode, + 0 ); //TrId, not used at the moment + } + break; + + case EAPVAccessory: + { + //Forward request to ASY Proxy Handler + iOutstandingTrId = iConnectionController->ASYProxyHandler().HandleASYCommsL( + ECmdSetValueBool, + asyCommandParamRecord ); + //Store SetValueTBoolL to queue + iConnectionController->NotificationQueue().RegisterControlMessage( ESetValue, + this); + + //Because SetValueL() is synchronous method, there shouldn't be existing request + iSetValueTBoolMsg = aMessage; + } + break; + + default: + { + TRACE_ASSERT_ALWAYS; + User::Leave( KErrArgument ); + } + break; + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueTBoolL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::SetValueTInt +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::SetValueTIntL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueTIntL()" ); + + TAccPolGenericID genericID; + TAccSrvGenericIDPckg genericIDPckg( genericID ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + TAccSrvValueTypeTIntPckgBuf valuePckgBuf; + TASYCommandParamRecord asyCommandParamRecord; + + aMessage.ReadL( KAccServParamPosFirst, genericIDPckg ); + aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg ); + aMessage.ReadL( KAccServParamPosThird, valuePckgBuf ); + + //Precondition + iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected + + asyCommandParamRecord.iNameRecord = nameRecordPckg(); + asyCommandParamRecord.iCmdValue = valuePckgBuf().iValue; + asyCommandParamRecord.iGenericID = genericID; + + //get capability + TUint32 name; + nameRecordPckg().GetName( name ); + CCapValue * value = iServerModel->CapabilityStorage().GetCapability( genericID, name ); + + if ( !value ) + { + User::Leave( KErrArgument ); + } + + switch ( value->Location() ) + { + case EAPVPolicy: + { + //Value is located in Accessory Policy DB, request can be completed. + //The value is stored to Accessory Policy DB in HandleValueMessageL. + iSetValueTIntMsg = aMessage; + HandleValueMessageL( ESetValue, + valuePckgBuf(), + KErrNone, //ErrorCode, + 0 ); //TrId, not used at the moment + } + break; + + case EAPVAccessory: + { + //Forward request to ASY Proxy Handler + iOutstandingTrId = iConnectionController->ASYProxyHandler().HandleASYCommsL( + ECmdSetValueTInt, + asyCommandParamRecord ); + //Store SetValueTBoolL to queue + iConnectionController->NotificationQueue().RegisterControlMessage( ESetValue, + this ); + //Because SetValueL() is synchronous method, there shouldn't be existing request + iSetValueTIntMsg = aMessage; + } + break; + + default: + { + TRACE_ASSERT_ALWAYS; + User::Leave( KErrArgument ); + } + break; + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::CAccSrvSubControl::SetValueTIntL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::SetValueObjectBaseL +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::SetValueObjectBaseL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueObjectBaseL()" ); + + RBufReadStream rStrm; + TAccPolGenericID genericID; + TAccSrvGenericIDPckg genericIDPckg( genericID ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + TASYCommandParamRecord asyCommandParamRecord; + + CBufFlat *buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity ); + CleanupStack::PushL( buf ); + buf->ResizeL( aMessage.GetDesMaxLength( KAccServParamPosThird ) ); + + TPtr8 ptrBuf( buf->Ptr( 0 ) ); + + // Read client parameters + aMessage.ReadL( KAccServParamPosFirst, genericIDPckg ); + aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg ); + aMessage.ReadL( KAccServParamPosThird, ptrBuf ); + + //Precondition + iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected + + asyCommandParamRecord.iNameRecord = nameRecordPckg(); + asyCommandParamRecord.iCmdValue = 0; + asyCommandParamRecord.iGenericID = genericID; + + //get capability + TUint32 name; + nameRecordPckg().GetName( name ); + CCapValue * value = iServerModel->CapabilityStorage().GetCapability( genericID, name ); + + if ( !value ) + { + User::Leave( KErrArgument ); + } + + switch ( value->Location() ) + { + case EAPVAccessory: + { + //Forward request to ASY Proxy Handler + iOutstandingTrId = iConnectionController->ASYProxyHandler().HandleASYCommsL( + ECmdSetObjectValue, + asyCommandParamRecord, + &ptrBuf ); + //Store SetValueTBoolL to queue + iConnectionController->NotificationQueue().RegisterControlMessage( ESetValue, + this ); + //Because SetValueL() is synchronous method, there shouldn't be existing request + iSetValueObjectMsg = aMessage; + } + break; + + default: + { + TRACE_ASSERT_ALWAYS; + User::Leave( KErrArgument ); + } + break; + } + + CleanupStack::PopAndDestroy( buf ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueObjectBaseL - return void" ); + } +// CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL()" ); + + TAccPolGenericID genericID; + TAccSrvGenericIDPckg genericIDPckg( genericID ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + TAccSrvValueTypeTBoolPckgBuf valuePckgBuf; + + aMessage.ReadL( KAccServParamPosFirst, genericIDPckg ); + aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg ); + aMessage.ReadL( KAccServParamPosThird, valuePckgBuf ); + + //Precondition + iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected + + //get capability and store new value + TUint32 name; + nameRecordPckg().GetName( name ); + + CCapValue* value = iServerModel->CapabilityStorage().GetCapability( genericID, name ); + if ( !value ) + { + User::Leave( KErrArgument ); + } + + value->SetValueL( valuePckgBuf().iValue ); + + //Store Value Data for AccessoryValueChanged notification + TAccValueTypeTInt dummyTIntValue = { 0 }; + TAccValueTypeObject dummyObjectValue( TPtr8( NULL, 0, 0 ) ); + iServerModel->SetValueData( genericID, + nameRecordPckg(), + dummyTIntValue, /*Not used*/ + valuePckgBuf(), + dummyObjectValue/* Not used*/); + + //complete possible pending notifications about change of accessory value + iConnectionController->NotificationQueue().CompleteControlMessageL( + EAccessoryValueChangedTBool, + KErrNone, + genericID.UniqueID() ); + + //Update Connection status and Accessory mode (if changed) + iConnectionController->HandleConnectionChangeValidationL( genericID ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::AccessoryValueChangedTIntNotifyL +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::AccessoryValueChangedTIntNotifyL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTIntNotifyL()" ); + + TAccPolGenericID genericID; + TAccSrvGenericIDPckg genericIDPckg( genericID ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + TAccSrvValueTypeTIntPckgBuf valuePckgBuf; + + aMessage.ReadL( KAccServParamPosFirst, genericIDPckg ); + aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg ); + aMessage.ReadL( KAccServParamPosThird, valuePckgBuf ); + + //Precondition + iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected + + //get capability and store new value + TUint32 name; + nameRecordPckg().GetName( name ); + + CCapValue* value = iServerModel->CapabilityStorage().GetCapability( genericID, name ); + if ( !value ) + { + User::Leave( KErrArgument ); + } + + value->SetValueL( valuePckgBuf().iValue ); + + //Store Value Data for AccessoryValueChanged notification + TAccValueTypeTBool dummyTBoolValue = { EFalse }; + TAccValueTypeObject dummyObjectValue( TPtr8( NULL, 0, 0 ) ); + iServerModel->SetValueData( genericID, + nameRecordPckg(), + valuePckgBuf(), + dummyTBoolValue,/*Not used*/ + dummyObjectValue/*Not used*/ ); + + //complete possible pending notifications about change of accessory value + iConnectionController->NotificationQueue().CompleteControlMessageL( + EAccessoryValueChangedTInt, + KErrNone, + genericID.UniqueID() ); + + //Update Connection status and Accessory mode (if changed) + iConnectionController->HandleConnectionChangeValidationL( genericID ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTIntNotifyL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::AccessoryValueChangedObjectNotifyL +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::AccessoryValueChangedObjectNotifyL( const RMessage2& aMessage ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedObjectNotifyL()" ); + + TAccPolGenericID genericID; + TAccSrvGenericIDPckg genericIDPckg( genericID ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + CBufFlat* valueBuf = NULL; + + aMessage.ReadL( KAccServParamPosFirst, genericIDPckg ); + aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg ); + + valueBuf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity ); + CleanupStack::PushL( valueBuf ); + valueBuf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize ); + TPtr8 valueBufPtr( valueBuf->Ptr( 0 ) ); + aMessage.ReadL( KAccServParamPosThird, valueBufPtr ); + + //Precondition + iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected + + //get capability and store new value + TUint32 name; + nameRecordPckg().GetName( name ); + + CCapValue* value = iServerModel->CapabilityStorage().GetCapability( genericID, name ); + if ( !value ) + { + User::Leave( KErrArgument ); + } + + value->SetValueL( valueBufPtr ); + + //Store Value Data for AccessoryValueChanged notification + TAccValueTypeTBool dummyTBoolValue = { EFalse }; + TAccValueTypeTInt dummyTIntValue = { 0 }; + TAccValueTypeObject objectValue( valueBufPtr ); + iServerModel->SetValueData( genericID, + nameRecordPckg(), + dummyTIntValue, /*Not used*/ + dummyTBoolValue,/*Not used*/ + objectValue ); + + //complete possible pending notifications about change of accessory value + iConnectionController->NotificationQueue().CompleteControlMessageL( + EAccessoryValueChangedObject, + KErrNone, + genericID.UniqueID() ); + + //Update Connection status and Accessory mode (if changed) + iConnectionController->HandleConnectionChangeValidationL( genericID ); + + // Cleanup + CleanupStack::PopAndDestroy( valueBuf ); + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedObjectNotifyL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::CompleteMessageL +// ----------------------------------------------------------------------------- +// +TBool CAccSrvSubControl::CompleteMessageL( TMsgID aMsgID, + TInt aErrorCode, + TInt aUniqueID ) + { + COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubControl::CompleteMessageL(%d)", aMsgID ); + return CAccSrvSubConnection::CompleteMessageL( aMsgID, aErrorCode, aUniqueID ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::HandleValueMessageL +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::HandleValueMessageL( TMsgID aMsgID, + TAccValueTypeTBool aValueTBool, + TInt aErrorCode, + TInt aTrId ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL() - TBool" ); + + switch ( aMsgID ) + { + case ESetValue: + { + HandleSetValueTBoolCompletionL( aErrorCode, aTrId ); + } + break; + + default: + { + //Pass handling to parent class + CAccSrvSubConnectionBase::HandleValueMessageL( + aMsgID, + aValueTBool, + aErrorCode, + aTrId ); + } + break; + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL - TBool - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::HandleValueMessageL +// +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::HandleValueMessageL( TMsgID aMsgID, + TAccValueTypeTInt aValueTInt, + TInt aErrorCode, + TInt aTrId ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL() - TInt" ); + + switch ( aMsgID ) + { + case ESetValue: + { + HandleSetValueTIntCompletionL( aErrorCode, aTrId ); + } + break; + + default: + { + //Pass handling to parent class + CAccSrvSubConnectionBase::HandleValueMessageL( + aMsgID, + aValueTInt, + aErrorCode, + aTrId ); + } + break; + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL - TInt - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::HandleValueMessageL +// +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::HandleValueMessageL( TMsgID aMsgID, + TInt aTrId, + TPtr8* aPtrBuf, + TInt aErrorCode ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL() - Obj" ); + + switch ( aMsgID ) + { + case ESetValue: + { + HandleSetValueObjectCompletion( aErrorCode, aTrId ); + } + break; + + default: + { + //Pass handling to parent class + CAccSrvSubConnectionBase::HandleValueMessageL( aMsgID, + aTrId, + aPtrBuf, + aErrorCode ); + } + break; + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL - Obj - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::HandleSetValueTIntCompletionL +// +// Complete outstanding SetValueL( TAccValueTypeTInt ) request. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::HandleSetValueTIntCompletionL( TInt aErrorCode, TInt aTrId ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL()" ); + + __ASSERT_DEBUG( !iSetValueTIntMsg.IsNull(), User::Invariant() ); + + //Check is this correct SetValueL(), i.e. Some other CAccSrvSubControl-subsession + //might also have a pending SetValueL() request. + if ( iOutstandingTrId == aTrId ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL - TrId match" ); + //Store a new value to Accessory Policy DB. + //Storing is done when value location is Accessory Policy DB or accessory. + TAccPolGenericID gid; + TAccSrvGenericIDPckg gidPckg( gid ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + TAccSrvValueTypeTIntPckgBuf valuePckgBuf; + + iSetValueTIntMsg.ReadL( KAccServParamPosFirst, gidPckg ); + iSetValueTIntMsg.ReadL( KAccServParamPosSecond, nameRecordPckg ); + iSetValueTIntMsg.ReadL( KAccServParamPosThird, valuePckgBuf ); + + //get capability and store new value + TUint32 name; + nameRecordPckg().GetName( name); + + CCapValue * value = iServerModel->CapabilityStorage().GetCapability( gid, name ); + + if ( !value ) + { + User::Leave( KErrArgument ); + } + + value->SetValueL( valuePckgBuf().iValue ); + + iOutstandingTrId = 0;//reset transaction ID of this session + iSetValueTIntMsg.Complete( aErrorCode ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::HandleSetValueTBoolCompletionL +// +// Complete outstanding SetValueL( TAccValueTypeTBool ) request. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::HandleSetValueTBoolCompletionL( TInt aErrorCode, TInt aTrId ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTBoolCompletionL()" ); + + __ASSERT_DEBUG( !iSetValueTBoolMsg.IsNull(), User::Invariant() ); + + //Check is this correct SetValueL(), i.e. Some other CAccSrvSubControl-subsession + //might also have a pending SetValueL() request. + if ( iOutstandingTrId == aTrId ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTBoolCompletionL - TrId match" ); + //Store a new value to Accessory Policy DB. + //Storing is done when value location is Accessory Policy DB or accessory. + TAccPolGenericID gid; + TAccSrvGenericIDPckg gidPckg( gid ); + TAccPolNameRecord nameRecord; + TAccSrvNameRecordPckg nameRecordPckg( nameRecord ); + TAccSrvValueTypeTBoolPckgBuf valuePckgBuf; + + iSetValueTBoolMsg.ReadL( KAccServParamPosFirst, gidPckg ); + iSetValueTBoolMsg.ReadL( KAccServParamPosSecond, nameRecordPckg ); + iSetValueTBoolMsg.ReadL( KAccServParamPosThird, valuePckgBuf ); + + //get capability and store new value + TUint32 name; + nameRecordPckg().GetName( name ); + + CCapValue * value = iServerModel->CapabilityStorage().GetCapability( gid, name ); + + if ( !value ) + { + User::Leave( KErrArgument ); + } + + value->SetValueL( valuePckgBuf().iValue ); + + iOutstandingTrId = 0;//reset transaction ID of this session + iSetValueTBoolMsg.Complete( aErrorCode ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTBoolCompletionL - return void" ); + } + +// ----------------------------------------------------------------------------- +// CAccSrvSubControl::HandleSetValueObjectCompletion +// +// Complete outstanding SetValueL( Object type ) request. +// ----------------------------------------------------------------------------- +// +void CAccSrvSubControl::HandleSetValueObjectCompletion( TInt aErrorCode, TInt aTrId ) + { + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueObjectCompletion()" ); + + __ASSERT_DEBUG( !iSetValueObjectMsg.IsNull(), User::Invariant() ); + + //Check is this correct SetValueL(), i.e. Some other CAccSrvSubControl-subsession + //might also have a pending SetValueL() request. + if ( iOutstandingTrId == aTrId ) + { + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL - TrId match" ); + + iOutstandingTrId = 0;//reset transaction ID of this session + iSetValueObjectMsg.Complete( aErrorCode ); + } + + COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueObjectCompletion - return void" ); + } + + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File