accessoryservices/accessoryserver/src/Server/AccSrvSubControl.cpp
changeset 0 4e1aa6a622a0
child 21 ccb4f6b3db21
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2 * Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Server-side sub-session of Accessory Control
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include "AccSrvSubControl.h"
       
    21 #include "AccSrvMainSession.h"
       
    22 #include "AccClientServerMessages.h"
       
    23 #include "AccPolGenericID.h"
       
    24 #include "AccPolGenericIDAccessor.h"
       
    25 #include "acc_debug.h"
       
    26 #include "AccSrvServerModel.h"
       
    27 #include "AccSrvASYProxyHandler.h"
       
    28 #include "AccPolAccessoryPolicy.h"
       
    29 #include "AccPolNameValueArraySerial.h"
       
    30 #include <AccessoryTypes.h>
       
    31 #include <s32mem.h>
       
    32 
       
    33 // EXTERNAL DATA STRUCTURES
       
    34 
       
    35 // EXTERNAL FUNCTION PROTOTYPES
       
    36 
       
    37 // CONSTANTS
       
    38 
       
    39 const TUid KAccFwUiNoteNotifierUid   = { 0x10205061 };
       
    40 //const TUid KAccFwUiDialogNotifierUid = { 0x10205062 }
       
    41 // MACROS
       
    42 
       
    43 // LOCAL CONSTANTS AND MACROS
       
    44 
       
    45 // MODULE DATA STRUCTURES
       
    46 
       
    47 // LOCAL FUNCTION PROTOTYPES
       
    48 
       
    49 // FORWARD DECLARATIONS
       
    50 
       
    51 // ============================= LOCAL FUNCTIONS ===============================
       
    52 
       
    53 // ============================ MEMBER FUNCTIONS ===============================
       
    54 
       
    55 // -----------------------------------------------------------------------------
       
    56 // CAccSrvSubControl::CAccSrvSubControl
       
    57 // C++ default constructor can NOT contain any code, that
       
    58 // might leave.
       
    59 // -----------------------------------------------------------------------------
       
    60 //
       
    61 CAccSrvSubControl::CAccSrvSubControl(
       
    62     CASYProxyAPI* aProxy,
       
    63     CAccSrvConnectionController* aConnectionController,
       
    64     CAccSrvServerModel* aServerModel )
       
    65     : CAccSrvSubConnection ( aProxy, aConnectionController, aServerModel ),
       
    66     iOutstandingTrId( 0 )
       
    67     {
       
    68     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::CAccSrvSubControl()" );
       
    69     }
       
    70 
       
    71 // -----------------------------------------------------------------------------
       
    72 // CAccSrvSubControl::ConstructL
       
    73 // Symbian 2nd phase constructor can leave.
       
    74 // -----------------------------------------------------------------------------
       
    75 //
       
    76 void CAccSrvSubControl::ConstructL()
       
    77     {
       
    78     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConstructL()" );
       
    79     CAccSrvSubConnection::ConstructL();
       
    80     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConstructL - return void" );
       
    81     }
       
    82 
       
    83 // -----------------------------------------------------------------------------
       
    84 // CAccSrvSubControl::NewL
       
    85 // Two-phased constructor.
       
    86 // -----------------------------------------------------------------------------
       
    87 //
       
    88 CAccSrvSubControl* CAccSrvSubControl::NewL(
       
    89     CASYProxyAPI* aProxy,
       
    90     CAccSrvConnectionController* aConnectionController,
       
    91     CAccSrvServerModel* aServerModel )
       
    92     {
       
    93     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::NewL()" );
       
    94 
       
    95     if ( !aProxy )
       
    96         {
       
    97         User::Leave( KErrArgument );
       
    98         }
       
    99 
       
   100     CAccSrvSubControl* self = new (ELeave) CAccSrvSubControl( aProxy,
       
   101                                                               aConnectionController,
       
   102                                                               aServerModel );
       
   103 
       
   104     CleanupStack::PushL( self );
       
   105     self->ConstructL();
       
   106     CleanupStack::Pop( self );
       
   107 
       
   108     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::NewL - return self" );
       
   109     return self;
       
   110     }
       
   111 
       
   112 // Destructor
       
   113 CAccSrvSubControl::~CAccSrvSubControl()
       
   114     {
       
   115     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::~CAccSrvSubControl()" );
       
   116     // Cancel any outstanding request
       
   117     if ( !iConnectAccessoryMsg.IsNull() )
       
   118         {
       
   119         iConnectAccessoryMsg.Complete( KErrCancel );
       
   120         }
       
   121 
       
   122     if ( !iSetValueTBoolMsg.IsNull() )
       
   123         {
       
   124         iSetValueTBoolMsg.Complete( KErrCancel );
       
   125         }
       
   126 
       
   127     if ( !iSetValueTIntMsg.IsNull() )
       
   128         {
       
   129         iSetValueTIntMsg.Complete( KErrCancel );
       
   130         }
       
   131         
       
   132     if ( !iSetValueObjectMsg.IsNull() )
       
   133         {
       
   134         iSetValueObjectMsg.Complete( KErrCancel );
       
   135         }
       
   136         
       
   137     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::~CAccSrvSubControl - return" );
       
   138     }
       
   139 
       
   140 // -----------------------------------------------------------------------------
       
   141 // CAccSrvSubControl::DispatchMessageL
       
   142 // Handles client request. If request is not handled here, it is passed to 
       
   143 // parent class for handling
       
   144 // -----------------------------------------------------------------------------
       
   145 //
       
   146 void CAccSrvSubControl::DispatchMessageL( const RMessage2& aMessage )
       
   147     {
       
   148     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DispatchMessageL()" );
       
   149 
       
   150     TInt function = aMessage.Function();
       
   151 
       
   152     switch ( function )
       
   153         {
       
   154         case EAccSrvConnectAccessory2:
       
   155             {
       
   156             ConnectAccessory2L( aMessage );
       
   157             break;
       
   158             }
       
   159         case EAccSrvDisconnectAccessory:
       
   160             {
       
   161             DisconnectAccessoryL( aMessage );
       
   162             break;
       
   163             }
       
   164         case EAccSrvSetValueTBool:
       
   165             {
       
   166             SetValueTBoolL( aMessage );
       
   167             break;
       
   168             }
       
   169         case EAccSrvSetValueTInt:
       
   170             {
       
   171             SetValueTIntL( aMessage );
       
   172             break;
       
   173             }
       
   174         case EAccSrvSetValueObject:
       
   175             {
       
   176             SetValueObjectBaseL( aMessage );
       
   177             break;   
       
   178             }
       
   179         case EAccSrvAccessoryValueChangedTBoolNotify:
       
   180             {
       
   181             AccessoryValueChangedTBoolNotifyL( aMessage );
       
   182             break;
       
   183             }
       
   184         case EAccSrvAccessoryValueChangedTIntNotify:
       
   185             {
       
   186             AccessoryValueChangedTIntNotifyL( aMessage );
       
   187             break;
       
   188             }
       
   189         case EAccSrvAccessoryValueChangedObjectNotify:
       
   190             {
       
   191             AccessoryValueChangedObjectNotifyL( aMessage );
       
   192             break;
       
   193             }
       
   194         default:
       
   195             {
       
   196             // Not handled here, pass to base class
       
   197             CAccSrvSubConnection::DispatchMessageL( aMessage );
       
   198             break;
       
   199             }
       
   200         } // switch( function )
       
   201 
       
   202     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DispatchMessageL - return void" );
       
   203     }
       
   204 
       
   205 // -----------------------------------------------------------------------------
       
   206 // CAccSrvSubControl::ConnectAccessoryL
       
   207 //
       
   208 // Preconditions: if unsupported accessory (Unique Id = KErrNotFound)
       
   209 //                is connected, "Unsupported accessory connected"
       
   210 //                note is shown in UI.
       
   211 // -----------------------------------------------------------------------------
       
   212 //
       
   213 void CAccSrvSubControl::ConnectAccessory2L( const RMessage2& aMessage )
       
   214     {
       
   215     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL()" );
       
   216 
       
   217     TAccPolGenericID         genericID;
       
   218     TAccSrvGenericIDPckg     genericIDPckg( genericID );
       
   219     TAccSrvConnectRecord     connectRecord;
       
   220     TAccSrvConnectRecordPckg connectRecordPckg( connectRecord );
       
   221 
       
   222     aMessage.ReadL( KAccServParamPosFirst, genericIDPckg );
       
   223     aMessage.ReadL( KAccServParamPosSecond, connectRecordPckg );
       
   224 
       
   225     //Preconditions
       
   226     if ( KErrNotFound == genericID.UniqueID() )
       
   227         {
       
   228         COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - Accessory not supported!" );       
       
   229 	    // Show a notification to the user
       
   230         RNotifier notifier;
       
   231         TInt err = notifier.Connect();
       
   232         if ( err != KErrNone )
       
   233             {
       
   234             COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - Couldn't connect to notifier: err = %d", err);	
       
   235             }
       
   236         else
       
   237             {
       
   238             err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, KNullDesC8 );
       
   239             if ( err != KErrNone )
       
   240                 {
       
   241                 COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - Couldn't start notifier: err = %d", err);	
       
   242                 }
       
   243             notifier.Close();
       
   244             }
       
   245 	    }
       
   246     else
       
   247         {
       
   248 		//generate uniques if for connection if not update...
       
   249 		if ( genericID.UniqueID() == KAccSrvGenerateGID )
       
   250 		    {	
       
   251 	    	COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL() Generate new unique ID" );	
       
   252 		    iServerModel->CapabilityStorage().GenerateUniqueId( genericID );
       
   253 		    }
       
   254 		else
       
   255 		    {
       
   256 		    COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL() Updated connection" );	
       
   257 		    }
       
   258 
       
   259     	//read capability buffer
       
   260     	CBufFlat* buf = CBufFlat::NewL( connectRecord.iNameValueBufSize );
       
   261     	CleanupStack::PushL( buf );
       
   262     	buf->ResizeL( connectRecord.iNameValueBufSize );
       
   263    		buf->Write( 0, connectRecord.iCapsPtr );
       
   264 
       
   265 		//open capability steam and read caps to storage
       
   266 		RBufReadStream rStrm;
       
   267 		(void) rStrm.Open( *buf ); // void is used to prevent warnings from code scanner.
       
   268         rStrm.PushL();             // RBufReadStream::Open does not return any values 			
       
   269 		TBool isUpdate = iServerModel->CapabilityStorage().NewCapabilityListL( genericID, rStrm);
       
   270 		rStrm.Close();
       
   271 		rStrm.Pop(); 
       
   272 
       
   273 		CleanupStack::PopAndDestroy( buf);
       
   274 
       
   275         //Pass handling to Connection Controller
       
   276         iConnectionController->HandleConnectL( genericIDPckg(),
       
   277                                                connectRecord.iThreadID,
       
   278                                                connectRecord.iEvaluateConnectionRules,
       
   279                                                isUpdate );
       
   280 
       
   281         // return modified generic id to client
       
   282         genericIDPckg() = genericID;
       
   283         aMessage.WriteL( KAccServParamPosFirst, genericIDPckg );
       
   284         }
       
   285 
       
   286     Write( aMessage, KAccSrvConnectAccessoryBit );
       
   287 
       
   288     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::ConnectAccessoryL - return void" );
       
   289     }
       
   290 
       
   291 // -----------------------------------------------------------------------------
       
   292 //  CAccSrvSubControl::DisconnectAccessoryL
       
   293 //
       
   294 // Preconditions: if unsupported accessory (Unique Id = KErrNotFound)
       
   295 //                is disconnected, RMessage2 is just completed.
       
   296 // -----------------------------------------------------------------------------
       
   297 //
       
   298 void CAccSrvSubControl::DisconnectAccessoryL( const RMessage2& aMessage )
       
   299     {
       
   300     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DisconnectAccessoryL()" );
       
   301 
       
   302     TAccPolGenericID genericID;
       
   303     TAccSrvGenericIDPckg disconnectGenericIDPackage( genericID );
       
   304 
       
   305     aMessage.ReadL( KAccServParamPosFirst, disconnectGenericIDPackage );
       
   306 
       
   307     //Preconditions
       
   308     if ( KErrNotFound != genericID.UniqueID() )
       
   309         {
       
   310         iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected    
       
   311         iConnectionController->HandleDisconnectL( disconnectGenericIDPackage() ); //Pass handling to Connection Controller
       
   312         }
       
   313 
       
   314     Write( aMessage, KAccSrvDisconnectAccessoryBit );
       
   315 
       
   316     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::DisconnectAccessoryL - return void" );
       
   317     }
       
   318 
       
   319 // -----------------------------------------------------------------------------
       
   320 //  CAccSrvSubControl::SetValueTBoolL
       
   321 // -----------------------------------------------------------------------------
       
   322 //
       
   323 void CAccSrvSubControl::SetValueTBoolL( const RMessage2& aMessage )
       
   324     {
       
   325     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueTBoolL()" );
       
   326 
       
   327     TAccPolGenericID             genericID;
       
   328     TAccSrvGenericIDPckg         genericIDPckg( genericID );
       
   329     TAccPolNameRecord            nameRecord;
       
   330     TAccSrvNameRecordPckg        nameRecordPckg( nameRecord );
       
   331     TAccSrvValueTypeTBoolPckgBuf valuePckgBuf;
       
   332     TASYCommandParamRecord       asyCommandParamRecord;
       
   333 
       
   334     aMessage.ReadL( KAccServParamPosFirst, genericIDPckg );
       
   335     aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   336     aMessage.ReadL( KAccServParamPosThird, valuePckgBuf );
       
   337 
       
   338     //Precondition
       
   339     iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected
       
   340 
       
   341     asyCommandParamRecord.iNameRecord = nameRecordPckg();
       
   342     asyCommandParamRecord.iCmdValue   = valuePckgBuf().iValue;
       
   343     asyCommandParamRecord.iGenericID  = genericID;
       
   344 
       
   345 	//get capability
       
   346 	TUint32 name;
       
   347 	nameRecordPckg().GetName( name );
       
   348 	CCapValue* value =  iServerModel->CapabilityStorage().GetCapability( genericID, name );
       
   349     if ( !value )
       
   350         {
       
   351     	User::Leave( KErrArgument );
       
   352         }
       
   353 
       
   354     switch ( value->Location() )
       
   355         {
       
   356         case EAPVPolicy:
       
   357             {
       
   358             //Value is located in Accessory Policy DB, request can be completed.
       
   359             //The value is stored to Accessory Policy DB in HandleValueMessageL.
       
   360             iSetValueTBoolMsg = aMessage;
       
   361             HandleValueMessageL( ESetValue,
       
   362                                  valuePckgBuf(),
       
   363                                  KErrNone, //ErrorCode,
       
   364                                  0 ); //TrId, not used at the moment
       
   365             }
       
   366             break;
       
   367 
       
   368         case EAPVAccessory:
       
   369             {
       
   370             //Forward request to ASY Proxy Handler
       
   371             iOutstandingTrId = iConnectionController->ASYProxyHandler().HandleASYCommsL(
       
   372                                                         ECmdSetValueBool,
       
   373                                                         asyCommandParamRecord );
       
   374             //Store SetValueTBoolL to queue
       
   375             iConnectionController->NotificationQueue().RegisterControlMessage( ESetValue,
       
   376                                                                               this);
       
   377 
       
   378             //Because SetValueL() is synchronous method, there shouldn't be existing request
       
   379             iSetValueTBoolMsg = aMessage;
       
   380             }
       
   381             break;
       
   382 
       
   383         default:
       
   384             {
       
   385             TRACE_ASSERT_ALWAYS;
       
   386             User::Leave( KErrArgument );
       
   387             }
       
   388             break;
       
   389         }
       
   390 
       
   391     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueTBoolL - return void" );
       
   392     }
       
   393 
       
   394 // -----------------------------------------------------------------------------
       
   395 //  CAccSrvSubControl::SetValueTInt
       
   396 // -----------------------------------------------------------------------------
       
   397 //
       
   398 void CAccSrvSubControl::SetValueTIntL( const RMessage2& aMessage )
       
   399     {
       
   400     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueTIntL()" );
       
   401 
       
   402     TAccPolGenericID            genericID;
       
   403     TAccSrvGenericIDPckg        genericIDPckg( genericID );
       
   404     TAccPolNameRecord           nameRecord;
       
   405     TAccSrvNameRecordPckg       nameRecordPckg( nameRecord );
       
   406     TAccSrvValueTypeTIntPckgBuf valuePckgBuf;
       
   407     TASYCommandParamRecord      asyCommandParamRecord;
       
   408 
       
   409     aMessage.ReadL( KAccServParamPosFirst, genericIDPckg );
       
   410     aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   411     aMessage.ReadL( KAccServParamPosThird, valuePckgBuf );
       
   412 
       
   413     //Precondition
       
   414     iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected
       
   415 
       
   416     asyCommandParamRecord.iNameRecord = nameRecordPckg();
       
   417     asyCommandParamRecord.iCmdValue   = valuePckgBuf().iValue;
       
   418     asyCommandParamRecord.iGenericID  = genericID;
       
   419 
       
   420 	//get capability
       
   421 	TUint32 name;
       
   422 	nameRecordPckg().GetName( name );
       
   423 	CCapValue * value =  iServerModel->CapabilityStorage().GetCapability( genericID, name );
       
   424     
       
   425     if ( !value )
       
   426         {
       
   427     	User::Leave( KErrArgument );
       
   428         }
       
   429 
       
   430     switch ( value->Location() )
       
   431         {
       
   432         case EAPVPolicy:
       
   433             {
       
   434             //Value is located in Accessory Policy DB, request can be completed.
       
   435             //The value is stored to Accessory Policy DB in HandleValueMessageL.
       
   436             iSetValueTIntMsg = aMessage;
       
   437             HandleValueMessageL( ESetValue,
       
   438                                  valuePckgBuf(),
       
   439                                  KErrNone, //ErrorCode,
       
   440                                  0 ); //TrId, not used at the moment
       
   441             }
       
   442             break;
       
   443 
       
   444         case EAPVAccessory:
       
   445             {
       
   446             //Forward request to ASY Proxy Handler
       
   447             iOutstandingTrId = iConnectionController->ASYProxyHandler().HandleASYCommsL(
       
   448                                                         ECmdSetValueTInt,
       
   449                                                         asyCommandParamRecord );
       
   450             //Store SetValueTBoolL to queue
       
   451             iConnectionController->NotificationQueue().RegisterControlMessage( ESetValue,
       
   452                                                                                this );
       
   453             //Because SetValueL() is synchronous method, there shouldn't be existing request
       
   454             iSetValueTIntMsg = aMessage;
       
   455             }
       
   456             break;
       
   457 
       
   458         default:
       
   459             {
       
   460             TRACE_ASSERT_ALWAYS;
       
   461             User::Leave( KErrArgument );
       
   462             }
       
   463             break;
       
   464         }
       
   465 
       
   466     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::CAccSrvSubControl::SetValueTIntL - return void" );
       
   467     }
       
   468 
       
   469 // -----------------------------------------------------------------------------
       
   470 //  CAccSrvSubControl::SetValueObjectBaseL
       
   471 // -----------------------------------------------------------------------------
       
   472 //
       
   473 void CAccSrvSubControl::SetValueObjectBaseL( const RMessage2& aMessage )
       
   474     {
       
   475     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueObjectBaseL()" );
       
   476     
       
   477     RBufReadStream           rStrm;  
       
   478     TAccPolGenericID         genericID;
       
   479     TAccSrvGenericIDPckg     genericIDPckg( genericID );
       
   480     TAccPolNameRecord        nameRecord;
       
   481     TAccSrvNameRecordPckg    nameRecordPckg( nameRecord );
       
   482     TASYCommandParamRecord   asyCommandParamRecord;
       
   483     
       
   484     CBufFlat *buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
       
   485     CleanupStack::PushL( buf );
       
   486     buf->ResizeL( aMessage.GetDesMaxLength( KAccServParamPosThird ) );
       
   487     
       
   488     TPtr8 ptrBuf( buf->Ptr( 0 ) );
       
   489     
       
   490     // Read client parameters
       
   491     aMessage.ReadL( KAccServParamPosFirst, genericIDPckg );
       
   492     aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   493     aMessage.ReadL( KAccServParamPosThird, ptrBuf );
       
   494     
       
   495     //Precondition
       
   496     iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected
       
   497     
       
   498     asyCommandParamRecord.iNameRecord = nameRecordPckg();
       
   499     asyCommandParamRecord.iCmdValue   = 0;
       
   500     asyCommandParamRecord.iGenericID  = genericID;
       
   501 
       
   502 	//get capability
       
   503 	TUint32 name;
       
   504 	nameRecordPckg().GetName( name );
       
   505 	CCapValue * value =  iServerModel->CapabilityStorage().GetCapability( genericID, name );
       
   506     
       
   507     if ( !value )
       
   508         {
       
   509     	User::Leave( KErrArgument );
       
   510         }
       
   511 
       
   512     switch ( value->Location() )
       
   513         {
       
   514         case EAPVAccessory:
       
   515             {
       
   516             //Forward request to ASY Proxy Handler
       
   517             iOutstandingTrId = iConnectionController->ASYProxyHandler().HandleASYCommsL(
       
   518                                                         ECmdSetObjectValue,
       
   519                                                         asyCommandParamRecord,
       
   520                                                         &ptrBuf );
       
   521             //Store SetValueTBoolL to queue
       
   522             iConnectionController->NotificationQueue().RegisterControlMessage( ESetValue,
       
   523                                                                                this );
       
   524             //Because SetValueL() is synchronous method, there shouldn't be existing request
       
   525             iSetValueObjectMsg = aMessage;
       
   526             }
       
   527             break;
       
   528 
       
   529         default:
       
   530             {
       
   531             TRACE_ASSERT_ALWAYS;
       
   532             User::Leave( KErrArgument );
       
   533             }
       
   534             break;
       
   535         }
       
   536     
       
   537     CleanupStack::PopAndDestroy( buf );    
       
   538 
       
   539     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::SetValueObjectBaseL - return void" );
       
   540     }
       
   541 // CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL
       
   542 // -----------------------------------------------------------------------------
       
   543 //
       
   544 void CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL( const RMessage2& aMessage )
       
   545     {
       
   546     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL()" );
       
   547 
       
   548     TAccPolGenericID             genericID;
       
   549     TAccSrvGenericIDPckg         genericIDPckg( genericID );
       
   550     TAccPolNameRecord            nameRecord;
       
   551     TAccSrvNameRecordPckg        nameRecordPckg( nameRecord );
       
   552     TAccSrvValueTypeTBoolPckgBuf valuePckgBuf;
       
   553 
       
   554     aMessage.ReadL( KAccServParamPosFirst, genericIDPckg );
       
   555     aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   556     aMessage.ReadL( KAccServParamPosThird, valuePckgBuf );
       
   557 
       
   558     //Precondition
       
   559     iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected
       
   560 
       
   561     //get capability and store new value
       
   562 	TUint32 name;
       
   563 	nameRecordPckg().GetName( name );
       
   564 
       
   565 	CCapValue* value =  iServerModel->CapabilityStorage().GetCapability( genericID, name );
       
   566     if ( !value )
       
   567         {
       
   568     	User::Leave( KErrArgument );
       
   569         }
       
   570 
       
   571  	value->SetValueL( valuePckgBuf().iValue );   
       
   572 
       
   573     //Store Value Data for AccessoryValueChanged notification
       
   574     TAccValueTypeTInt dummyTIntValue = { 0 };
       
   575     TAccValueTypeObject dummyObjectValue( TPtr8( NULL, 0, 0 ) );
       
   576     iServerModel->SetValueData( genericID,
       
   577                                 nameRecordPckg(),
       
   578                                 dummyTIntValue, /*Not used*/
       
   579                                 valuePckgBuf(),
       
   580                                 dummyObjectValue/* Not used*/);
       
   581 
       
   582     //complete possible pending notifications about change of accessory value
       
   583     iConnectionController->NotificationQueue().CompleteControlMessageL( 
       
   584                                                     EAccessoryValueChangedTBool,
       
   585                                                     KErrNone,
       
   586                                                     genericID.UniqueID() );
       
   587 
       
   588     //Update Connection status and Accessory mode (if changed)
       
   589     iConnectionController->HandleConnectionChangeValidationL( genericID );
       
   590 
       
   591     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTBoolNotifyL - return void" );
       
   592     }
       
   593 
       
   594 // -----------------------------------------------------------------------------
       
   595 // CAccSrvSubControl::AccessoryValueChangedTIntNotifyL
       
   596 // -----------------------------------------------------------------------------
       
   597 //
       
   598 void CAccSrvSubControl::AccessoryValueChangedTIntNotifyL( const RMessage2& aMessage )
       
   599     {
       
   600     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTIntNotifyL()" );
       
   601 
       
   602     TAccPolGenericID            genericID;
       
   603     TAccSrvGenericIDPckg        genericIDPckg( genericID );
       
   604     TAccPolNameRecord           nameRecord;
       
   605     TAccSrvNameRecordPckg       nameRecordPckg( nameRecord );
       
   606     TAccSrvValueTypeTIntPckgBuf valuePckgBuf;
       
   607 
       
   608     aMessage.ReadL( KAccServParamPosFirst, genericIDPckg );
       
   609     aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   610     aMessage.ReadL( KAccServParamPosThird, valuePckgBuf );
       
   611 
       
   612     //Precondition
       
   613     iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected
       
   614 
       
   615     //get capability and store new value
       
   616 	TUint32 name;
       
   617 	nameRecordPckg().GetName( name );
       
   618 
       
   619 	CCapValue* value = iServerModel->CapabilityStorage().GetCapability( genericID, name );
       
   620     if ( !value )
       
   621         {
       
   622     	User::Leave( KErrArgument );
       
   623         }
       
   624  
       
   625  	value->SetValueL( valuePckgBuf().iValue );       
       
   626  	
       
   627     //Store Value Data for AccessoryValueChanged notification
       
   628     TAccValueTypeTBool dummyTBoolValue = { EFalse };
       
   629     TAccValueTypeObject dummyObjectValue( TPtr8( NULL, 0, 0 ) );
       
   630     iServerModel->SetValueData( genericID,
       
   631                                 nameRecordPckg(),
       
   632                                 valuePckgBuf(),
       
   633                                 dummyTBoolValue,/*Not used*/
       
   634                                 dummyObjectValue/*Not used*/ );
       
   635 
       
   636     //complete possible pending notifications about change of accessory value
       
   637     iConnectionController->NotificationQueue().CompleteControlMessageL( 
       
   638                                                     EAccessoryValueChangedTInt,
       
   639                                                     KErrNone,
       
   640                                                     genericID.UniqueID() );
       
   641 
       
   642     //Update Connection status and Accessory mode (if changed)
       
   643     iConnectionController->HandleConnectionChangeValidationL( genericID );
       
   644 
       
   645     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedTIntNotifyL - return void" );
       
   646     }
       
   647 
       
   648 // -----------------------------------------------------------------------------
       
   649 // CAccSrvSubControl::AccessoryValueChangedObjectNotifyL
       
   650 // -----------------------------------------------------------------------------
       
   651 //
       
   652 void CAccSrvSubControl::AccessoryValueChangedObjectNotifyL( const RMessage2& aMessage )
       
   653     {
       
   654     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedObjectNotifyL()" );
       
   655 
       
   656     TAccPolGenericID            genericID;
       
   657     TAccSrvGenericIDPckg        genericIDPckg( genericID );
       
   658     TAccPolNameRecord           nameRecord;
       
   659     TAccSrvNameRecordPckg       nameRecordPckg( nameRecord );
       
   660     CBufFlat*                   valueBuf = NULL;
       
   661 
       
   662     aMessage.ReadL( KAccServParamPosFirst, genericIDPckg );
       
   663     aMessage.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   664     
       
   665     valueBuf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
       
   666     CleanupStack::PushL( valueBuf );    
       
   667     valueBuf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
       
   668     TPtr8 valueBufPtr( valueBuf->Ptr( 0 ) );
       
   669     aMessage.ReadL( KAccServParamPosThird, valueBufPtr );
       
   670 
       
   671     //Precondition
       
   672     iServerModel->IsConnectedOrDetectedL( genericID );//Leaves with KErrArgument if the accessory is not connected or detected
       
   673 
       
   674     //get capability and store new value
       
   675     TUint32 name;
       
   676     nameRecordPckg().GetName( name );
       
   677 
       
   678     CCapValue* value = iServerModel->CapabilityStorage().GetCapability( genericID, name );
       
   679     if ( !value )
       
   680         {
       
   681         User::Leave( KErrArgument );
       
   682         }
       
   683  
       
   684     value->SetValueL( valueBufPtr );
       
   685     
       
   686     //Store Value Data for AccessoryValueChanged notification
       
   687     TAccValueTypeTBool  dummyTBoolValue = { EFalse };
       
   688     TAccValueTypeTInt   dummyTIntValue  = { 0 };
       
   689     TAccValueTypeObject objectValue( valueBufPtr );
       
   690     iServerModel->SetValueData( genericID,
       
   691                                 nameRecordPckg(),
       
   692                                 dummyTIntValue, /*Not used*/ 
       
   693                                 dummyTBoolValue,/*Not used*/
       
   694                                 objectValue );
       
   695 
       
   696     //complete possible pending notifications about change of accessory value
       
   697     iConnectionController->NotificationQueue().CompleteControlMessageL( 
       
   698                                                     EAccessoryValueChangedObject,
       
   699                                                     KErrNone,
       
   700                                                     genericID.UniqueID() );
       
   701 
       
   702     //Update Connection status and Accessory mode (if changed)
       
   703     iConnectionController->HandleConnectionChangeValidationL( genericID );
       
   704     
       
   705     // Cleanup
       
   706     CleanupStack::PopAndDestroy( valueBuf );
       
   707 
       
   708     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::AccessoryValueChangedObjectNotifyL - return void" );
       
   709     }
       
   710 
       
   711 // -----------------------------------------------------------------------------
       
   712 // CAccSrvSubControl::CompleteMessageL
       
   713 // -----------------------------------------------------------------------------
       
   714 //
       
   715 TBool CAccSrvSubControl::CompleteMessageL( TMsgID aMsgID,
       
   716                                            TInt aErrorCode,
       
   717                                            TInt aUniqueID )
       
   718     {
       
   719     COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubControl::CompleteMessageL(%d)", aMsgID );
       
   720     return CAccSrvSubConnection::CompleteMessageL( aMsgID, aErrorCode, aUniqueID );
       
   721     }
       
   722 
       
   723 // -----------------------------------------------------------------------------
       
   724 // CAccSrvSubControl::HandleValueMessageL
       
   725 // -----------------------------------------------------------------------------
       
   726 //
       
   727 void CAccSrvSubControl::HandleValueMessageL( TMsgID aMsgID,
       
   728                                              TAccValueTypeTBool aValueTBool,
       
   729                                              TInt aErrorCode,
       
   730                                              TInt aTrId )
       
   731     {
       
   732     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL() - TBool" );
       
   733 
       
   734     switch ( aMsgID )
       
   735         {
       
   736         case ESetValue:
       
   737             {
       
   738             HandleSetValueTBoolCompletionL( aErrorCode, aTrId );
       
   739             }
       
   740             break;
       
   741 
       
   742         default:
       
   743             {
       
   744             //Pass handling to parent class
       
   745             CAccSrvSubConnectionBase::HandleValueMessageL( 
       
   746                                             aMsgID, 
       
   747                                             aValueTBool, 
       
   748                                             aErrorCode, 
       
   749                                             aTrId );
       
   750             }
       
   751             break;
       
   752         }
       
   753 
       
   754     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL - TBool - return void" );
       
   755     }
       
   756 
       
   757 // -----------------------------------------------------------------------------
       
   758 // CAccSrvSubControl::HandleValueMessageL
       
   759 //
       
   760 // -----------------------------------------------------------------------------
       
   761 //
       
   762 void CAccSrvSubControl::HandleValueMessageL( TMsgID aMsgID,
       
   763                                              TAccValueTypeTInt aValueTInt,
       
   764                                              TInt aErrorCode,
       
   765                                              TInt aTrId )
       
   766     {
       
   767     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL() - TInt" );
       
   768 
       
   769     switch ( aMsgID )
       
   770         {
       
   771         case ESetValue:
       
   772             {
       
   773             HandleSetValueTIntCompletionL( aErrorCode, aTrId );
       
   774             }
       
   775             break;
       
   776 
       
   777         default:
       
   778             {
       
   779             //Pass handling to parent class
       
   780             CAccSrvSubConnectionBase::HandleValueMessageL( 
       
   781                                             aMsgID, 
       
   782                                             aValueTInt, 
       
   783                                             aErrorCode, 
       
   784                                             aTrId );
       
   785             }
       
   786             break;
       
   787         }
       
   788 
       
   789     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL - TInt - return void" );
       
   790     }
       
   791     
       
   792 // -----------------------------------------------------------------------------
       
   793 // CAccSrvSubControl::HandleValueMessageL
       
   794 //
       
   795 // -----------------------------------------------------------------------------
       
   796 //
       
   797 void CAccSrvSubControl::HandleValueMessageL( TMsgID aMsgID,
       
   798                                              TInt aTrId,
       
   799                                              TPtr8* aPtrBuf,
       
   800                                              TInt aErrorCode )
       
   801     {
       
   802     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL() - Obj" );
       
   803 
       
   804     switch ( aMsgID )
       
   805         {
       
   806         case ESetValue:
       
   807             {
       
   808             HandleSetValueObjectCompletion( aErrorCode, aTrId );
       
   809             }
       
   810             break;
       
   811 
       
   812         default:
       
   813             {
       
   814             //Pass handling to parent class
       
   815             CAccSrvSubConnectionBase::HandleValueMessageL( aMsgID, 
       
   816                                                            aTrId,
       
   817                                                            aPtrBuf,
       
   818                                                            aErrorCode );
       
   819             }
       
   820             break;
       
   821         }
       
   822    
       
   823     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleValueMessageL - Obj - return void" );
       
   824     }
       
   825 
       
   826 // -----------------------------------------------------------------------------
       
   827 // CAccSrvSubControl::HandleSetValueTIntCompletionL
       
   828 //
       
   829 // Complete outstanding SetValueL( TAccValueTypeTInt ) request.
       
   830 // -----------------------------------------------------------------------------
       
   831 //
       
   832 void CAccSrvSubControl::HandleSetValueTIntCompletionL( TInt aErrorCode, TInt aTrId )
       
   833     {
       
   834     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL()" );
       
   835 
       
   836     __ASSERT_DEBUG( !iSetValueTIntMsg.IsNull(), User::Invariant() );
       
   837 
       
   838     //Check is this correct SetValueL(), i.e. Some other CAccSrvSubControl-subsession
       
   839     //might also have a pending SetValueL() request.
       
   840     if ( iOutstandingTrId == aTrId )
       
   841         {
       
   842         COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL - TrId match" );
       
   843         //Store a new value to Accessory Policy DB.
       
   844         //Storing is done when value location is Accessory Policy DB or accessory.
       
   845         TAccPolGenericID            gid;
       
   846         TAccSrvGenericIDPckg        gidPckg( gid );
       
   847         TAccPolNameRecord           nameRecord;
       
   848         TAccSrvNameRecordPckg       nameRecordPckg( nameRecord );
       
   849         TAccSrvValueTypeTIntPckgBuf valuePckgBuf;
       
   850 
       
   851         iSetValueTIntMsg.ReadL( KAccServParamPosFirst, gidPckg );
       
   852         iSetValueTIntMsg.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   853         iSetValueTIntMsg.ReadL( KAccServParamPosThird, valuePckgBuf );
       
   854 
       
   855 	    //get capability and store new value
       
   856 		TUint32 name;
       
   857 		nameRecordPckg().GetName( name);
       
   858 
       
   859 		CCapValue * value = iServerModel->CapabilityStorage().GetCapability( gid, name );
       
   860 
       
   861     	if ( !value )
       
   862     	    {
       
   863     		User::Leave( KErrArgument );
       
   864         	}
       
   865 
       
   866  		value->SetValueL( valuePckgBuf().iValue );            
       
   867 
       
   868         iOutstandingTrId = 0;//reset transaction ID of this session
       
   869         iSetValueTIntMsg.Complete( aErrorCode );
       
   870         }
       
   871 
       
   872     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL - return void" );
       
   873     }
       
   874 
       
   875 // -----------------------------------------------------------------------------
       
   876 // CAccSrvSubControl::HandleSetValueTBoolCompletionL
       
   877 //
       
   878 // Complete outstanding SetValueL( TAccValueTypeTBool ) request.
       
   879 // -----------------------------------------------------------------------------
       
   880 //
       
   881 void CAccSrvSubControl::HandleSetValueTBoolCompletionL( TInt aErrorCode, TInt aTrId )
       
   882     {
       
   883     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTBoolCompletionL()" );
       
   884 
       
   885     __ASSERT_DEBUG( !iSetValueTBoolMsg.IsNull(), User::Invariant() );
       
   886 
       
   887     //Check is this correct SetValueL(), i.e. Some other CAccSrvSubControl-subsession
       
   888     //might also have a pending SetValueL() request.
       
   889     if ( iOutstandingTrId == aTrId )
       
   890         {
       
   891         COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTBoolCompletionL - TrId match" );
       
   892         //Store a new value to Accessory Policy DB.
       
   893         //Storing is done when value location is Accessory Policy DB or accessory.
       
   894         TAccPolGenericID            gid;
       
   895         TAccSrvGenericIDPckg        gidPckg( gid );
       
   896         TAccPolNameRecord           nameRecord;
       
   897         TAccSrvNameRecordPckg       nameRecordPckg( nameRecord );
       
   898         TAccSrvValueTypeTBoolPckgBuf valuePckgBuf;
       
   899 
       
   900         iSetValueTBoolMsg.ReadL( KAccServParamPosFirst, gidPckg );
       
   901         iSetValueTBoolMsg.ReadL( KAccServParamPosSecond, nameRecordPckg );
       
   902         iSetValueTBoolMsg.ReadL( KAccServParamPosThird, valuePckgBuf );
       
   903 
       
   904 	    //get capability and store new value
       
   905 		TUint32 name;
       
   906 		nameRecordPckg().GetName( name );
       
   907 
       
   908 		CCapValue * value = iServerModel->CapabilityStorage().GetCapability( gid, name );
       
   909 
       
   910     	if ( !value )
       
   911             {
       
   912     		User::Leave( KErrArgument );
       
   913         	}
       
   914 
       
   915  		value->SetValueL( valuePckgBuf().iValue ); 
       
   916 
       
   917         iOutstandingTrId = 0;//reset transaction ID of this session
       
   918         iSetValueTBoolMsg.Complete( aErrorCode );
       
   919         }
       
   920 
       
   921     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTBoolCompletionL - return void" );
       
   922     }
       
   923 
       
   924 // -----------------------------------------------------------------------------
       
   925 // CAccSrvSubControl::HandleSetValueObjectCompletion
       
   926 //
       
   927 // Complete outstanding SetValueL( Object type ) request.
       
   928 // -----------------------------------------------------------------------------
       
   929 //
       
   930 void CAccSrvSubControl::HandleSetValueObjectCompletion( TInt aErrorCode, TInt aTrId )
       
   931     {
       
   932 
       
   933     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueObjectCompletion()" );
       
   934 
       
   935      __ASSERT_DEBUG( !iSetValueObjectMsg.IsNull(), User::Invariant() );
       
   936 
       
   937     //Check is this correct SetValueL(), i.e. Some other CAccSrvSubControl-subsession
       
   938     //might also have a pending SetValueL() request.
       
   939     if ( iOutstandingTrId == aTrId )
       
   940         {
       
   941         COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueTIntCompletionL - TrId match" );
       
   942 
       
   943         iOutstandingTrId = 0;//reset transaction ID of this session
       
   944         iSetValueObjectMsg.Complete( aErrorCode );
       
   945         }    
       
   946 
       
   947     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubControl::HandleSetValueObjectCompletion - return void" );
       
   948     }
       
   949 
       
   950 
       
   951 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   952 
       
   953 //  End of File