accessoryservices/accessoryserver/src/Server/AccSrvSubControl.cpp
changeset 0 4e1aa6a622a0
child 59 0f7422b6b602
--- /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