bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp
changeset 2 0b192a3a05a4
parent 1 6a1fe72036e3
child 10 0707dd69d236
equal deleted inserted replaced
1:6a1fe72036e3 2:0b192a3a05a4
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 #include "atcodec.h"
    19 #include "atcodec.h"
    20 #include <mmtsy_names.h> // for etel
    20 #include <mmtsy_names.h> // for etel
    21 #include <btengconstants.h>
    21 #include <bttypes.h>
    22 #include <btengdiscovery.h>
       
    23 #include <badesca.h>
    22 #include <badesca.h>
    24 #include "btmcprotocol.h"
    23 #include "btmcprotocol.h"
    25 #include "btmccallinghandler.h"
    24 #include "btmccallinghandler.h"
    26 #include "btmcphonestatus.h"
    25 #include "btmcphonestatus.h"
    27 #include "btmccallstatus.h"
    26 #include "btmccallstatus.h"
    44 const TInt KSLC_3WayCalling = KChldFromHF | KChldFromAG;
    43 const TInt KSLC_3WayCalling = KChldFromHF | KChldFromAG;
    45 
    44 
    46 const TInt KBerUnknown = 99;
    45 const TInt KBerUnknown = 99;
    47 
    46 
    48 const TInt KServiceSlcTimer = 1;
    47 const TInt KServiceSlcTimer = 1;
    49 const TInt KServiceSdpQuery = 2;
    48 
    50 const TInt KServiceGetSubscriber = 3;
    49 const TInt KServiceGetSubscriber = 3;
    51 const TInt KServiceGetOperator = 4;
    50 const TInt KServiceGetOperator = 4;
    52 const TInt KServiceCmdHandling = 5;
    51 const TInt KServiceCmdHandling = 5;
    53 
    52 
    54 const TInt KQueryIMEI = 6;
    53 const TInt KQueryIMEI = 6;
    83     
    82     
    84     delete iNumber;
    83     delete iNumber;
    85     delete iOperator;
    84     delete iOperator;
    86     
    85     
    87     delete iEtelQuery;
    86     delete iEtelQuery;
    88     delete iBteng;
       
    89   
    87   
    90     iPhone.Close();
    88     iPhone.Close();
    91     iServer.UnloadPhoneModule(KMmTsyModuleName);
    89     iServer.UnloadPhoneModule(KMmTsyModuleName);
    92     iServer.Close();
    90     iServer.Close();
    93     delete iOutgoPacketQueue;
    91     delete iOutgoPacketQueue;
   213 TBool CBtmcProtocol::ActiveChldHandling() const
   211 TBool CBtmcProtocol::ActiveChldHandling() const
   214     {
   212     {
   215     return iCallingHandler->ActiveChldHandling();
   213     return iCallingHandler->ActiveChldHandling();
   216     }
   214     }
   217 
   215 
       
   216 void CBtmcProtocol::SetHspRvcSupported(TBool aSupported)
       
   217     {
       
   218     TRACE_FUNC
       
   219     // Only update the supported feature field if this
       
   220     // is for HSP controlling to avoid denial of
       
   221     // HFP service
       
   222     if ( iProtocolStatus->iProfile == EBtmcHSP )
       
   223         {
       
   224         if ( aSupported )
       
   225             {
       
   226             // volume control must be enabled now:
       
   227             if ( !iPhoneStatus)
       
   228                 {
       
   229                 TRAP_IGNORE( iPhoneStatus = 
       
   230                     CBtmcPhoneStatus::NewL(*this, iPhone, iProtocolStatus->iProfile) );
       
   231                 }
       
   232             if ( iPhoneStatus )
       
   233                 {
       
   234                 // We just do the best effort. If enabling volume control fails,
       
   235                 // other functionalities on the HSP will still work:
       
   236                 TRAP_IGNORE( iPhoneStatus->SetVolumeControlFeatureL(ETrue) );
       
   237                 }
       
   238             }
       
   239         else
       
   240             {
       
   241             // When this serves the controlling of a HSP connection, iPhoneStatus is only
       
   242             // used for volume control, deleting it will disable volume control:
       
   243             delete iPhoneStatus;
       
   244             iPhoneStatus = NULL;
       
   245             }
       
   246         }
       
   247     }
       
   248 
   218 void CBtmcProtocol::RequestCompletedL(CBtmcActive& aActive, TInt aErr)
   249 void CBtmcProtocol::RequestCompletedL(CBtmcActive& aActive, TInt aErr)
   219     {
   250     {
   220     TRACE_FUNC_ENTRY
   251     TRACE_FUNC_ENTRY
   221     switch (aActive.ServiceId())
   252     switch (aActive.ServiceId())
   222         {
   253         {
   226                 {
   257                 {
   227                 StopTimer(KServiceSlcTimer);
   258                 StopTimer(KServiceSlcTimer);
   228                 iObserver.SlcIndicateL(EFalse);
   259                 iObserver.SlcIndicateL(EFalse);
   229                 }
   260                 }
   230             break;
   261             break;
   231             }
       
   232         case KServiceSdpQuery:
       
   233             {
       
   234             }
   262             }
   235         case KServiceGetSubscriber:
   263         case KServiceGetSubscriber:
   236             {
   264             {
   237             delete iNumber;
   265             delete iNumber;
   238             iNumber = NULL;
   266             iNumber = NULL;
   289     TRACE_FUNC_ENTRY
   317     TRACE_FUNC_ENTRY
   290     if (aServiceId == KServiceSlcTimer || aServiceId == KServiceFirstHspCkpdTrap )
   318     if (aServiceId == KServiceSlcTimer || aServiceId == KServiceFirstHspCkpdTrap )
   291         {
   319         {
   292         iTimer.Cancel();
   320         iTimer.Cancel();
   293         }
   321         }
   294     else if (aServiceId == KServiceSdpQuery)
       
   295         {
       
   296         iBteng->CancelRemoteSdpQuery();
       
   297         }
       
   298     TRACE_FUNC_EXIT
   322     TRACE_FUNC_EXIT
   299     }
   323     }
   300 
   324 
   301 CBtmcProtocol::CBtmcProtocol(MBtmcObserver& aObserver)
   325 CBtmcProtocol::CBtmcProtocol(MBtmcObserver& aObserver)
   302     : iObserver(aObserver),
   326     : iObserver(aObserver),
   321     iCallStatus = CBtmcCallStatus::NewL(*this, iPhone, aProfile);
   345     iCallStatus = CBtmcCallStatus::NewL(*this, iPhone, aProfile);
   322     iProtocolStatus->iCallBits = iCallStatus->CallStatusL();
   346     iProtocolStatus->iCallBits = iCallStatus->CallStatusL();
   323     
   347     
   324     iEtelQuery = CBtmcActive::NewL(*this, CActive::EPriorityStandard, KQueryIMEI);
   348     iEtelQuery = CBtmcActive::NewL(*this, CActive::EPriorityStandard, KQueryIMEI);
   325 
   349 
   326 		iPhone.GetPhoneId(iEtelQuery->iStatus, iIdentity);
   350     iPhone.GetPhoneId(iEtelQuery->iStatus, iIdentity);
   327 		iEtelQuery->GoActive();
   351     iEtelQuery->GoActive();
   328     
   352     
   329     switch (aProfile)
   353     switch (aProfile)
   330         {
   354         {
   331         case EBtmcHFP0105:
   355         case EBtmcHFP0105:
   332             {
   356             {
   340             TRACE_INFO((_L("constructing option HSP")))
   364             TRACE_INFO((_L("constructing option HSP")))
   341             if (aBTDevAddr.Length() != KBTDevAddrSize)
   365             if (aBTDevAddr.Length() != KBTDevAddrSize)
   342                 {
   366                 {
   343                 LEAVE(KErrBadDescriptor);
   367                 LEAVE(KErrBadDescriptor);
   344                 }
   368                 }
       
   369             // HSP doesn't have an SLC protocol except the RFCOMM connection itself:
   345             iProtocolStatus->iSlc = ETrue;
   370             iProtocolStatus->iSlc = ETrue;
   346             iBteng = CBTEngDiscovery::NewL(this);
       
   347             iBteng->RemoteSdpQuery(TBTDevAddr(aBTDevAddr), TUUID(EBTProfileHSP), KBTHSRemoteAudioVolumeControl);
       
   348             if ( iAccessoryInitiated && ( iProtocolStatus->iCallBits & KCallConnectedBit ) )
   371             if ( iAccessoryInitiated && ( iProtocolStatus->iCallBits & KCallConnectedBit ) )
   349                 {
   372                 {
   350                 TRACE_INFO((_L("Incoming HSP connected, start CKPD trapper")));
   373                 TRACE_INFO((_L("Incoming HSP connected, start CKPD trapper")));
   351                 // In case of incoming HSP connection during a voice call, 
   374                 // In case of incoming HSP connection during a voice call, 
   352                 // start timer to trap the CKPD command as part of the audio transfer of HSP.
   375                 // start timer to trap the CKPD command as part of the audio transfer of HSP.
   606 // -----------------------------------------------------------------------------
   629 // -----------------------------------------------------------------------------
   607 //
   630 //
   608 void CBtmcProtocol::HandleReadCommandL(const CATCommand& aCmd)
   631 void CBtmcProtocol::HandleReadCommandL(const CATCommand& aCmd)
   609     {
   632     {
   610     TRACE_FUNC
   633     TRACE_FUNC
       
   634     RATResultPtrArray resarr;
       
   635     ATObjArrayCleanupResetAndDestroyPushL(resarr);
   611     CATResult* code = NULL;
   636     CATResult* code = NULL;
   612     RArray<TATParam> params;
   637     RATParamArray params;
   613     CleanupClosePushL(params);
   638     CleanupClosePushL(params);
   614     TBool response = EFalse;
       
   615     switch (aCmd.Id())
   639     switch (aCmd.Id())
   616         {
   640         {
   617         case EATCIND:
   641         case EATCIND:
   618             {
   642             {
   619             // Network status
   643             // Network status
   620             if(!iPhoneStatus)
   644             if(!iPhoneStatus)
   621                 {
   645                 {
   622                 LEAVE(KErrNotSupported);
   646                 LEAVE(KErrNotSupported);
   623                 }
   647                 }
   624             
   648 
   625             RMobilePhone::TMobilePhoneRegistrationStatus net = 
   649             RMobilePhone::TMobilePhoneRegistrationStatus net = 
   626                 iPhoneStatus->NetworkStatus();
   650                     iPhoneStatus->NetworkStatus();
   627             
   651 
   628             if (net == RMobilePhone::ERegisteredOnHomeNetwork || 
   652             if (net == RMobilePhone::ERegisteredOnHomeNetwork || 
   629                 net == RMobilePhone::ERegisteredRoaming)
   653                     net == RMobilePhone::ERegisteredRoaming)
   630                 {
   654                 {
   631                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNetworkAvailable)))
   655                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNetworkAvailable)))
   632                 }
   656                 }
   633             else
   657             else
   634                 {
   658                 {
   635                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNetworkUnavailable)))
   659                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNetworkUnavailable)))
   636                 }
   660                 }
   637             
   661 
   638             // call status
   662             // call status
   639             if ((iProtocolStatus->iCallBits & KCallConnectedBit) ||
   663             if ((iProtocolStatus->iCallBits & KCallConnectedBit) ||
   640                 (iProtocolStatus->iCallBits & KCallHoldBit))
   664                     (iProtocolStatus->iCallBits & KCallHoldBit))
   641                 {
   665                 {
   642                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATCallActive)))
   666                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATCallActive)))
   643                 }
   667                 }
   644             else
   668             else
   645                 {
   669                 {
   646                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNoCall)))
   670                 LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNoCall)))
   647                 }
   671                 }
   648             
   672 
   649             // Call setup status
   673             // Call setup status
   650             TInt callSetupInd = EBTMonoATNoCallSetup;
   674             TInt callSetupInd = EBTMonoATNoCallSetup;
   651 
   675 
   652             if (iProtocolStatus->iCallBits & KCallRingingBit)
   676             if (iProtocolStatus->iCallBits & KCallRingingBit)
   653                 {
   677                 {
   662                 callSetupInd = EBTMonoATCallConnecting;
   686                 callSetupInd = EBTMonoATCallConnecting;
   663                 }
   687                 }
   664             LEAVE_IF_ERROR(params.Append(TATParam(callSetupInd)))
   688             LEAVE_IF_ERROR(params.Append(TATParam(callSetupInd)))
   665             // call_setup == callsetup
   689             // call_setup == callsetup
   666             LEAVE_IF_ERROR(params.Append(TATParam(callSetupInd)))
   690             LEAVE_IF_ERROR(params.Append(TATParam(callSetupInd)))
   667                 
   691 
   668             // Call held status
   692             // Call held status
   669             TInt callHeldInd = EBTMonoATNoCallHeld;
   693             TInt callHeldInd = EBTMonoATNoCallHeld;
   670             if( (iProtocolStatus->iCallBits & KCallHoldBit) && (iProtocolStatus->iCallBits & KCallConnectedBit) )
   694             if( (iProtocolStatus->iCallBits & KCallHoldBit) && (iProtocolStatus->iCallBits & KCallConnectedBit) )
   671                 {
   695                 {
   672                 callHeldInd = EBTMonoATCallHeldAndActive;
   696                 callHeldInd = EBTMonoATCallHeldAndActive;
   677                 }
   701                 }
   678             LEAVE_IF_ERROR(params.Append(TATParam(callHeldInd)))
   702             LEAVE_IF_ERROR(params.Append(TATParam(callHeldInd)))
   679             // signal status
   703             // signal status
   680             LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetSignalStrength())))
   704             LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetSignalStrength())))
   681             // roaming status
   705             // roaming status
   682               if(net == RMobilePhone::ERegisteredRoaming)
   706             if(net == RMobilePhone::ERegisteredRoaming)
   683                   {
   707                 {
   684                   LEAVE_IF_ERROR(params.Append(TATParam(1)))
   708                 LEAVE_IF_ERROR(params.Append(TATParam(1)))
   685                   }
   709                 }
   686               else 
   710             else 
   687                   {
   711                 {
   688                   LEAVE_IF_ERROR(params.Append(TATParam(0)))
   712                 LEAVE_IF_ERROR(params.Append(TATParam(0)))
   689                   }
   713                 }
   690             // battery charge
   714             // battery charge
   691             LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetBatteryCharge())))
   715             LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetBatteryCharge())))
   692 
   716 
   693             code = CATResult::NewL(EATCIND, EATReadResult, &params);
   717             code = CATResult::NewL(EATCIND, EATReadResult, &params);
   694             response = ETrue;
       
   695             break;
   718             break;
   696             }
   719             }
   697         case EATCLIP:
   720         case EATCLIP:
   698             {
   721             {
   699             LEAVE_IF_ERROR(params.Append(TATParam(iProtocolStatus->iCallerIdNotif)))
   722             LEAVE_IF_ERROR(params.Append(TATParam(iProtocolStatus->iCallerIdNotif)))
   700             LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATCallerIdNetworkServiceUnknown)))
   723             LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATCallerIdNetworkServiceUnknown)))
   701             code = CATResult::NewL(EATCLIP, EATReadResult, &params);
   724             code = CATResult::NewL(EATCLIP, EATReadResult, &params);
   702             response = ETrue; 
       
   703             break;
   725             break;
   704             }
   726             }
   705         case EATCOPS:
   727         case EATCOPS:
   706             {
   728             {
   707             iOperator = CBtmcOperator::NewL(*this, *this, CActive::EPriorityStandard, KServiceGetOperator);
   729             iOperator = CBtmcOperator::NewL(*this, *this, CActive::EPriorityStandard, KServiceGetOperator);
   708             iOperator->GoActive();
   730             iOperator->GoActive();
   709 			break;
   731             break;
   710             }
   732             }
   711         case EATCREG:
   733         case EATCREG:
   712         	{
   734             {
   713             if(!iPhoneStatus)
   735             if(!iPhoneStatus)
   714                 {
   736                 {
   715                 LEAVE(KErrNotSupported);
   737                 LEAVE(KErrNotSupported);
   716                 }
   738                 }
   717             
   739 
   718             RMobilePhone::TMobilePhoneRegistrationStatus net = 
   740             RMobilePhone::TMobilePhoneRegistrationStatus net = 
   719                 iPhoneStatus->NetworkStatus();
   741                     iPhoneStatus->NetworkStatus();
   720 			response = ETrue;
   742             switch(net)
   721 			switch(net)
   743                 {
   722 				{
   744                 case RMobilePhone::ERegistrationUnknown:
   723 				case RMobilePhone::ERegistrationUnknown:
   745                     {
   724 					{
   746                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   725 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   747                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceUnknown)))
   726 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceUnknown)))
   748                     code = CATResult::NewL(EATCREG, EATReadResult, &params);
   727 					code = CATResult::NewL(EATCREG, EATReadResult, &params);
   749                     break;
   728 					break;
   750                     }
   729 					}
   751                 case RMobilePhone::ENotRegisteredEmergencyOnly:
   730 				case RMobilePhone::ENotRegisteredEmergencyOnly:
   752                 case RMobilePhone::ENotRegisteredNoService:
   731 				case RMobilePhone::ENotRegisteredNoService:
   753                     {
   732 					{
   754                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   733 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   755                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegistered)))
   734 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegistered)))
   756                     code = CATResult::NewL(EATCREG, EATReadResult, &params);
   735 					code = CATResult::NewL(EATCREG, EATReadResult, &params);
   757                     break;
   736 					break;
   758                     }
   737 					}
   759                 case RMobilePhone::ENotRegisteredSearching:
   738 				case RMobilePhone::ENotRegisteredSearching:
   760                 case RMobilePhone::ERegisteredBusy:
   739 				case RMobilePhone::ERegisteredBusy:
   761                     {
   740 					{
   762                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   741 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   763                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegisteredSearching)))
   742 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegisteredSearching)))
   764                     code = CATResult::NewL(EATCREG, EATReadResult, &params);
   743 					code = CATResult::NewL(EATCREG, EATReadResult, &params);
   765                     break;
   744 					break;
   766                     }
   745 					}
   767                 case RMobilePhone::ERegisteredOnHomeNetwork:
   746 				case RMobilePhone::ERegisteredOnHomeNetwork:
   768                     {
   747 					{
   769                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   748 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   770                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceHomeNetwork)))
   749 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceHomeNetwork)))
   771                     code = CATResult::NewL(EATCREG, EATReadResult, &params);
   750 					code = CATResult::NewL(EATCREG, EATReadResult, &params);
   772                     break;
   751 					break;
   773                     }
   752 					}
   774                 case RMobilePhone::ERegistrationDenied:
   753 				case RMobilePhone::ERegistrationDenied:
   775                     {
   754 					{
   776                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   755 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   777                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegistrationDenied)))
   756 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegistrationDenied)))
   778                     code = CATResult::NewL(EATCREG, EATReadResult, &params);
   757 					code = CATResult::NewL(EATCREG, EATReadResult, &params);
   779                     break;
   758 					break;
   780                     }
   759 					}
   781                 case RMobilePhone::ERegisteredRoaming:
   760 				case RMobilePhone::ERegisteredRoaming:
   782                     {
   761 					{
   783                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   762 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited)))
   784                     LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegisteredRoaming)))
   763 					LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegisteredRoaming)))
   785                     code = CATResult::NewL(EATCREG, EATReadResult, &params);
   764 					code = CATResult::NewL(EATCREG, EATReadResult, &params);
   786                     break;
   765 					break;
   787                     }
   766 					}
   788                 default:
   767 				default:
   789                     TRACE_INFO(_L("Error: default in CREG"));
   768 					TRACE_INFO(_L("Error: default in CREG"));
   790                     break;  
   769 					break;	
   791                 };
   770 				};
   792             break;  
   771 			break;	
   793             }
   772       }
   794         case EATCSQ:
   773     case EATCSQ:
   795             {
   774     	{
   796             TRACE_INFO(_L("Requesting Signal strength"));
   775     	TRACE_INFO(_L("Requesting Signal strength"));
   797             LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetRssiStrength())))
   776 			response = ETrue;
   798             LEAVE_IF_ERROR(params.Append(TATParam(KBerUnknown)))
   777     	LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetRssiStrength())))
   799             code = CATResult::NewL(EATCSQ, EATReadResult, &params);
   778     	LEAVE_IF_ERROR(params.Append(TATParam(KBerUnknown)))
   800             TRACE_INFO(_L("done"));
   779    		code = CATResult::NewL(EATCSQ, EATReadResult, &params);
   801             break;
   780     	TRACE_INFO(_L("done"));
   802             }
   781     	break;
   803 
   782     	}
   804         case EATCGSN:
   783         	
   805             {
   784 		case EATCGSN:
   806             TBuf8<RMobilePhone::KPhoneSerialNumberSize> buf;
   785 			{
   807             buf.Copy(iIdentity.iSerialNumber);
   786 			response = ETrue;
   808             LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   787    		TBuf8<RMobilePhone::KPhoneSerialNumberSize> buf;
   809             code = CATResult::NewL(EATCGSN, EATReadResult, &params);
   788    		buf.Copy(iIdentity.iSerialNumber);
   810             break;
   789    		LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   811             }
   790    		code = CATResult::NewL(EATCGSN, EATReadResult, &params);
   812         case EATCGMI:
   791 			break;
   813             {
   792 			}
   814             TBuf8<RMobilePhone::KPhoneManufacturerIdSize> buf;
   793     case EATCGMI:
   815             buf.Copy(iIdentity.iManufacturer);
   794     	{
   816             LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   795     	response = ETrue;
   817             code = CATResult::NewL(EATCGMI, EATReadResult, &params);
   796     	TBuf8<RMobilePhone::KPhoneManufacturerIdSize> buf;
   818             break;
   797     	buf.Copy(iIdentity.iManufacturer);
   819             }
   798    		LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   820         case EATCGMM:
   799    		code = CATResult::NewL(EATCGMI, EATReadResult, &params);
   821             {
   800    		break;
   822             TBuf8<RMobilePhone::KPhoneModelIdSize> buf;
   801     	}
   823             buf.Copy(iIdentity.iModel);
   802     case EATCGMM:
   824             LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   803     	{
   825             code = CATResult::NewL(EATCGMM, EATReadResult, &params);
   804     	response = ETrue;
   826             break;      
   805     	TBuf8<RMobilePhone::KPhoneModelIdSize> buf;
   827             }
   806     	buf.Copy(iIdentity.iModel);
   828         case EATCGMR:
   807    		LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   829             {
   808    		code = CATResult::NewL(EATCGMM, EATReadResult, &params);
   830             TBuf8<RMobilePhone::KPhoneRevisionIdSize> buf;
   809    		break;    	
   831             buf.Copy(iIdentity.iRevision);
   810     	}
   832             LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   811     case EATCGMR:
   833             code = CATResult::NewL(EATCGMR, EATReadResult, &params);
   812     	{
   834             break;      
   813     	response = ETrue;
   835             }
   814     	TBuf8<RMobilePhone::KPhoneRevisionIdSize> buf;
   836         case EATCIMI:
   815     	buf.Copy(iIdentity.iRevision);
   837             {
   816    		LEAVE_IF_ERROR(params.Append(TATParam(buf)))
   838             iEtelQuery->SetServiceId(KQueryIMSI);
   817    		code = CATResult::NewL(EATCGMR, EATReadResult, &params);
   839             iPhone.GetSubscriberId(iEtelQuery->iStatus, iId);
   818    		break;    	
   840             iEtelQuery->GoActive();
   819     	}
   841             break;
   820 		case EATCIMI:
   842             }
   821 			{
   843         case EATCOLP:
   822 			iEtelQuery->SetServiceId(KQueryIMSI);
   844             {
   823 			iPhone.GetSubscriberId(iEtelQuery->iStatus, iId);
   845             LEAVE_IF_ERROR(params.Append(TATParam(TInt(iProtocolStatus->iOutgoingCallNotif))))
   824 			iEtelQuery->GoActive();
   846             code = CATResult::NewL(EATCOLP, EATReadResult, &params);
   825 			break;
   847             break;
   826 			}
   848             }
   827 		case EATCOLP:
   849         default:
   828 			{
   850             LEAVE(KErrNotSupported);
   829 			response = ETrue;
   851         }
   830     	LEAVE_IF_ERROR(params.Append(TATParam(TInt(iProtocolStatus->iOutgoingCallNotif))))
       
   831 			code = CATResult::NewL(EATCOLP, EATReadResult, &params);
       
   832 			break;
       
   833 			}
       
   834     default:
       
   835       LEAVE(KErrNotSupported);
       
   836       }
       
   837     CleanupStack::PopAndDestroy(&params);
   852     CleanupStack::PopAndDestroy(&params);
   838     if (response)
   853     if (code)
   839         {
   854         {     
   840         RATResultPtrArray resarr;
       
   841         CleanupStack::PushL(code);
   855         CleanupStack::PushL(code);
   842         ATObjArrayCleanupResetAndDestroyPushL(resarr);        
       
   843         resarr.AppendL(code);
   856         resarr.AppendL(code);
   844         CleanupStack::Pop(code);
   857         CleanupStack::Pop(code);
   845         CATResult* ok = CATResult::NewL(EATOK);
   858         CATResult* ok = CATResult::NewL(EATOK);
   846         CleanupStack::PushL(ok);
   859         CleanupStack::PushL(ok);
   847         resarr.AppendL(ok);
   860         resarr.AppendL(ok);
   848         CleanupStack::Pop(ok);
   861         CleanupStack::Pop(ok);
   849         SendResponseL(resarr);
   862         SendResponseL(resarr);
   850         CleanupStack::PopAndDestroy(&resarr);
       
   851         CmdHandlingCompletedL();
   863         CmdHandlingCompletedL();
   852         }
   864         }
       
   865     CleanupStack::PopAndDestroy(&resarr);
   853     }
   866     }
   854 
   867 
   855 // -----------------------------------------------------------------------------
   868 // -----------------------------------------------------------------------------
   856 // CBtmcProtocol::HandleWriteCommand
   869 // CBtmcProtocol::HandleWriteCommand
   857 // 
   870 // 
  1068             break;
  1081             break;
  1069             }
  1082             }
  1070         case EATCGSN:
  1083         case EATCGSN:
  1071             {
  1084             {
  1072             CATResult* code = NULL;
  1085             CATResult* code = NULL;
  1073             RArray<TATParam> params;
  1086             RATResultPtrArray resarr;
       
  1087             ATObjArrayCleanupResetAndDestroyPushL(resarr);              
       
  1088             RATParamArray params;
  1074             CleanupClosePushL(params);
  1089             CleanupClosePushL(params);
  1075             TBuf8<RMobilePhone::KPhoneSerialNumberSize> buf;
  1090             TBuf8<RMobilePhone::KPhoneSerialNumberSize> buf;
  1076             buf.Copy(iIdentity.iSerialNumber);
  1091             buf.Copy(iIdentity.iSerialNumber);
  1077             LEAVE_IF_ERROR(params.Append(TATParam(buf)))
  1092             LEAVE_IF_ERROR(params.Append(TATParam(buf)))
  1078             code = CATResult::NewL(EATCGSN, EATActionResult, &params);
  1093             code = CATResult::NewL(EATCGSN, EATActionResult, &params);
  1079             CleanupStack::PopAndDestroy(&params);
  1094             CleanupStack::PopAndDestroy(&params);
  1080             CleanupStack::PushL(code);
  1095             CleanupStack::PushL(code);
  1081             RATResultPtrArray resarr;
       
  1082             ATObjArrayCleanupResetAndDestroyPushL(resarr);        
       
  1083             resarr.AppendL(code);
  1096             resarr.AppendL(code);
  1084             CleanupStack::Pop(code);
  1097             CleanupStack::Pop(code);
  1085             CATResult* ok = CATResult::NewL(EATOK);
  1098             CATResult* ok = CATResult::NewL(EATOK);
  1086             CleanupStack::PushL(ok);
  1099             CleanupStack::PushL(ok);
  1087             resarr.AppendL(ok);
  1100             resarr.AppendL(ok);
  1158         (iSlcMask == KSLC_No3WayCalling))
  1171         (iSlcMask == KSLC_No3WayCalling))
  1159         {
  1172         {
  1160         return ETrue;
  1173         return ETrue;
  1161         }
  1174         }
  1162     return EFalse;
  1175     return EFalse;
  1163     }
       
  1164 
       
  1165 // -----------------------------------------------------------------------------
       
  1166 // CBtmcProtocol::ServiceAttributeSearchComplete
       
  1167 // -----------------------------------------------------------------------------
       
  1168 //    
       
  1169 void CBtmcProtocol::ServiceAttributeSearchComplete( TSdpServRecordHandle /*aHandle*/, 
       
  1170                                                     const RSdpResultArray& aAttr, 
       
  1171                                                     TInt aErr )
       
  1172 	{
       
  1173     TRACE_FUNC
       
  1174     if((aErr == KErrNone || aErr == KErrEof) && aAttr.Count() && aAttr[0].iAttrValue.iValNumeric)
       
  1175         {
       
  1176         TRACE_INFO((_L("Remote volume control supported")))
       
  1177         TInt err = KErrNone;
       
  1178         if (!iPhoneStatus)
       
  1179             {
       
  1180             TRAP(err, iPhoneStatus = CBtmcPhoneStatus::NewL(*this, iPhone, iProtocolStatus->iProfile));
       
  1181             }   
       
  1182 			
       
  1183         if (err == KErrNone)
       
  1184             {
       
  1185             TRAP_IGNORE(iPhoneStatus->SetVolumeControlFeatureL(ETrue));
       
  1186             iPhoneStatus->ActivateRemoteVolumeControl();
       
  1187             }        
       
  1188         }
       
  1189         
       
  1190     if(aErr)
       
  1191         {
       
  1192         delete iBteng;
       
  1193         iBteng = NULL;
       
  1194         }
       
  1195     }
  1176     }
  1196 
  1177 
  1197 void CBtmcProtocol::SetIndicatorL(TInt aIndicator, TInt aValue)
  1178 void CBtmcProtocol::SetIndicatorL(TInt aIndicator, TInt aValue)
  1198 	{
  1179 	{
  1199 	TInt indBit( 0 );
  1180 	TInt indBit( 0 );