diff -r 6a1fe72036e3 -r 0b192a3a05a4 bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Tue Jan 26 12:06:42 2010 +0200 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Tue Feb 02 00:20:42 2010 +0200 @@ -18,8 +18,7 @@ #include "atcodec.h" #include // for etel -#include -#include +#include #include #include "btmcprotocol.h" #include "btmccallinghandler.h" @@ -46,7 +45,7 @@ const TInt KBerUnknown = 99; const TInt KServiceSlcTimer = 1; -const TInt KServiceSdpQuery = 2; + const TInt KServiceGetSubscriber = 3; const TInt KServiceGetOperator = 4; const TInt KServiceCmdHandling = 5; @@ -85,7 +84,6 @@ delete iOperator; delete iEtelQuery; - delete iBteng; iPhone.Close(); iServer.UnloadPhoneModule(KMmTsyModuleName); @@ -215,6 +213,39 @@ return iCallingHandler->ActiveChldHandling(); } +void CBtmcProtocol::SetHspRvcSupported(TBool aSupported) + { + TRACE_FUNC + // Only update the supported feature field if this + // is for HSP controlling to avoid denial of + // HFP service + if ( iProtocolStatus->iProfile == EBtmcHSP ) + { + if ( aSupported ) + { + // volume control must be enabled now: + if ( !iPhoneStatus) + { + TRAP_IGNORE( iPhoneStatus = + CBtmcPhoneStatus::NewL(*this, iPhone, iProtocolStatus->iProfile) ); + } + if ( iPhoneStatus ) + { + // We just do the best effort. If enabling volume control fails, + // other functionalities on the HSP will still work: + TRAP_IGNORE( iPhoneStatus->SetVolumeControlFeatureL(ETrue) ); + } + } + else + { + // When this serves the controlling of a HSP connection, iPhoneStatus is only + // used for volume control, deleting it will disable volume control: + delete iPhoneStatus; + iPhoneStatus = NULL; + } + } + } + void CBtmcProtocol::RequestCompletedL(CBtmcActive& aActive, TInt aErr) { TRACE_FUNC_ENTRY @@ -229,9 +260,6 @@ } break; } - case KServiceSdpQuery: - { - } case KServiceGetSubscriber: { delete iNumber; @@ -291,10 +319,6 @@ { iTimer.Cancel(); } - else if (aServiceId == KServiceSdpQuery) - { - iBteng->CancelRemoteSdpQuery(); - } TRACE_FUNC_EXIT } @@ -323,8 +347,8 @@ iEtelQuery = CBtmcActive::NewL(*this, CActive::EPriorityStandard, KQueryIMEI); - iPhone.GetPhoneId(iEtelQuery->iStatus, iIdentity); - iEtelQuery->GoActive(); + iPhone.GetPhoneId(iEtelQuery->iStatus, iIdentity); + iEtelQuery->GoActive(); switch (aProfile) { @@ -342,9 +366,8 @@ { LEAVE(KErrBadDescriptor); } + // HSP doesn't have an SLC protocol except the RFCOMM connection itself: iProtocolStatus->iSlc = ETrue; - iBteng = CBTEngDiscovery::NewL(this); - iBteng->RemoteSdpQuery(TBTDevAddr(aBTDevAddr), TUUID(EBTProfileHSP), KBTHSRemoteAudioVolumeControl); if ( iAccessoryInitiated && ( iProtocolStatus->iCallBits & KCallConnectedBit ) ) { TRACE_INFO((_L("Incoming HSP connected, start CKPD trapper"))); @@ -608,10 +631,11 @@ void CBtmcProtocol::HandleReadCommandL(const CATCommand& aCmd) { TRACE_FUNC + RATResultPtrArray resarr; + ATObjArrayCleanupResetAndDestroyPushL(resarr); CATResult* code = NULL; - RArray params; + RATParamArray params; CleanupClosePushL(params); - TBool response = EFalse; switch (aCmd.Id()) { case EATCIND: @@ -621,12 +645,12 @@ { LEAVE(KErrNotSupported); } - + RMobilePhone::TMobilePhoneRegistrationStatus net = - iPhoneStatus->NetworkStatus(); - + iPhoneStatus->NetworkStatus(); + if (net == RMobilePhone::ERegisteredOnHomeNetwork || - net == RMobilePhone::ERegisteredRoaming) + net == RMobilePhone::ERegisteredRoaming) { LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNetworkAvailable))) } @@ -634,10 +658,10 @@ { LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNetworkUnavailable))) } - + // call status if ((iProtocolStatus->iCallBits & KCallConnectedBit) || - (iProtocolStatus->iCallBits & KCallHoldBit)) + (iProtocolStatus->iCallBits & KCallHoldBit)) { LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATCallActive))) } @@ -645,7 +669,7 @@ { LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATNoCall))) } - + // Call setup status TInt callSetupInd = EBTMonoATNoCallSetup; @@ -664,7 +688,7 @@ LEAVE_IF_ERROR(params.Append(TATParam(callSetupInd))) // call_setup == callsetup LEAVE_IF_ERROR(params.Append(TATParam(callSetupInd))) - + // Call held status TInt callHeldInd = EBTMonoATNoCallHeld; if( (iProtocolStatus->iCallBits & KCallHoldBit) && (iProtocolStatus->iCallBits & KCallConnectedBit) ) @@ -679,19 +703,18 @@ // signal status LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetSignalStrength()))) // roaming status - if(net == RMobilePhone::ERegisteredRoaming) - { - LEAVE_IF_ERROR(params.Append(TATParam(1))) - } - else - { - LEAVE_IF_ERROR(params.Append(TATParam(0))) - } + if(net == RMobilePhone::ERegisteredRoaming) + { + LEAVE_IF_ERROR(params.Append(TATParam(1))) + } + else + { + LEAVE_IF_ERROR(params.Append(TATParam(0))) + } // battery charge LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetBatteryCharge()))) code = CATResult::NewL(EATCIND, EATReadResult, ¶ms); - response = ETrue; break; } case EATCLIP: @@ -699,147 +722,137 @@ LEAVE_IF_ERROR(params.Append(TATParam(iProtocolStatus->iCallerIdNotif))) LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoATCallerIdNetworkServiceUnknown))) code = CATResult::NewL(EATCLIP, EATReadResult, ¶ms); - response = ETrue; break; } case EATCOPS: { iOperator = CBtmcOperator::NewL(*this, *this, CActive::EPriorityStandard, KServiceGetOperator); iOperator->GoActive(); - break; + break; } case EATCREG: - { + { if(!iPhoneStatus) { LEAVE(KErrNotSupported); } - + RMobilePhone::TMobilePhoneRegistrationStatus net = - iPhoneStatus->NetworkStatus(); - response = ETrue; - switch(net) - { - case RMobilePhone::ERegistrationUnknown: - { - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceUnknown))) - code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); - break; - } - case RMobilePhone::ENotRegisteredEmergencyOnly: - case RMobilePhone::ENotRegisteredNoService: - { - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegistered))) - code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); - break; - } - case RMobilePhone::ENotRegisteredSearching: - case RMobilePhone::ERegisteredBusy: - { - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegisteredSearching))) - code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); - break; - } - case RMobilePhone::ERegisteredOnHomeNetwork: - { - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceHomeNetwork))) - code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); - break; - } - case RMobilePhone::ERegistrationDenied: - { - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegistrationDenied))) - code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); - break; - } - case RMobilePhone::ERegisteredRoaming: - { - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) - LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegisteredRoaming))) - code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); - break; - } - default: - TRACE_INFO(_L("Error: default in CREG")); - break; - }; - break; - } - case EATCSQ: - { - TRACE_INFO(_L("Requesting Signal strength")); - response = ETrue; - LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetRssiStrength()))) - LEAVE_IF_ERROR(params.Append(TATParam(KBerUnknown))) - code = CATResult::NewL(EATCSQ, EATReadResult, ¶ms); - TRACE_INFO(_L("done")); - break; - } - - case EATCGSN: - { - response = ETrue; - TBuf8 buf; - buf.Copy(iIdentity.iSerialNumber); - LEAVE_IF_ERROR(params.Append(TATParam(buf))) - code = CATResult::NewL(EATCGSN, EATReadResult, ¶ms); - break; - } - case EATCGMI: - { - response = ETrue; - TBuf8 buf; - buf.Copy(iIdentity.iManufacturer); - LEAVE_IF_ERROR(params.Append(TATParam(buf))) - code = CATResult::NewL(EATCGMI, EATReadResult, ¶ms); - break; - } - case EATCGMM: - { - response = ETrue; - TBuf8 buf; - buf.Copy(iIdentity.iModel); - LEAVE_IF_ERROR(params.Append(TATParam(buf))) - code = CATResult::NewL(EATCGMM, EATReadResult, ¶ms); - break; - } - case EATCGMR: - { - response = ETrue; - TBuf8 buf; - buf.Copy(iIdentity.iRevision); - LEAVE_IF_ERROR(params.Append(TATParam(buf))) - code = CATResult::NewL(EATCGMR, EATReadResult, ¶ms); - break; - } - case EATCIMI: - { - iEtelQuery->SetServiceId(KQueryIMSI); - iPhone.GetSubscriberId(iEtelQuery->iStatus, iId); - iEtelQuery->GoActive(); - break; - } - case EATCOLP: - { - response = ETrue; - LEAVE_IF_ERROR(params.Append(TATParam(TInt(iProtocolStatus->iOutgoingCallNotif)))) - code = CATResult::NewL(EATCOLP, EATReadResult, ¶ms); - break; - } - default: - LEAVE(KErrNotSupported); - } + iPhoneStatus->NetworkStatus(); + switch(net) + { + case RMobilePhone::ERegistrationUnknown: + { + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceUnknown))) + code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); + break; + } + case RMobilePhone::ENotRegisteredEmergencyOnly: + case RMobilePhone::ENotRegisteredNoService: + { + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegistered))) + code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); + break; + } + case RMobilePhone::ENotRegisteredSearching: + case RMobilePhone::ERegisteredBusy: + { + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceNotRegisteredSearching))) + code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); + break; + } + case RMobilePhone::ERegisteredOnHomeNetwork: + { + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceHomeNetwork))) + code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); + break; + } + case RMobilePhone::ERegistrationDenied: + { + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegistrationDenied))) + code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); + break; + } + case RMobilePhone::ERegisteredRoaming: + { + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregEnableUnsolicited))) + LEAVE_IF_ERROR(params.Append(TATParam(EBTMonoCregNetworkServiceRegisteredRoaming))) + code = CATResult::NewL(EATCREG, EATReadResult, ¶ms); + break; + } + default: + TRACE_INFO(_L("Error: default in CREG")); + break; + }; + break; + } + case EATCSQ: + { + TRACE_INFO(_L("Requesting Signal strength")); + LEAVE_IF_ERROR(params.Append(TATParam(iPhoneStatus->GetRssiStrength()))) + LEAVE_IF_ERROR(params.Append(TATParam(KBerUnknown))) + code = CATResult::NewL(EATCSQ, EATReadResult, ¶ms); + TRACE_INFO(_L("done")); + break; + } + + case EATCGSN: + { + TBuf8 buf; + buf.Copy(iIdentity.iSerialNumber); + LEAVE_IF_ERROR(params.Append(TATParam(buf))) + code = CATResult::NewL(EATCGSN, EATReadResult, ¶ms); + break; + } + case EATCGMI: + { + TBuf8 buf; + buf.Copy(iIdentity.iManufacturer); + LEAVE_IF_ERROR(params.Append(TATParam(buf))) + code = CATResult::NewL(EATCGMI, EATReadResult, ¶ms); + break; + } + case EATCGMM: + { + TBuf8 buf; + buf.Copy(iIdentity.iModel); + LEAVE_IF_ERROR(params.Append(TATParam(buf))) + code = CATResult::NewL(EATCGMM, EATReadResult, ¶ms); + break; + } + case EATCGMR: + { + TBuf8 buf; + buf.Copy(iIdentity.iRevision); + LEAVE_IF_ERROR(params.Append(TATParam(buf))) + code = CATResult::NewL(EATCGMR, EATReadResult, ¶ms); + break; + } + case EATCIMI: + { + iEtelQuery->SetServiceId(KQueryIMSI); + iPhone.GetSubscriberId(iEtelQuery->iStatus, iId); + iEtelQuery->GoActive(); + break; + } + case EATCOLP: + { + LEAVE_IF_ERROR(params.Append(TATParam(TInt(iProtocolStatus->iOutgoingCallNotif)))) + code = CATResult::NewL(EATCOLP, EATReadResult, ¶ms); + break; + } + default: + LEAVE(KErrNotSupported); + } CleanupStack::PopAndDestroy(¶ms); - if (response) - { - RATResultPtrArray resarr; + if (code) + { CleanupStack::PushL(code); - ATObjArrayCleanupResetAndDestroyPushL(resarr); resarr.AppendL(code); CleanupStack::Pop(code); CATResult* ok = CATResult::NewL(EATOK); @@ -847,9 +860,9 @@ resarr.AppendL(ok); CleanupStack::Pop(ok); SendResponseL(resarr); - CleanupStack::PopAndDestroy(&resarr); CmdHandlingCompletedL(); } + CleanupStack::PopAndDestroy(&resarr); } // ----------------------------------------------------------------------------- @@ -1070,7 +1083,9 @@ case EATCGSN: { CATResult* code = NULL; - RArray params; + RATResultPtrArray resarr; + ATObjArrayCleanupResetAndDestroyPushL(resarr); + RATParamArray params; CleanupClosePushL(params); TBuf8 buf; buf.Copy(iIdentity.iSerialNumber); @@ -1078,8 +1093,6 @@ code = CATResult::NewL(EATCGSN, EATActionResult, ¶ms); CleanupStack::PopAndDestroy(¶ms); CleanupStack::PushL(code); - RATResultPtrArray resarr; - ATObjArrayCleanupResetAndDestroyPushL(resarr); resarr.AppendL(code); CleanupStack::Pop(code); CATResult* ok = CATResult::NewL(EATOK); @@ -1162,38 +1175,6 @@ return EFalse; } -// ----------------------------------------------------------------------------- -// CBtmcProtocol::ServiceAttributeSearchComplete -// ----------------------------------------------------------------------------- -// -void CBtmcProtocol::ServiceAttributeSearchComplete( TSdpServRecordHandle /*aHandle*/, - const RSdpResultArray& aAttr, - TInt aErr ) - { - TRACE_FUNC - if((aErr == KErrNone || aErr == KErrEof) && aAttr.Count() && aAttr[0].iAttrValue.iValNumeric) - { - TRACE_INFO((_L("Remote volume control supported"))) - TInt err = KErrNone; - if (!iPhoneStatus) - { - TRAP(err, iPhoneStatus = CBtmcPhoneStatus::NewL(*this, iPhone, iProtocolStatus->iProfile)); - } - - if (err == KErrNone) - { - TRAP_IGNORE(iPhoneStatus->SetVolumeControlFeatureL(ETrue)); - iPhoneStatus->ActivateRemoteVolumeControl(); - } - } - - if(aErr) - { - delete iBteng; - iBteng = NULL; - } - } - void CBtmcProtocol::SetIndicatorL(TInt aIndicator, TInt aValue) { TInt indBit( 0 );