--- /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 <AccessoryTypes.h>
+#include <s32mem.h>
+
+// 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