accessoryservices/accessoryserver/src/Server/AccSrvSubAsyComms.cpp
changeset 0 4e1aa6a622a0
child 8 8d1d8440b626
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:  Subconnection class for session of ASYComms
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include "AccSrvSubAsyComms.h"
       
    21 #include "AccSrvMainSession.h"
       
    22 #include "AccClientServerMessages.h"
       
    23 #include "acc_debug.h"
       
    24 #include "AccSrvServerModel.h"
       
    25 #include "AccSrvASYProxyHandler.h"
       
    26 #include <AccessoryTypes.h>
       
    27 
       
    28 // EXTERNAL DATA STRUCTURES
       
    29 
       
    30 // EXTERNAL FUNCTION PROTOTYPES
       
    31 
       
    32 // CONSTANTS
       
    33 //Main service implementation uid of BT-ASY stub for MT
       
    34 const TUid KBTAsyMainServUidStub = {0x10200c7c};
       
    35 //Main service implementation uid of BT ASY
       
    36 const TUid KBTAsyMainServUid = {0x1020897c};
       
    37 
       
    38 // MACROS
       
    39 
       
    40 // LOCAL CONSTANTS AND MACROS
       
    41 
       
    42 // MODULE DATA STRUCTURES
       
    43 
       
    44 // LOCAL FUNCTION PROTOTYPES
       
    45 
       
    46 // FORWARD DECLARATIONS
       
    47 
       
    48 // ============================= LOCAL FUNCTIONS ===============================
       
    49 
       
    50 // ============================ MEMBER FUNCTIONS ===============================
       
    51 
       
    52 // -----------------------------------------------------------------------------
       
    53 // CAccSrvSubAsyComms::CAccSrvSubAsyComms
       
    54 // C++ default constructor can NOT contain any code, that
       
    55 // might leave.
       
    56 // -----------------------------------------------------------------------------
       
    57 //
       
    58 CAccSrvSubAsyComms::CAccSrvSubAsyComms(
       
    59             CASYProxyAPI* aProxy,
       
    60             CAccSrvConnectionController* aConnectionController,
       
    61             CAccSrvServerModel* aServerModel,
       
    62             TUint aASYThreadID,
       
    63             TUid aMainServiceUid )
       
    64     : CAccSrvSubBase( aProxy, aConnectionController,aServerModel ),
       
    65       iOutstandingTrId( 0 ),
       
    66       iTimeOutTrId ( 0 ),
       
    67       iOutstandingProcessCmdId( ECmdBadFunction ),
       
    68       iASYThreadID( aASYThreadID ),
       
    69       iMainServiceUid( aMainServiceUid )
       
    70     {
       
    71     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CAccSrvSubAsyComms()" );
       
    72     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CAccSrvSubAsyComms" );
       
    73     }
       
    74 
       
    75 // -----------------------------------------------------------------------------
       
    76 // CAccSrvSubAsyComms::ConstructL
       
    77 // Symbian 2nd phase constructor can leave.
       
    78 // -----------------------------------------------------------------------------
       
    79 //
       
    80 void CAccSrvSubAsyComms::ConstructL()
       
    81     {
       
    82     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::ConstructL()" );
       
    83 
       
    84     iInitCommandTimer = CAccSrvProcessCommandTimer::NewL( this, KInitCmdTimeOut );
       
    85     iServerModel->AddASYThreadId( iASYThreadID );
       
    86 
       
    87     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::ConstructL - return void" );
       
    88     }
       
    89 
       
    90 // -----------------------------------------------------------------------------
       
    91 // CAccSrvSubAsyComms::NewL
       
    92 // Two-phased constructor.
       
    93 // -----------------------------------------------------------------------------
       
    94 //
       
    95 CAccSrvSubAsyComms* CAccSrvSubAsyComms::NewL(
       
    96                     CASYProxyAPI* aProxy,
       
    97                     CAccSrvConnectionController* aConnectionController,
       
    98                     CAccSrvServerModel* aServerModel,
       
    99                     TUint aASYThreadID,
       
   100                     TUid aMainServiceUid )
       
   101     {
       
   102     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::NewL()" );
       
   103     if ( !aProxy )
       
   104         {
       
   105         User::Leave( KErrArgument );
       
   106         }
       
   107 
       
   108     CAccSrvSubAsyComms* self = new ( ELeave ) CAccSrvSubAsyComms(
       
   109                                                 aProxy,
       
   110                                                 aConnectionController,
       
   111                                                 aServerModel,
       
   112                                                 aASYThreadID,
       
   113                                                 aMainServiceUid );
       
   114 
       
   115     CleanupStack::PushL( self );
       
   116     self->ConstructL();
       
   117     CleanupStack::Pop( self );
       
   118 
       
   119     COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubAsyComms::NewL - return 0x%x", self );
       
   120     return self;
       
   121     }
       
   122 
       
   123 // Destructor
       
   124 CAccSrvSubAsyComms::~CAccSrvSubAsyComms()
       
   125     {
       
   126     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::~CAccSrvSubAsyComms()" );
       
   127 
       
   128     if ( iInitCommandTimer )
       
   129         {
       
   130         delete iInitCommandTimer;
       
   131         }
       
   132 
       
   133     if ( iProcessCommandTimer )
       
   134         {
       
   135         delete iProcessCommandTimer;
       
   136         }
       
   137         
       
   138     if( iObjectBuf )
       
   139         {
       
   140         delete iObjectBuf;
       
   141         }
       
   142 
       
   143     CancelNotifyProcessCommand( iMessage );
       
   144 
       
   145     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::~CAccSrvSubAsyComms" );
       
   146     }
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 // CAccSrvSubAsyComms::DispatchMessageL
       
   150 // Handles client request
       
   151 // -----------------------------------------------------------------------------
       
   152 //
       
   153 void CAccSrvSubAsyComms::DispatchMessageL( const RMessage2& aMessage )
       
   154     {
       
   155     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::DispatchMessageL()" );
       
   156 
       
   157     TInt function = aMessage.Function();
       
   158 
       
   159     switch ( function )
       
   160         {
       
   161         case EAccSrvNotifyProcessCommand:
       
   162             {
       
   163             NotifyProcessCommand( aMessage );
       
   164             break;
       
   165             }
       
   166         case EAccSrvCancelNotifyProcessCommand:
       
   167             {
       
   168             CancelNotifyProcessCommand( aMessage );
       
   169             break;
       
   170             }
       
   171         case EAccSrvProcessResponseTBool:
       
   172             {
       
   173             ProcessResponseL( aMessage, EProcessResponseTBool );
       
   174             break;
       
   175             }
       
   176         case EAccSrvProcessResponseTInt:
       
   177             {
       
   178             ProcessResponseL( aMessage, EProcessResponseTInt );
       
   179             break;
       
   180             }
       
   181         case EAccSrvProcessResponseTDes:
       
   182             {
       
   183             ProcessResponseL( aMessage, EProcessResponseTDes );
       
   184             break;
       
   185             }        
       
   186         case EAccSrvProcessResponseObject:
       
   187             {
       
   188             ProcessResponseL( aMessage, EProcessResponseObject );
       
   189             break;
       
   190             }
       
   191          
       
   192         case EAccSrvGetObjectBuffer:
       
   193             {
       
   194             TPtr8 ptrBuf( iObjectBuf->Ptr( 0 ) );
       
   195             aMessage.WriteL( KAccServParamPosFirst, ptrBuf );
       
   196             delete iObjectBuf;
       
   197             iObjectBuf = NULL;
       
   198             break;
       
   199             }
       
   200         default:
       
   201             {
       
   202             TRACE_ASSERT_ALWAYS;
       
   203             COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubAsyComms::DispatchMessageL - unhandled function %d", function );
       
   204             User::Leave( KErrNotSupported );
       
   205             break;
       
   206             }
       
   207         } // switch( function )
       
   208 
       
   209     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::DispatchMessageL - return void" );
       
   210     }
       
   211 
       
   212 // -----------------------------------------------------------------------------
       
   213 // CAccSrvSubAsyComms::NotifyProcessCommand
       
   214 // Sets the NotifyProcessCommand to a handling queue
       
   215 // (other items were commented in a header).
       
   216 // -----------------------------------------------------------------------------
       
   217 //
       
   218 void CAccSrvSubAsyComms::NotifyProcessCommand( const RMessage2& aMessage )
       
   219     {
       
   220     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::NotifyProcessCommand()" );
       
   221 
       
   222     // Add session to queue.
       
   223     // Queue will call CAccSrvSubAsyComms::CompleteProcessCommandL() when client
       
   224     // has sent request to ASY.
       
   225 
       
   226     // Exception: In initialization case asy-proxy-server makes
       
   227     //  the completition instead of client ( Loading complete )
       
   228 
       
   229     iConnectionController->NotificationQueue().RegisterControlMessage(
       
   230                                                     ENotifyProcessCommand,
       
   231                                                     this );
       
   232 
       
   233     // Copy client message for completion when client has sent request to ASY.
       
   234     // Completion is done in CAccSrvSubAsyComms::CompleteProcessCommandL()
       
   235 
       
   236     // Exception: In initialization case asy-proxy-server makes
       
   237     //  the completition instead of client ( Loading complete )
       
   238 
       
   239     iMessage = aMessage;
       
   240 
       
   241     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::NotifyProcessCommand - return void" );
       
   242     }
       
   243 
       
   244 // -----------------------------------------------------------------------------
       
   245 // CAccSrvSubAsyComms::CancelNotifyProcessCommand
       
   246 // -----------------------------------------------------------------------------
       
   247 //
       
   248 void CAccSrvSubAsyComms::CancelNotifyProcessCommand( const RMessage2& /*aMessage*/ )
       
   249     {
       
   250     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CancelNotifyProcessCommand()" );
       
   251 
       
   252     // Is command pending
       
   253     if ( !iMessage.IsNull() )
       
   254         {
       
   255         // Remove NotifyProcessCommand from queue.
       
   256         iConnectionController->NotificationQueue().CancelControlMessage(
       
   257                                                         ENotifyProcessCommand,
       
   258                                                         this );
       
   259         iMessage.Complete( KErrCancel );
       
   260         }
       
   261 
       
   262     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CancelNotifyProcessCommand - return void" );
       
   263     }
       
   264 
       
   265 // -----------------------------------------------------------------------------
       
   266 // CAccSrvSubAsyComms::ProcessResponseL
       
   267 // Handles responses of NotifyProcessCommand
       
   268 // (other items were commented in a header).
       
   269 // -----------------------------------------------------------------------------
       
   270 //
       
   271 void CAccSrvSubAsyComms::ProcessResponseL( const RMessage2& aMessage,
       
   272                                            TProcessResponseType aResponseType,
       
   273                                            TBool aTimeOut )
       
   274     {
       
   275     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::ProcessResponseL()" );
       
   276 
       
   277     if ( iProcessCommandTimer )
       
   278         {
       
   279         iProcessCommandTimer->Cancel();
       
   280         delete iProcessCommandTimer;
       
   281         iProcessCommandTimer = NULL;
       
   282         }
       
   283 
       
   284     TMsgID                       messageId( EUnknown );
       
   285     TPckgBuf<TInt>               tridPckgBuf;
       
   286     TPckgBuf<TInt>               errPckgBuf;    
       
   287     TAccSrvValueTypeTBoolPckgBuf valueTBoolPckgBuf;// TBool    
       
   288     TPckgBuf<TAccValueTypeTInt>  valueTIntPckgBuf;// TInt    
       
   289     TASYBTAccInfo                btInfo;// TDes
       
   290     TPckg<TASYBTAccInfo>         valueBTPckg( btInfo );
       
   291     TInt asyDataSize ( 0 );
       
   292     HBufC8 *asyData = NULL;    
       
   293     CBufFlat* objectBuf = NULL;    
       
   294     
       
   295     //
       
   296     // Allocated the buffer which is really needed!
       
   297     // 
       
   298     if ( EProcessResponseTDes == aResponseType && 
       
   299          ECmdGetSupportedBTProfiles != iOutstandingProcessCmdId )
       
   300         {
       
   301     	asyDataSize = aMessage.GetDesLengthL( KAccServParamPosSecond );
       
   302         asyData = HBufC8::NewL( asyDataSize );
       
   303         CleanupStack::PushL( asyData );        
       
   304         }
       
   305 	else if ( EProcessResponseObject == aResponseType )
       
   306 		{
       
   307         objectBuf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
       
   308 	    CleanupStack::PushL( objectBuf );
       
   309 	    TInt bufLength( aMessage.GetDesLength( KAccServParamPosSecond ) );
       
   310 	    objectBuf->ResizeL( bufLength );	      
       
   311 		}
       
   312 	else
       
   313 	   {
       
   314 	   COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::ProcessResponseL() - Buffer is not needed!" );
       
   315 	   }
       
   316 		    		    
       
   317     if ( !aTimeOut )
       
   318         {
       
   319         aMessage.ReadL( KAccServParamPosFirst, tridPckgBuf );
       
   320         if ( iOutstandingTrId != tridPckgBuf() )
       
   321             {
       
   322             // There are no correcponding SetValueL()/GetValueL() pending
       
   323             User::Leave( KErrNotFound );
       
   324             }
       
   325 
       
   326         switch ( aResponseType )
       
   327             {
       
   328             case EProcessResponseTBool :
       
   329                 aMessage.ReadL( KAccServParamPosSecond, valueTBoolPckgBuf );
       
   330                 aMessage.ReadL( KAccServParamPosThird, errPckgBuf );
       
   331                 break;
       
   332             case EProcessResponseTInt :
       
   333                 aMessage.ReadL( KAccServParamPosSecond, valueTIntPckgBuf );
       
   334                 aMessage.ReadL( KAccServParamPosThird, errPckgBuf );
       
   335                 break;
       
   336             case EProcessResponseTDes :
       
   337                 if( ECmdGetSupportedBTProfiles == iOutstandingProcessCmdId )
       
   338                     {
       
   339                     aMessage.ReadL( KAccServParamPosSecond, valueBTPckg ); 
       
   340                     }
       
   341                 else
       
   342                     {             
       
   343                     TPtr8 asyDataPtr = asyData->Des();	        
       
   344                     aMessage.ReadL( KAccServParamPosSecond, asyDataPtr );       
       
   345                     }
       
   346                 aMessage.ReadL( KAccServParamPosThird, errPckgBuf );         
       
   347                 break;
       
   348             case EProcessResponseObject :   
       
   349                 {  
       
   350                 // In set case do not read object buf ptr.	                      
       
   351                 if( ECmdGetObjectValue == iOutstandingProcessCmdId ) 	
       
   352                    {
       
   353                    TPtr8 objectBufPtr( objectBuf->Ptr(0) );			    		
       
   354                    aMessage.ReadL( KAccServParamPosSecond, objectBufPtr );
       
   355                    aMessage.ReadL( KAccServParamPosThird, errPckgBuf );
       
   356                    }
       
   357                 else
       
   358                    {                   	
       
   359                    aMessage.ReadL( KAccServParamPosThird, errPckgBuf );
       
   360                    }
       
   361                 }
       
   362                 break;
       
   363                 
       
   364             default:
       
   365                 {
       
   366                 TRACE_ASSERT_ALWAYS;
       
   367                 User::Leave( KErrGeneral );
       
   368                 }
       
   369                 break;
       
   370             }
       
   371         }
       
   372     else // Timed out
       
   373         {
       
   374         tridPckgBuf = iOutstandingTrId;
       
   375         errPckgBuf = KErrTimedOut;
       
   376         iTimeOutTrId = iOutstandingTrId;
       
   377         }
       
   378         
       
   379     // This ASY command is handled so no more new requests can not be linked to this one
       
   380     // ->Transaction filter can be removed
       
   381     iConnectionController->ASYProxyHandler().RemoveTransactionID( iOutstandingTrId );
       
   382         
       
   383     switch ( iOutstandingProcessCmdId )
       
   384         {
       
   385         case ECmdSetValueBool:
       
   386         case ECmdSetValueTInt:
       
   387         case ECmdAccessoryUpdated:
       
   388         case ECmdSetObjectValue:
       
   389             {
       
   390             messageId = ESetValue;
       
   391             }
       
   392             break;
       
   393         case ECmdGetValueBool:
       
   394         case ECmdGetValueTInt:
       
   395         case ECmdGetValueTDes8:
       
   396         case ECmdGetSupportedBTProfiles:
       
   397         case ECmdGetObjectValue:
       
   398             {
       
   399             messageId = EGetValue;
       
   400             }
       
   401             break;
       
   402         case ECmdProcessCommandInit:
       
   403             {
       
   404             if ( iInitCommandTimer->IsActive() )
       
   405                 {
       
   406                 iInitCommandTimer->Cancel();
       
   407                 CompleteProcessCommandInitL();
       
   408                 }
       
   409             }
       
   410             break;
       
   411         default:
       
   412             {
       
   413             TRACE_ASSERT_ALWAYS;
       
   414             User::Leave( KErrGeneral );
       
   415             }
       
   416             break;
       
   417         }
       
   418 
       
   419     if ( iOutstandingProcessCmdId != ECmdProcessCommandInit )
       
   420         {
       
   421         switch ( aResponseType )
       
   422             {
       
   423             case EProcessResponseTBool :
       
   424                 iConnectionController->NotificationQueue().CompleteValueMessageL(
       
   425                                                    messageId,
       
   426                                                    valueTBoolPckgBuf(),
       
   427                                                    errPckgBuf(),
       
   428                                                    iOutstandingTrId );
       
   429                 break;
       
   430             case EProcessResponseTInt :
       
   431                 iConnectionController->NotificationQueue().CompleteValueMessageL(
       
   432                                                    messageId,
       
   433                                                    valueTIntPckgBuf(),
       
   434                                                    errPckgBuf(),
       
   435                                                    iOutstandingTrId );
       
   436                 break;
       
   437             case EProcessResponseTDes :
       
   438                 if( ECmdGetSupportedBTProfiles == iOutstandingProcessCmdId )
       
   439                     {
       
   440                     iConnectionController->NotificationQueue().CompleteValueMessageL(
       
   441                                                    messageId,
       
   442                                                    valueBTPckg,
       
   443                                                    errPckgBuf(),
       
   444                                                    iOutstandingTrId );
       
   445                     }
       
   446                 else
       
   447                     {
       
   448                     TPtr8 asyDataPtr = asyData->Des();		
       
   449                     iConnectionController->NotificationQueue().CompleteValueMessageL(
       
   450                                                    messageId,
       
   451                                                    asyDataPtr,
       
   452                                                    errPckgBuf(),
       
   453                                                    iOutstandingTrId );                    
       
   454                     CleanupStack::PopAndDestroy( asyData );                               
       
   455                     }
       
   456                 break;
       
   457             case EProcessResponseObject :
       
   458                 {
       
   459                 TPtr8 objectBufPtr( objectBuf->Ptr(0) );
       
   460                 iConnectionController->NotificationQueue().CompleteValueMessageL( 
       
   461                                                    messageId,
       
   462                                                    iOutstandingTrId,
       
   463                                                    &objectBufPtr,
       
   464                                                    errPckgBuf() );
       
   465                 CleanupStack::PopAndDestroy( objectBuf );
       
   466                 }                                                   
       
   467             break;
       
   468                 
       
   469             default:
       
   470                 {
       
   471                 TRACE_ASSERT_ALWAYS;
       
   472                 User::Leave( KErrGeneral );
       
   473                 }
       
   474                 break;
       
   475             }
       
   476 
       
   477         }
       
   478 
       
   479     iOutstandingProcessCmdId = ECmdBadFunction;
       
   480     iOutstandingTrId = 0;
       
   481     
       
   482     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::ProcessResponseL - return void" );
       
   483     }
       
   484 
       
   485 // -----------------------------------------------------------------------------
       
   486 // CAccSrvSubAsyComms::CompleteMessageL
       
   487 //
       
   488 // (other items were commented in a header).
       
   489 // -----------------------------------------------------------------------------
       
   490 //
       
   491 TBool CAccSrvSubAsyComms::CompleteMessageL( TMsgID /*aMsgID*/,
       
   492                                             TInt /*aErrorCode*/,
       
   493                                             TInt /*aUniqueID*/ )
       
   494     {
       
   495     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CompleteMessageL()" );
       
   496 
       
   497     TRACE_ASSERT_ALWAYS;
       
   498 
       
   499     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CompleteMessageL - return False" );
       
   500 
       
   501     return EFalse; //message was not consumed
       
   502     }
       
   503 // -----------------------------------------------------------------------------
       
   504 // CAccSrvSubAsyComms::CompleteProcessCommandL
       
   505 // Completes queued message
       
   506 // Preconditions:
       
   507 // 1. ECmdProcessCommandInit command is allways handled
       
   508 // 2. Request must be meant for this subsession
       
   509 // -----------------------------------------------------------------------------
       
   510 //
       
   511 TBool CAccSrvSubAsyComms::CompleteProcessCommandL(
       
   512     TProcessCmdId aCmdn,
       
   513     TInt aTrId,
       
   514     TASYCommandParamRecord& aASYCommandParamRecord,
       
   515     TPtr8* aPtrBuf )
       
   516     {
       
   517     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CompleteProcessCommandL()" );
       
   518 
       
   519     TBool messageConsumption( EFalse );// Return value tells should this subsession be removed from the queue
       
   520 
       
   521     if (  ECmdProcessCommandInit == aCmdn )
       
   522         {
       
   523         messageConsumption = HandleCommandL( aCmdn, aTrId, aASYCommandParamRecord, aPtrBuf );
       
   524         }
       
   525     else
       
   526         {
       
   527         if ( iServerModel->IsMyRequest( 
       
   528                 iASYThreadID, aASYCommandParamRecord.iGenericID.UniqueID() ) )
       
   529             {
       
   530             messageConsumption = HandleCommandL( aCmdn, aTrId, aASYCommandParamRecord, aPtrBuf );
       
   531             }
       
   532         else
       
   533             {
       
   534             //Not for us
       
   535             //Special handling for BT-ASY
       
   536             if ( ( KBTAsyMainServUidStub.iUid == iMainServiceUid.iUid ) || 
       
   537                  ( KBTAsyMainServUid.iUid == iMainServiceUid.iUid ) )
       
   538                 {
       
   539                 if ( aASYCommandParamRecord.iGenericID.PhysicalConnectionCaps( KPCBluetooth ) )//BT
       
   540                     {
       
   541                     messageConsumption = HandleCommandL( aCmdn, aTrId, aASYCommandParamRecord, aPtrBuf );
       
   542                     }
       
   543                 }
       
   544             else
       
   545                 {
       
   546                 //This subsession is not serving BT-ASY
       
   547                 }
       
   548             }
       
   549         }
       
   550 
       
   551     COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubAsyComms::CompleteProcessCommandL - return %d", messageConsumption );
       
   552     return messageConsumption;
       
   553     }
       
   554 
       
   555 // -----------------------------------------------------------------------------
       
   556 // CAccSrvSubAsyComms::HandleCommandL
       
   557 //
       
   558 // (other items were commented in a header).
       
   559 // -----------------------------------------------------------------------------
       
   560 TBool CAccSrvSubAsyComms::HandleCommandL( TProcessCmdId aCmdn,
       
   561                                           TInt aTrId,
       
   562                                           TASYCommandParamRecord& aASYCommandParamRecord,
       
   563                                           TPtr8* aPtrBuf )
       
   564     {
       
   565     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::HandleCommandL()" );
       
   566     TInt err( KErrNone );
       
   567 
       
   568     iOutstandingProcessCmdId = aCmdn;
       
   569     iOutstandingTrId = aTrId;
       
   570 
       
   571     TProxyCommandPckgBuf params;
       
   572     params().iCmdId        = aCmdn;
       
   573     params().iTrId         = aTrId;
       
   574     params().iTimeOutTrId  = iTimeOutTrId;
       
   575     params().iAsyCmdParams = aASYCommandParamRecord;
       
   576     iMessage.WriteL( KAccServParamPosFirst, params ); 
       
   577 
       
   578 
       
   579     if( ECmdProcessCommandInit !=  aCmdn )
       
   580         {    
       
   581         err = HandleObjectBufferWriteL( aPtrBuf );
       
   582         iProcessCommandTimer = CAccSrvProcessCommandTimer::NewL( this );
       
   583         iProcessCommandTimer->StartTimer();
       
   584         }
       
   585     else
       
   586         {
       
   587         iInitCommandTimer->StartTimer();
       
   588         }
       
   589 
       
   590     iMessage.Complete( err );
       
   591 
       
   592     iTimeOutTrId = 0;
       
   593     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::HandleCommandL - return ETrue" );
       
   594     return ETrue;
       
   595     }
       
   596     
       
   597 // -----------------------------------------------------------------------------
       
   598 // CAccSrvSubAsyComms::HandleObjectBufferWriteL()
       
   599 // -----------------------------------------------------------------------------
       
   600 TInt CAccSrvSubAsyComms::HandleObjectBufferWriteL( TPtr8* aPtrBuf )
       
   601     {
       
   602     COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubAsyComms::HandleObjectBufferWriteL(0x%x)", aPtrBuf );
       
   603     TInt err( KErrNone );
       
   604     
       
   605     if( !aPtrBuf )
       
   606         {
       
   607         // There are no buffer to handle
       
   608         COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubAsyComms::HandleObjectBufferWriteL - no buffer, return %d", err );
       
   609         return err;
       
   610         }
       
   611     
       
   612     TInt size=iMessage.GetDesMaxLength( KAccServParamPosSecond );    
       
   613     
       
   614     if( aPtrBuf->Size() <=  size )
       
   615         {
       
   616         iMessage.WriteL( KAccServParamPosSecond, *aPtrBuf );
       
   617         }
       
   618     else
       
   619         {
       
   620         //Return a new buffer size to client
       
   621         err = KErrOverflow;
       
   622         CBufFlat*  buf = CBufFlat::NewL( sizeof( KMaxTUint ) ); 
       
   623         CleanupStack::PushL( buf );  
       
   624         buf->ResizeL( sizeof(KMaxTUint) );
       
   625             
       
   626         RBufWriteStream wStrm;    
       
   627         (void) wStrm.Open( *buf );
       
   628         CleanupClosePushL( wStrm );    
       
   629         wStrm.WriteInt32L( aPtrBuf->Size() );//new buffer size
       
   630         wStrm.CommitL();         
       
   631         CleanupStack::PopAndDestroy( &wStrm );
       
   632          
       
   633         TPtr8 ptr( buf->Ptr( 0 ) );
       
   634         iMessage.WriteL( KAccServParamPosSecond, ptr );        
       
   635         CleanupStack::PopAndDestroy( buf );           
       
   636          
       
   637         //Store current buffer for later retrival        
       
   638         iObjectBuf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
       
   639         iObjectBuf->ResizeL( aPtrBuf->Size() );
       
   640         iObjectBuf->Write( 0, *aPtrBuf );     
       
   641         
       
   642         }
       
   643         
       
   644         
       
   645     COM_TRACE_1( "[AccFW:AccServer] CAccSrvSubAsyComms::HandleObjectBufferWriteL - return %d", err );
       
   646     return err;
       
   647     }
       
   648 
       
   649 // -----------------------------------------------------------------------------
       
   650 // CAccSrvSubAsyComms::CompleteProcessCommandInitL
       
   651 //
       
   652 // (other items were commented in a header).
       
   653 // -----------------------------------------------------------------------------
       
   654 void CAccSrvSubAsyComms::CompleteProcessCommandInitL()
       
   655     {
       
   656     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CompleteProcessCommandInitL()" );
       
   657 
       
   658     // Note, Must NOT leave before next call
       
   659     iServerModel->SetASYsLoadCompleted();
       
   660 
       
   661     iConnectionController->InitializeConnectionStatusL();
       
   662 
       
   663     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::CompleteProcessCommandInitL" );
       
   664     }
       
   665 
       
   666 // -----------------------------------------------------------------------------
       
   667 // CAccSrvSubAsyComms::ProcessCommandTimeOutCompleteL
       
   668 //
       
   669 // (other items were commented in a header).
       
   670 // -----------------------------------------------------------------------------
       
   671 void CAccSrvSubAsyComms::ProcessCommandTimeOutCompleteL()
       
   672     {
       
   673     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::ProcessCommandTimeOutCompleteL()" );
       
   674 
       
   675     switch( iOutstandingProcessCmdId )
       
   676         {
       
   677         case ECmdSetValueBool:
       
   678         case ECmdGetValueBool:
       
   679             ProcessResponseL( iMessage, EProcessResponseTBool, ETrue );
       
   680             break;
       
   681         case ECmdSetValueTInt:
       
   682         case ECmdGetValueTInt:
       
   683             ProcessResponseL( iMessage, EProcessResponseTInt, ETrue );
       
   684             break;
       
   685         case ECmdGetValueTDes8:
       
   686         case ECmdGetSupportedBTProfiles:
       
   687             ProcessResponseL( iMessage, EProcessResponseTDes, ETrue );
       
   688             break;
       
   689         case ECmdSetObjectValue:
       
   690         case ECmdGetObjectValue:
       
   691             ProcessResponseL( iMessage, EProcessResponseObject, ETrue );
       
   692             break;    
       
   693         default:
       
   694             break;
       
   695         }
       
   696 
       
   697     COM_TRACE_( "[AccFW:AccServer] CAccSrvSubAsyComms::ProcessCommandTimeOutCompleteL" );
       
   698     }
       
   699 
       
   700 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   701 
       
   702 // End of File