# HG changeset patch # User hgs # Date 1281102201 -10800 # Node ID 625f43ae93626235ee6fbc6985ede9e698771b95 # Parent 9866e1d495565f51022bd127235d62f1d5c23f39 201031_05 diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btaudioman/inc/basrvacc.h --- a/bluetoothengine/btaudioman/inc/basrvacc.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btaudioman/inc/basrvacc.h Fri Aug 06 16:43:21 2010 +0300 @@ -67,6 +67,11 @@ void OpenAudioL(TAccAudioType aType); /** + * Called when the audio open request is to be cancelled. + */ + void CancelOpenAudio(); + + /** * Called when an audio close request comes from Acc FW. */ void CloseAudioL(TAccAudioType aType); diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btaudioman/inc/basrvaccstate.h --- a/bluetoothengine/btaudioman/inc/basrvaccstate.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btaudioman/inc/basrvaccstate.h Fri Aug 06 16:43:21 2010 +0300 @@ -102,7 +102,12 @@ * Called when an audio open request comes from Acc FW. */ virtual void OpenAudioL(TAccAudioType aType); - + + /** + * Called when the audio open request is to be cancelled. + */ + virtual void CancelOpenAudio(); + /** * Called when an audio close request comes from Acc FW. */ diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btaudioman/inc/basrvaccstateattached.h --- a/bluetoothengine/btaudioman/inc/basrvaccstateattached.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btaudioman/inc/basrvaccstateattached.h Fri Aug 06 16:43:21 2010 +0300 @@ -84,6 +84,12 @@ void OpenAudioL(TAccAudioType aType); /** + * Called when the audio open request is to be cancelled. + */ + void CancelOpenAudio(); + + + /** * Called when an audio close request comes from Acc FW. */ void CloseAudioL(TAccAudioType aType); diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btaudioman/src/basrvacc.cpp --- a/bluetoothengine/btaudioman/src/basrvacc.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvacc.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -139,6 +139,12 @@ iState->CloseAudioL(aType); } +void CBasrvAcc::CancelOpenAudio() + { + TRACE_FUNC + iState->CancelOpenAudio(); + } + const TAccInfo* CBasrvAcc::AccInfo(const TBTDevAddr& aAddr) { TRACE_FUNC diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btaudioman/src/basrvaccman.cpp --- a/bluetoothengine/btaudioman/src/basrvaccman.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvaccman.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -12,7 +12,7 @@ * Contributors: * * Description: Implementation of an accessory management. -* Version : %version: 14.1.11 % +* Version : %version: 14.1.12 % * */ @@ -619,27 +619,23 @@ TInt idx = FindAcc(aAddr); if (idx >= 0) { - // Check if another audio link opened already - TInt audiolinks = AudioLinkStatus(); - - if ( ( audiolinks && audiolinks != aProfile) || - ( iAudioRequests.Count() && - iAudioRequests[0].iOngoing && - iAudioRequests[0].iAddr == aAddr) ) + TInt audiolinks = AudioLinkStatus(); + if ( audiolinks && audiolinks != aProfile) { - // another audio type is opened while we have an audio link or pending audio request. - if (iAudioRequests.Count()) - { - TRACE_INFO((_L(" [audio link check] existing audio link %x, audio request pending ? %d. Audio should be rejected!"), - audiolinks, iAudioRequests[0].iOngoing)) - } - else - { - TRACE_INFO((_L(" [audio link check] existing audio link %x. Audio should be rejected!"), + TRACE_INFO((_L(" [global audio link check] existing audio link %x. Audio should be rejected!"), audiolinks)) - } RejectAudioLink(aAddr, (aProfile == EStereo) ? EAccStereoAudio : EAccMonoAudio); } + else if ( iAudioRequests.Count() && + iAudioRequests[0].iReqType == EOpenReqFromAudioPolicy && + iAudioRequests[0].iAudioType == ((aProfile == EStereo) ? EAccStereoAudio : EAccMonoAudio) && + iAudioRequests[0].iOngoing && + iAudioRequests[0].iAddr == aAddr) + { + TRACE_INFO((_L(" [device-specific audio request check] audio request pending ? %d. Audio request should be cancelled!"), + iAudioRequests[0].iOngoing)) + iAccs[idx]->CancelOpenAudio(); + } else { iAccs[idx]->AccOpenedAudio(aProfile); diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btaudioman/src/basrvaccstate.cpp --- a/bluetoothengine/btaudioman/src/basrvaccstate.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvaccstate.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -86,6 +86,11 @@ TRACE_FUNC } +void CBasrvAccState::CancelOpenAudio() + { + TRACE_FUNC + } + void CBasrvAccState::CloseAudioL(TAccAudioType /*aType*/) { TRACE_FUNC @@ -128,7 +133,7 @@ } void CBasrvAccState::NewProfileConnection(TProfiles aProfile) - { + { AccInfo().iConnProfiles |= aProfile; AccInfo().iSuppProfiles |= aProfile; if (aProfile == ERemConCT && diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btaudioman/src/basrvaccstateattached.cpp --- a/bluetoothengine/btaudioman/src/basrvaccstateattached.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvaccstateattached.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -12,7 +12,7 @@ * Contributors: * * Description: Implementation of Connected state. -* Version : %version: 21 % +* Version : %version: 22 % * */ @@ -228,6 +228,16 @@ User::RequestComplete( myStatus, KErrNone ); } +void CBasrvAccStateAttached::CancelOpenAudio() + { + TRACE_FUNC + + if (iAudioOpener) + { + iAudioOpener->Cancel(); + } + } + void CBasrvAccStateAttached::CloseAudioL(TAccAudioType aType) { TRACE_FUNC diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btmac/inc/btmonobearer/bmbcmdlistener.h --- a/bluetoothengine/btmac/inc/btmonobearer/bmbcmdlistener.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btmac/inc/btmonobearer/bmbcmdlistener.h Fri Aug 06 16:43:21 2010 +0300 @@ -90,7 +90,7 @@ RProperty iATRespProperty; // At command buffer - TBuf8 iAtCmdBuf; + RBuf8 iAtCmdBuf; }; #endif diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btmac/inc/btmonocmdhandler/HfpAtCmdHandler.h --- a/bluetoothengine/btmac/inc/btmonocmdhandler/HfpAtCmdHandler.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btmac/inc/btmonocmdhandler/HfpAtCmdHandler.h Fri Aug 06 16:43:21 2010 +0300 @@ -133,10 +133,11 @@ MATExtObserver& iObserver; RATExt iATExtClient; - TBuf8 iCmdBuffer; - TBuf8 iRecvBuffer; - TBuf8 iReplyBuffer; - TBuf8<512> iSystemReply; + // reserve buffers from the heap + RBuf8 iCmdBuffer; + RBuf8 iSystemReply; + TBuf8 *iRecvBuffer; + TBuf8 *iReplyBuffer; TInt iRemainingReplyLength; TPckg iRemainingReplyLengthPckg; diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btmac/src/BTMonoCmdHandler/HfpAtCmdhandler.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/HfpAtCmdhandler.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/HfpAtCmdhandler.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -49,20 +49,24 @@ { iATExtClient.Close(); } + iCmdBuffer.Close(); + iSystemReply.Close(); + delete iRecvBuffer; + delete iReplyBuffer; } void CHFPAtCmdHandler::HandleCommand(const TDesC8& aAT, const TDesC8& aReply) { TRACE_INFO((_L8("default reply '%S'"), &aReply)) iCmdBuffer.Copy(aAT); - iReplyBuffer.Zero(); + iReplyBuffer->Zero(); if (aReply.Length()) { - iReplyBuffer.Copy(aReply); + iReplyBuffer->Copy(aReply); iSystemReply.Copy(aReply); - } + } iATExtClient.HandleCommand(iCommander->iStatus, - iCmdBuffer, iReplyBuffer, iRemainingReplyLengthPckg, iReplyTypePckg); + iCmdBuffer, *iReplyBuffer, iRemainingReplyLengthPckg, iReplyTypePckg); iCommander->GoActive(); } @@ -79,16 +83,16 @@ if (iRemainingReplyLengthPckg()) { TRACE_INFO((_L8("reply '%S'"), &iReplyBuffer)) - iObserver.ATExtHandleReplyReceivedL(err, iReplyBuffer); + iObserver.ATExtHandleReplyReceivedL(err, *iReplyBuffer); do { TRACE_INFO((_L8("iRemainingReplyLength '%d'"), iRemainingReplyLengthPckg())) RBuf8 reply; reply.CreateL(iRemainingReplyLengthPckg()); - err = iATExtClient.GetNextPartOfReply(iRecvBuffer, iRemainingReplyLengthPckg()); + err = iATExtClient.GetNextPartOfReply(*iRecvBuffer, iRemainingReplyLengthPckg()); if (!err) { - reply.Insert(0, iRecvBuffer); + reply.Insert(0, *iRecvBuffer); } TRACE_INFO((_L8("reply '%S'"), &reply)) iObserver.ATExtHandleReplyReceivedL(err, reply); @@ -98,8 +102,8 @@ } else { - TRACE_INFO((_L8("reply '%S'"), &iReplyBuffer)) - iObserver.ATExtHandleReplyReceivedL(err, iReplyBuffer); + TRACE_INFO((_L8("reply '%S'"), iReplyBuffer)) + iObserver.ATExtHandleReplyReceivedL(err, *iReplyBuffer); } } else @@ -159,6 +163,10 @@ StartUrc(); iCommander = CBtmcActive::NewL(*this, CActive::EPriorityStandard, EHandleCommandRequest); + iCmdBuffer.CreateL(KDefaultCmdBufLength); + iRecvBuffer = new (ELeave) TBuf8(); + iReplyBuffer = new (ELeave) TBuf8(); + iSystemReply.CreateL(KDefaultUrcBufLength); TRACE_FUNC_EXIT } diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallinghandler.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallinghandler.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallinghandler.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -94,13 +94,15 @@ TInt result = KErrNone; if (!aErr) { - TBuf8 buf; + RBuf8 buf; + buf.CreateL(KDefaultCmdBufLength); aErr = iRespProperty.Get(buf); if (!aErr && buf.Length() >= sizeof(TInt)) { const TUint8* ptr = buf.Ptr(); result = *((const TInt*)ptr); } + buf.Close(); } TRACE_INFO((_L("resp %d"), result)) TATId atid = EATOK; diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -399,21 +399,23 @@ { return; } - TBuf8 cmddes; - if (iInDataBuf.NextCommand(cmddes)) + RBuf8 cmddes; + cmddes.CreateL(KDefaultCmdBufLength); + CleanupClosePushL(cmddes); + if (iInDataBuf.NextCommand(cmddes) || cmddes.Length() == 0) { + CleanupStack::PopAndDestroy(&cmddes); return; } - if (cmddes.Length() == 0) - { - return; - } + TRACE_INFO_SEG( { - TBuf8 buf; + RBuf8 buf; + buf.CreateL(KDefaultCmdBufLength); buf = cmddes; buf.Trim(); Trace(_L8("[HFP] [I] %S"), &buf); + buf.Close(); }) CATCommand* cmd = NULL; @@ -423,13 +425,16 @@ if(iAtExt) { iAtExt->HandleCommand(cmddes, _L8("\n\rERROR\n\r")); + CleanupStack::PopAndDestroy(&cmddes); return; } CATResult* nok = CATResult::NewLC(EATERROR); SendResponseL(*nok); CleanupStack::PopAndDestroy(nok); + CleanupStack::PopAndDestroy(&cmddes); return; } + CleanupStack::PopAndDestroy(&cmddes); CleanupStack::PushL(cmd); iHandleCmdPending = ETrue; TATId id = cmd->Id(); @@ -1080,14 +1085,17 @@ { TRACE_INFO((_L("credit %d"), iCredit)) TInt count = iOutgoPacketQueue->MdcaCount(); + RBuf8 buf; + buf.CreateL(KDefaultCmdBufLength); + CleanupClosePushL(buf); for (TInt i = 0; iCredit >0 && i < count; i++) { iCredit--; - TBuf8 buf; buf.Copy(iOutgoPacketQueue->MdcaPoint(0)); iObserver.SendProtocolDataL(buf); iOutgoPacketQueue->Delete(0); } + CleanupStack::PopAndDestroy(&buf); } void CBtmcProtocol::StartTimerL(TInt aService, TInt aTimeout) diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btmac/src/btmonobearer/bmbcmdlistener.cpp --- a/bluetoothengine/btmac/src/btmonobearer/bmbcmdlistener.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btmac/src/btmonobearer/bmbcmdlistener.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -35,6 +35,7 @@ Cancel(); iATCmdProperty.Close(); iATRespProperty.Close(); + iAtCmdBuf.Close(); } // --------------------------------------------------------------------------- @@ -60,6 +61,7 @@ TRACE_FUNC LEAVE_IF_ERROR(iATCmdProperty.Attach(KPSUidBluetoothEnginePrivateCategory, KBTHfpATCommand)); LEAVE_IF_ERROR(iATRespProperty.Attach(KPSUidBluetoothEnginePrivateCategory, KBTHfpATResponse)); + iAtCmdBuf.CreateL(KDefaultCmdBufLength); Subscribe(); } diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp --- a/bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -146,14 +146,6 @@ BTUI_ASSERT_X( optionsMenu != 0, "BtCpUiSearchView::BtCpUiSearchView", "Options menu not found" ); this->setMenu(optionsMenu); - mExit = static_cast( mLoader->findObject( "exitAction" ) ); - BTUI_ASSERT_X( mExit, "BtCpUiSearchView::BtCpUiSearchView", "exitAction missing" ); - mExit->setText(hbTrId("txt_common_opt_exit")); - - mConnect = static_cast( mLoader->findObject( "connectAction" ) ); - BTUI_ASSERT_X( mConnect, "BtCpUiSearchView::BtCpUiSearchView", "connectAction missing" ); - mConnect->setText(hbTrId("txt_bt_menu_connect")); - ret = connect(mDeviceList, SIGNAL(activated(QModelIndex)), this, SLOT(deviceSelected(QModelIndex))); BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "deviceSelected can't connect" ); diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btui/btcpplugin/btcpuisearchview.h --- a/bluetoothengine/btui/btcpplugin/btcpuisearchview.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuisearchview.h Fri Aug 06 16:43:21 2010 +0300 @@ -88,8 +88,6 @@ HbAction* mViewBy; HbAction* mStop; HbAction* mRetry; - HbAction* mExit; - HbAction* mConnect; //pointer to abstract delegate, and it is instantiated at runtime BtAbstractDelegate* mAbstractDelegate; diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btui/btcpplugin/docml/bt-search-view.docml --- a/bluetoothengine/btui/btcpplugin/docml/bt-search-view.docml Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/docml/bt-search-view.docml Fri Aug 06 16:43:21 2010 +0300 @@ -13,12 +13,6 @@ - - - - - - @@ -82,17 +76,11 @@ - - - - +
- - - @@ -100,6 +88,9 @@ + + + diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btui/btuidelegate/btdelegateconnect.cpp --- a/bluetoothengine/btui/btuidelegate/btdelegateconnect.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegateconnect.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -162,8 +162,8 @@ QString questionText(hbTrId("txt_bt_info_to_connect_1_2_needs_to_be_disconnec") .arg(mDeviceName).arg(conflictDevName)); - HbMessageBox::question( questionText, this, SLOT(handleUserAnswer(HbAction*)), - hbTrId("txt_common_button_continue"), hbTrId("txt_common_button_cancel") ); + HbMessageBox::question( questionText, this, SLOT(handleUserAnswer(int)), + HbMessageBox::Continue | HbMessageBox::Cancel ); } } else { @@ -175,10 +175,9 @@ /*! * handle user response to query about disconnecting conflict device */ -void BtDelegateConnect::handleUserAnswer( HbAction* answer ) +void BtDelegateConnect::handleUserAnswer( int answer ) { - HbMessageBox* dlg = static_cast( sender() ); - if( dlg->actions().first() == answer ) { + if( answer == HbMessageBox::Continue ) { // Continue, ie. disconnect conflict device and then try reconnecting again if (!mAbstractDelegate) //if there is no other delegate running { diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btui/btuidelegate/btdelegateconnect.h --- a/bluetoothengine/btui/btuidelegate/btdelegateconnect.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegateconnect.h Fri Aug 06 16:43:21 2010 +0300 @@ -54,7 +54,7 @@ virtual void DisconnectComplete( TBTDevAddr& aAddr, TInt aErr ); private slots: - void handleUserAnswer( HbAction* answer ); + void handleUserAnswer( int answer ); void powerDelegateCompleted(int status); void disconnectDelegateCompleted(int status); diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btui/btuidelegate/btdelegatepower.cpp --- a/bluetoothengine/btui/btuidelegate/btdelegatepower.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegatepower.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -91,7 +91,7 @@ if (btEnabledInOffline){ // BT is allowed to be enabled in offline mode, show query. HbMessageBox::question( hbTrId("txt_bt_info_trun_bluetooth_on_ini_offline_mode" ),this, - SLOT(btOnQuestionClose(HbAction*))); + SLOT(btOnQuestionClose(int)), HbMessageBox::Yes | HbMessageBox::No ); } else{ @@ -113,11 +113,10 @@ } -void BtDelegatePower::btOnQuestionClose(HbAction *action) +void BtDelegatePower::btOnQuestionClose(int action) { - HbMessageBox *dlg = static_cast(sender()); int err = 0; - if(action == dlg->actions().at(0)) + if(action == HbMessageBox::Yes) { //user chooses "yes" for using BT in offline mActiveHandling = true; diff -r 9866e1d49556 -r 625f43ae9362 bluetoothengine/btui/btuidelegate/btdelegatepower.h --- a/bluetoothengine/btui/btuidelegate/btdelegatepower.h Tue Jul 27 13:42:03 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegatepower.h Fri Aug 06 16:43:21 2010 +0300 @@ -53,7 +53,7 @@ virtual void VisibilityModeChanged( TBTVisibilityMode aState ); public slots: - void btOnQuestionClose(HbAction *action); + void btOnQuestionClose(int action); void btOnWarningClose(); diff -r 9866e1d49556 -r 625f43ae9362 btobexprofiles/obexserviceman/utils/src/obexutilsmessagehandler.cpp --- a/btobexprofiles/obexserviceman/utils/src/obexutilsmessagehandler.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/btobexprofiles/obexserviceman/utils/src/obexutilsmessagehandler.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -54,6 +54,8 @@ const TInt KObexUtilsMaxCharToFromField = 256; +const TInt32 KUidMsgTypeBtTInt32 = 0x10009ED5; + // ============================= LOCAL FUNCTIONS =============================== // ----------------------------------------------------------------------------- @@ -303,6 +305,7 @@ parentTEntry.iMtm = KUidBIOMessageTypeMtm; parentTEntry.iServiceId = KMsvLocalServiceIndexEntryId; parentTEntry.iBioType = aBioMsgId.iUid; + parentTEntry.iMtmData1 = KUidMsgTypeBtTInt32; parentTEntry.iDescription.Set(aBioDB->BifReader(index).Description()); parentEntry->ChangeL(parentTEntry); diff -r 9866e1d49556 -r 625f43ae9362 cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp --- a/cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp Tue Jul 27 13:42:03 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp Fri Aug 06 16:43:21 2010 +0300 @@ -268,12 +268,14 @@ // Extract the token at this point TPtrC8 retVal = iCmd.MarkedToken(); - // Skip comma, space and control chars - while(!iCmd.Eos() && (chr == ',' || chr.IsSpace() || chr.IsControl())) - { - iCmd.Inc(); - chr = iCmd.Peek(); - } + // Skip the first delimiter and any further space and control chars + do + { + iCmd.Inc(); + chr = iCmd.Peek(); + } + while(!iCmd.Eos() && (chr.IsSpace() || chr.IsControl())); + TRACE_FUNC_EXIT return retVal; }