# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1282114745 -10800 # Node ID 4545c04e61e1cd7b00e02bcec7b58732aacd4d27 # Parent 0b2439c3e39794d2589f8721e94908e3e0191aa4 Revision: 201031 Kit: 201033 diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/mediabrowseapi/group/bld.inf --- a/bluetoothappprofiles/avrcp/mediabrowseapi/group/bld.inf Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/mediabrowseapi/group/bld.inf Wed Aug 18 09:59:05 2010 +0300 @@ -40,5 +40,5 @@ ../public/remconmediabrowsetypes.h SYMBIAN_MW_LAYER_PUBLIC_EXPORT_PATH(remconmediabrowsetypes.h) ../public/remconmediabrowsepanic.h SYMBIAN_MW_LAYER_PUBLIC_EXPORT_PATH(remconmediabrowsepanic.h) -../public/remconmediabrowsetargetbase.h SYMBIAN_MW_LAYER_PUBLIC_EXPORT_PATH(remcon/remconmediabrowsetargetbase.h) +../public/remconmediabrowsetargetbase.h SYMBIAN_MW_LAYER_PLATFORM_EXPORT_PATH(remcon/remconmediabrowsetargetbase.h) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/nowplayingapi/group/bld.inf --- a/bluetoothappprofiles/avrcp/nowplayingapi/group/bld.inf Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/nowplayingapi/group/bld.inf Wed Aug 18 09:59:05 2010 +0300 @@ -30,4 +30,4 @@ ../public/remcondatabaseunawarenowplayingtarget.h SYMBIAN_MW_LAYER_PUBLIC_EXPORT_PATH(remcondatabaseunawarenowplayingtarget.h) ../public/remcondatabaseunawarenowplayingtargetobserver.h SYMBIAN_MW_LAYER_PUBLIC_EXPORT_PATH(remcondatabaseunawarenowplayingtargetobserver.h) -../public/remconnowplayingtargetbase.h SYMBIAN_MW_LAYER_PUBLIC_EXPORT_PATH(remcon/remconnowplayingtargetbase.h) +../public/remconnowplayingtargetbase.h SYMBIAN_MW_LAYER_PLATFORM_EXPORT_PATH(remcon/remconnowplayingtargetbase.h) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/remconbeareravrcp/group/remconbeareravrcp.mmp --- a/bluetoothappprofiles/avrcp/remconbeareravrcp/group/remconbeareravrcp.mmp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/group/remconbeareravrcp.mmp Wed Aug 18 09:59:05 2010 +0300 @@ -20,8 +20,6 @@ @file */ -#include "../../../../../../os/bt/bluetoothmgmt/btcommon/config.cfg" - #include TARGET remconbeareravrcp.dll diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcpplayerinfomanager.h --- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcpplayerinfomanager.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcpplayerinfomanager.h Wed Aug 18 09:59:05 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of "Eclipse Public License v1.0" @@ -88,6 +88,7 @@ void ClientStatus(TBool aControllerPresent, TBool aTargetPresent); TInt SetLocalAddressedClient(const TRemConClientId& aId); void ControllerFeaturesUpdatedL(RArray& aSupportedInterfaces); + void TargetFeaturesUpdated(const TRemConClientId& aId, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName); MIncomingCommandHandler& InternalCommandHandler(); // Interface to command handler @@ -106,7 +107,10 @@ void MpsoPlayStatusChanged(TRemConClientId aId, MPlayerEventsObserver::TPlaybackStatus aPlaybackStatus); void MpsoError(TRemConClientId aId); - + // Helper function for ClientAvailable and TargetFeaturesUpdated + TInt SetItemDetails(TAvrcpMediaPlayerItem& aItem, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName); + void UpdateSdpRecord(const TAvrcpMediaPlayerItem& aItem); + //--------------------------------------------------------- // Bulk thread only functions //--------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlbearer.h --- a/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlbearer.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlbearer.h Wed Aug 18 09:59:05 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of "Eclipse Public License v1.0" @@ -118,6 +118,8 @@ virtual TInt SetLocalAddressedClient(TRemConClientId& aId); + virtual void TargetFeaturesUpdated(const TRemConClientId& aId, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName); + private: // from CRemConBearerPlugin TAny* GetInterface(TUid aUid); diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/remconbeareravrcp/src/avrcpincomingcommandhandler.cpp --- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/avrcpincomingcommandhandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/avrcpincomingcommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of "Eclipse Public License v1.0" @@ -564,13 +564,13 @@ // Can ignore this as we know we have allocated a big enough buffer TRAP_IGNORE(response.WriteL(responseBuf)); + + iCommandInterface.MrccciSetAddressedClient(iClientId); break; } }; SendInternalResponse(aId, responseBuf); - iCommandInterface.MrccciSetAddressedClient(iClientId); - responseBuf.Close(); } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/remconbeareravrcp/src/avrcpplayerinfomanager.cpp --- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/avrcpplayerinfomanager.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/avrcpplayerinfomanager.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of "Eclipse Public License v1.0" @@ -133,7 +133,33 @@ iUidWatcher = NULL; } -void CAvrcpPlayerInfoManager::ClientAvailable(const TRemConClientId& aId, TPlayerType aClientType, TPlayerSubType aClientSubType, const TDesC8& aName) +// Helper function for ClientAvailable and TargetFeaturesUpdated +TInt CAvrcpPlayerInfoManager::SetItemDetails(TAvrcpMediaPlayerItem& aItem, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName) + { + aItem.iPlayerType = aPlayerType; + aItem.iPlayerSubType = aPlayerSubType; + aItem.iName.Set(aName); + aItem.iFeatureBitmask = TPlayerFeatureBitmask(); + return SetPlayerFeatures(aItem.iId, aItem.iFeatureBitmask, aItem.iSdpFeatures, aItem.iAbsoluteVolumeSupport); + } + +// Helper function for ClientAvailable and TargetFeaturesUpdated +void CAvrcpPlayerInfoManager::UpdateSdpRecord(const TAvrcpMediaPlayerItem& aItem) + { + // Update SDP record, if this fails we carry on, it's non-fatal + TInt sdpErr = KErrNone; + if(!iTargetRecord) + { + TRAP(sdpErr, AvrcpSdpUtils::CreateServiceRecordL(iSdpDatabase, iTargetRecord, ETrue, + (aItem.iSdpFeatures & AvrcpSdp::EBrowsing) ? AvrcpSdp::KAvrcpProfileVersion14 : AvrcpSdp::KAvrcpProfileVersion13)); + } + if(sdpErr == KErrNone) + { + TRAP_IGNORE(UpdateTgServiceRecordL()); + } + } + +void CAvrcpPlayerInfoManager::ClientAvailable(const TRemConClientId& aId, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName) { LOG_FUNC; ASSERT_CONTROL_THREAD; @@ -150,15 +176,11 @@ TAvrcpMediaPlayerItem& item = iPlayers[index]; item.iId = aId; - item.iPlayerType = aClientType; - item.iPlayerSubType = aClientSubType; - item.iName.Set(aName); item.iBulkClientAvailable = EFalse; item.iUidCounter = 0; item.iLastUpdatedUidCounter = 0; item.iPlaybackStatus = MPlayerEventsObserver::EStopped; - item.iFeatureBitmask = TPlayerFeatureBitmask(); - TInt err = SetPlayerFeatures(aId, item.iFeatureBitmask, item.iSdpFeatures, item.iAbsoluteVolumeSupport); + TInt err = SetItemDetails(item, aPlayerType, aPlayerSubType, aName); // Release lock before calling out of player info manager in case // anyone needs to call back in - we're finished updating the @@ -168,41 +190,21 @@ if(!err) { TRAP(err, iPlayStatusWatcher->StartWatchingPlayerL(aId)); - if(!err) { - // Update SDP record, if this fails we carry on, it's non-fatal - TInt sdpErr = KErrNone; - if(!iTargetRecord) + UpdateSdpRecord(item); + for(TInt i = 0; iMpcoAvailablePlayersChanged(); } } - } - - if(!err) - { - for(TInt i = 0; iMpcoAvailablePlayersChanged(); + iLock.Wait(); + iPlayers[index].iId = KNullClientId; + iLock.Signal(); } } - else - { - iLock.Wait(); - iPlayers[index].iId = KNullClientId; - iLock.Signal(); - } } void CAvrcpPlayerInfoManager::ClientNotAvailable(const TRemConClientId& aId) @@ -303,6 +305,46 @@ AvrcpSdpUtils::UpdateSupportedFeaturesL(iSdpDatabase, iControllerRecord, AvrcpSdp::ERemoteControl, AvrcpSdp::KAvrcpBaseCtFeatures); } +void CAvrcpPlayerInfoManager::TargetFeaturesUpdated(const TRemConClientId& aId, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName) + { + LOG_FUNC; + ASSERT_CONTROL_THREAD; + iLock.Wait(); + // Find this client in our client list + TInt index = iPlayers.Find(aId, PlayerCompare); + if(index < 0) + { + // Couldn't find client in client list, maybe we removed it after an earlier failure + iLock.Signal(); + return; + } + + TAvrcpMediaPlayerItem& item = iPlayers[index]; + TInt err = SetItemDetails(item, aPlayerType, aPlayerSubType, aName); + + // Release lock before calling out of player info manager in case + // anyone needs to call back in - we're finished updating the + // info now. + iLock.Signal(); + + if(!err) + { + UpdateSdpRecord(item); + } + else + { + // There was an error updating the features so remove this client from the client list + iLock.Wait(); + iPlayers[index].iId = KNullClientId; + iLock.Signal(); + } + + for(TInt i = 0; iMpcoAvailablePlayersChanged(); + } + } + MIncomingCommandHandler& CAvrcpPlayerInfoManager::InternalCommandHandler() { LOG_FUNC diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/remconbeareravrcp/src/playerstatewatcher.cpp --- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/playerstatewatcher.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/playerstatewatcher.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -37,14 +37,17 @@ void CPlayerWatcherBase::StopWatchingPlayer(TRemConClientId aClientId) { LOG_FUNC; - CInternalCommand* command = *iCommands.Find(aClientId); - __ASSERT_DEBUG(command, AVRCP_PANIC(ENotWatchingPlayer)); - - TUint transId = command->RemConCommandId(); - iCommandInterface.MrcciCommandExpired(transId); - - iCommands.Remove(aClientId); - command->DecrementUsers(); + CInternalCommand** cmdPtr = iCommands.Find(aClientId); + if (cmdPtr) // This may be NULL if we've already stopped watching the player as a result of reciving a reject + { + CInternalCommand* cmd = *cmdPtr; + + TUint transId = cmd->RemConCommandId(); + iCommandInterface.MrcciCommandExpired(transId); + + iCommands.Remove(aClientId); + cmd->DecrementUsers(); + } } void CPlayerWatcherBase::MessageSent(CAvrcpCommand& /*aCommand*/, TInt /*aSendResult*/) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothappprofiles/avrcp/remconbeareravrcp/src/remconbeareravrcp.cpp --- a/bluetoothappprofiles/avrcp/remconbeareravrcp/src/remconbeareravrcp.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothappprofiles/avrcp/remconbeareravrcp/src/remconbeareravrcp.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of "Eclipse Public License v1.0" @@ -698,6 +698,19 @@ return iPlayerInfoManager->SetLocalAddressedClient(aId); } +void CRemConBearerAvrcp::TargetFeaturesUpdated(const TRemConClientId& aId, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName) + { + LOG_FUNC + + if (!iConstructionComplete) + { + // Object only partially constructed, swallow the request + return; + } + + iPlayerInfoManager->TargetFeaturesUpdated(aId, aPlayerType, aPlayerSubType, aName); + } + void CRemConBearerAvrcp::ControllerFeaturesUpdated(RArray& aSupportedInterfaces) { LOG_FUNC diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btaudioman/inc/basrvacc.h --- a/bluetoothengine/btaudioman/inc/basrvacc.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btaudioman/inc/basrvacc.h Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btaudioman/inc/basrvaccstate.h --- a/bluetoothengine/btaudioman/inc/basrvaccstate.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btaudioman/inc/basrvaccstate.h Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btaudioman/inc/basrvaccstateattached.h --- a/bluetoothengine/btaudioman/inc/basrvaccstateattached.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btaudioman/inc/basrvaccstateattached.h Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btaudioman/src/basrvacc.cpp --- a/bluetoothengine/btaudioman/src/basrvacc.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvacc.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btaudioman/src/basrvaccman.cpp --- a/bluetoothengine/btaudioman/src/basrvaccman.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvaccman.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btaudioman/src/basrvaccstate.cpp --- a/bluetoothengine/btaudioman/src/basrvaccstate.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvaccstate.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btaudioman/src/basrvaccstateattached.cpp --- a/bluetoothengine/btaudioman/src/basrvaccstateattached.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btaudioman/src/basrvaccstateattached.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/bteng/bttoggle/src/bttoggle.cpp --- a/bluetoothengine/bteng/bttoggle/src/bttoggle.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/bteng/bttoggle/src/bttoggle.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -303,9 +303,9 @@ iNotifier.CancelNotifier(KBTGenericQueryNotifierUid); } else if ( EPowerModeChangeNote == iActiveNotifier ) - { - iNotifier.CancelNotifier(KBTGenericQueryNotifierUid); - } + { + iNotifier.CancelNotifier(KBTGenericInfoNotifierUid); + } // For all cancels, we must reset iActiveNotifier back to ENoneQuery // to permit another request to be made. @@ -330,8 +330,8 @@ switch (iActiveNotifier) { case EPowerModeQuery: - iActiveNotifier = ENoneQuery; - ShowNotification(ETrue); + ShowNotification(ETrue); + iActiveNotifier = EPowerModeChangeNote ; SetActive(); break; case ECloseConnectionQuery: diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/bteng/conf/CI_bteng.confml Binary file bluetoothengine/bteng/conf/CI_bteng.confml has changed diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/bteng/group/bld.inf --- a/bluetoothengine/bteng/group/bld.inf Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/bteng/group/bld.inf Wed Aug 18 09:59:05 2010 +0300 @@ -37,9 +37,6 @@ ../conf/bteng_10204DAB.crml MW_LAYER_CRML(bteng_10204DAB.crml) ../conf/bteng_10204DAC.crml MW_LAYER_CRML(bteng_10204DAC.crml) -/*remove the following exportation, when SCB CR is approved*/ -../conf/CI_bteng.confml MW_LAYER_CONFML(CI_bteng.confml) - ../data/btrfs.txt z:/resource/btrfs.txt diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp --- a/bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -707,9 +707,10 @@ TRACE_INFO( ( _L( "[CBTEngSrvSettingsMgr]\t Using HCI API v2 power manager" ) ) ) User::LeaveIfError( iPowerMgr.Open() ); #ifndef __WINS__ - iPowerMgr.SetPower( EBTOff, NULL, iActive->RequestStatus() ); - User::WaitForRequest( iActive->RequestStatus() ); - TInt status = ( iActive->RequestStatus().Int() == KErrAlreadyExists ? KErrNone : iActive->RequestStatus().Int() ); + TRequestStatus reqStatus; + iPowerMgr.SetPower( EBTOff, NULL, reqStatus ); + User::WaitForRequest( reqStatus ); + TInt status = ( reqStatus.Int() == KErrAlreadyExists ? KErrNone : reqStatus.Int() ); User::LeaveIfError( status ); #else //__WINS__ iPowerState = EBTOff; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btindicator/inc/btindicatorconstants.h --- a/bluetoothengine/btindicator/inc/btindicatorconstants.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btindicator/inc/btindicatorconstants.h Wed Aug 18 09:59:05 2010 +0300 @@ -15,8 +15,8 @@ * */ -#ifndef BTINDCONSTANTS_H -#define BTINDCONSTANTS_H +#ifndef BTINDICATORCONSTANTS_H +#define BTINDICATORCONSTANTS_H @@ -36,7 +36,7 @@ EBTIndicatorHiddenConnected }; -#endif /* BTINDCONSTANTS_H */ +#endif /* BTINDICATORCONSTANTS_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btindicator/rom/btindicator.iby --- a/bluetoothengine/btindicator/rom/btindicator.iby Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btindicator/rom/btindicator.iby Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btindicator/src/btindicatorplugin.cpp --- a/bluetoothengine/btindicator/src/btindicatorplugin.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btindicator/src/btindicatorplugin.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -34,9 +34,9 @@ // BTIndicatorPlugin::~BTIndicatorPlugin // ---------------------------------------------------------------------------- BTIndicatorPlugin::~BTIndicatorPlugin() - { +{ delete mIndicatorTranslator; - } +} // ---------------------------------------------------------------------------- // BTIndicatorPlugin::indicatorTypes @@ -70,10 +70,9 @@ // ---------------------------------------------------------------------------- HbIndicatorInterface* BTIndicatorPlugin::createIndicator(const QString &indicatorType) { - if(!mIndicatorTranslator) - { + if(!mIndicatorTranslator) { mIndicatorTranslator = new HbTranslator(BTINDICATOR_TRANSLATION); - } + } HbIndicatorInterface *indicator = new BTIndicator(indicatorType); return indicator; } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btmac/inc/btmonobearer/bmbcmdlistener.h --- a/bluetoothengine/btmac/inc/btmonobearer/bmbcmdlistener.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btmac/inc/btmonobearer/bmbcmdlistener.h Wed Aug 18 09:59:05 2010 +0300 @@ -90,7 +90,7 @@ RProperty iATRespProperty; // At command buffer - TBuf8 iAtCmdBuf; + RBuf8 iAtCmdBuf; }; #endif diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btmac/inc/btmonocmdhandler/HfpAtCmdHandler.h --- a/bluetoothengine/btmac/inc/btmonocmdhandler/HfpAtCmdHandler.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btmac/inc/btmonocmdhandler/HfpAtCmdHandler.h Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btmac/src/BTMonoCmdHandler/HfpAtCmdhandler.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/HfpAtCmdhandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/HfpAtCmdhandler.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallinghandler.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallinghandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallinghandler.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btmac/src/btmac/btmpagescanparametersmanager.cpp --- a/bluetoothengine/btmac/src/btmac/btmpagescanparametersmanager.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btmac/src/btmac/btmpagescanparametersmanager.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -71,6 +71,7 @@ KPageScanParametersListenerService); iTimerActive = CBtmActive::NewL(*this, CActive::EPriorityStandard, KFastConnectionService); + LEAVE_IF_ERROR(iTimer.CreateLocal()); TRACE_FUNC_EXIT } @@ -89,7 +90,6 @@ if (!iTimerActive->IsActive()) { TRACE_FUNC_ENTRY - iTimer.CreateLocal(); iTimer.After(iTimerActive->iStatus, aTimeout); iTimerActive->SetRequestId(aService); iTimerActive->GoActive(); @@ -107,7 +107,6 @@ { TRACE_FUNC_ENTRY iTimerActive->Cancel(); - iTimer.Close(); TRACE_FUNC_EXIT } } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btmac/src/btmonobearer/bmbcmdlistener.cpp --- a/bluetoothengine/btmac/src/btmonobearer/bmbcmdlistener.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btmac/src/btmonobearer/bmbcmdlistener.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/btdevicedialogplugin.pro --- a/bluetoothengine/btnotif/btdevicedialogplugin/btdevicedialogplugin.pro Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/btdevicedialogplugin.pro Wed Aug 18 09:59:05 2010 +0300 @@ -35,7 +35,8 @@ inc/btsenddialogwidget.h \ inc/btdevicedialogplugintrace.h \ inc/btdevicedialogrecvquerywidget.h \ - inc/btrecvprgrsdialogwidget.h + inc/btrecvprgrsdialogwidget.h \ + inc/btrecvcompleteddialogwidget.h SOURCES += src/btdevicedialogplugin.cpp \ @@ -46,7 +47,8 @@ src/btmoredevicesdialogwidget.cpp \ src/btsenddialogwidget.cpp \ src/btdevicedialogrecvquerywidget.cpp \ - src/btrecvprgrsdialogwidget.cpp + src/btrecvprgrsdialogwidget.cpp \ + src/btrecvcompleteddialogwidget.cpp RESOURCES += btdevicedialogplugin.qrc @@ -56,7 +58,10 @@ TARGET.CAPABILITY = CAP_GENERAL_DLL TARGET.UID3 = 0x2002E6DF - LIBS += -lbtdevice + LIBS += -lbtdevice \ + -lhbcore \ + -lxqservice \ + -lxqserviceutil \ hblib.sources = Hb.dll hblib.path = \sys\bin diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/btdevicedialogplugin.qrc --- a/bluetoothengine/btnotif/btdevicedialogplugin/btdevicedialogplugin.qrc Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/btdevicedialogplugin.qrc Wed Aug 18 09:59:05 2010 +0300 @@ -7,5 +7,6 @@ icons/qtg_large_bluetooth.svg docml/bt-receive-auth-dialog.docml docml/bt-recv-progress-dialog.docml + docml/bt-receive-done-dialog.docml diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-device-search-dialog.docml --- a/bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-device-search-dialog.docml Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-device-search-dialog.docml Wed Aug 18 09:59:05 2010 +0300 @@ -1,13 +1,19 @@ - + - + + + + - + + + + @@ -40,15 +46,16 @@ - + + - + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-more-devices-dialog.docml --- a/bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-more-devices-dialog.docml Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-more-devices-dialog.docml Wed Aug 18 09:59:05 2010 +0300 @@ -3,10 +3,11 @@ - + + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-receive-done-dialog.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-receive-done-dialog.docml Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-send-dialog.docml --- a/bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-send-dialog.docml Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/docml/bt-send-dialog.docml Wed Aug 18 09:59:05 2010 +0300 @@ -1,6 +1,7 @@ + @@ -12,8 +13,8 @@ + - diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicedialogrecvquerywidget.h --- a/bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicedialogrecvquerywidget.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicedialogrecvquerywidget.h Wed Aug 18 09:59:05 2010 +0300 @@ -16,8 +16,8 @@ */ -#ifndef BTDEVICEDIALOGRECVQUERYWIDGET_H_ -#define BTDEVICEDIALOGRECVQUERYWIDGET_H_ +#ifndef BTDEVICEDIALOGRECVQUERYWIDGET_H +#define BTDEVICEDIALOGRECVQUERYWIDGET_H #include #include @@ -74,4 +74,4 @@ Q_DISABLE_COPY(BTRecvQueryDialogWidget) }; -#endif /* BTDEVICEDIALOGRECVQUERYWIDGET_H_ */ +#endif /* BTDEVICEDIALOGRECVQUERYWIDGET_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicedialogutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicedialogutils.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0"" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +#ifndef BTDEVICESDIALOGUTILS_H +#define BTDEVICESDIALOGUTILS_H + +#include +#include +#include + +// A data item in this model DLL. For example, power state item consists +// of the information regarding the current Bluetooth power state. +typedef QMap< int, QVariant > BtSendDataItem; + +// A category of the model data for specific group +typedef QList< BtSendDataItem > BtSendDataSource; + + +Q_DECLARE_METATYPE(BtSendDataItem) +Q_DECLARE_METATYPE(BtSendDataSource) + +enum DevDataRole { + NameAliasRole = Qt::DisplayRole, // QVariant::String, the name showing in UI + ReadableBdaddrRole = Qt::UserRole, // QString, the readable format of a BD_ADDR (BT Device address) + MajorPropertyRole, // QVariant::Int, bits of DevMajorProperty + MinorPropertyRole, // QVariant::Int, bits of DevMinorProperty + CoDRole, // QVariant::Int, the value of Class of Device + DeviceTypeRole //QVairant::Int, the value of Device Type +}; + + +inline void setMajorProperty( + BtSendDataItem& qtdev, int prop, bool addto) +{ + if ( addto ) { + qtdev[MajorPropertyRole] = + QVariant( qtdev[MajorPropertyRole].toInt() | prop); + } + else { + qtdev[MajorPropertyRole] = + QVariant( qtdev[MajorPropertyRole].toInt() & ~prop); + } +} + + +#endif /*BTDEVICESDIALOGUTILS_H*/ diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicesearchdialogwidget.h --- a/bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicesearchdialogwidget.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/inc/btdevicesearchdialogwidget.h Wed Aug 18 09:59:05 2010 +0300 @@ -30,14 +30,17 @@ #include #include #include +#include +#include "btdevicedialogutils.h" -struct device + +/*struct device { QString mDeviceName; QString mDeviceType; int mDeviceIdx; - }; + };*/ class BTDeviceSearchDialogWidget : public QObject, @@ -67,11 +70,15 @@ private: bool constructDialog(const QVariantMap ¶meters); - void hideEvent(QHideEvent *event); - void showEvent(QShowEvent *event); - void appendToDeviceList(const QString deviceName); - bool appendToDeviceTypeList(const QString deviceType); - QIcon icon(); + +private: + enum devTypeSelectionList { + BtUiDevAudioDevice = 0, + BtUiDevComputer, + BtUiDevInputDevice, + BtUiDevPhone, + BtUiDevOtherDevice + }; signals: void deviceDialogClosed(); @@ -86,25 +93,30 @@ */ QStandardItemModel* mContentItemModel; - HbDialog* mViewByDialog; - HbRadioButtonList* mRbl; - QList mDeviceTypeList; - QList mDeviceList; + + HbSelectionDialog *mQuery; +// QList mDeviceTypeList; + QStringList mDevTypeList; +// QList mDeviceList; HbListView* mListView; HbLabel* mSearchLabel; HbLabel* mSearchIconLabel; HbLabel* mSearchDoneLabel; - bool mViewByChosen; - QList mDeviceLstOfType; - int mDeviceLstIdx; - int mSelectedType; - int mDeviceDialogData; +// bool mViewByChosen; +// QList mDeviceLstOfType; +// int mDeviceLstIdx; + int mSelectedDeviceType; +// int mDeviceDialogData; HbDialog *mSearchDevicesDialog; HbAction *mStopRetryAction; - HbAction *mViewByAction; + HbAction *mShowAction; + HbAction *mCancelAction; int mStopRetryFlag; + BtSendDataSource mData; + BtSendDataSource mSelectedData; + Q_DISABLE_COPY(BTDeviceSearchDialogWidget) }; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/inc/btmoredevicesdialogwidget.h --- a/bluetoothengine/btnotif/btdevicedialogplugin/inc/btmoredevicesdialogwidget.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/inc/btmoredevicesdialogwidget.h Wed Aug 18 09:59:05 2010 +0300 @@ -19,6 +19,7 @@ #ifndef BTMOREDEVICESDIALOGWIDGET_H #define BTMOREDEVICESDIALOGWIDGET_H +#include "btdevicedialogutils.h" #include #include #include @@ -54,6 +55,8 @@ // void hideEvent(QHideEvent *event); // void showEvent(QShowEvent *event); QIcon icon(/*QString deviceType*/); + // void setMajorProperty( +// BtSendDataItem& qtdev, int prop, bool addto); signals: void deviceDialogClosed(); @@ -73,6 +76,8 @@ QStandardItemModel* mContentItemModel; + BtSendDataSource mData; + Q_DISABLE_COPY(BTMoreDevicesDialogWidget) }; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/inc/btrecvcompleteddialogwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/inc/btrecvcompleteddialogwidget.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: BtDeviceDialogWidget class declaration. +* +*/ + + +#ifndef BTRECVCOMPLETEDDIALOGWIDGET_H_ +#define BTRECVCOMPLETEDDIALOGWIDGET_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +class CoversationViewServiceStarter : public QRunnable + { +public: + CoversationViewServiceStarter(qint64 conversationId); + ~CoversationViewServiceStarter(); + void run(); +private: + qint64 mCnvId; + }; + + +class BTRecvcompletedDialogWidget : public QObject, + public HbDeviceDialogInterface + { + Q_OBJECT + +public: + BTRecvcompletedDialogWidget(const QVariantMap ¶meters); + ~BTRecvcompletedDialogWidget(); + +public: // from HbDeviceDialogInterface + bool setDeviceDialogParameters(const QVariantMap ¶meters); + int deviceDialogError() const; + void closeDeviceDialog(bool byClient); + HbPopup *deviceDialogWidget() const; + virtual QObject *signalSender() const; + +public slots: + void showClicked(); + void cancelClicked(); + +private: + bool constructDialog(const QVariantMap ¶meters); + +signals: + void deviceDialogClosed(); + void deviceDialogData(QVariantMap data); + +private: + HbDocumentLoader *mLoader; + QStandardItemModel *mContentItemModel; + HbLabel *mHeading; + HbLabel *mFileName; + HbLabel *mFileSize; + HbLabel *mFileCount; + HbAction *mShow; + HbAction *mCancel; + HbDialog *mDialog; + int mFileSz; + + Q_DISABLE_COPY(BTRecvcompletedDialogWidget) + }; + + + +#endif /* BTRECVCOMPLETEDDIALOGWIDGET_H_ */ diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/inc/btrecvprgrsdialogwidget.h --- a/bluetoothengine/btnotif/btdevicedialogplugin/inc/btrecvprgrsdialogwidget.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/inc/btrecvprgrsdialogwidget.h Wed Aug 18 09:59:05 2010 +0300 @@ -15,8 +15,8 @@ * */ -#ifndef BTRECVPRGRSDIALOGWIDGET_H_ -#define BTRECVPRGRSDIALOGWIDGET_H_ +#ifndef BTRECVPRGRSDIALOGWIDGET_H +#define BTRECVPRGRSDIALOGWIDGET_H #include #include @@ -73,4 +73,4 @@ Q_DISABLE_COPY(BTRecvPrgrsDialogWidget) }; -#endif /* BTRECVPRGRSDIALOGWIDGET_H_ */ +#endif /* BTRECVPRGRSDIALOGWIDGET_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogplugin.cpp --- a/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogplugin.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogplugin.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -31,6 +31,7 @@ #include "btmoredevicesdialogwidget.h" #include "btsenddialogwidget.h" #include "btdevicedialogrecvquerywidget.h" +#include "btrecvcompleteddialogwidget.h" #include Q_EXPORT_PLUGIN2(btdevicedialogplugin, BtDeviceDialogPlugin) @@ -206,7 +207,7 @@ break; case TBluetoothDialogParams::EQuery: deviceDialog = - new BtDeviceDialogQueryWidget(HbMessageBox::MessageTypeQuestion, parameters); + new BtDeviceDialogQueryWidget(HbMessageBox::MessageTypeWarning,parameters); break; case TBluetoothDialogParams::EInput: deviceDialog = new BtDeviceDialogInputWidget(parameters); @@ -229,6 +230,9 @@ case TBluetoothDialogParams::EReceiveProgress: deviceDialog = new BTRecvPrgrsDialogWidget(parameters); break; + case TBluetoothDialogParams::EReceiveDone: + deviceDialog = new BTRecvcompletedDialogWidget(parameters); + break; default: d->mError = UnknownDeviceDialogError; break; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogquerywidget.cpp --- a/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogquerywidget.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialogquerywidget.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -35,7 +35,6 @@ mLastError = NoError; mShowEventReceived = false; mMessageBox = new HbMessageBox(type); - resetProperties(); constructQueryDialog(parameters); TRACE_EXIT @@ -129,7 +128,7 @@ mLastError = UnknownDeviceDialogError; return; } - title = QString(hbTrId("txt_bt_title_pairing_with_1")); + param = parameters.value( keyStr ); int key = param.toInt(); switch ( key ) { @@ -139,7 +138,12 @@ case EPasskeyDisplay: prompt = QString( hbTrId( "txt_bt_info_enter_the_following_code_to_the_1" ) ); break; - // Note dialogs, but not Notification dialogs + case EPairingFailureRetry: + prompt = QString( hbTrId( "txt_bt_info_pairing_with_1_failed_either_the_pas" ) ); + break; + case EPairingFailureOk: + prompt = QString( hbTrId( "txt_bt_info_unable_to_pair_with_1" ) ); + break; // Input dialogs case EPinInput: case EObexPasskeyInput: @@ -154,18 +158,41 @@ if ( repls > 0 ) { name = parameters.value( QString::number( TBluetoothDeviceDialog::EDeviceName ) ); prompt = prompt.arg( name.toString() ); - addval = parameters.value( QString::number( TBluetoothDeviceDialog::EAdditionalDesc ) ); - // todo: Formating the prompt need to be discussed with UI designer - // The passcode could be displayed on a separate row if it the label did support - // the use of newline escape character. - prompt.append(tr(" ")); - prompt.append(addval.toString()); + if(key != EPairingFailureRetry && key != EPairingFailureOk) + { + addval = parameters.value( QString::number( TBluetoothDeviceDialog::EAdditionalDesc ) ); + // todo: Formating the prompt need to be discussed with UI designer + // The passcode could be displayed on a separate row if it the label did support + // the use of newline escape character. + prompt.append(tr("\n\n")); // insert 2 newlines for clarity + prompt.append(addval.toString()); + if(key == EPasskeyDisplay) + { + prompt.append("\n"); + } + } } - title = title.arg(name.toString()); // set property value to this dialog widget - mMessageBox->setHeadingWidget(new HbLabel(title)); + if(key != EPairingFailureRetry && key != EPairingFailureOk) + { + title = QString(hbTrId("txt_bt_title_pairing_with_1")); + title = title.arg(name.toString()); + mMessageBox->setHeadingWidget(new HbLabel(title)); + mMessageBox->setIconVisible(false); + mMessageBox->setStandardButtons( HbMessageBox::Yes | HbMessageBox::No); + } + else + { + if(key == EPairingFailureRetry) + { + mMessageBox->setStandardButtons( HbMessageBox::Retry | HbMessageBox::Cancel); + } + else + { + mMessageBox->setStandardButtons( HbMessageBox::Ok); + } + } mMessageBox->setText( prompt ); - mMessageBox->setIconVisible(false); TRACE_EXIT } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicesearchdialogwidget.cpp --- a/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicesearchdialogwidget.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicesearchdialogwidget.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -20,13 +20,16 @@ #include #include -#include + #include #include #include #include #include +#include +#include +#include const char* DOCML_BTDEV_SEARCH_DIALOG = ":/docml/bt-device-search-dialog.docml"; @@ -39,13 +42,19 @@ BTDeviceSearchDialogWidget::BTDeviceSearchDialogWidget(const QVariantMap ¶meters) { - mDeviceLstIdx = 0; - mViewByChosen = false; - mSelectedType = 0; - mDeviceDialogData = 0; +// mDeviceLstIdx = 0; +// mViewByChosen = false; + mSelectedDeviceType = 0; + // mDeviceDialogData = 0; mLoader = 0; mContentItemModel = 0; mStopRetryFlag = 0; // Stop + mQuery = 0; + mSelectedDeviceType |= (BtuiDevProperty::AVDev | BtuiDevProperty::Computer | + BtuiDevProperty::Phone | BtuiDevProperty::Peripheral | + BtuiDevProperty::LANAccessDev | BtuiDevProperty::Toy | + BtuiDevProperty::WearableDev | BtuiDevProperty::ImagingDev | + BtuiDevProperty::HealthDev | BtuiDevProperty::UncategorizedDev); constructDialog(parameters); } @@ -53,6 +62,9 @@ { delete mLoader; delete mContentItemModel; + if ( mQuery ) { + delete mQuery; + } // delete mRbl; // delete mViewByDialog; @@ -62,6 +74,7 @@ { if(parameters.keys().at(0).compare("Search Completed")==0) { + mStopRetryFlag = 1; // Retry mSearchLabel->hide(); mSearchIconLabel->hide(); @@ -75,43 +88,40 @@ } else { - device newDevice; + double cod = parameters.value(QString::number(TBluetoothDeviceDialog::EDeviceClass)).toDouble(); + int uiMajorDevice; + int uiMinorDevice; - // newDevice.mDeviceName = parameters.value("deviceName").toString(); - newDevice.mDeviceName = parameters.value(parameters.keys().at(0)).toString(); - - // newDevice.mDeviceType = parameters.value("deviceType").toString(); - newDevice.mDeviceIdx = mDeviceLstIdx; - - mDeviceList.append(newDevice); - mDeviceLstIdx++; - - QStringList info; - // if(!mViewByChosen) - { - info.append(newDevice.mDeviceName); - // info.append(newDevice.mDeviceType); - QStandardItem* listitem = new QStandardItem(); - listitem->setData(info, Qt::DisplayRole); + BtuiDevProperty::mapDeiveType(uiMajorDevice, uiMinorDevice, cod); + + BtSendDataItem devData; + devData[NameAliasRole] = QVariant(parameters.value(QString::number(TBluetoothDeviceDialog::EDeviceName)).toString()); + devData[ReadableBdaddrRole] = QVariant(parameters.value(QString::number(TBluetoothDialogParams::EAddress)).toString()); + devData[CoDRole] = QVariant(cod); + devData[DeviceTypeRole] = QVariant(uiMajorDevice); + setMajorProperty(devData,BtuiDevProperty::Bonded, + parameters.value("Bonded").toBool()); + setMajorProperty(devData,BtuiDevProperty::Blocked, + parameters.value("Blocked").toBool()); + setMajorProperty(devData,BtuiDevProperty::Trusted, + parameters.value("Trusted").toBool()); + setMajorProperty(devData,BtuiDevProperty::Connected, + parameters.value("Connected").toBool()); + mData.append(devData); - listitem->setIcon(icon()); - - mContentItemModel->appendRow(listitem); - } - /* else + if(mSelectedDeviceType & devData[DeviceTypeRole].toInt()) { - if(mDeviceTypeList[mSelectedType] == newDevice.mDeviceType) - { - info.append(newDevice.mDeviceName); - info.append(newDevice.mDeviceType); - QStandardItem* listitem = new QStandardItem(); - listitem->setData(info, Qt::DisplayRole); - - listitem->setIcon(icon(newDevice.mDeviceType)); - - mContentItemModel->appendRow(listitem); - } - }*/ + QStandardItem* listitem = new QStandardItem(); + QStringList info; + info.append(devData[NameAliasRole].toString()); + listitem->setData(info, Qt::DisplayRole); + HbIcon icon = getBadgedDeviceTypeIcon(devData[CoDRole].toDouble(), + devData[MajorPropertyRole].toInt(), + BtuiBottomLeft | BtuiBottomRight | BtuiTopLeft | BtuiTopRight); + listitem->setIcon(icon.qicon()); + mContentItemModel->appendRow(listitem); + mSelectedData.append(devData); + } } return true; @@ -168,7 +178,7 @@ mSearchLabel->setPlainText(LOC_SEARCHING_DEVICE); mSearchIconLabel = qobject_cast(mLoader->findWidget("iconLabel")); - mSearchIconLabel->setIcon(icon()); + mSearchIconLabel->setIcon(QIcon(QString(":/icons/qtg_large_bluetooth.svg"))); mSearchDoneLabel = qobject_cast(mLoader->findWidget("searchDoneLabel")); mSearchDoneLabel->hide(); @@ -190,13 +200,16 @@ // connect(mStopRetryBtn, SIGNAL(clicked()), this, SLOT(stopRetryClicked())); // connect(mViewByBtn, SIGNAL(clicked()), this, SLOT(viewByClicked())); - mViewByAction = static_cast( mLoader->findObject( "viewaction" ) ); - mViewByAction->disconnect(mSearchDevicesDialog); + mShowAction = static_cast( mLoader->findObject( "viewaction" ) ); + mShowAction->disconnect(mSearchDevicesDialog); mStopRetryAction = static_cast( mLoader->findObject( "stopretryaction" ) ); mStopRetryAction->disconnect(mSearchDevicesDialog); - connect(mViewByAction, SIGNAL(triggered()), this, SLOT(viewByClicked())); +// mCancelAction = static_cast( mLoader->findObject( "cancelaction" ) ); +// mCancelAction->disconnect(mSearchDevicesDialog); + + connect(mShowAction, SIGNAL(triggered()), this, SLOT(viewByClicked())); connect(mStopRetryAction, SIGNAL(triggered()), this, SLOT(stopRetryClicked())); connect(mSearchDevicesDialog, SIGNAL(aboutToClose()), this, SLOT(searchDialogClosed())); @@ -205,10 +218,16 @@ //setContentWidget(widget); } mSearchDevicesDialog->setBackgroundFaded(false); - mSearchDevicesDialog->setDismissPolicy(HbPopup::TapOutside); + mSearchDevicesDialog->setDismissPolicy(HbPopup::NoDismiss); mSearchDevicesDialog->setTimeout(HbPopup::NoTimeout); mSearchDevicesDialog->setAttribute(Qt::WA_DeleteOnClose); + mDevTypeList << hbTrId("txt_bt_list_audio_devices") + << hbTrId("txt_bt_list_computers") + << hbTrId("txt_bt_list_input_devices") + << hbTrId("txt_bt_list_phones") + << hbTrId("txt_bt_list_other_devices"); + /* mViewByDialog = new HbDialog(); mRbl = new HbRadioButtonList(mViewByDialog); connect(mRbl, SIGNAL(itemSelected(int)), this, SLOT(viewByItemSelected(int)));*/ @@ -216,20 +235,6 @@ return true; } -/*void BTDeviceSearchDialogWidget::hideEvent(QHideEvent *event) - { - // HbDialog::hideEvent(event); - QVariantMap val; - QVariant index(-1); - val.insert("selectedindex",index); - emit deviceDialogData(val); - emit deviceDialogClosed(); - } - -void BTDeviceSearchDialogWidget::showEvent(QShowEvent *event) - { - // HbDialog::showEvent(event); - }*/ void BTDeviceSearchDialogWidget::stopRetryClicked() { @@ -249,7 +254,7 @@ mSearchLabel->setAlignment(Qt::AlignHCenter); mSearchLabel->setPlainText(LOC_SEARCHING_DEVICE); - mSearchIconLabel->setIcon(icon()); + mSearchIconLabel->setIcon(QIcon(QString(":/icons/qtg_large_bluetooth.svg"))); mSearchLabel->show(); mSearchIconLabel->show(); @@ -292,58 +297,27 @@ void BTDeviceSearchDialogWidget::viewByClicked() { - QStringList list; - list << "Select all" << "Audio devices" << "Computers" << "Input devices" << "Phones" << "Other devices"; - - HbSelectionDialog *query = new HbSelectionDialog; - query->setStringItems(list); - query->setSelectionMode(HbAbstractItemView::MultiSelection); - - QList current; - current.append(QVariant(0)); - query->setSelectedItems(current); - - query->setAttribute(Qt::WA_DeleteOnClose); - - query->open(this,SLOT(selectionDialogClosed(HbAction*))); + + if ( !mQuery ) { + mQuery = new HbSelectionDialog; + mQuery->setStringItems(mDevTypeList, 0); + mQuery->setSelectionMode(HbAbstractItemView::MultiSelection); - //connect(query, SIGNAL(finished(HbAction*)), this, SLOT(selectionDialogClosed(HbAction*))); - -/* mViewByDialog->setDismissPolicy(HbPopup::NoDismiss); - mViewByDialog->setTimeout(HbPopup::NoTimeout); + QList current; + current.append(QVariant(0)); + mQuery->setSelectedItems(current); + + //todo need to check whether the dialog is destroyed without setting this flag + //if not destoryed then set this flag in the destructor and then delete it + +// mQuery->setAttribute(Qt::WA_DeleteOnClose); + // Set the heading for the dialog. + HbLabel *headingLabel = new HbLabel(hbTrId("txt_bt_title_show"), mQuery); + mQuery->setHeadingWidget(headingLabel); + } + mQuery->open(this,SLOT(selectionDialogClosed(HbAction*))); - bool foundEntry = false; - QStringList st; - st << "All"; - mDeviceTypeList.clear(); - for(int i = 0; i < mDeviceList.count(); i++) - { - for(int j = 0; j < mDeviceTypeList.count(); j++) - { - if(mDeviceTypeList[j] == mDeviceList[i].mDeviceType) - { - foundEntry = true; - break; - } - } - if(!foundEntry) - { - mDeviceTypeList.append(mDeviceList[i].mDeviceType); - } - foundEntry = false; - } - - for(int k = 0; k < mDeviceTypeList.count(); k++) - { - st << mDeviceTypeList[k]; - } - - mRbl->setItems(st); - mViewByDialog->setContentWidget(mRbl); - mViewByDialog->setMaximumHeight(300); - mViewByDialog->setMaximumWidth(500); - - mViewByDialog->show();*/ + } void BTDeviceSearchDialogWidget::searchDialogClosed() @@ -358,6 +332,49 @@ void BTDeviceSearchDialogWidget::selectionDialogClosed(HbAction* action) { Q_UNUSED(action); + + disconnect( mQuery ); + int devTypesWanted = 0; + + if (action == mQuery->actions().first()) { // user pressed "Ok" + // Get selected items. + QList selections; + selections = mQuery->selectedItems(); + + for (int i=0; i < selections.count(); i++) { + switch (selections.at(i).toInt()) { + case BtUiDevAudioDevice: + devTypesWanted |= BtuiDevProperty::AVDev; + break; + case BtUiDevComputer: + devTypesWanted |= BtuiDevProperty::Computer; + break; + case BtUiDevInputDevice: + devTypesWanted |= BtuiDevProperty::Peripheral; + break; + case BtUiDevPhone: + devTypesWanted |= BtuiDevProperty::Phone; + break; + case BtUiDevOtherDevice: + devTypesWanted |= (BtuiDevProperty::LANAccessDev | + BtuiDevProperty::Toy | + BtuiDevProperty::WearableDev | + BtuiDevProperty::ImagingDev | + BtuiDevProperty::HealthDev | + BtuiDevProperty::UncategorizedDev); + break; + default: + // should never get here + break; + } + } + } + else + { + devTypesWanted = mSelectedDeviceType; + } + + /* HbSelectionDialog *dlg = (HbSelectionDialog*)(sender()); if(dlg->actions().first() == action) { @@ -365,6 +382,34 @@ } else if(dlg->actions().at(1) == action) { }*/ + + if((devTypesWanted != mSelectedDeviceType) &&(devTypesWanted !=0)) + { + mSelectedDeviceType = devTypesWanted; +// mViewByChosen = true; + delete mContentItemModel; + mContentItemModel = new QStandardItemModel(this); + mListView->setModel(mContentItemModel); + mSelectedData.clear(); + for(int i=0;isetData(info, Qt::DisplayRole); + HbIcon icon = getBadgedDeviceTypeIcon(qtdev[CoDRole].toDouble(), + qtdev[MajorPropertyRole].toInt(), + BtuiBottomLeft | BtuiBottomRight | BtuiTopLeft | BtuiTopRight); + listitem->setIcon(icon.qicon()); + mContentItemModel->appendRow(listitem); + mSelectedData.append(qtdev); + } + } + } } void BTDeviceSearchDialogWidget::deviceSelected(const QModelIndex& modelIndex) @@ -382,109 +427,19 @@ } QVariantMap val; - QVariant index(row); - val.insert("selectedindex",index); +// QVariant index(row); +// val.insert("selectedindex",index); + + const BtSendDataItem& qtdev = mSelectedData.at(row); + val.insert("selectedindex",QVariant(row)); + val.insert("devicename",QVariant(qtdev[NameAliasRole])); + val.insert("deviceaddress",QVariant(qtdev[ReadableBdaddrRole])); + val.insert("deviceclass",QVariant(qtdev[CoDRole])); + emit deviceDialogData(val); // mDeviceDialogData = 1;//flag is to say that device dialog data is emitted required when we cancel the dialog //emit deviceDialogClosed(); // this->close(); } -//void BTDeviceSearchDialogWidget::viewByItemSelected(int index) - // { - // (void) index; - /* if(index == 0) - { - //Option 'All' selected - mViewByDialog->close(); - delete mContentItemModel; - mContentItemModel = new QStandardItemModel(this); - mListView->setModel(mContentItemModel); - mViewByChosen = false; - for(int i = 0; i < mDeviceList.count(); i++) - { - QStandardItem* listitem = new QStandardItem(); - - QStringList info; - info << mDeviceList[i].mDeviceName << mDeviceList[i].mDeviceType ; - listitem->setData(info, Qt::DisplayRole); - - //listitem->setIcon(icon(mDeviceList[i].mDeviceType)); - - mContentItemModel->appendRow(listitem); - } - } - else - { - index--; - mSelectedType = index; - mViewByDialog->close(); - - delete mContentItemModel; - mContentItemModel = new QStandardItemModel(this); - mListView->setModel(mContentItemModel); - - mDeviceLstOfType.clear(); - for(int i = 0; i < mDeviceList.count(); i++) - { - if(mDeviceList[i].mDeviceType == mDeviceTypeList[index]) - { - mDeviceLstOfType.append(mDeviceList[i]); - - QStandardItem* listitem = new QStandardItem(); - - QStringList info; - info << mDeviceList[i].mDeviceName << mDeviceTypeList[index]; - listitem->setData(info, Qt::DisplayRole); - - //listitem->setIcon(icon(mDeviceTypeList[index])); - - mContentItemModel->appendRow(listitem); - } - } - mViewByChosen = true; - }*/ - // } - -QIcon BTDeviceSearchDialogWidget::icon() - { - /* if(deviceType == "Audio") - { - return (QIcon(QString(":/icons/qgn_prop_bt_audio.svg"))); - } - else if(deviceType == "Car-kit") - { - return (QIcon(QString(":/icons/qgn_prop_bt_car_kit.svg"))); - } - else if(deviceType == "Computer") - { - return (QIcon(QString(":/icons/qgn_prop_bt_computer.svg"))); - } - else if(deviceType == "Headset") - { - return (QIcon(QString(":/icons/qgn_prop_bt_headset.svg"))); - } - else if(deviceType == "Keyboard") - { - return (QIcon(QString(":/icons/qgn_prop_bt_keyboard.svg"))); - } - else if(deviceType == "Mouse") - { - return (QIcon(QString(":/icons/qgn_prop_bt_mouse.svg"))); - } - else if(deviceType == "Phone") - { - return (QIcon(QString(":/icons/qgn_prop_bt_phone.svg"))); - } - else if(deviceType == "Printer") - { - return (QIcon(QString(":/icons/qgn_prop_bt_printer.svg"))); - } - else - { - return (QIcon(QString(":/icons/qgn_prop_bt_unknown.svg"))); - }*/ - return QIcon(QString(":/icons/qtg_large_bluetooth.svg")); - } - diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/src/btmoredevicesdialogwidget.cpp --- a/bluetoothengine/btnotif/btdevicedialogplugin/src/btmoredevicesdialogwidget.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btmoredevicesdialogwidget.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -15,14 +15,17 @@ * */ - +#include "btmoredevicesdialogwidget.h" #include #include #include #include #include #include -#include "btmoredevicesdialogwidget.h" +#include +#include +#include + const char* DOCML_BT_MORE_DEV_DIALOG = ":/docml/bt-more-devices-dialog.docml"; @@ -55,21 +58,46 @@ bool BTMoreDevicesDialogWidget::setDeviceDialogParameters(const QVariantMap ¶meters) { - QStandardItem* listitem = new QStandardItem(); - QStringList info; - // info.append(parameters.value("deviceName").toString()); - //info.append(parameters.value("deviceType").toString()); - info.append(parameters.value(parameters.keys().at(0)).toString()); + double cod = parameters.value(QString::number(TBluetoothDeviceDialog::EDeviceClass)).toDouble(); + int uiMajorDevice; + int uiMinorDevice; + + BtuiDevProperty::mapDeiveType(uiMajorDevice, uiMinorDevice, cod); + if ((uiMajorDevice & BtuiDevProperty::Phone)||(uiMajorDevice & BtuiDevProperty::Computer) ) + { + BtSendDataItem devData; + devData[NameAliasRole] = QVariant(parameters.value(QString::number(TBluetoothDeviceDialog::EDeviceName)).toString()); + devData[ReadableBdaddrRole] = QVariant(parameters.value(QString::number(TBluetoothDialogParams::EAddress)).toString()); + devData[CoDRole] = QVariant(cod); + + setMajorProperty(devData,BtuiDevProperty::Bonded, + parameters.value("Bonded").toBool()); + setMajorProperty(devData,BtuiDevProperty::Blocked, + parameters.value("Blocked").toBool()); + setMajorProperty(devData,BtuiDevProperty::Trusted, + parameters.value("Trusted").toBool()); + setMajorProperty(devData,BtuiDevProperty::Connected, + parameters.value("Connected").toBool()); + mData.append(devData); + + QStandardItem* listitem = new QStandardItem(); + QStringList info; + info.append(devData[NameAliasRole].toString()); + + listitem->setData(info, Qt::DisplayRole); + HbIcon icon = getBadgedDeviceTypeIcon(devData[CoDRole].toDouble(), + devData[MajorPropertyRole].toInt(), + BtuiBottomLeft | BtuiBottomRight | BtuiTopLeft | BtuiTopRight); + listitem->setIcon(icon.qicon()); + // listitem->setIcon(icon(parameters.value("deviceType").toString())); + + mContentItemModel->appendRow(listitem); + } + return true; + } - listitem->setData(info, Qt::DisplayRole); - listitem->setIcon(icon()); - // listitem->setIcon(icon(parameters.value("deviceType").toString())); - - mContentItemModel->appendRow(listitem); - return true; - } int BTMoreDevicesDialogWidget::deviceDialogError() const { @@ -213,8 +241,12 @@ { int row = modelIndex.row(); QVariantMap val; - QVariant index(row); - val.insert("selectedindex",index); +// QVariant index(row); + const BtSendDataItem& qtdev = mData.at(row); + val.insert("selectedindex",QVariant(row)); + val.insert("devicename",QVariant(qtdev[NameAliasRole])); + val.insert("deviceaddress",QVariant(qtdev[ReadableBdaddrRole])); + val.insert("deviceclass",QVariant(qtdev[CoDRole])); emit deviceDialogData(val); // mDeviceDialogData = 1;//flag is to say that device dialog data is emitted required when we cancel the dialog // this->close(); diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/src/btrecvcompleteddialogwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btrecvcompleteddialogwidget.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,202 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: BTRecvcompletedDialogWidget class declaration. +* +*/ + +#include +#include +#include +#include "btrecvcompleteddialogwidget.h" +#include "bluetoothdevicedialogs.h" + +const char* DOCML_BT_RECV_CMPLTD_DIALOG = ":/docml/bt-receive-done-dialog.docml"; +const qint64 KBluetoothMsgsConversationId = 0x01; + + +CoversationViewServiceStarter::CoversationViewServiceStarter(qint64 conversationId) +:mCnvId(conversationId) + { + + } + +CoversationViewServiceStarter::~CoversationViewServiceStarter() + { + + } + +void CoversationViewServiceStarter::run() + { + QList args; + QString serviceName("com.nokia.services.hbserviceprovider"); + QString operation("open(qint64)"); + XQAiwRequest* request; + XQApplicationManager appManager; + request = appManager.create(serviceName, "conversationview", operation, false); // not embedded + if ( request == NULL ) + { + return; + } + args << QVariant(mCnvId); + request->setArguments(args); + request->send(); + delete request; + } + + +BTRecvcompletedDialogWidget::BTRecvcompletedDialogWidget(const QVariantMap ¶meters) +{ + mLoader = 0; + constructDialog(parameters); +} + +BTRecvcompletedDialogWidget::~BTRecvcompletedDialogWidget() +{ + if(mLoader) + { + delete mLoader; + mLoader = NULL; + } +} + +bool BTRecvcompletedDialogWidget::setDeviceDialogParameters(const QVariantMap ¶meters) +{ + return true; +} + +int BTRecvcompletedDialogWidget::deviceDialogError() const +{ + return 0; +} + +void BTRecvcompletedDialogWidget::closeDeviceDialog(bool byClient) +{ + Q_UNUSED(byClient); + mDialog->close(); +} + +HbPopup* BTRecvcompletedDialogWidget::deviceDialogWidget() const +{ + return mDialog; +} + +QObject* BTRecvcompletedDialogWidget::signalSender() const +{ + return const_cast(this); +} + +bool BTRecvcompletedDialogWidget::constructDialog(const QVariantMap ¶meters) +{ + mLoader = new HbDocumentLoader(); + bool ok = false; + + mLoader->load(DOCML_BT_RECV_CMPLTD_DIALOG, &ok); + if(ok) + { + mDialog = qobject_cast(mLoader->findWidget("recvCompleteddialog")); + mHeading = qobject_cast(mLoader->findWidget("heading")); + + mFileName = qobject_cast(mLoader->findWidget("fileName")); + mFileSize = qobject_cast(mLoader->findWidget("fileSize")); + mFileCount = qobject_cast(mLoader->findWidget("fileCount_label")); + mFileCount->setVisible(false); + + //TODO - set icon based on the file icon. + + mShow = qobject_cast(mLoader->findObject("showaction")); + mCancel = qobject_cast(mLoader->findObject("cancelaction")); + + QString headingStr(hbTrId("txt_bt_title_received_from_1")); + QString senderName(parameters.value(QString::number(TBluetoothDeviceDialog::EDeviceName)).toString()); + mHeading->setPlainText(headingStr.arg(senderName)); + mDialog->setHeadingWidget(mHeading); + + mFileName->setPlainText(parameters.value(QString::number(TBluetoothDeviceDialog::EReceivingFileName)).toString()); + + mFileSz = parameters.value(QString::number(TBluetoothDeviceDialog::EReceivingFileSize)).toInt(); + + //Format the file size into a more readable format + if ( mFileSz >> 20 ) // size in MB + { + float sizeInMB = 0; + sizeInMB = ((float)mFileSz ) / (1024*1024); + QString fileSzMb; + fileSzMb.setNum(sizeInMB); + //TODO - check for localization + fileSzMb.append(QString(" Mb")); + mFileSize->setPlainText(fileSzMb); + } + + else if( mFileSz >> 10 ) // size in KB + { + TInt64 sizeInKB = 0; + sizeInKB = mFileSz >> 10; + QString fileSzKb; + fileSzKb.setNum(sizeInKB); + //TODO - check for localization + fileSzKb.append(QString(" Kb")); + mFileSize->setPlainText(fileSzKb); + } + + else // size is unknown or less than 1K + { + QString fileSzB; + fileSzB.setNum(mFileSz); + //TODO - check for localization + fileSzB.append(QString(" Bytes")); + mFileSize->setPlainText(fileSzB); + } + + //Set the received file count + int fCnt = parameters.value(QString::number(TBluetoothDeviceDialog::EReceivedFileCount)).toInt(); + if(fCnt > 1) + { + mFileCount->setVisible(true); + + QString fCntStr(hbTrId("txt_bt_info_ln_other_files_received", (fCnt-1))); + mFileCount->setPlainText(fCntStr); + } + } + + mDialog->setBackgroundFaded(false); + mDialog->setDismissPolicy(HbPopup::NoDismiss); + mDialog->setTimeout(HbPopup::NoTimeout); + + connect(mShow, SIGNAL(triggered()), this, SLOT(showClicked())); + connect(mCancel, SIGNAL(triggered()), this, SLOT(cancelClicked())); + + return true; +} + +void BTRecvcompletedDialogWidget::showClicked() +{ + CoversationViewServiceStarter* service = new CoversationViewServiceStarter(KBluetoothMsgsConversationId); + service->setAutoDelete(true); + + QThreadPool::globalInstance()->start(service); + + QVariantMap data; + data.insert(QString("actionResult"), QVariant(TBluetoothDialogParams::EShow)); + emit deviceDialogData(data); + emit deviceDialogClosed(); +} + +void BTRecvcompletedDialogWidget::cancelClicked() +{ + QVariantMap data; + data.insert(QString("actionResult"), QVariant(TBluetoothDialogParams::ECancelShow)); + emit deviceDialogData(data); + emit deviceDialogClosed(); +} + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/src/btrecvprgrsdialogwidget.cpp --- a/bluetoothengine/btnotif/btdevicedialogplugin/src/btrecvprgrsdialogwidget.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btrecvprgrsdialogwidget.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -118,6 +118,7 @@ sizeInMB = ((float)mFileSz ) / (1024*1024); QString fileSzMb; fileSzMb.setNum(sizeInMB); + //TODO - check for localization fileSzMb.append(QString(" Mb")); mFileSize->setPlainText(fileSzMb); } @@ -128,6 +129,7 @@ sizeInKB = mFileSz >> 10; QString fileSzKb; fileSzKb.setNum(sizeInKB); + //TODO - check for localization fileSzKb.append(QString(" Kb")); mFileSize->setPlainText(fileSzKb); } @@ -136,6 +138,7 @@ { QString fileSzB; fileSzB.setNum(mFileSz); + //TODO - check for localization fileSzB.append(QString(" Bytes")); mFileSize->setPlainText(fileSzB); } @@ -146,8 +149,8 @@ { mFileCount->setVisible(true); - QString fCntStr(hbTrId("txt_bt_info_ln_files_already_received")); - mFileCount->setPlainText(fCntStr.arg(fCnt)); + QString fCntStr(hbTrId("txt_bt_info_ln_files_already_received", fCnt)); + mFileCount->setPlainText(fCntStr); } } @@ -164,7 +167,7 @@ void BTRecvPrgrsDialogWidget::hideClicked() { QVariantMap data; - data.insert(QString("actionResult"), QVariant(true)); + data.insert(QString("actionResult"), QVariant(TBluetoothDialogParams::EHide)); emit deviceDialogData(data); emit deviceDialogClosed(); } @@ -172,7 +175,7 @@ void BTRecvPrgrsDialogWidget::cancelClicked() { QVariantMap data; - data.insert(QString("actionResult"), QVariant(false)); + data.insert(QString("actionResult"), QVariant(TBluetoothDialogParams::ECancelReceive)); emit deviceDialogData(data); emit deviceDialogClosed(); } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btdevicedialogplugin/src/btsenddialogwidget.cpp --- a/bluetoothengine/btnotif/btdevicedialogplugin/src/btsenddialogwidget.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btsenddialogwidget.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -15,14 +15,13 @@ * */ - +#include "btsenddialogwidget.h" #include #include #include #include #include #include -#include "btsenddialogwidget.h" #define LOC_SENDING_FILES_TO_DEVICE hbTrId("txt_bt_title_sending_file_l1l2_to_3") diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/inc/btnotifdeviceselector.h --- a/bluetoothengine/btnotif/btnotifsrv/inc/btnotifdeviceselector.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/inc/btnotifdeviceselector.h Wed Aug 18 09:59:05 2010 +0300 @@ -30,6 +30,7 @@ #include #include "bluetoothnotification.h" #include +#include class CBTNotifServer; class CAdvanceDevDiscoverer; @@ -154,7 +155,18 @@ TBluetoothDialogParams::TBTDialogType aType, TBTDialogResourceId aResourceId ); - void LoadUsedDevicesL(); + void LoadUsedDevicesL(); + + void AddDataL(CHbSymbianVariantMap* aMap, const TDesC& aKey, const TAny* aData, + CHbSymbianVariant::TType aDataType); + + void setMajorProperty(TInt aMajorProperty, TInt prop, TBool addto); + + TBool isBonded( const CBTDevice &dev ); + + CBtDevExtension* GetDeviceFromRepositoryL( const TBTDevAddr& addr ); + + void SendSelectedDeviceL( CHbSymbianVariantMap& aData ); private: // data @@ -176,9 +188,9 @@ CAdvanceDevDiscoverer* iDiscoverer; /** - * do not own the elements in the array. + * own's the elements in the array. */ - RPointerArray iDevices; + RDevExtensionArray iDevices; /** * The message for a pending device selection request from a RNotifier client. diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/inc/btnotifoutgoingpairinghandler.h --- a/bluetoothengine/btnotif/btnotifsrv/inc/btnotifoutgoingpairinghandler.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/inc/btnotifoutgoingpairinghandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -23,7 +23,11 @@ #include #include "btnotifclientserver.h" #include "btnotifBasePairingHandler.h" +#include +#include "btnotificationresult.h" +#include "bluetoothdevicedialogs.h" +class CBluetoothNotification; enum TBTOutgoingPairMode { @@ -53,7 +57,8 @@ * * @since Symbian^4 */ -NONSHARABLE_CLASS( CBTNotifOutgoingPairingHandler ) : public CBTNotifBasePairingHandler +NONSHARABLE_CLASS( CBTNotifOutgoingPairingHandler ) : public CBTNotifBasePairingHandler, + public MBTNotificationResult { public: @@ -70,8 +75,36 @@ * Destructor */ ~CBTNotifOutgoingPairingHandler(); + -private: // From CBTEngPairBase + // from base class MBTNotificationResult + + /** + * From MBTNotificationResult. + * Handle an intermediate result from a user query. + * This function is called if the user query passes information + * back before it has finished i.e. is dismissed. The final acceptance/ + * denial of a query is passed back in MBRNotificationClosed. + * + * @since Symbian^4 + * @param aData the returned data. The actual format + * is dependent on the actual notifier. + */ + virtual void MBRDataReceived( CHbSymbianVariantMap& aData ); + + /** + * From MBTNotificationResult. + * The notification is finished. The resulting data (e.g. user input or + * acceptance/denial of the query) is passed back here. + * + * @since Symbian^4 + * @param aErr KErrNone or one of the system-wide error codes. + * @param aData the returned data. The actual format + * is dependent on the actual notifier. + */ + virtual void MBRNotificationClosed( TInt aError, const TDesC8& aData ); + +private: /** * Start observing the result of pairing which was originated from @@ -153,6 +186,27 @@ void HandleError( CBtSimpleActive* aActive, TInt aError ); private: + /** + * Get a notification and configure it according to the current operation. + * + * @since Symbian^4 + * @param aType The notification type. + * @param aResourceId Identifier for the resource to display. + */ + void PrepareNotificationL( TBluetoothDialogParams::TBTDialogType aType, + TBTDialogResourceId aResourceId ); + + /** + * Handle the result from a notification that is finished. + * + * @since Symbian^4 + * @param aErr KErrNone or one of the system-wide error codes. + * @param aData The returned data. The actual format + * is dependent on the actual notifier. + */ + void NotificationClosedL( TInt aError, const TDesC8& aData ); + +private: /** * C++ default constructor @@ -169,6 +223,16 @@ */ void DoPairingL(); + /** + * Ask the user to retry pairing. + */ + void ShowPairingRetryDialog(); + + /** + * Tell the user the pairing failed. + */ + void ShowPairingFailureDialog(); + private: // data /** @@ -200,6 +264,17 @@ * the current pairing mode this class is in */ TBTOutgoingPairMode iPairMode; + + /** + * Pointer to an outstanding user interaction. + * Not own. + */ + CBluetoothNotification* iNotification; + + /** + * Number of pairing attempt + */ + TInt iPairingAttempt; }; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/src/btnotifbasepairinghandler.cpp --- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifbasepairinghandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifbasepairinghandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -138,7 +138,7 @@ TBTDialogResourceId resourceId = EPairingSuccess; if(KErrNone != aResult) { - resourceId = EPairingFailure; + resourceId = EPairingFailureOk; } notification->SetNotificationType( TBluetoothDialogParams::ENote, resourceId ); const CBtDevExtension* dev = iParent.BTDevRepository().Device(iAddr); diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/src/btnotifdeviceselector.cpp --- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifdeviceselector.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifdeviceselector.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -20,7 +20,6 @@ #include #include #include -#include #include "btnotifdeviceselector.h" #include "btnotifserver.h" @@ -174,7 +173,7 @@ void CBTNotifDeviceSelector::MBRDataReceived( CHbSymbianVariantMap& aData ) { TInt err = KErrCancel; - if(aData.Keys().MdcaPoint(0).Compare(_L("selectedindex"))==KErrNone) + if(aData.Keys().MdcaPoint(aData.Keys().MdcaCount()-1).Compare(_L("selectedindex"))==KErrNone) { TInt val = *(static_cast(aData.Get(_L("selectedindex"))->Data())); BOstrace1( TRACE_DEBUG, TNAME_DEVLIST_2, "MBRDataReceived, val %d", val ); @@ -185,10 +184,11 @@ TBTDeviceResponseParamsPckg devParams; if ( val > -1 && val < iDevices.Count() ) { - devParams().SetDeviceAddress( iDevices[val]->Addr() ); + TRAP(err,SendSelectedDeviceL(aData)); + /* devParams().SetDeviceAddress( iDevices[val]->Addr() ); devParams().SetDeviceClass(iDevices[val]->Device().DeviceClass()); devParams().SetDeviceName(iDevices[val]->Alias()); - err = iMessage.Write( EBTNotifSrvReplySlot, devParams ); + err = iMessage.Write( EBTNotifSrvReplySlot, devParams );*/ iNotification->RemoveObserver(); iNotification->Close(); // Also dequeues the notification from the queue. iNotification = NULL; @@ -242,22 +242,61 @@ const TInquirySockAddr& aAddr, const TDesC& aName ) { // Todo: look for this device in repository before creating it. - CBtDevExtension* devext = CBtDevExtension::NewLC( aAddr, aName ); + TBuf addr; + + + + CBtDevExtension* devext = GetDeviceFromRepositoryL(aAddr.BTAddr()); + + if(!devext) + { + devext = CBtDevExtension::NewLC( aAddr, aName ); + } + else + { + CleanupStack::PushL(devext); + } iDevices.AppendL( devext ); - CleanupStack::Pop( devext ); + CleanupStack::Pop( devext ); if(iNotification) {// conditional check required as CAdvanceDevDiscoverer sends discovered devices at times // even after canceldiscovery is issued and notification is set to NULL // this causes EExcDataAbort CHbSymbianVariantMap* map = iNotification->Data(); - TBuf keyStr; +/* TBuf keyStr; CHbSymbianVariant* devEntry; keyStr.Num( TBluetoothDialogParams::EDialogExt + iDevices.Count() - 1 ); devEntry = CHbSymbianVariant::NewL( (TAny*) &(devext->Alias()), CHbSymbianVariant::EDes ); - map->Add( keyStr, devEntry ); + map->Add( keyStr, devEntry );*/ + + User::LeaveIfError(iNotification->SetData(TBluetoothDeviceDialog::EDeviceName, + devext->Alias())); + + devext->Addr().GetReadable(addr); + User::LeaveIfError(iNotification->SetData(TBluetoothDialogParams::EAddress,addr)); + + TInt classOfDevice; + classOfDevice = devext->Device().DeviceClass().DeviceClass(); + User::LeaveIfError(iNotification->SetData(TBluetoothDeviceDialog::EDeviceClass,classOfDevice)); + + TBool status; + status = isBonded( devext->Device()); + + // setMajorProperty(majorProperty, _L("Bonded"), isBonded( devArray[i]->Device() )); + AddDataL(map,_L("Bonded"),&status,CHbSymbianVariant::EBool); + status = devext->Device().GlobalSecurity().Banned(); + AddDataL(map,_L("Blocked"),&status, + CHbSymbianVariant::EBool); + status = devext->Device().GlobalSecurity().NoAuthorise(); + AddDataL(map,_L("Trusted"),&status, + CHbSymbianVariant::EBool); + status = devext->ServiceConnectionStatus() == EBTEngConnected; + AddDataL(map,_L("Connected"),&status, + CHbSymbianVariant::EBool); + iNotification->Update(); } } @@ -371,6 +410,7 @@ void CBTNotifDeviceSelector::LoadUsedDevicesL() { const RDevExtensionArray& devArray= iServer.DevRepository().AllDevices(); + TBuf addr; for(TInt i=0; i< devArray.Count(); i++ ) { const TTime& usedTime = devArray[i]->Device().Used(); @@ -381,14 +421,118 @@ { iDevices.AppendL( devArray[i]->CopyL() ); CHbSymbianVariantMap* map = iNotification->Data(); - TBuf keyStr; - CHbSymbianVariant* devEntry; + // TBuf keyStr; + // CHbSymbianVariant* devEntry; - keyStr.Num( TBluetoothDialogParams::EDialogExt + iDevices.Count() - 1 ); - devEntry = CHbSymbianVariant::NewL( (TAny*) &(devArray[i]->Alias()), - CHbSymbianVariant::EDes ); - map->Add( keyStr, devEntry ); + // keyStr.Num( TBluetoothDialogParams::EDialogExt + iDevices.Count() - 1 ); +// devEntry = CHbSymbianVariant::NewL( (TAny*) &(devArray[i]->Alias()), + // CHbSymbianVariant::EDes ); + // map->Add( keyStr, devEntry, ); + User::LeaveIfError(iNotification->SetData(TBluetoothDeviceDialog::EDeviceName, + devArray[i]->Alias())); +// AddDataL(map,keyStr,&(devArray[i]->Alias()),CHbSymbianVariant::EDes); + devArray[i]->Addr().GetReadable(addr); + User::LeaveIfError(iNotification->SetData(TBluetoothDialogParams::EAddress,addr)); + addr.Zero(); + TInt classOfDevice; + classOfDevice = devArray[i]->Device().DeviceClass().DeviceClass(); + User::LeaveIfError(iNotification->SetData(TBluetoothDeviceDialog::EDeviceClass,classOfDevice)); + + TBool status; + status = isBonded( devArray[i]->Device()); + + // setMajorProperty(majorProperty, _L("Bonded"), isBonded( devArray[i]->Device() )); + AddDataL(map,_L("Bonded"),&status,CHbSymbianVariant::EBool); + status = devArray[i]->Device().GlobalSecurity().Banned(); + AddDataL(map,_L("Blocked"),&status, + CHbSymbianVariant::EBool); + status = devArray[i]->Device().GlobalSecurity().NoAuthorise(); + AddDataL(map,_L("Trusted"),&status, + CHbSymbianVariant::EBool); + status = devArray[i]->ServiceConnectionStatus() == EBTEngConnected; + AddDataL(map,_L("Connected"),&status, + CHbSymbianVariant::EBool); + // set blocked status: +/* setMajorProperty(majorProperty, BtuiDevProperty::Blocked, + devArray[i]->Device().GlobalSecurity().Banned() ); + // set trusted status: + setMajorProperty(majorProperty, BtuiDevProperty::Trusted, + devArray[i]->Device().GlobalSecurity().NoAuthorise() ); + // set connected status: + // EBTEngConnecting is an intermediate state between connected and not-connected, + // we do not treat it as connected: + setMajorProperty(majorProperty, BtuiDevProperty::Connected, devArray[i]->ServiceConnectionStatus() == EBTEngConnected); + + */ + + // AddDataL(map,keyStr,&(devArray[i]->Alias()),CHbSymbianVariant::EDes); iNotification->Update(); } } } + + + +/*! + Tells if the given device is bonded. +*/ +TBool CBTNotifDeviceSelector::isBonded( const CBTDevice &dev ) +{ + // todo: this has not addresses Just Works pairing mode yet. + return dev.IsValidPaired() && dev.IsPaired() && + dev.LinkKeyType() != ELinkKeyUnauthenticatedUpgradable; +} + +void CBTNotifDeviceSelector::AddDataL(CHbSymbianVariantMap* aMap, const TDesC& aKey, + const TAny* aData, CHbSymbianVariant::TType aDataType) + { + CHbSymbianVariant* value = CHbSymbianVariant::NewL(aData, aDataType); + CleanupStack::PushL( value ); + User::LeaveIfError( aMap->Add( aKey, value ) ); // aMap takes the ownership of value + CleanupStack::Pop( value ); + } + +// --------------------------------------------------------------------------- +// Tells if these two instances are for the same remote device +// --------------------------------------------------------------------------- +// +TBool MatchDeviceAddress(const TBTDevAddr* aAddr, const CBtDevExtension& aDev) + { + return *aAddr == aDev.Device().BDAddr(); + } + + +CBtDevExtension* CBTNotifDeviceSelector::GetDeviceFromRepositoryL( const TBTDevAddr& aAddr ) +{ + const RDevExtensionArray& devArray= iServer.DevRepository().AllDevices(); + + TInt pos = devArray.Find( aAddr, MatchDeviceAddress); + if(pos > -1) + { + return devArray[pos]->CopyL(); + } + return NULL; +/* addrSymbianToReadbleString( addrStr, addr ); + for (int i = 0; i < mData.count(); ++i ) { + if ( mData.at( i ).value( BtDeviceModel::ReadableBdaddrRole ) + == addrStr ) { + return i; + } + } + return -1;*/ +} + + +void CBTNotifDeviceSelector::SendSelectedDeviceL( CHbSymbianVariantMap& aData ) + { + TInt err; + TBTDeviceResponseParamsPckg devParams; + TBTDevAddr address; + User::LeaveIfError(address.SetReadable( + *(static_cast(aData.Get(_L("deviceaddress"))->Data())))); + devParams().SetDeviceAddress( address ); + devParams().SetDeviceClass(*(static_cast(aData.Get(_L("deviceclass"))->Data()))); + devParams().SetDeviceName(*(static_cast(aData.Get(_L("devicename"))->Data()))); + User::LeaveIfError(iMessage.Write( EBTNotifSrvReplySlot, devParams )); + } + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/src/btnotifoutgoingpairinghandler.cpp --- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifoutgoingpairinghandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifoutgoingpairinghandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -20,10 +20,21 @@ #include #include "btnotifsecuritymanager.h" #include "bluetoothtrace.h" +#include "bluetoothnotification.h" +#include "btnotifserver.h" +#include "btnotifconnectiontracker.h" +#include "btnotificationmanager.h" /** Length of the default PIN. */ const TInt KDefaultHeadsetPinLength = 4; +/** Maximum repeated outgoing pairing attempt. + * if the pairing fails the UI specs says + * we can ask twice the user if he/she want + * to retry pairing. + */ +const TInt KMaxRepeatedPairingAttempt = 2; + enum TPairingStageId { /** @@ -84,6 +95,7 @@ { BaseConstructL(); User::LeaveIfError( iTimer.CreateLocal() ); + iPairingAttempt = KMaxRepeatedPairingAttempt; } // --------------------------------------------------------------------------- @@ -113,14 +125,22 @@ iBondingSession.Close(); iSocket.Close(); iTimer.Close(); + if( iNotification ) + { + // Clear the notification callback, we cannot receive them anymore. + iNotification->RemoveObserver(); + iNotification->Close(); // Also dequeues the notification from the queue. + iNotification = NULL; + } } // --------------------------------------------------------------------------- // Simply deny the request as this is handing outgoing pairing // --------------------------------------------------------------------------- // -TInt CBTNotifOutgoingPairingHandler::ObserveIncomingPair( const TBTDevAddr& /*aAddr*/ ) +TInt CBTNotifOutgoingPairingHandler::ObserveIncomingPair( const TBTDevAddr& aAddr ) { + (void)aAddr; return KErrServerBusy; } @@ -136,7 +156,6 @@ // we don't allow another pairing request. User::Leave( KErrServerBusy ); } - iAddr = aAddr; iCod = TBTDeviceClass( aCod ); UnSetPairResult(); @@ -161,6 +180,14 @@ { BOstraceFunctionEntry0( DUMMY_DEVLIST ); iParent.RenewPairingHandler( NULL ); + if( iNotification ) + { + // Cancel the user query + // This will also unregister us from the notification. + TInt err = iNotification->Close(); + NOTIF_NOTHANDLED( !err ) + iNotification = NULL; + } } @@ -185,7 +212,7 @@ const TUint8 KZeroPinValue = '0'; for (TInt i = 0; i < KDefaultHeadsetPinLength; ++i) { - aPin().iPIN[i] = KZeroPinValue; + aPin().iPIN[i] = KZeroPinValue; } aPin().iLength = KDefaultHeadsetPinLength; } @@ -202,6 +229,14 @@ { iParent.OutgoingPairCompleted( KErrCancel ); iParent.RenewPairingHandler( NULL ); + if( iNotification ) + { + // Cancel the user query + // This will also unregister us from the notification. + TInt err = iNotification->Close(); + NOTIF_NOTHANDLED( !err ) + iNotification = NULL; + } } } @@ -296,8 +331,23 @@ } if ( aStatus ) { - iParent.OutgoingPairCompleted( aStatus ); - } + // retry pairing + if(aStatus && iPairingAttempt > 0) + { + if(aActive->RequestId() == EGeneralBondingRetry && iPairMode == EBTOutgoingHeadsetManualPairing) + { + // Headset pairing failed, reset and try again from auto pairing + iActive->SetRequestId(EGeneralBonding); + } + iPairingAttempt --; + ShowPairingRetryDialog(); + } + else + { + iPairingAttempt --; + ShowPairingFailureDialog(); + } + } } } @@ -344,6 +394,14 @@ (void) aActive; iParent.OutgoingPairCompleted( aError ); iParent.RenewPairingHandler( NULL ); + if( iNotification ) + { + // Cancel the user query + // This will also unregister us from the notification. + TInt err = iNotification->Close(); + NOTIF_NOTHANDLED( !err ) + iNotification = NULL; + } } // --------------------------------------------------------------------------- @@ -390,3 +448,106 @@ BOstraceFunctionExit0( DUMMY_DEVLIST ); } +// --------------------------------------------------------------------------- +// From class MBTNotificationResult. +// Handle a result from a user query. +// --------------------------------------------------------------------------- +// +void CBTNotifOutgoingPairingHandler::MBRDataReceived( CHbSymbianVariantMap& aData ) + { + BOstraceFunctionEntry0( DUMMY_DEVLIST ); + (void) aData; + BOstraceFunctionExit0( DUMMY_DEVLIST ); + } + +// --------------------------------------------------------------------------- +// From class MBTNotificationResult. +// The notification is finished. +// --------------------------------------------------------------------------- +// +void CBTNotifOutgoingPairingHandler::MBRNotificationClosed( TInt aError, const TDesC8& aData ) + { + BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aError ); + // First unregister from the notification, so we can already get the next one. + iNotification->RemoveObserver(); + iNotification = NULL; + TRAP_IGNORE( NotificationClosedL( aError, aData ) ); + BOstraceFunctionExit1( DUMMY_DEVLIST, this ); + } + +// --------------------------------------------------------------------------- +// Get and configure a notification. +// --------------------------------------------------------------------------- +// +void CBTNotifOutgoingPairingHandler::PrepareNotificationL( TBluetoothDialogParams::TBTDialogType aType, + TBTDialogResourceId aResourceId ) + { + BOstraceFunctionEntry0( DUMMY_DEVLIST ); + iNotification = + iParent.ConnectionTracker().NotificationManager()->GetNotification(); + User::LeaveIfNull( iNotification ); // For OOM exception, leaves with KErrNoMemory + iNotification->SetObserver( this ); + iNotification->SetNotificationType( aType, aResourceId ); + const CBtDevExtension* dev = iParent.BTDevRepository().Device(iAddr); + if(dev) + { + User::LeaveIfError(iNotification->SetData( TBluetoothDeviceDialog::EDeviceName, dev->Alias())); + } + else + { + TBTDeviceName name; + iAddr.GetReadable(name); + User::LeaveIfError(iNotification->SetData( TBluetoothDeviceDialog::EDeviceName, name)); + NOTIF_NOTHANDLED( !err ) + } + iParent.ConnectionTracker().NotificationManager()->QueueNotificationL( iNotification); + NOTIF_NOTHANDLED( !err ) + BOstraceFunctionExit0( DUMMY_DEVLIST ); + } + +// --------------------------------------------------------------------------- +// The notification is finished, handle the result. +// --------------------------------------------------------------------------- +// +void CBTNotifOutgoingPairingHandler::NotificationClosedL( TInt aError, const TDesC8& aData ) + { + BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aError ); + // Read the result. + TPckgC result( EFalse ); + result.Set( aData.Ptr(), result.Length() ); // Read the part containing the result + // Set a pointer descriptor to capture the remaining data, if any. + TPtrC8 dataPtr( aData.Mid( result.Length() ) ); + + if(result() && iPairingAttempt >= 0) + { + HandleOutgoingPairL(iAddr,iCod.DeviceClass()); + } + else + { + iPairingAttempt = KMaxRepeatedPairingAttempt; // reset the counter + iParent.OutgoingPairCompleted( KErrCancel ); + iParent.RenewPairingHandler( NULL ); + } + BOstraceFunctionExit1( DUMMY_DEVLIST, this ); + } + +// --------------------------------------------------------------------------- +// Show a dialog to ask the user to retry the pairing +// --------------------------------------------------------------------------- +// +void CBTNotifOutgoingPairingHandler::ShowPairingRetryDialog() + { + PrepareNotificationL( TBluetoothDialogParams::EQuery, EPairingFailureRetry); + } + +// --------------------------------------------------------------------------- +// Show a dialog to tell the user pairing retry attempt failed +// --------------------------------------------------------------------------- +// +void CBTNotifOutgoingPairingHandler::ShowPairingFailureDialog() + { + PrepareNotificationL( TBluetoothDialogParams::EQuery, EPairingFailureOk ); + } + + + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/src/btnotifpairnotifier.cpp --- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifpairnotifier.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifpairnotifier.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -196,7 +196,7 @@ // in pairing manager for this device: iParent.GetPinCode( pinCode, iRemote, iMinPinLength ); } - if ( pinCode().iLength != 0 ) + if ( pinCode().iLength > 0 ) { // a pin is ready for this pairing. // write it back to client (stack) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/src/btnotifsecuritymanager.cpp --- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifsecuritymanager.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifsecuritymanager.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -445,6 +445,7 @@ { // make sure not to leave any text as PIN. aPin.Zero(); + aPin().iLength = 0; } } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/btnotifsrv/src/btnotifserviceauthorizer.cpp --- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifserviceauthorizer.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/btnotifsrv/src/btnotifserviceauthorizer.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -25,7 +25,6 @@ #include "bluetoothnotification.h" #include "btnotifconnectiontracker.h" #include "btnotificationmanager.h" -#include "bluetoothnotification.h" #include "btnotifserver.h" #include "btnotifutil.h" diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btnotif/inc/bluetoothdevicedialogs.h --- a/bluetoothengine/btnotif/inc/bluetoothdevicedialogs.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btnotif/inc/bluetoothdevicedialogs.h Wed Aug 18 09:59:05 2010 +0300 @@ -39,7 +39,8 @@ EBlockUnpairedDevice, EBlockPairedDevice, EPairingSuccess, - EPairingFailure, + EPairingFailureRetry, + EPairingFailureOk, EVisibilityTimeout, EUnpairedDevice, EUnusedResource // The last ID @@ -68,7 +69,9 @@ ESend, EGlobalNotif, EUserAuthorization, - EReceiveProgress + EReceiveProgress, + ETransferFailed, + EReceiveDone }; /** Enumeration for the notification parameters data type to be configured. */ @@ -88,7 +91,18 @@ EReceive, EReceiveFromPairedDevice, EConnect, - EPairingRequest + EPairingRequest, + ERecvFailed, + ESendFailed, + EReceiveCompleted + }; + + enum TDialogActionType + { + EHide, + EShow, + ECancelReceive, + ECancelShow }; inline TBluetoothDialogParams(); diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/btrcc/inc/btrccVolumeLevelControllerBase.h --- a/bluetoothengine/btsac/btrcc/inc/btrccVolumeLevelControllerBase.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/btrcc/inc/btrccVolumeLevelControllerBase.h Wed Aug 18 09:59:05 2010 +0300 @@ -89,7 +89,7 @@ void Reset(); // Reset the volume level. - TInt GetLocalMaxVolume(); + TInt GetLocalMaxVolumeL(); TInt GetCurrentLocalVolume(); diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/btrcc/src/btrccAbsoluteVolumeLevelController.cpp --- a/bluetoothengine/btsac/btrcc/src/btrccAbsoluteVolumeLevelController.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/btrcc/src/btrccAbsoluteVolumeLevelController.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -67,7 +67,7 @@ { TRACE_FUNC CBTRCCVolumeLevelControllerBase::ConstructL(); - iLocalMaxVolume = GetLocalMaxVolume(); + iLocalMaxVolume = GetLocalMaxVolumeL(); iInterfaceSelector = &aInterfaceSelector; iRemConAbsoluteVolumeController = CRemConAbsoluteVolumeController::NewL(aInterfaceSelector, diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/btrcc/src/btrccLegacyVolumeLevelController.cpp --- a/bluetoothengine/btsac/btrcc/src/btrccLegacyVolumeLevelController.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/btrcc/src/btrccLegacyVolumeLevelController.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -80,7 +80,7 @@ TRACE_INFO((_L("CBTRCCActive created"))) iCtrlRTimer.CreateLocal(); TRACE_INFO((_L("RTimer created"))) - iLocalMaxVolume = GetLocalMaxVolume(); + iLocalMaxVolume = GetLocalMaxVolumeL(); } // ----------------------------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/btrcc/src/btrccLinker.cpp --- a/bluetoothengine/btsac/btrcc/src/btrccLinker.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/btrcc/src/btrccLinker.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -86,14 +86,35 @@ iRegisterVolumeChangeNotificationCounter = 0; if (iAccObserver.IsAvrcpVolCTSupported()) { - iAbsoluteVolController = CBTRCCAbsoluteVolumeLevelController::NewL(*iInterfaceSelector, *this); - TRACE_INFO((_L("CBTRCCLinker::ConstructL, absolute volume controller created."))) + TInt err = KErrNone; + TRAP(err, iAbsoluteVolController = CBTRCCAbsoluteVolumeLevelController::NewL(*iInterfaceSelector, *this)); + if( err ) + { + // Absolute volume controller creation failed, this means that we don't have volume controller + // but continue construct linker. + iAbsoluteVolController = NULL; + TRACE_INFO((_L("CBTRCCLinker::ConstructL, absolute volume controller creation failed %d, continue anyway."), err)) + } + else + { + TRACE_INFO((_L("CBTRCCLinker::ConstructL, absolute volume controller created."))) + } // If also legacy is configured into use, prepare to use it with legacy devices. if(iAccObserver.IsAvrcpLegacyVolCTSupported()) { - iLegacyVolController = CBTRCCLegacyVolumeLevelController::NewL(*iInterfaceSelector, *this); - TRACE_INFO((_L("CBTRCCLinker::ConstructL, legacy volume controller created."))) + TRAP(err, iLegacyVolController = CBTRCCLegacyVolumeLevelController::NewL(*iInterfaceSelector, *this)); + if( err ) + { + // Legacy volume controller creation failed, this means that we don't have volume controller + // but continue construct linker. + iLegacyVolController = NULL; + TRACE_INFO((_L("CBTRCCLinker::ConstructL, legacy volume controller creation failed %d, continue anyway."), err)) + } + else + { + TRACE_INFO((_L("CBTRCCLinker::ConstructL, legacy volume controller created."))) + } } } else @@ -108,7 +129,7 @@ iRemConBatteryTgt = CRemConBatteryApiTarget::NewL(*iInterfaceSelector, *this); - if (iAccObserver.IsAvrcpVolCTSupported()) + if (iAbsoluteVolController || iLegacyVolController) { iInterfaceSelector->OpenControllerL(); } @@ -445,6 +466,12 @@ // absolute controller or legacy controller. if(!iVolController) { + // iAbsoluteVolController may be NULL, if creation of devsound has + // been failed or local max volume provided by devsound is zero. + + // iLegacyVolController may be NULL, depends on the configuration and + // if creation of devsound has been failed or local max volume provided + // by devsound is zero. if (iAccObserver.IsAbsoluteVolumeSupported(iRemoteAddr)) { iVolController = iAbsoluteVolController; @@ -452,7 +479,7 @@ } else { - iVolController = iLegacyVolController; // iLegacyVolController may be NULL, depends on the configuration. + iVolController = iLegacyVolController; } } } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/btrcc/src/btrccVolumeLevelControllerBase.cpp --- a/bluetoothengine/btsac/btrcc/src/btrccVolumeLevelControllerBase.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/btrcc/src/btrccVolumeLevelControllerBase.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -122,23 +122,21 @@ } // ----------------------------------------------------------------------------- -// CBTRCCVolumeLevelControllerBase::GetLocalMaxVolume +// CBTRCCVolumeLevelControllerBase::GetLocalMaxVolumeL // ----------------------------------------------------------------------------- // -TInt CBTRCCVolumeLevelControllerBase::GetLocalMaxVolume() +TInt CBTRCCVolumeLevelControllerBase::GetLocalMaxVolumeL() { TRACE_FUNC - if(iLocalMaxVolume == 0) + // fetch max volume from adaptation and cache it. + CMMFDevSound* devSound = CMMFDevSound::NewL(); + iLocalMaxVolume = devSound->MaxVolume(); + TRACE_INFO((_L("Maximum volume is %d"), iLocalMaxVolume)) + delete devSound; // This is not needed for anything else. + if( iLocalMaxVolume <= 0 ) { - // fetch max volume from adaptation and cache it. - CMMFDevSound* devSound = NULL; - TRAPD( err, devSound = CMMFDevSound::NewL() ); - if(!err) - { - iLocalMaxVolume = devSound->MaxVolume(); - TRACE_INFO((_L("Maximum volume is %d"), iLocalMaxVolume)) - delete devSound; // This is not needed for anything else. - } + TRACE_INFO((_L("Error, Maximum volume value is invalid"))) + User::Leave(KErrNotSupported); } return iLocalMaxVolume; } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/inc/btsaController.h --- a/bluetoothengine/btsac/inc/btsaController.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/inc/btsaController.h Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -239,6 +239,7 @@ CBtsacActive* iGavdpErrorActive; TBTDevAddr iRemoteAddr; + TBool iNotifiedObserverOfNewAccessory; TInt iSBCSEPIndex; // SBC SEP Index in iRemoteSEPs array TBool iResetAudioInput; TRequestStatus* iConnectStatus; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/inc/btsacStateListening.h --- a/bluetoothengine/btsac/inc/btsacStateListening.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/inc/btsacStateListening.h Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -40,7 +40,9 @@ public: - static CBtsacListening* NewL(CBTSAController& aParent, TBTSACGavdpResetReason aGavdpResetReason, TInt aDisconnectReason); + static CBtsacListening* NewL(CBTSAController& aParent, + TBTSACResetGavdp aResetGavdp = EDontResetGavdp, + TInt aDisconnectReason = KErrNone); virtual ~CBtsacListening(); @@ -117,15 +119,14 @@ private: - CBtsacListening(CBTSAController& aParent, TBTSACGavdpResetReason aGavdpResetReason, TInt aDisconnectReason); + CBtsacListening(CBTSAController& aParent, TBTSACResetGavdp aResetGavdp, TInt aDisconnectReason); void ConstructL(); private: - TBTSACGavdpResetReason iGavdpResetReason; + TBTSACResetGavdp iResetGavdp; TInt iDisconnectReason; TInt iPendingRequests; TBTInitProcedure iInitializationProcedure; - TBool iUnfinishedGavdpError; /** * AO for self completing. @@ -134,4 +135,4 @@ }; #endif // C_BTSACLISTENING_H - \ No newline at end of file + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/inc/btsacdefs.h --- a/bluetoothengine/btsac/inc/btsacdefs.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/inc/btsacdefs.h Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -57,10 +57,10 @@ EStreamConfiguredBySink }; -enum TBTSACGavdpResetReason +enum TBTSACResetGavdp { - EGavdpResetReasonNone, - EGavdpResetReasonGeneral + EDontResetGavdp, + EResetGavdp }; //Panic codes diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsaController.cpp --- a/bluetoothengine/btsac/src/btsaController.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsaController.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -448,11 +448,16 @@ void CBTSAController::NewAccessory(const TBTDevAddr& aAddr) { TRACE_FUNC - TInt connectedProfiles = Observer().ConnectionStatus( aAddr ); - if( !(connectedProfiles & EStereo) ) - { - Observer().NewAccessory( aAddr, EStereo ); - } + TRACE_INFO((_L("\tiNotifiedObserverOfNewAccessory = %d"), iNotifiedObserverOfNewAccessory)) + if ( !iNotifiedObserverOfNewAccessory ) + { + TInt connectedProfiles = Observer().ConnectionStatus( aAddr ); + if( !(connectedProfiles & EStereo) ) + { + Observer().NewAccessory( aAddr, EStereo ); + iNotifiedObserverOfNewAccessory = ETrue; + } + } } // ----------------------------------------------------------------------------- @@ -462,7 +467,12 @@ void CBTSAController::DisconnectedFromRemote(const TBTDevAddr& aAddr, TInt /*aError*/) { TRACE_FUNC - Observer().AccessoryDisconnected(aAddr, EStereo ); + TRACE_INFO((_L("\tiNotifiedObserverOfNewAccessory = %d"), iNotifiedObserverOfNewAccessory)) + if ( iNotifiedObserverOfNewAccessory ) + { + Observer().AccessoryDisconnected(aAddr, EStereo ); + iNotifiedObserverOfNewAccessory = EFalse; + } } // ----------------------------------------------------------------------------- @@ -533,6 +543,11 @@ // void CBTSAController::SetRemoteAddr(const TBTDevAddr& aRemoteAddr) { +#ifdef PRJ_ENABLE_TRACE + TBuf<12> buf; + aRemoteAddr.GetReadable(buf); + TRACE_INFO((_L("CBTSAController::SetRemoteAddr aRemoteAddr = %S"), &buf)) +#endif iRemoteAddr = aRemoteAddr; } @@ -542,6 +557,11 @@ // TBTDevAddr CBTSAController::GetRemoteAddr() const { +#ifdef PRJ_ENABLE_TRACE + TBuf<12> buf; + iRemoteAddr.GetReadable(buf); + TRACE_INFO((_L("CBTSAController::GetRemoteAddr iRemoteAddr = %S"), &buf)) +#endif return iRemoteAddr; } @@ -615,7 +635,7 @@ } else { - TRAPD(err, ChangeStateL(CBtsacListening::NewL(*this, EGavdpResetReasonGeneral, EFalse))); + TRAPD(err, ChangeStateL(CBtsacListening::NewL(*this, EResetGavdp, KErrNone))); if (err) { TRACE_INFO((_L("CBTSAController::NotifyError() Couldn't change state."))) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacState.cpp --- a/bluetoothengine/btsac/src/btsacState.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacState.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -50,7 +50,7 @@ CBtsacState* CBtsacState::ErrorOnEntryL(TInt /*aReason*/) { TRACE_FUNC - return CBtsacListening::NewL(iParent, EGavdpResetReasonNone, KErrNone); + return CBtsacListening::NewL(iParent); } // ----------------------------------------------------------------------------- @@ -221,7 +221,7 @@ { TRACE_INFO((_L("CBtsacState::GAVDP_AbortStreamConfirm(), state %d"), GetStateIndex())) Parent().CompletePendingRequests(KCompleteAllReqs, KErrAbort); - TRAPD(err, Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected))); + TRAPD(err, Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected))); if (err) { TRACE_INFO((_L("CBtsacState::GAVDP_AbortStreamConfirm() Couldn't change state."))) @@ -333,7 +333,7 @@ TRACE_INFO((_L("CBtsacState::GAVDP_AbortIndication(), state %d, SEID:%d"), GetStateIndex(), aSEID.SEID())) (void)aSEID; Parent().CompletePendingRequests(KCompleteAllReqs, KErrDisconnected); - TRAPD(err, Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected))) + TRAPD(err, Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected))) if(err) { TRACE_INFO((_L("CBtsacState::GAVDP_AbortIndication(), error! Couldn't change state"))) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateAborting.cpp --- a/bluetoothengine/btsac/src/btsacStateAborting.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateAborting.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -76,7 +76,7 @@ { TRACE_FUNC Parent().CompletePendingRequests(KCompleteAllReqs, aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected)); } // End of File diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateConfigured.cpp --- a/bluetoothengine/btsac/src/btsacStateConfigured.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateConfigured.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -173,7 +173,7 @@ { TRACE_FUNC Parent().CompletePendingRequests(KOpenAudioReq, aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, aError)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, aError)); } // ----------------------------------------------------------------------------- @@ -237,7 +237,7 @@ Parent().CompletePendingRequests(KDisconnectReq, KErrNone); // Cancel all other requests Parent().CompletePendingRequests(KCompleteAllReqs, KErrCancel); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrNone)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrNone)); } // ----------------------------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateConfiguring.cpp --- a/bluetoothengine/btsac/src/btsacStateConfiguring.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateConfiguring.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -110,7 +110,7 @@ { TRACE_FUNC Parent().CompletePendingRequests((KConnectReq | KOpenAudioReq), aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, aError)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, aError)); } // ----------------------------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateConnected.cpp --- a/bluetoothengine/btsac/src/btsacStateConnected.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateConnected.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -184,7 +184,7 @@ TRACE_FUNC StopTimer(); Parent().CompletePendingRequests((KConnectReq | KOpenAudioReq), aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, aError)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, aError)); } // ----------------------------------------------------------------------------- @@ -552,7 +552,7 @@ TRACE_INFO((_L("[SOCKET] created."))) Parent().iStreamingSockets.Append(aNewSocket); Parent().CompletePendingRequests(KCompleteAllReqs, KErrCancel); - TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrNone))); + TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrNone))); } } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateConnecting.cpp --- a/bluetoothengine/btsac/src/btsacStateConnecting.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateConnecting.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -81,7 +81,7 @@ { TRACE_FUNC Parent().CompletePendingRequests((KConnectReq | KOpenAudioReq), aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, aError)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, aError)); } // ----------------------------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateIdle.cpp --- a/bluetoothengine/btsac/src/btsacStateIdle.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateIdle.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -102,7 +102,7 @@ void CBtsacIdle::GAVDP_ConfigurationConfirm() { TRACE_INFO((_L("CBtsacIdle::GAVDP_ConfigurationConfirm() Local SEPs registered successfully."))) - TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonNone, KErrNone))); + TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent()))); } // ----------------------------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateListening.cpp --- a/bluetoothengine/btsac/src/btsacStateListening.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateListening.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -35,9 +35,10 @@ // ----------------------------------------------------------------------------- // CBtsacListening* CBtsacListening::NewL(CBTSAController& aParent, - TBTSACGavdpResetReason aGavdpResetReason, TInt aDisconnectReason) + TBTSACResetGavdp aResetGavdp, + TInt aDisconnectReason) { - CBtsacListening* self = new( ELeave ) CBtsacListening(aParent, aGavdpResetReason, aDisconnectReason); + CBtsacListening* self = new( ELeave ) CBtsacListening(aParent, aResetGavdp, aDisconnectReason); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(self); @@ -49,10 +50,10 @@ // ----------------------------------------------------------------------------- // CBtsacListening::CBtsacListening(CBTSAController& aParent, - TBTSACGavdpResetReason aGavdpResetReason, TInt aDisconnectReason) -: CBtsacState(aParent, EStateListening), iGavdpResetReason(aGavdpResetReason), + TBTSACResetGavdp aResetGavdp, TInt aDisconnectReason) +: CBtsacState(aParent, EStateListening), iResetGavdp(aResetGavdp), iDisconnectReason(aDisconnectReason), iPendingRequests(KRequestNone), - iInitializationProcedure(EInitProcedureOngoing), iUnfinishedGavdpError(EFalse) + iInitializationProcedure(EInitProcedureOngoing) { } @@ -262,12 +263,13 @@ case KRequestIdSelfComplete: { TBTDevAddr remoteAddr = Parent().GetRemoteAddr(); - if(iUnfinishedGavdpError) - { - // We have unfinished gavdp error, force gavdp reset - iGavdpResetReason = EGavdpResetReasonGeneral; - } - if(iGavdpResetReason != EGavdpResetReasonNone) +#ifdef PRJ_ENABLE_TRACE + TBuf<12> buf; + remoteAddr.GetReadable(buf); + TRACE_INFO((_L("\tremoteAddr = %S"), &buf)) +#endif + TRACE_INFO((_L("\tiResetGavdp = %d"), iResetGavdp)) + if(iResetGavdp == EResetGavdp) { ResetGavdp(); } @@ -275,11 +277,12 @@ { GoListen(); } - if((iDisconnectReason == KErrDisconnected || iDisconnectReason == KErrHCILinkDisconnection) && - iPendingRequests == KRequestNone) + TRACE_INFO((_L("\tiPendingRequests = %d"), iPendingRequests)) + if(iPendingRequests == KRequestNone) { if(remoteAddr != TBTDevAddr()) { + TRACE_INFO((_L("\tcalling DisconnectedFromRemote with iDisconnectReason = %d"), iDisconnectReason)) Parent().DisconnectedFromRemote(remoteAddr, iDisconnectReason); } Parent().SetResetAudioInput(ETrue); @@ -397,7 +400,7 @@ if(iInitializationProcedure != EInitProcedureDone) { TRACE_INFO((_L("CBtsacListening::HandleGavdpErrorL() error ignored, initialization procedure ongoing."))) - iUnfinishedGavdpError = ETrue; + iResetGavdp = EResetGavdp; return; } switch(aError) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateStreaming.cpp --- a/bluetoothengine/btsac/src/btsacStateStreaming.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateStreaming.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -99,7 +99,7 @@ TRACE_INFO((_L("CBtsacStreaming::Cancel() iStreamer.StopStream() returned error(%d) !!!"), ret)) } Parent().CompletePendingRequests(KCompleteAllReqs, aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, aError)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, aError)); } // ----------------------------------------------------------------------------- @@ -151,7 +151,7 @@ TRACE_FUNC // For safety sake complete all pending requests Parent().CompletePendingRequests(KCompleteAllReqs, KErrNone); - TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected))); + TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected))); } @@ -171,7 +171,7 @@ { TRACE_INFO((_L("CBtsacStreaming::StartRecording() Couldn't abort stream."))) } - TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected))); + TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected))); } } @@ -188,7 +188,7 @@ TRACE_INFO((_L("CBtsacStreaming::DisconnectL() StopStream() returned error: %d"), ret)) } Parent().CompletePendingRequests(KDisconnectReq, ret); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrNone)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrNone)); } // ----------------------------------------------------------------------------- @@ -220,7 +220,7 @@ // It is possible the remote disconnected while we have active close audio request. Parent().CompletePendingRequests(KCompleteAllReqs, KErrNone); - TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected))); + TRAP_IGNORE(Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected))); } // ----------------------------------------------------------------------------- @@ -339,7 +339,7 @@ else { Parent().CompletePendingRequests(KCompleteAllReqs, aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected)); } break; } @@ -347,7 +347,7 @@ case KErrDisconnected: // -36 { Parent().CompletePendingRequests(KCompleteAllReqs, aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, aError)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, aError)); break; } default: @@ -355,7 +355,7 @@ // Unknown error. For safety's sake let's disconnect a2dp link and inform btaudioman TRACE_INFO((_L("CBtsacStreaming::HandleGavdpErrorL() Unknown error, goes to listening"))) Parent().CompletePendingRequests(KCompleteAllReqs, aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, KErrDisconnected)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, KErrDisconnected)); break; } } diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsac/src/btsacStateSuspended.cpp --- a/bluetoothengine/btsac/src/btsacStateSuspended.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsac/src/btsacStateSuspended.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -87,7 +87,7 @@ { TRACE_FUNC Parent().CompletePendingRequests(KOpenAudioReq, aError); - Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EGavdpResetReasonGeneral, aError)); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), EResetGavdp, aError)); } // ----------------------------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btsap/src/BTSapSniffHandler.cpp --- a/bluetoothengine/btsap/src/BTSapSniffHandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btsap/src/BTSapSniffHandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -98,7 +98,7 @@ if(iIsLinkAdapterOpen) { // Start the sniffer timer - BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Starting the sniff timer %d µsec"), KSniffInterval)); + BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] CBTSapSniffHandler::Enable: Starting the sniff timer %d microseconds"), KSniffInterval)); Cancel(); After(KSniffInterval); diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpplugin.cpp --- a/bluetoothengine/btui/btcpplugin/btcpplugin.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpplugin.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -15,9 +15,8 @@ * */ - +#include "btcpplugin.h" #include -#include "btcpplugin.h" #include "btcpuisettingitem.h" /*! diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuidevicedetail.cpp --- a/bluetoothengine/btui/btcpplugin/btcpuidevicedetail.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuidevicedetail.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -23,6 +23,7 @@ #include #include + BtCpUiDeviceDetail::BtCpUiDeviceDetail(QObject *parent) : QObject(parent), mDeviceDetailView(0) { @@ -31,7 +32,6 @@ BtCpUiDeviceDetail::~BtCpUiDeviceDetail() { - notifyViewStatusToPlugins(AboutToClose); clearDeviceDetailList(); delete mDeviceDetailView; } @@ -57,8 +57,9 @@ delete interfaces.at(i); } + createDeviceDetailsView(deviceName); notifyDeviceDetailStatus(); - createDeviceDetailsView(deviceName); + } void BtCpUiDeviceDetail::appendDeviceToList(BtAbstractDevSetting *devSetting) @@ -84,6 +85,7 @@ void BtCpUiDeviceDetail::handleSettingChange(BtAbstractDevSetting *setting, bool available) { QList::iterator i; + for (i = mDeviceDetailList.begin(); i != mDeviceDetailList.end(); ++i) { if((setting == (*i).mSetting) && mDeviceDetailView) { (*i).mSettingAvailable = available; @@ -99,10 +101,9 @@ else { if((*i).mSettingForm) { //remove widget - //todo: In case if no items are there close this view - //and disable device settings button. mDeviceDetailView->removeItem((*i).mSettingForm); - (*i).mSettingForm = 0; + (*i).mSettingForm = 0; + checkDeviceDetailSettings(); } } notifyDeviceDetailStatus(); @@ -111,6 +112,25 @@ } +void BtCpUiDeviceDetail::checkDeviceDetailSettings() +{ + QList::const_iterator i; + bool devicedetail = false; + + for (i = mDeviceDetailList.constBegin(); i != mDeviceDetailList.constEnd(); ++i) { + if((*i).mSettingForm) { + devicedetail = true; + break; + } + } + //If no setting is available and current view is device detail + //view move to previous view. + if((!devicedetail) && (mMainWindow->currentView() == mDeviceDetailView)) { + mMainWindow->removeView(mDeviceDetailView); + mMainWindow->setCurrentView( mPreviousView ); + } +} + void BtCpUiDeviceDetail::notifyDeviceDetailStatus() { QList::const_iterator i; @@ -156,7 +176,6 @@ mDeviceDetailView->addItem((*i).mSettingForm); } } - } void BtCpUiDeviceDetail::loadDeviceDetailsView() @@ -203,4 +222,9 @@ } +void BtCpUiDeviceDetail::sendCloseEvent() +{ + notifyViewStatusToPlugins(AboutToClose); +} + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuidevicedetail.h --- a/bluetoothengine/btui/btcpplugin/btcpuidevicedetail.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuidevicedetail.h Wed Aug 18 09:59:05 2010 +0300 @@ -46,7 +46,9 @@ void loadDeviceDetailPlugins(QString deviceAddress, QString deviceName); void loadDeviceDetailsView(); - + + void sendCloseEvent(); + signals: void deviceSettingsChanged(bool settingAvailable); @@ -66,6 +68,7 @@ void notifyDeviceDetailStatus(); void createDeviceDetailsView(QString deviceName); void notifyViewStatusToPlugins(BtCpUiDeviceDetail::NotifyType type); + void checkDeviceDetailSettings(); private: diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuidevicedetailsview.cpp --- a/bluetoothengine/btui/btcpplugin/btcpuidevicedetailsview.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuidevicedetailsview.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -14,6 +14,7 @@ * Description: BtCpUiDeviceDetailsView implementation * */ +#include "btcpuidevicedetailsview.h" #include #include #include @@ -23,7 +24,6 @@ #include #include #include -#include "btcpuidevicedetailsview.h" // docml to load const char* BTUI_DEVICEDETAILSVIEW_DOCML = ":/docml/bt-device-details-view.docml"; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuidevicedetailsview.h --- a/bluetoothengine/btui/btcpplugin/btcpuidevicedetailsview.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuidevicedetailsview.h Wed Aug 18 09:59:05 2010 +0300 @@ -14,8 +14,8 @@ * Description: BtCpUiDeviceDetailsView declaration */ -#ifndef BTCPUIDEVICEDETAILSVIEW_H_ -#define BTCPUIDEVICEDETAILSVIEW_H_ +#ifndef BTCPUIDEVICEDETAILSVIEW_H +#define BTCPUIDEVICEDETAILSVIEW_H #include #include @@ -50,4 +50,4 @@ Q_DISABLE_COPY(BtCpUiDeviceDetailsView) }; -#endif /* BTCPUIDEVICEDETAILSVIEW_H_ */ +#endif /* BTCPUIDEVICEDETAILSVIEW_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuideviceview.cpp --- a/bluetoothengine/btui/btcpplugin/btcpuideviceview.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuideviceview.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -52,8 +52,8 @@ BtDeviceModel &deviceModel, QGraphicsItem *parent) : BtCpUiBaseView(settingModel,deviceModel,parent), - mPairedStatus(false), mConnectedStatus(false), mTrustedStatus(false), mBlockedStatus(false), - mConnectable(false), mAbstractDelegate(0), mDeviceDetail(0) + mPairedStatus(false), mConnectedStatus(false),mPreviousConnectedStatus(false), mTrustedStatus(false), + mBlockedStatus(false), mConnectable(false), mAbstractDelegate(0), mDeviceDetail(0) { mDeviceIndex = QModelIndex();//is it needed to initialize mIndex??? @@ -187,16 +187,46 @@ { BTUI_ASSERT_X(mMainView, "BtCpUiSearchView::switchToPreviousView", "invalid mMainView"); mMainView->switchToPreviousView(); - delete mDeviceDetail; - mDeviceDetail = 0; + + if(mDeviceDetail) { + mDeviceDetail->sendCloseEvent(); + } + unloadDeviceDetails(); +} + +void BtCpUiDeviceView::loadDeviceDetails() +{ + bool ret(false); + + unloadDeviceDetails(); + + mDeviceDetail = new BtCpUiDeviceDetail(); + + ret=connect(mDeviceDetail, SIGNAL(deviceSettingsChanged(bool)), + this, SLOT(handleDeviceSettingsChange(bool))); + BTUI_ASSERT_X( ret, "Btui, BtCpUiDeviceView::loadDeviceDetails", "deviceSettingsChanged() connect failed"); + + mDeviceDetail->loadDeviceDetailPlugins(mDeviceBdAddr.toString(), mDeviceName->text()); +} + +void BtCpUiDeviceView::unloadDeviceDetails() +{ + if(mDeviceDetail) { + disconnect(mDeviceDetail); + delete mDeviceDetail; + mDeviceDetail = 0; + } } void BtCpUiDeviceView::activateView( const QVariant& value, bool fromBackButton ) { + Q_UNUSED( fromBackButton ); + mConnectedStatus = false; setSoftkeyBack(); + QModelIndex index = value.value(); mDeviceBdAddr = (mDeviceModel->data(index, BtDeviceModel::ReadableBdaddrRole)); @@ -205,31 +235,24 @@ updateDeviceData(); mDeviceSetting->setVisible(false); - - mDeviceDetail = new BtCpUiDeviceDetail(); - + bool ret(false); ret=connect(mDeviceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(updateDeviceData())); BTUI_ASSERT_X( ret, "Btui, BtCpUiDeviceView::activateView", "dataChanged() connect failed"); - ret=connect(mDeviceDetail, SIGNAL(deviceSettingsChanged(bool)), - this, SLOT(handleDeviceSettingsChange(bool))); - BTUI_ASSERT_X( ret, "Btui, BtCpUiDeviceView::activateView", "deviceSettingsChanged() connect failed"); - - - mDeviceDetail->loadDeviceDetailPlugins(mDeviceBdAddr.toString(), mDeviceName->text()); - } void BtCpUiDeviceView::handleDeviceSettingsChange(bool status) { - mDeviceSetting->setVisible(status); + mDeviceSetting->setVisible(status); } void BtCpUiDeviceView::handleDeviceSetting() { - mDeviceDetail->loadDeviceDetailsView(); + if(mDeviceDetail) { + mDeviceDetail->loadDeviceDetailsView(); + } } void BtCpUiDeviceView::deactivateView() @@ -257,13 +280,15 @@ mDeviceIcon->clear(); mDeviceCategory->clear(); mDeviceStatus->clear(); - + mConnectable = false; + /* mPairedStatus = false; mConnectedStatus = false; mTrustedStatus = false; mBlockedStatus = false; mConnectable = false; + */ } void BtCpUiDeviceView::updateDeviceData() @@ -355,6 +380,8 @@ */ void BtCpUiDeviceView::updateStatusVariables(int majorRole) { + mPreviousConnectedStatus = mConnectedStatus; + if (majorRole & BtuiDevProperty::Trusted ) { mTrustedStatus = true; } @@ -369,6 +396,10 @@ } if (majorRole & BtuiDevProperty::Connected) { mConnectedStatus = true; + if (!mPreviousConnectedStatus){ + //Loading device detail plugins after successfull connection. + loadDeviceDetails(); + } } else { mConnectedStatus = false; @@ -402,6 +433,7 @@ if (mConnectable) { + mConnect_Disconnect->setVisible(true); mConnect_Disconnect->setStretched(true); if (mConnectedStatus) { @@ -539,8 +571,6 @@ delete mAbstractDelegate; mAbstractDelegate = 0; } - - } void BtCpUiDeviceView::disconnectDevice() @@ -582,9 +612,14 @@ disconnect(mAbstractDelegate); delete mAbstractDelegate; mAbstractDelegate = 0; - } - - + } +} + +void BtCpUiDeviceView::setPrevBtDeviceName() +{ + QString deviceName = (mDeviceModel->data(mDeviceIndex, + BtDeviceModel::NameAliasRole)).toString(); + mDeviceName->setText(deviceName); } void BtCpUiDeviceView::changeBtDeviceName(){ @@ -609,6 +644,9 @@ connect( mAbstractDelegate, SIGNAL(commandCompleted(int, QVariant)), this, SLOT(changeDevNameDelegateCompleted(int, QVariant)) ); mAbstractDelegate->exec(params); } + else { + setPrevBtDeviceName(); + } } @@ -620,7 +658,7 @@ mDeviceName->setText(param.toString()); } else { - //setPrevBtLocalName(); + setPrevBtDeviceName(); } //TODO:Error handling has to be done. if (mAbstractDelegate) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuideviceview.h --- a/bluetoothengine/btui/btcpplugin/btcpuideviceview.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuideviceview.h Wed Aug 18 09:59:05 2010 +0300 @@ -78,7 +78,10 @@ void setConnectionCombobox(); void setTextAndVisibilityOfButtons(); void updateStatusVariables(int majorRole); - + void loadDeviceDetails(); + void unloadDeviceDetails(); + void setPrevBtDeviceName(); + private: HbDocumentLoader *mLoader; //HbGroupBox *mGroupBox; @@ -113,6 +116,7 @@ //true-> device is connected; false -> device is disconnected bool mConnectedStatus; + bool mPreviousConnectedStatus; bool mTrustedStatus; bool mBlockedStatus; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuimainview.cpp --- a/bluetoothengine/btui/btcpplugin/btcpuimainview.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuimainview.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -34,6 +34,7 @@ #include #include #include +#include #include "btcpuisearchview.h" #include "btcpuideviceview.h" #include @@ -144,24 +145,23 @@ ret = connect(mPairAction, SIGNAL(triggered()), this, SLOT(pairActionTriggered())); BTUI_ASSERT_X( ret, "bt-main-view", "pair action can't connect" ); - mGroupBox = qobject_cast( mLoader->findWidget( "groupBox" ) ); - BTUI_ASSERT_X( mGroupBox != 0, "bt-main-view", "Group Box not found" ); + mDataForm = qobject_cast( mLoader->findWidget( "dataForm" ) ); + BTUI_ASSERT_X( mDataForm != 0, "bt-main-view", "dataForm not found" ); - //*********************Testing device view START****************************// - HbAction *removePairedDevices = static_cast( mLoader->findObject( "removePairedDevices" ) ); - BTUI_ASSERT_X( removePairedDevices, "bt-main-view", "remove action missing" ); - //ret = connect(removePairedDevices, SIGNAL(triggered()), this, SLOT(goToDeviceView())); - //BTUI_ASSERT_X( ret, "bt-main-view", "orientation toggle can't connect" ); - - - - //*********************Testing device view END****************************// // load menu HbMenu *optionsMenu = qobject_cast(mLoader->findWidget("viewMenu")); BTUI_ASSERT_X( optionsMenu != 0, "bt-main-view", "Options menu not found" ); this->setMenu(optionsMenu); + HbMenu *menu = this->menu(); + mRemovePairedDevices = menu->addAction(hbTrId("txt_bt_opt_remove_paired_devices")); + + mSubMenu = new HbMenu(hbTrId("txt_bt_opt_remove")); + mSubMenu->addAction(hbTrId("txt_bt_opt_remove_sub_all_devices")); + mSubMenu->addAction(hbTrId("txt_bt_opt_remove_sub_paired_devices")); + mSubMenu->addAction(hbTrId("txt_bt_opt_remove_sub_blocked_devices")); + // update display when setting data changed ret = connect(mSettingModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(updateSettingItems(QModelIndex,QModelIndex))); @@ -183,14 +183,13 @@ mMainFilterModel = new BtuiModelSortFilter(this); mMainFilterModel->setSourceModel( mDeviceModel ); + mDeviceList->setModel(mMainFilterModel); updateDeviceListFilter(BtuiPaired); // List view item BtCpUiMainListViewItem *prototype = new BtCpUiMainListViewItem(mDeviceList); prototype->setModelSortFilter(mMainFilterModel); mDeviceList->setItemPrototype(prototype); - mDeviceList->setModel(mMainFilterModel); - } /*! @@ -204,6 +203,7 @@ if (mAbstractDelegate) { delete mAbstractDelegate; } + } /*! @@ -214,6 +214,9 @@ Q_UNUSED(value); Q_UNUSED(fromBackButton); + //Reset the device list when returning to the view, as it may have been invalidated by the device view + mMainFilterModel->setSourceModel( mDeviceModel ); + mDeviceList->setModel(mMainFilterModel); } /*! @@ -321,11 +324,18 @@ void BtCpUiMainView::allActionTriggered() { + HbMenu *menu = this->menu(); + menu->removeAction(mRemovePairedDevices); + mRemoveDevices = menu->addMenu( mSubMenu ); + updateDeviceListFilter(BtuiAll); } void BtCpUiMainView::pairActionTriggered() { + HbMenu *menu = this->menu(); + menu->removeAction(mRemoveDevices); + mRemovePairedDevices = menu->addAction(hbTrId("txt_bt_opt_remove_paired_devices")); updateDeviceListFilter(BtuiPaired); } @@ -335,7 +345,7 @@ switch (filter) { case BtuiAll: - mGroupBox->setHeading(hbTrId("txt_bt_subhead_bluetooth_all_devices")); + mDataForm->setHeading(hbTrId("txt_bt_subhead_bluetooth_all_devices")); mPairAction->setEnabled(true); mAllAction->setEnabled(false); mMainFilterModel->addDeviceMajorFilter( @@ -344,7 +354,7 @@ break; case BtuiPaired: - mGroupBox->setHeading(hbTrId("txt_bt_subhead_bluetooth_paired_devices")); + mDataForm->setHeading(hbTrId("txt_bt_subhead_bluetooth_paired_devices")); mPairAction->setEnabled(false); mAllAction->setEnabled(true); mMainFilterModel->addDeviceMajorFilter( diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuimainview.h --- a/bluetoothengine/btui/btcpplugin/btcpuimainview.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuimainview.h Wed Aug 18 09:59:05 2010 +0300 @@ -32,6 +32,7 @@ class BtAbstractDelegate; class HbListView; class HbGroupBox; +class HbDataForm; class BtCpUiMainView : public BtCpUiBaseView { @@ -118,6 +119,9 @@ HbAction *mAllAction; HbAction *mPairAction; - HbGroupBox *mGroupBox; + HbDataForm *mDataForm; + HbAction* mRemovePairedDevices; + HbAction* mRemoveDevices; + HbMenu* mSubMenu; }; #endif // BTCPUIMAINVIEW_H diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp --- a/bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -49,12 +50,14 @@ bool ret(false); mQuery = 0; + mLoader = 0; + mSoftKeyBackAction = 0; + mMainView = (BtCpUiMainView *) parent; - mMainWindow = hbInstance->allMainWindows().first(); mSoftKeyBackAction = new HbAction(Hb::BackNaviAction, this); - BTUI_ASSERT_X(mSoftKeyBackAction, "BtCpUiBaseView::BtCpUiBaseView", "can't create back action"); + BTUI_ASSERT_X(mSoftKeyBackAction, "BtCpUiSearchView::BtCpUiSearchView", "can't create back action"); // Create view for the application. // Set the name for the view. The name should be same as the view's @@ -62,6 +65,7 @@ setObjectName("bt_search_view"); mLoader = new HbDocumentLoader(); + BTUI_ASSERT_X( mLoader != 0, "BtCpUiSearchView::BtCpUiSearchView", "can't create mLoader" ); // Pass the view to documentloader. Document loader uses this view // when docml is parsed, instead of creating new view. QObjectList objectList; @@ -83,21 +87,21 @@ mDeviceIcon=0; // can't use qobject_cast since HbIcon is not derived from QObject! mDeviceIcon = qobject_cast( mLoader->findWidget( "icon" ) ); - BTUI_ASSERT_X( mDeviceIcon != 0, "bt-search-view", "Device Icon not found" ); + BTUI_ASSERT_X( mDeviceIcon != 0, "BtCpUiSearchView::BtCpUiSearchView", "Device Icon not found" ); - mLabelFoundDevices=0; - mLabelFoundDevices = qobject_cast( mLoader->findWidget( "label_found_devices" ) ); - BTUI_ASSERT_X( mLabelFoundDevices != 0, "bt-search-view", "Found Devices not found" ); - mLabelFoundDevices->setPlainText(hbTrId("txt_bt_subhead_bluetooth_found_devices")); + mDataForm=0; + mDataForm = qobject_cast( mLoader->findWidget( "dataForm" ) ); + BTUI_ASSERT_X( mDataForm != 0, "BtCpUiSearchView::BtCpUiSearchView", "dataForm not found" ); + mDataForm->setHeading(hbTrId("txt_bt_subhead_bluetooth_found_devices")); mLabelSearching=0; mLabelSearching = qobject_cast( mLoader->findWidget( "label_searching" ) ); - BTUI_ASSERT_X( mLabelSearching != 0, "bt-search-view", "Searching not found" ); + BTUI_ASSERT_X( mLabelSearching != 0, "BtCpUiSearchView::BtCpUiSearchView", "Searching not found" ); mLabelSearching->setPlainText(hbTrId("txt_bt_subhead_searching")); mDeviceList=0; mDeviceList = qobject_cast( mLoader->findWidget( "deviceList" ) ); - BTUI_ASSERT_X( mDeviceList != 0, "bt-search-view", "Device List not found" ); + BTUI_ASSERT_X( mDeviceList != 0, "BtCpUiSearchView::BtCpUiSearchView", "Device List not found" ); mDeviceList->setSelectionMode( HbAbstractItemView::SingleSelection ); @@ -107,10 +111,10 @@ if (mOrientation == Qt::Horizontal) { mLoader->load(BTUI_SEARCHVIEW_DOCML, "landscape_ui", &ok); - BTUI_ASSERT_X( ok, "bt-search-view", "Invalid docml file: landscape section problem" ); + BTUI_ASSERT_X( ok, "BtCpUiSearchView::BtCpUiSearchView", "Invalid docml file: landscape section problem" ); } else { mLoader->load(BTUI_SEARCHVIEW_DOCML, "portrait_ui", &ok); - BTUI_ASSERT_X( ok, "bt-search-view", "Invalid docml file: portrait section problem" ); + BTUI_ASSERT_X( ok, "BtCpUiSearchView::BtCpUiSearchView", "Invalid docml file: portrait section problem" ); } // listen for orientation changes @@ -120,38 +124,30 @@ // load tool bar actions mViewBy = static_cast( mLoader->findObject( "viewByAction" ) ); - BTUI_ASSERT_X( mViewBy, "bt-search-view", "view by action missing" ); + BTUI_ASSERT_X( mViewBy, "BtCpUiSearchView::BtCpUiSearchView", "view by action missing" ); ret = connect(mViewBy, SIGNAL(triggered()), this, SLOT(viewByDeviceTypeDialog())); - BTUI_ASSERT_X( ret, "bt-search-view", "viewByAction can't connect" ); + BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "viewByAction can't connect" ); mStop = static_cast( mLoader->findObject( "stopAction" ) ); - BTUI_ASSERT_X( mStop, "bt-search-view", "stopAction missing" ); + BTUI_ASSERT_X( mStop, "BtCpUiSearchView::BtCpUiSearchView", "stopAction missing" ); ret = connect(mStop, SIGNAL(triggered()), this, SLOT(stopSearching())); - BTUI_ASSERT_X( ret, "bt-search-view", "stopAction can't connect" ); + BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "stopAction can't connect" ); mStop->setEnabled(true); mRetry = static_cast( mLoader->findObject( "retryAction" ) ); - BTUI_ASSERT_X( mRetry, "bt-search-view", "retryAction missing" ); + BTUI_ASSERT_X( mRetry, "BtCpUiSearchView::BtCpUiSearchView", "retryAction missing" ); ret = connect(mRetry, SIGNAL(triggered()), this, SLOT(retrySearch())); - BTUI_ASSERT_X( ret, "bt-search-view", "retryAction can't connect" ); + BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "retryAction can't connect" ); // Disable for initial search mRetry->setEnabled(false); // load menu HbMenu *optionsMenu = qobject_cast(mLoader->findWidget("viewMenu")); - BTUI_ASSERT_X( optionsMenu != 0, "bt-search-view", "Options menu not found" ); + BTUI_ASSERT_X( optionsMenu != 0, "BtCpUiSearchView::BtCpUiSearchView", "Options menu not found" ); this->setMenu(optionsMenu); - mExit = static_cast( mLoader->findObject( "exitAction" ) ); - BTUI_ASSERT_X( mExit, "bt-search-view", "exitAction missing" ); - mExit->setText(hbTrId("txt_common_opt_exit")); - - mConnect = static_cast( mLoader->findObject( "connectAction" ) ); - BTUI_ASSERT_X( mConnect, "bt-search-view", "connectAction missing" ); - mConnect->setText(hbTrId("txt_bt_menu_connect")); - ret = connect(mDeviceList, SIGNAL(activated(QModelIndex)), this, SLOT(deviceSelected(QModelIndex))); - BTUI_ASSERT_X( ret, "bt-search-view", "deviceSelected can't connect" ); + BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "deviceSelected can't connect" ); // initialize device type list for "view by" option // Note: this list needs to be in the same order as enum devTypeSelectionList @@ -181,13 +177,7 @@ // Create the inquiry delegate. mAbstractDelegate = BtDelegateFactory::newDelegate(BtDelegate::Inquiry, mSettingModel, mDeviceModel ); - // Connect to the signal from the BtDelegateInquiry for completion of the search request - ret = connect(mAbstractDelegate, SIGNAL(commandCompleted(int)), this, SLOT(searchDelegateCompleted(int))); - BTUI_ASSERT_X( ret, "bt-search-view", "searchDelegateCompleted can't connect" ); - - // Connect to the signal from the BtuiModel when the search has been completed. - ret = connect(mDeviceModel, SIGNAL(deviceSearchCompleted(int)), this, SLOT(deviceSearchCompleted(int))); - BTUI_ASSERT_X( ret, "bt-search-view", "deviceSearchCompleted can't connect" ); + } BtCpUiSearchView::~BtCpUiSearchView() @@ -199,6 +189,7 @@ delete mSoftKeyBackAction; if(mAbstractDelegate) { + disconnect(mAbstractDelegate); delete mAbstractDelegate; } if(mBtuiModelSortFilter) { @@ -218,11 +209,11 @@ if( orientation == Qt::Vertical ) { // load "portrait" section mLoader->load( BTUI_SEARCHVIEW_DOCML, "portrait_ui", &ok ); - BTUI_ASSERT_X( ok, "bt-search-view", "Invalid docml file: portrait section problem" ); + BTUI_ASSERT_X( ok, "BtCpUiSearchView::changeOrientation", "Invalid docml file: portrait section problem" ); } else { // load "landscape" section mLoader->load( BTUI_SEARCHVIEW_DOCML, "landscape_ui", &ok ); - BTUI_ASSERT_X( ok, "bt-search-view", "Invalid docml file: landscape section problem" ); + BTUI_ASSERT_X( ok, "BtCpUiSearchView::changeOrientation", "Invalid docml file: landscape section problem" ); } } @@ -293,26 +284,31 @@ mBtuiModelSortFilter->addDeviceMajorFilter(devTypesWanted, BtuiModelSortFilter::RoughMatch); // device can be any one of selected ones } - mBtuiModelSortFilter->sort(0, Qt::AscendingOrder); } } void BtCpUiSearchView::stopSearching() { // Stop searching - - // Change label and buttons to reflect status - mLabelSearching->setPlainText(hbTrId("txt_bt_subhead_search_done")); - mRetry->setEnabled(true); - mStop->setEnabled(false); // Stop search delegate mAbstractDelegate->cancel(); + // reset view + deviceSearchCompleted(KErrNone); } void BtCpUiSearchView::startSearchDelegate () { + bool ret = false; + // Connect to the signal from the BtDelegateInquiry for completion of the search request + ret = connect(mAbstractDelegate, SIGNAL(commandCompleted(int)), this, SLOT(searchDelegateCompleted(int))); + BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "searchDelegateCompleted can't connect" ); + + // Connect to the signal from the BtuiModel when the search has been completed. + ret = connect(mDeviceModel, SIGNAL(deviceSearchCompleted(int)), this, SLOT(deviceSearchCompleted(int))); + BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "deviceSearchCompleted can't connect" ); + mAbstractDelegate->exec(QVariant()); } @@ -354,7 +350,8 @@ setSoftkeyBack(); if ( !fromBackButton ) { - startSearchDelegate(); + // Sets the label and toolbar buttons + retrySearch(); } } @@ -374,9 +371,14 @@ { //TODO - handle error. Q_UNUSED(error); + mLabelSearching->setPlainText(hbTrId("txt_bt_subhead_search_done")); mRetry->setEnabled(true); - mStop->setEnabled(false); + mStop->setEnabled(false); + + // disconnect signals + disconnect(mAbstractDelegate); + disconnect(mDeviceModel); } void BtCpUiSearchView::deviceSelected(const QModelIndex& modelIndex) diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/btcpuisearchview.h --- a/bluetoothengine/btui/btcpplugin/btcpuisearchview.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuisearchview.h Wed Aug 18 09:59:05 2010 +0300 @@ -31,6 +31,8 @@ class HbListView; class BtAbstractDelegate; class HbSelectionDialog; +class HbGroupBox; +class HbDataForm; class BtCpUiSearchView : public BtCpUiBaseView { @@ -72,7 +74,7 @@ private: HbDocumentLoader *mLoader; HbLabel *mDeviceIcon; - HbLabel *mLabelFoundDevices; + HbDataForm *mDataForm; HbLabel *mLabelSearching; HbListView *mDeviceList; QStringList mDevTypeList; @@ -86,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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/docml/bt-device-view.docml --- a/bluetoothengine/btui/btcpplugin/docml/bt-device-view.docml Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/docml/bt-device-view.docml Wed Aug 18 09:59:05 2010 +0300 @@ -1,15 +1,14 @@ - - + + - + - - + @@ -43,6 +42,7 @@ + @@ -66,13 +66,13 @@ - - - + + + - + - + @@ -82,33 +82,33 @@ - + - + - + - +
- - - + + + - + - + @@ -123,23 +123,23 @@ - + - +
- - - - - + + + + + - + - + @@ -149,18 +149,18 @@ - + - + - + - +
diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/docml/bt-main-view.docml --- a/bluetoothengine/btui/btcpplugin/docml/bt-main-view.docml Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/docml/bt-main-view.docml Wed Aug 18 09:59:05 2010 +0300 @@ -15,26 +15,8 @@ - - - - - - - - - - - - - - - - - - - - + + @@ -45,8 +27,9 @@ - - + + + @@ -101,13 +84,14 @@ - + + @@ -118,21 +102,35 @@ - - - - - - - - - - +
+ + + + + + + + + + + + + + + + + + + + + + + @@ -149,30 +147,17 @@ - - - +
+
+ + - - - - - - - + + - - - - - - - -
-
@@ -186,15 +171,6 @@ - - - - - - - - -
diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btcpplugin/docml/bt-search-view.docml --- a/bluetoothengine/btui/btcpplugin/docml/bt-search-view.docml Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/docml/bt-search-view.docml Wed Aug 18 09:59:05 2010 +0300 @@ -13,27 +13,15 @@
- - - - - - - - - - - - - + @@ -45,20 +33,29 @@ + + + + + + + - + + + - - - - + + + + + + + - - - - - + + @@ -72,37 +69,49 @@ - + + - - - - +
+ + + + + + + + + + - + + + - - - - - - + + + + - - + + + + + +
- + diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegateInquiry.h --- a/bluetoothengine/btui/btuidelegate/btdelegateInquiry.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegateInquiry.h Wed Aug 18 09:59:05 2010 +0300 @@ -16,8 +16,8 @@ */ -#ifndef BTDELEGATEINQUIRY_H_ -#define BTDELEGATEINQUIRY_H_ +#ifndef BTDELEGATEINQUIRY_H +#define BTDELEGATEINQUIRY_H #include #include @@ -53,4 +53,4 @@ }; -#endif /* BTDELEGATEINQUIRY_H_ */ +#endif /* BTDELEGATEINQUIRY_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegateconnect.cpp --- a/bluetoothengine/btui/btuidelegate/btdelegateconnect.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegateconnect.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegateconnect.h --- a/bluetoothengine/btui/btuidelegate/btdelegateconnect.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegateconnect.h Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.cpp --- a/bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -14,11 +14,9 @@ * Description: * */ - +#include "btdelegatedevsecurity.h" +#include "btqtconstants.h" #include - -#include "btqtconstants.h" -#include "btdelegatedevsecurity.h" #include #include #include diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.h --- a/bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.h Wed Aug 18 09:59:05 2010 +0300 @@ -21,7 +21,6 @@ #include #include #include -#include #include "btabstractdelegate.h" class BtuiModel; diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegatepower.cpp --- a/bluetoothengine/btui/btuidelegate/btdelegatepower.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegatepower.cpp Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegatepower.h --- a/bluetoothengine/btui/btuidelegate/btdelegatepower.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegatepower.h Wed Aug 18 09:59:05 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 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegateremotedevname.cpp --- a/bluetoothengine/btui/btuidelegate/btdelegateremotedevname.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegateremotedevname.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -26,7 +26,7 @@ BtDelegateRemoteDevName::BtDelegateRemoteDevName(BtSettingModel* settingModel, BtDeviceModel* deviceModel,QObject *parent ) - :BtAbstractDelegate( settingModel, deviceModel, parent ), mRegistryActive(0) + :BtAbstractDelegate( settingModel, deviceModel, parent ), mRegistryActive(0), mRegistryOpened(false) { } @@ -35,7 +35,8 @@ { delete mRegistryActive; mSymName.Close(); - mBtRegistry.Close(); + if (mRegistryOpened) + mBtRegistry.Close();//there is crash is close the btregistry without opening it first mBtRegServ.Close(); } @@ -70,11 +71,20 @@ QVariant nameVariant = paramList.at(1); QString btRemoteDevName = nameVariant.toString(); + if (!validateName(btRemoteDevName)){ + emit commandCompleted(KErrBadName); + return; + } + mNewName = btRemoteDevName; + /* + QModelIndex start = getDeviceModel()->index(0,0); + QModelIndexList indexList = getDeviceModel()->match(start,BtDeviceModel::NameAliasRole, mNewName); + if (indexList.size() > 1){ + emit commandCompleted(KErrBadName, mNewName); + return; + } + */ int error = KErrNone; - - validateName(btRemoteDevName); - mNewName = btRemoteDevName; - TPtrC ptrName(reinterpret_cast(btRemoteDevName.constData())); error = mSymName.Create(ptrName.Length()); @@ -105,6 +115,8 @@ emit commandCompleted(error,mNewName); return; } + mRegistryOpened = true; + if (!mRegistryActive){ RequestIdentifiers requestId = Unknown; TRAP(error, mRegistryActive = CBtSimpleActive::NewL( diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuidelegate/btdelegateremotedevname.h --- a/bluetoothengine/btui/btuidelegate/btdelegateremotedevname.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuidelegate/btdelegateremotedevname.h Wed Aug 18 09:59:05 2010 +0300 @@ -72,6 +72,8 @@ TBTDevAddr mSymaddr; + bool mRegistryOpened; + private: diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/btuimodel/btdevicemodel_p.h --- a/bluetoothengine/btui/btuimodel/btdevicemodel_p.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/btuimodel/btdevicemodel_p.h Wed Aug 18 09:59:05 2010 +0300 @@ -15,8 +15,8 @@ * */ -#ifndef BTDEVICEMODE_P_H -#define BTDEVICEMODE_P_H +#ifndef BTDEVICEMODELPRIVATE_H +#define BTDEVICEMODELPRIVATE_H #include "btuimodeltypes.h" #include @@ -137,4 +137,4 @@ }; -#endif // BTLOCALSETTING_H +#endif // BTDEVICEMODELPRIVATE_H diff -r 0b2439c3e397 -r 4545c04e61e1 bluetoothengine/btui/inc/btuiiconutil.h --- a/bluetoothengine/btui/inc/btuiiconutil.h Tue Jul 06 14:27:09 2010 +0300 +++ b/bluetoothengine/btui/inc/btuiiconutil.h Wed Aug 18 09:59:05 2010 +0300 @@ -21,7 +21,7 @@ #include #include #include -#include "btdevicemodel.h" +//#include "btdevicemodel.h" #include "btuidevtypemap.h" enum BtuiIconCorner { diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/inc/BTServiceParameterList.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/btobexprofiles/inc/BTServiceParameterList.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Parameter list +* +*/ + + +#ifndef BT_SERVICE_PARAMETER_LIST_H +#define BT_SERVICE_PARAMETER_LIST_H + +// INCLUDES +#include +#include // CDesCArray +#include + +// CONSTANTS + +// DATA TYPES + +struct TBTSUXhtmlParam + { + TDesC* iFileName; + CDesCArray* iRefObjectList; + }; + +struct TBTSUImageParam + { + RFile iFile; + TDesC* iDisplayName; + TDesC8* iMimeType; + TSize iPixelSize; + TInt iFileSize; + TBool iSend; + + }; + + +// CLASS DECLARATION + +/** +* A class holding paths to different types of files. +* +* In case of an XHTML file the list collects paths +* to objects referenced in the file. +* +* In case of an image the list resolves the MIME types and +* displayable names of the images. +* +* @lib BtServiceUtils.lib +* @since Series 60 2.6 +*/ +class CBTServiceParameterList : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + IMPORT_C static CBTServiceParameterList* NewL(); + IMPORT_C static CBTServiceParameterList* NewLC(); + + /** + * Destructor. + */ + virtual ~CBTServiceParameterList(); + + public: // New functions + + /** + * Adds an xhtml file path to the list. + * @since Series 60 2.6 + * @param aFilePath A full path and file name. + * @return None. + */ + IMPORT_C void AddXhtmlL( const TDesC& aFilePath ); + + /** + * Adds an image file path to the list. + * @since Series 60 2.6 + * @param aFilePath A full path and file name. + * @return None. + */ + IMPORT_C void AddImageL( const TDesC& aFilePath ); + + /** + * Adds an image file path to the list. + * @since Series 60 2.6 + * @param aFile file handle to be send. + * @return None. + */ + IMPORT_C void AddImageL( RFile aFile ); + + /** + * Adds an object file path to the list. + * @since Series 60 2.6 + * @param aFilePath A full path and file name. + * @return None. + */ + IMPORT_C void AddObjectL( const TDesC& aFilePath ); + + /** + * Adds an object file path to the list. + * @since Series 60 2.6 + * @param aFile file handle to be send . + * @return None. + */ + IMPORT_C void AddObjectL( RFile aFile ); + + public: // New functions (not exported) + + /** + * Return the number of xhtml file paths in the list. + * @return The count. + */ + TInt XhtmlCount() const; + + /** + * Return the number of image file paths in the list. + * @return The count. + */ + TInt ImageCount() const; + + /** + * Return the number of object file paths in the list. + * @return The count. + */ + TInt ObjectCount() const; + + /** + * Returns a copy of an element of the list from the given index. + * @param aIndex The index. + * @return The element. + */ + TBTSUXhtmlParam XhtmlAt( TInt aIndex ) const; + + /** + * Returns a copy of an element of the list from the given index. + * @param aIndex The index. + * @return The element. + */ + TBTSUImageParam ImageAtL( TInt aIndex ) const; + + /** + * Returns a copy of an element of the list from the given index. + * @param aIndex The index. + * @return The element. + */ + RFile& ObjectAtL( TInt aIndex ); + + /** + * Checks whether the list has any xhtml-files with referenced objects. + * @return A boolean according to result. + */ + TBool HasAnyReferencedObjects() const; + + /** + * Return the size of objects in the list. + * @return The count. + */ + TInt ObjectListSizeL() const; + + /** + * Return the size of images in the list. + * @return The count. + */ + + TInt ImageListSize() const; + + /** + * Remove image from list. + * @param aIndex The index. + * @return None. + */ + void RemoveImageL(TInt aIndex); + + /** + * Return count of removed image + * @return The count of removed images. + */ + TInt RemovedImageCount(); + + /** + * Reset image filehandle + * @param aIndex The index. + * @return None. + */ + void ResetImageHandleL(TInt aIndex); + + /** + * Reset object filehandle + * @param aIndex The index. + * @return None. + */ + void ResetObjectHandleL(TInt aIndex); + + + /** + * Reset image filehandle + * @param aIndex The index. + * @return None. + */ + void MarkAsSendL(TInt aIndex); + + + private: + + /** + * C++ default constructor. + */ + CBTServiceParameterList(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // Data + + RArray iXhtmlList; + RArray iImageList; + RArray iObjectList; + RFs iFileSession; + TInt iRemovedImageCount; + }; + +#endif // BT_SERVICE_PARAMETER_LIST_H + +// End of File diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/inc/btserviceapi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/btobexprofiles/inc/btserviceapi.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: API for sending services +* +*/ + + + +#ifndef BT_SERVICE_API_H +#define BT_SERVICE_API_H + +// INCLUDES +#include "BTServiceParameterList.h" + +// CONSTANTS + +// DATA TYPES + +enum TBTServiceType + { + EBTSendingService, + EBTPrintingService, + EBTObjectPushService // use this if support for only OPP is wanted + }; + +// FORWARD DECLARATIONS +class CBTServiceStarter; + +// CLASS DECLARATION + +/** +* An API for starting Bluetooth services. +* +* @lib BtServiceUtils.lib +* @since Series 60 2.6 +*/ +class CBTServiceAPI : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + */ + IMPORT_C static CBTServiceAPI* NewL(); + + /** + * Destructor. + */ + virtual ~CBTServiceAPI(); + + public: // New functions + + /** + * Starts the given service. + * Returns when service is started. + * @since Series 60 2.6 + * @param aService The service to be started. + * @param aList Parameters for the service. + * @return None. + */ + IMPORT_C void StartServiceL( TBTServiceType aService, + CBTServiceParameterList* aList ); + + /** + * Starts the given service. + * Returns when service is completed. + * @since Series 60 2.6 + * @param aService The service to be started. + * @param aList Parameters for the service. + * @return None. + */ + IMPORT_C void StartSynchronousServiceL( TBTServiceType aService, + CBTServiceParameterList* aList ); + private: + + /** + * C++ default constructor. + */ + CBTServiceAPI(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // Data + + CBTServiceStarter* iStarter; + CActiveSchedulerWait iSyncWaiter; + }; + +#endif // BT_SERVICE_API_H + +// End of File diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/inc/obexutilsdialog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/btobexprofiles/inc/obexutilsdialog.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,271 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef COBEXUTILSDIALOG_H +#define COBEXUTILSDIALOG_H + +#include + +#include +#include +#include +#include + +class CObexUtilsDialogTimer; + +enum TButtonId + { + ECancelButton = -1, + EYesButton, + ENoButton + }; +/** +* An observer interface for asking progress status of an operation using +* a progress dialog. +*/ +NONSHARABLE_CLASS( MObexUtilsProgressObserver ) + { + public: + + /** + * Returns the progress status of the operation. + * @since 2.6 + * @return A progress value relative to final value. + */ + virtual TInt GetProgressStatus() = 0; + }; + +// CLASS DECLARATION + +/** +* An observer interface for informing about dialog events. +*/ +NONSHARABLE_CLASS( MObexUtilsDialogObserver ) + { + public: + + /** + * Informs the observer that a dialog has been dismissed. + * @since 2.6 + * todo check whether the parameter is required + * @param aButtonId The button that was used to dismiss the dialog. + */ + virtual void DialogDismissed(TInt aButtonId) = 0; //TInt aButtonId + }; + + +// CLASS DECLARATION + +/** +* A class for launching and managing dialogs. +*/ +NONSHARABLE_CLASS( CObexUtilsDialog ) : public CBase, + public MHbDeviceProgressDialogObserver, + public MHbDeviceDialogObserver, + public MHbDeviceMessageBoxObserver + { + public:// Constructors and destructor + + /** + * Two-phased constructor. + */ + IMPORT_C static CObexUtilsDialog* NewL( + MObexUtilsDialogObserver* aObserverPtr ); + + IMPORT_C static CObexUtilsDialog* NewLC( + MObexUtilsDialogObserver* aObserverPtr ); + + /** + * Destructor. + */ + virtual ~CObexUtilsDialog(); + + public: // New functions + + + /** + * Launches a progress dialog. + * @param aObserverPtr A pointer to progress observer. A NULL pointer if + the progress dialog is updated manually. + * @param aFileCount Total number of files to be sent. + * @param aDeviceName Device Name to which files to be sent. + * @param aTimeoutValue A value telling how often should the dialog be + updated. Relevant only if observer is given. + */ + IMPORT_C void LaunchProgressDialogL( + MObexUtilsProgressObserver* aObserverPtr, TInt aFileCount, + const TDesC& aDeviceName, TInt aTimeoutValue ); + + /** + * Updates the progress dialog with new file information when multiples files are sent. + * @param aFileSize Size of the file to be sent + * @param aFileIndex Index of the file to be sent + * @param aFileName Name of the file to be sent. + */ + IMPORT_C void UpdateProgressNoteL( TInt aFileSize,TInt aFileIndex, const TDesC& aFileName ); + + /** + * Launches a wait dialog. + * @param aDisplayText Text that needs to be displayed. + */ + IMPORT_C void LaunchWaitDialogL( const TDesC& aDisplayText ); + + /** + * Cancels a wait dialog if one exists. + * @since 2.6 + * @return None. + */ + IMPORT_C void CancelWaitDialog(); + + /** + * Cancels a wait progress dialog if one exists. + * @since 2.6 + * @return None. + */ + IMPORT_C void CancelProgressDialog(); + + /** + * Updates a progress dialog with the latest progress value + * @param aValue A progress value relative to final value. + * @return None + */ + IMPORT_C void UpdateProgressDialogL( TInt aProgressValue ); + + /** + * Show a query note + * @param aConfirmText text for the note. + * @return None + */ + IMPORT_C void LaunchQueryDialogL( const TDesC& aConfirmText ); + + /** + * Shows an error note. + * @param aTextId A resource id for the note. + * @return None. + */ + IMPORT_C void ShowErrorNoteL( const TDesC& aErrorText ); + + /** + * Shows an information note. + * @param aTextId A resource id for the note. + * @return None. + */ + IMPORT_C void ShowInformationNoteL( const TDesC& aInfoText ); + + public: // New functions (not exported) + + /** + * Updates the progress dialog. + * @return None. + */ + void UpdateProgressDialog(); + + private: // Functions from base classes + + /** + * From MHbDeviceProgressDialogObserver called when dialog is closed by pressing the "cancel" button + * @param aDialog Pointer to dialog that was cancelled. + * @return None. + */ + void ProgressDialogCancelled(const CHbDeviceProgressDialogSymbian* aDialog); + + /** + * From MHbDeviceProgressDialogObserver called when a device progress dialog is has closed + * @param aDialog Pointer to dialog instance that has closed. + * @return None. + */ + void ProgressDialogClosed(const CHbDeviceProgressDialogSymbian* aDialog ) ; + + /** + * From MHbDeviceDialogObserver called when data is received from a device dialog + * @param aDialog Pointer to dialog instance that has closed. + * @return None. + */ + void DataReceived(CHbSymbianVariantMap& aData); + + /** + * From MHbDeviceDialogObserver called when a device dialog is closed + * @param aData contains data from the dialog plugin. + * @return None. + */ + void DeviceDialogClosed(TInt aCompletionCode); + + /** + * from base class MHbDeviceMessageBoxObserver + * @param aMessageBox Pointer to dialog instance that has closed. + * @param aButton the id of the button the user pressed + */ + void MessageBoxClosed(const CHbDeviceMessageBoxSymbian *aMessageBox, + CHbDeviceMessageBoxSymbian::TButtonId aButton); + + private: + + /** + * C++ default constructor. + */ + CObexUtilsDialog( MObexUtilsDialogObserver* aObserverPtr ); + + /** + * By default Symbian OS constructor is private. + */ + void ConstructL(); + + /** + * Add a data item into the given CHbSymbianVariantMap. + * @param aMap the instance to which the data item will be added. + * @param aKey the key of the data item. + * @param aData the value of the data item + * @param aDataType the data-type of the data item + */ + void AddDataL(CHbSymbianVariantMap* aMap, const TDesC& aKey, + const TAny* aData, CHbSymbianVariant::TType aDataType); + + /** + * Creates and shows a message box. + * @param aType the type of the message box to create. + * @param aText the text to be shown in the message box + * @param aObserver the observer that receives the events from the + * message box + * @param aTimeout the timeout value of the message box + */ + CHbDeviceMessageBoxSymbian* CreateAndShowMessageBoxL( + CHbDeviceMessageBoxSymbian::TType aType, + const TDesC& aText, + MHbDeviceMessageBoxObserver* aObserver, + TInt aTimeout ); + + private: // Data + + CHbDeviceDialogSymbian *iProgressDialog; + CHbDeviceProgressDialogSymbian* iWaitDialog; + CHbDeviceMessageBoxSymbian* iMessageBox; + + CObexUtilsDialogTimer* iObexDialogTimer; + TInt iFileIndex; + TInt iFileCount; + RBuf iDeviceName; + + // Not Owned + // + MObexUtilsProgressObserver* iProgressObserverPtr; + MObexUtilsDialogObserver* iDialogObserverPtr; + }; + +#endif // COBEXUTILSDIALOG_H + +// End of File diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/inc/obexutilspropertynotifier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/btobexprofiles/inc/obexutilspropertynotifier.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Declares disk status watcher class for ObexUtils. +* +*/ + + + +#ifndef _OBEXUTILSPROPERTYNOTIFIER_H +#define _OBEXUTILSPROPERTYNOTIFIER_H + +// INCLUDES +#include +#include +#include + +// CLASS DECLARATION + + /** + Type of memory property check, + @param ECheckPhoneMemory, phone memory is checked, default value if not mentioned explicitly. + @param ECheckMMCMemory, MMC memory is checked. + */ + +enum TMemoryPropertyCheckType + { + ECheckPhoneMemory, + ECheckMMCMemory + }; + + /** + A callback interface for informing content change of disk status. Client must derive + from this class and implement HandleNotifyL() method. When disk space will cross warning + level or critical level this method will be call back. + */ + +NONSHARABLE_CLASS( MObexUtilsPropertyNotifyHandler ) + { + public: + /** + * Callback method for disk status change + * @param aUid UID identifying a shared data file where notify came from. + * @param aKey keyword of which value was changed + */ + virtual void HandleNotifyL( TMemoryPropertyCheckType aCheckType ) =0; + }; + +NONSHARABLE_CLASS( CObexUtilsPropertyNotifier ) : public CActive + { +public: // NewL, Constructors and destructor + + /* + * Two-phased constructor. + * @param aHandler -Pointer to the MObexUtilsPropertyNotifyHandler derived class + * @param aCheckType -Constant defining type of memory checking to be done (phone/MMC) + * @return CObexUtilsPropertyNotifier* -Initialized object. + */ + + IMPORT_C static CObexUtilsPropertyNotifier* NewL( + MObexUtilsPropertyNotifyHandler* aHandler, + TMemoryPropertyCheckType aCheckType=ECheckPhoneMemory ); + + /** + * Destructor. + */ + + virtual ~CObexUtilsPropertyNotifier(); +private: // Functions from base classes + + /** + * Constructor. + * @param aHandler -Pointer to the MObexUtilsPropertyNotifyHandler derived class + * @param aCheckType -Constant defining type of memory checking to be done (phone/MMC) + */ + + CObexUtilsPropertyNotifier( + MObexUtilsPropertyNotifyHandler* aHandler, + TMemoryPropertyCheckType aCheckType ); + + void ConstructL(); + + /** + Subscribes to a property and sets active + */ + void Subscribe(); + + /** + * From CActive Gets called when CActive::Cancel is called, + * cancels disk status watching. + * + * @param None. + * @return None. + */ + + void DoCancel(); + + /** + * From CActive Gets called when content of disk status is changed, + * calls MObexUtilsPropertyNotifyHandler::HandleNotify. + * + * @param None. + * @return None. + */ + + void RunL(); + +private: + // Reference to observer + MObexUtilsPropertyNotifyHandler* iHandler; + // Type of memory check (phone/MMC) + TMemoryPropertyCheckType iCheckType; + // Database handle + RProperty iProperty; + }; + +#endif // _OBEXUTILSPROPERTYNOTIFIER_H diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/bip/inc/BIPController.h --- a/btobexprofiles/obexreceiveservices/bip/inc/BIPController.h Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/bip/inc/BIPController.h Wed Aug 18 09:59:05 2010 +0300 @@ -165,6 +165,9 @@ CHbDeviceDialogSymbian* iProgressDialog; TBool iDialogActive; TInt iFileCount; + TBool iReceivingFailed; + CHbDeviceDialogSymbian* iRecvDoneDialog; + TBool iShowRecvCompleteDialog; }; _LIT(KBipPanicCategory, "BIP"); diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/bip/src/BIPController.cpp --- a/btobexprofiles/obexreceiveservices/bip/src/BIPController.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/bip/src/BIPController.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -110,6 +110,7 @@ iFs.Close(); delete iDialog; delete iProgressDialog; + delete iRecvDoneDialog; TRACE_FUNC_EXIT } @@ -139,7 +140,8 @@ void CBIPController::HandleError(TBool aAbort) { TRACE_FUNC_ENTRY - + iReceivingFailed = ETrue; + iShowRecvCompleteDialog = EFalse; if( iBTTransferState == ETransferPut || (!aAbort && iBTTransferState == ETransferPutDiskError) ) { if(iBTObject) @@ -188,6 +190,7 @@ void CBIPController::TransportUpIndication() { TRACE_FUNC + iReceivingFailed = EFalse; if (!iFs.Handle()) { TRACE_INFO( (_L( "[bipreceiveservice] TransportUpIndication iFs.Connect()" )) ); @@ -247,7 +250,63 @@ // void CBIPController::TransportDownIndication() { - TRACE_FUNC + TRACE_FUNC + if(!iReceivingFailed && iShowRecvCompleteDialog) + { + //Launch recevice completed dialog. + iRecvDoneDialog = CHbDeviceDialogSymbian::NewL(); + iRecvDoneDialog->SetObserver(this); + + CHbSymbianVariantMap* variantMap = CHbSymbianVariantMap::NewL(); + CleanupStack::PushL(variantMap); + + TInt dialogIdx = TBluetoothDialogParams::EReceiveDone; + CHbSymbianVariant* dialogType = CHbSymbianVariant::NewL( (TAny*) &(dialogIdx), + CHbSymbianVariant::EInt ); + CleanupStack::PushL(dialogType); + TBuf16<6> dialogTypeKey; + dialogTypeKey.Num(TBluetoothDialogParams::EDialogType); + User::LeaveIfError(variantMap->Add(dialogTypeKey, dialogType)); + CleanupStack::Pop(dialogType); + + CHbSymbianVariant* deviceName = CHbSymbianVariant::NewL( (TAny*) (&iRemoteDeviceName), + CHbSymbianVariant::EDes ); + CleanupStack::PushL(deviceName); + TBuf16<6> deviceNameKey; + deviceNameKey.Num(TBluetoothDeviceDialog::EDeviceName); + User::LeaveIfError(variantMap->Add(deviceNameKey, deviceName)); + CleanupStack::Pop(deviceName); + + CHbSymbianVariant* fileName = CHbSymbianVariant::NewL( (TAny*) (&iReceivingFileName), + CHbSymbianVariant::EDes ); + CleanupStack::PushL(fileName); + TBuf16<6> fileNameKey; + fileNameKey.Num(TBluetoothDeviceDialog::EReceivingFileName); + User::LeaveIfError(variantMap->Add(fileNameKey, fileName)); + CleanupStack::Pop(fileName); + + CHbSymbianVariant* fileSz = CHbSymbianVariant::NewL( (TAny*) &iTotalSizeByte, + CHbSymbianVariant::EInt ); + CleanupStack::PushL(fileSz); + TBuf16<6> fileSzKey; + fileSzKey.Num(TBluetoothDeviceDialog::EReceivingFileSize); + User::LeaveIfError(variantMap->Add(fileSzKey, fileSz)); + CleanupStack::Pop(fileSz); + + CHbSymbianVariant* fileCnt = CHbSymbianVariant::NewL( (TAny*) &iFileCount, + CHbSymbianVariant::EInt ); + CleanupStack::PushL(fileCnt); + TBuf16<6> fileCntKey; + fileCntKey.Num(TBluetoothDeviceDialog::EReceivedFileCount); + User::LeaveIfError(variantMap->Add(fileCntKey, fileCnt)); + CleanupStack::Pop(fileCnt); + + iRecvDoneDialog->Show( KBTDevDialogId(), *variantMap, this ); + CleanupStack::PopAndDestroy(variantMap); + + iShowRecvCompleteDialog = EFalse; + } + // Remove receiving buffer and files used during file receiving. // delete iBTObject; @@ -381,6 +440,7 @@ iBTTransferState = ETransferIdle; CloseReceivingIndicator(); iFileCount++; + iShowRecvCompleteDialog = ETrue; } TRACE_FUNC_EXIT return retVal; @@ -1004,15 +1064,28 @@ if(aData.Keys().MdcaPoint(0).Compare(_L("actionResult")) == 0) { TInt val = *(static_cast(aData.Get(_L("actionResult"))->Data())); - if(!val) + switch(val) { - //Cancel has been clicked - CancelTransfer(); - } - else - { - //Hide has been clicked - CloseReceivingIndicator(EFalse); + case TBluetoothDialogParams::ECancelReceive: + { + //User choose to cancel receiving. + CancelTransfer(); + }break; + + case TBluetoothDialogParams::EHide: + { + //Use choose to hide the progress dialog. + CloseReceivingIndicator(EFalse); + }break; + + case TBluetoothDialogParams::EShow: + case TBluetoothDialogParams::ECancelShow: + { + //In case of Show, the device dialog will handle the opening of conversation view. + iRecvDoneDialog->Cancel(); + delete iRecvDoneDialog; + iRecvDoneDialog = NULL; + }break; } } } diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/btmsgviewer/btmsgviewer.pro --- a/btobexprofiles/obexreceiveservices/btmsgviewer/btmsgviewer.pro Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/btmsgviewer/btmsgviewer.pro Wed Aug 18 09:59:05 2010 +0300 @@ -30,7 +30,9 @@ -lbluetooth \ -lmsgs \ -lapmime \ - -lefsrv + -lefsrv \ + -lapgrfx \ + -lxqutils SERVICE.FILE = service_conf.xml libFiles.sources = xqservice.dll @@ -39,7 +41,7 @@ libFiles.path = "!:\sys\bin" DEPLOYMENT += libFiles HEADERS += ./inc/btmsgviewer.h \ - ./inc/btmsgviewerutils.h + ./inc/btmsgviewerutils.h SOURCES += ./src/btmsgviewer.cpp \ ./src/main.cpp \ ./src/btmsgviewerutils.cpp diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/btmsgviewer/inc/btmsgviewer.h --- a/btobexprofiles/obexreceiveservices/btmsgviewer/inc/btmsgviewer.h Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/btmsgviewer/inc/btmsgviewer.h Wed Aug 18 09:59:05 2010 +0300 @@ -22,6 +22,7 @@ #include #include #include + #include "btmsgviewerutils.h" @@ -30,12 +31,19 @@ Q_OBJECT public: - BTMsgViewer (QObject *parent = 0 ); - ~BTMsgViewer (); + BTMsgViewer (QObject* parent=0 ); + ~BTMsgViewer (); + public slots: - int displaymsg(int messageId); + void displaymsg(int messageId); + private: bool isError(int aError); + QString copyVCardToTemp(const QString& filepath); + void deleteVCardFromTemp(const QString& filepath); + +private: + int mCurrentRequestIndex; }; #endif // BTMSGVIEWER_H diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/btmsgviewer/inc/btmsgviewerutils.h --- a/btobexprofiles/obexreceiveservices/btmsgviewer/inc/btmsgviewerutils.h Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/btmsgviewer/inc/btmsgviewerutils.h Wed Aug 18 09:59:05 2010 +0300 @@ -27,12 +27,14 @@ static CBtMsgViewerUtils* NewL(); ~CBtMsgViewerUtils(); HBufC* GetMessagePath(TInt aMessageId, TInt aError); + HBufC8* GetMimeType(); private: // From MMsvSessionObserver void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3); private: void GetMessagePathL(TPtr aMsgPath, const TInt aMessageId); + void StoreMessageMimeTypeL(TPtr aMsgPath); private: CBtMsgViewerUtils(); @@ -40,6 +42,7 @@ private: CMsvSession* iMsvSession; + HBufC8* iMimeType; }; #endif // BTMSGVIEWERUTILS_H_ diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/btmsgviewer/src/btmsgviewer.cpp --- a/btobexprofiles/obexreceiveservices/btmsgviewer/src/btmsgviewer.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/btmsgviewer/src/btmsgviewer.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -19,23 +19,31 @@ #include "btmsgviewer.h" #include "apmstd.h" #include -#include -//#include +#include +#include +#include +#include +#include +#include + +const QString KMimeTypeVCard("text/X-vCard"); BTMsgViewer::BTMsgViewer(QObject* parent) -: XQServiceProvider("com.nokia.services.btmsgdispservices.displaymsg",parent) +: XQServiceProvider("com.nokia.services.btmsgdispservices.displaymsg", parent), mCurrentRequestIndex(0) { publishAll(); + connect(this, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); } BTMsgViewer::~BTMsgViewer () { - + } -int BTMsgViewer::displaymsg( int messageId ) - { +void BTMsgViewer::displaymsg( int messageId ) + { + mCurrentRequestIndex = setCurrentRequestAsync(); CBtMsgViewerUtils* btViewerUtils = 0; TRAPD(error, btViewerUtils = CBtMsgViewerUtils::NewL()); @@ -44,7 +52,9 @@ if(btViewerUtils) delete btViewerUtils; - return error; + QVariant retVal(error); + completeRequest(mCurrentRequestIndex, retVal); + return; } HBufC* fileName = 0; @@ -55,19 +65,65 @@ delete fileName; delete btViewerUtils; - return error; + + QVariant retVal(error); + completeRequest(mCurrentRequestIndex, retVal); + return; } - QString attachmentFName = QString::fromUtf16(fileName->Ptr(),fileName->Length()); - + QString attachmentFName = XQConversions::s60DescToQString(fileName->Des()); + QString mimeType = XQConversions::s60Desc8ToQString(btViewerUtils->GetMimeType()->Des()); delete fileName; delete btViewerUtils; + + if(mimeType == KMimeTypeVCard) + { + int error = KErrGeneral; + + /*todo: copyVCardToTemp() has to be removed when phonebook updates it's capabilites to + access messages from private folder*/ + QString newfilepath = copyVCardToTemp(attachmentFName); + + QString service("com.nokia.services.phonebookservices"); + QString interface("Fetch"); + QString operation("editCreateNew(QString)"); + XQApplicationManager appManager; + XQAiwRequest* request = appManager.create(service, interface, operation, true); //embedded + if(request) + { + QList args; + args << newfilepath; + request->setArguments(args); + QVariant retValue; + bool res = request->send(retValue); + if (!res) + { + error = request->lastError(); + } + else + { + error = retValue.toInt(); + } + + delete request; + } + /*todo: copyVCardToTemp() has to be removed when phonebook updates it's capabilites to + access messages from private folder*/ + deleteVCardFromTemp(newfilepath); + + QVariant retVal(error); + completeRequest(mCurrentRequestIndex, retVal); + return; + } + XQSharableFile sf; XQAiwRequest* request = 0; if (!sf.open(attachmentFName)) { - return KErrNotFound; + QVariant retVal(KErrGeneral); + completeRequest(mCurrentRequestIndex, retVal); + return; } // Get handlers @@ -79,12 +135,18 @@ if (!request) { sf.close(); - return KErrGeneral; + + QVariant retVal(KErrGeneral); + completeRequest(mCurrentRequestIndex, retVal); + return; } } else { sf.close(); - return KErrGeneral; + + QVariant retVal(KErrGeneral); + completeRequest(mCurrentRequestIndex, retVal); + return; } request->setEmbedded(true); @@ -95,23 +157,39 @@ args << qVariantFromValue(sf); request->setArguments(args); + int err = KErrNone; bool res = request->send(); if (!res) { - QString errMsg = request->lastErrorMessage(); + err = request->lastError(); } // Cleanup sf.close(); delete request; - if(!res) - return request->lastError(); - else - return KErrNone; + QVariant retVal(err); + completeRequest(mCurrentRequestIndex, retVal); + return; } bool BTMsgViewer::isError(int aError) { return ((aError < KErrNone)?true:false); } + +QString BTMsgViewer::copyVCardToTemp(const QString& filepath) +{ + QDir tempDir; + QString tempFilePath(QDir::toNativeSeparators(tempDir.tempPath())); + tempFilePath.append(QDir::separator()); + QFileInfo fInfo(filepath); + tempFilePath.append(fInfo.fileName()); + QFile::copy(filepath, tempFilePath); + return tempFilePath; +} + +void BTMsgViewer::deleteVCardFromTemp(const QString& filepath) +{ + QFile::remove(filepath); +} diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/btmsgviewer/src/btmsgviewerutils.cpp --- a/btobexprofiles/obexreceiveservices/btmsgviewer/src/btmsgviewerutils.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/btmsgviewer/src/btmsgviewerutils.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -16,9 +16,12 @@ */ #include +#include #include "btmsgviewerutils.h" +const TInt32 KUidMsgTypeBtTInt32 = 0x10009ED5; + CBtMsgViewerUtils* CBtMsgViewerUtils::NewL() { CBtMsgViewerUtils* me = new (ELeave) CBtMsgViewerUtils(); @@ -42,8 +45,9 @@ { if ( iMsvSession ) { - delete iMsvSession; + delete iMsvSession; } + delete iMimeType; } HBufC* CBtMsgViewerUtils::GetMessagePath(TInt aMessageId, TInt aError) @@ -62,28 +66,55 @@ void CBtMsgViewerUtils::GetMessagePathL(TPtr aMsgPath, const TInt aMessageId) { CMsvEntry* messageEntry = iMsvSession->GetEntryL(aMessageId); - CleanupStack::PushL(messageEntry); - - CMsvEntry* attachmentEntry = iMsvSession->GetEntryL((*messageEntry)[0].Id()); - CleanupStack::PushL(attachmentEntry); - - CMsvStore* store = attachmentEntry->EditStoreL(); - CleanupStack::PushL(store); + CleanupStack::PushL(messageEntry); //1st push - //get file handle for the attachment & the complete path of the file - RFile attachmentFile; - attachmentFile = store->AttachmentManagerL().GetAttachmentFileL(0); - attachmentFile.FullName(aMsgPath); - attachmentFile.Close(); - - //mark attachment as Read - TMsvEntry attachEntry = attachmentEntry->Entry(); - attachEntry.SetUnread(EFalse); - attachmentEntry->ChangeL(attachEntry); - - CleanupStack::PopAndDestroy(store); - CleanupStack::PopAndDestroy(attachmentEntry); - CleanupStack::PopAndDestroy(messageEntry); + TMsvEntry entry = messageEntry->Entry(); + if(entry.MtmData1() == KUidMsgTypeBtTInt32) + { + CMsvStore* store = messageEntry->ReadStoreL(); + CleanupStack::PushL(store); //2nd push + + //get file handle for the attachment & the complete path of the file + RFile attachmentFile; + attachmentFile = store->AttachmentManagerL().GetAttachmentFileL(0); + CleanupClosePushL(attachmentFile); //3rd push + User::LeaveIfError(attachmentFile.FullName(aMsgPath)); + CleanupStack::PopAndDestroy(&attachmentFile); + StoreMessageMimeTypeL(aMsgPath); + + //mark attachment as Read + TMsvEntry attachEntry = messageEntry->Entry(); + attachEntry.SetUnread(EFalse); + messageEntry->ChangeL(attachEntry); + + CleanupStack::PopAndDestroy(store); + CleanupStack::PopAndDestroy(messageEntry); + } + else + { + CMsvEntry* attachmentEntry = iMsvSession->GetEntryL((*messageEntry)[0].Id()); + CleanupStack::PushL(attachmentEntry); //2nd push + + CMsvStore* store = attachmentEntry->ReadStoreL(); + CleanupStack::PushL(store); //3rd push + + //get file handle for the attachment & the complete path of the file + RFile attachmentFile; + attachmentFile = store->AttachmentManagerL().GetAttachmentFileL(0); + CleanupClosePushL(attachmentFile); + User::LeaveIfError(attachmentFile.FullName(aMsgPath)); + CleanupStack::PopAndDestroy(&attachmentFile); + StoreMessageMimeTypeL(aMsgPath); + + //mark attachment as Read + TMsvEntry attachEntry = attachmentEntry->Entry(); + attachEntry.SetUnread(EFalse); + attachmentEntry->ChangeL(attachEntry); + + CleanupStack::PopAndDestroy(store); + CleanupStack::PopAndDestroy(attachmentEntry); + CleanupStack::PopAndDestroy(messageEntry); + } } void CBtMsgViewerUtils::HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, @@ -95,5 +126,41 @@ (void) aArg3; } +void CBtMsgViewerUtils::StoreMessageMimeTypeL(TPtr aMsgPath) + { + RFs rfs; + RFile file; + + User::LeaveIfError(rfs.Connect()); + + User::LeaveIfError(rfs.ShareProtected()); + + User::LeaveIfError(file.Open(rfs, aMsgPath, EFileShareReadersOrWriters | EFileRead)); + + TDataRecognitionResult dataType; + RApaLsSession apaSession; + + if(apaSession.Connect() == KErrNone) + { + if (apaSession.RecognizeData(file, dataType) == KErrNone) + { + if(iMimeType) + { + delete iMimeType; + iMimeType = NULL; + } + + iMimeType = dataType.iDataType.Des8().AllocL(); + + rfs.Close(); + apaSession.Close(); + } + } + rfs.Close(); + } +HBufC8* CBtMsgViewerUtils::GetMimeType() + { + return iMimeType; + } diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/btmsgviewer/src/main.cpp --- a/btobexprofiles/obexreceiveservices/btmsgviewer/src/main.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/btmsgviewer/src/main.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -26,6 +26,7 @@ HbApplication a( argc, argv ); BTMsgViewer* btmsgviewer = new BTMsgViewer(); + int retVal = a.exec(); delete btmsgviewer; return retVal; diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/opp/inc/oppcontroller.h --- a/btobexprofiles/obexreceiveservices/opp/inc/oppcontroller.h Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/opp/inc/oppcontroller.h Wed Aug 18 09:59:05 2010 +0300 @@ -157,6 +157,9 @@ CHbDeviceDialogSymbian* iProgressDialog; TBool iDialogActive; TInt iFileCount; + TBool iReceivingFailed; + CHbDeviceDialogSymbian* iRecvDoneDialog; + TBool iShowRecvCompleteDialog; }; #endif // OPPCONTROLLER_H diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexreceiveservices/opp/src/oppcontroller.cpp --- a/btobexprofiles/obexreceiveservices/opp/src/oppcontroller.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexreceiveservices/opp/src/oppcontroller.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -93,6 +93,7 @@ iFs.Close(); delete iDialog; delete iProgressDialog; + delete iRecvDoneDialog; } // --------------------------------------------------------- @@ -119,6 +120,8 @@ void COPPController::HandleError(TBool aAbort) { TRACE_ERROR((_L( "[oppreceiveservice] COPPController:HandleError" ))); + iReceivingFailed = ETrue; + iShowRecvCompleteDialog = EFalse; if( iObexTransferState == ETransferPut || iObexTransferState == ETransferPutDiskError ) { if(iObexObject) @@ -153,6 +156,7 @@ void COPPController::TransportUpIndication() { TRACE_FUNC + iReceivingFailed = EFalse; iObexTransferState = ETransferIdle; if ( !iFs.Handle() ) @@ -218,6 +222,61 @@ void COPPController::TransportDownIndication() { TRACE_FUNC + if(!iReceivingFailed && iShowRecvCompleteDialog) + { + //Launch recevice completed dialog. + iRecvDoneDialog = CHbDeviceDialogSymbian::NewL(); + iRecvDoneDialog->SetObserver(this); + + CHbSymbianVariantMap* variantMap = CHbSymbianVariantMap::NewL(); + CleanupStack::PushL(variantMap); + + TInt dialogIdx = TBluetoothDialogParams::EReceiveDone; + CHbSymbianVariant* dialogType = CHbSymbianVariant::NewL( (TAny*) &(dialogIdx), + CHbSymbianVariant::EInt ); + CleanupStack::PushL(dialogType); + TBuf16<6> dialogTypeKey; + dialogTypeKey.Num(TBluetoothDialogParams::EDialogType); + User::LeaveIfError(variantMap->Add(dialogTypeKey, dialogType)); + CleanupStack::Pop(dialogType); + + CHbSymbianVariant* deviceName = CHbSymbianVariant::NewL( (TAny*) (&iRemoteDeviceName), + CHbSymbianVariant::EDes ); + CleanupStack::PushL(deviceName); + TBuf16<6> deviceNameKey; + deviceNameKey.Num(TBluetoothDeviceDialog::EDeviceName); + User::LeaveIfError(variantMap->Add(deviceNameKey, deviceName)); + CleanupStack::Pop(deviceName); + + CHbSymbianVariant* fileName = CHbSymbianVariant::NewL( (TAny*) (&iReceivingFileName), + CHbSymbianVariant::EDes ); + CleanupStack::PushL(fileName); + TBuf16<6> fileNameKey; + fileNameKey.Num(TBluetoothDeviceDialog::EReceivingFileName); + User::LeaveIfError(variantMap->Add(fileNameKey, fileName)); + CleanupStack::Pop(fileName); + + CHbSymbianVariant* fileSz = CHbSymbianVariant::NewL( (TAny*) &iTotalSizeByte, + CHbSymbianVariant::EInt ); + CleanupStack::PushL(fileSz); + TBuf16<6> fileSzKey; + fileSzKey.Num(TBluetoothDeviceDialog::EReceivingFileSize); + User::LeaveIfError(variantMap->Add(fileSzKey, fileSz)); + CleanupStack::Pop(fileSz); + + CHbSymbianVariant* fileCnt = CHbSymbianVariant::NewL( (TAny*) &iFileCount, + CHbSymbianVariant::EInt ); + CleanupStack::PushL(fileCnt); + TBuf16<6> fileCntKey; + fileCntKey.Num(TBluetoothDeviceDialog::EReceivedFileCount); + User::LeaveIfError(variantMap->Add(fileCntKey, fileCnt)); + CleanupStack::Pop(fileCnt); + + iRecvDoneDialog->Show( KBTDevDialogId(), *variantMap, this ); + CleanupStack::PopAndDestroy(variantMap); + iShowRecvCompleteDialog = EFalse; + } + // Remove receiving buffer and files used during file receiving. // delete iObexObject; @@ -347,6 +406,7 @@ iObexTransferState = ETransferIdle; CloseReceivingIndicator(); iFileCount++; + iShowRecvCompleteDialog = ETrue; } TRACE_FUNC_EXIT return retVal; @@ -969,15 +1029,28 @@ if(aData.Keys().MdcaPoint(0).Compare(_L("actionResult")) == 0) { TInt val = *(static_cast(aData.Get(_L("actionResult"))->Data())); - if(!val) + switch(val) { - //Cancel has been clicked - CancelTransfer(); - } - else - { - //Hide has been clicked - CloseReceivingIndicator(EFalse); + case TBluetoothDialogParams::ECancelReceive: + { + //User choose to cancel receiving. + CancelTransfer(); + }break; + + case TBluetoothDialogParams::EHide: + { + //Use choose to hide the progress dialog. + CloseReceivingIndicator(EFalse); + }break; + + case TBluetoothDialogParams::EShow: + case TBluetoothDialogParams::ECancelShow: + { + //In case of Show, the device dialog will handle the opening of conversation view. + iRecvDoneDialog->Cancel(); + delete iRecvDoneDialog; + iRecvDoneDialog = NULL; + }break; } } } diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexsendservices/obexservicesendutils/src/BTServiceClient.cpp --- a/btobexprofiles/obexsendservices/obexservicesendutils/src/BTServiceClient.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexsendservices/obexservicesendutils/src/BTServiceClient.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -25,12 +25,12 @@ #include "BTConnectionTimer.h" #include "BTSUDebug.h" -const TUint16 KMtuSizeReceiv = 0xFFFF; // 64kB -const TUint16 KMtuSizeTrans = 0x3000; // 12kB -const TInt KBufferSize = 0x4000; // 16kB +const TUint16 KMtuSizeReceiv = 0xFFFF; // 64kB - 1 (65535) +const TUint16 KMtuSizeTrans = 0x8000; // 32kB +const TInt KBufferSize = 0x8000; // 32kB -const TInt KBTConnectionTimeout = 20000000; // 20 seconds -const TInt KBTAbortTimeout = 2000000; // 20 seconds +const TInt KBTConnectionTimeout = 20 * 1000 * 1000; // 20 seconds +const TInt KBTAbortTimeout = 2 * 1000 * 1000; // 2 seconds // CONSTANTS diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexsendservices/obexservicesendutils/src/BTServiceStarter.cpp --- a/btobexprofiles/obexsendservices/obexservicesendutils/src/BTServiceStarter.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexsendservices/obexservicesendutils/src/BTServiceStarter.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -743,7 +743,7 @@ { FLOG(_L("[BTSU]\t CBTServiceStarter::ServiceAttributeSearchComplete()")); TInt err = KErrNone; - if (aErr==KErrEof && aAttr.Count()>0 ) + if ((aErr==KErrEof || aErr==KErrNone) && aAttr.Count()>0 ) { RSdpResultArray results=aAttr; iBTEngDiscovery->ParseRfcommChannel(results,iClientChannel); @@ -812,6 +812,10 @@ iState = EBTSStarterFindingBIP; iTriedOPP = ETrue; } + else if (aErr==KErrNone && aAttr.Count()==0) + { + // This isn't KErrEof so we aren't done yet, wait for further matches + } else { // Set destroyer AO active (destroys CBTEngDiscovery/CBTEngSdpQuery classes). This is done diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexserviceman/rom/obex.iby --- a/btobexprofiles/obexserviceman/rom/obex.iby Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexserviceman/rom/obex.iby Wed Aug 18 09:59:05 2010 +0300 @@ -19,6 +19,8 @@ #ifndef __OBEX_IBY__ #define __OBEX_IBY__ +#include + #ifdef SYMBIAN_EXCLUDE_OBEX REM Messaging OBEX MTM is not included in this ROM, because it depends on excluded OBEX #else diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexserviceman/utils/inc/obexutilsentryhandler.h --- a/btobexprofiles/obexserviceman/utils/inc/obexutilsentryhandler.h Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexserviceman/utils/inc/obexutilsentryhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -54,19 +54,7 @@ */ TInt AddEntryAttachment(const TDesC &aFilePath, CMsvAttachment* anAttachInfo, CMsvStore* aStore ); - /** - * Update an entry attachment - * @since S60 v5.0 - * @param aFilePath the absolute file path of the linked attachment file. - * @param anAttachInfo the attachment info associated with the file. - * @param aStore An interface ove the message store that is associated with a message entry. - * @return error code - */ - TInt UpdateEntryAttachment(TFileName& aFileName, - CMsvAttachment* anOldAttachInfo, - CMsvAttachment* aNewAttachInfo, - CMsvStore* aStore ); - + // from base class CActive /** @@ -97,23 +85,6 @@ */ void ConstructL(); - /** - * Add link attachment - * - * @since S60 v5.0 - */ - void DoAddEntryAttachmentL(const TDesC &aFilePath, CMsvAttachment* anAttachInfo, CMsvStore* aStore); - - - /** - * Update link attachment - * - * @since S60 v5.0 - */ - void DoUpdateEntryAttachmentL(TFileName& aFileName, - CMsvAttachment* anOldAttachInfo, - CMsvAttachment* aNewAttachInfo, - CMsvStore* aStore); private: // member data diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexserviceman/utils/src/obexutilsentryhandler.cpp --- a/btobexprofiles/obexserviceman/utils/src/obexutilsentryhandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexserviceman/utils/src/obexutilsentryhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -81,7 +81,8 @@ iStatus = KRequestPending; - TRAPD(error, DoAddEntryAttachmentL(aFilePath, anAttachInfo, aStore)); + TRAPD(error, aStore->AttachmentManagerL().AddLinkedAttachmentL(aFilePath,anAttachInfo, iStatus);); + if (error != KErrNone ) { //Complete request @@ -98,76 +99,6 @@ // --------------------------------------------------------------------------- -// DoAddLinkAttachmentL() -// --------------------------------------------------------------------------- -// -void CObexutilsEntryhandler::DoAddEntryAttachmentL( - const TDesC &aFilePath, - CMsvAttachment* anAttachInfo, - CMsvStore* aStore) - { - FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoAddEntryAttachmentL()")); - - aStore->AttachmentManagerL().AddLinkedAttachmentL(aFilePath,anAttachInfo, iStatus); - - //Complete request - TRequestStatus* status = &iStatus; - User::RequestComplete(status, KErrNone); - - FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoAddEntryAttachmentL() completed")); - } - -// --------------------------------------------------------------------------- -// UpdateLinkAttachment() -// --------------------------------------------------------------------------- -// -TInt CObexutilsEntryhandler::UpdateEntryAttachment( - TFileName& aFileName, - CMsvAttachment* anOldAttachInfo, - CMsvAttachment* aNewAttachInfo, - CMsvStore* aStore) - { - FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::UpdateEntryAttachment()")); - - iStatus = KRequestPending; - - TRAPD(error, DoUpdateEntryAttachmentL(aFileName,anOldAttachInfo, aNewAttachInfo, aStore)); - if (error != KErrNone ) - { - //Complete request - TRequestStatus* status = &iStatus; - User::RequestComplete(status, error); - } - - SetActive(); - iSyncWaiter.Start(); - - FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::UpdateEntryAttachment() Done")); - return iStatus.Int(); - } - -// --------------------------------------------------------------------------- -// DoUpdateEntryAttachmentL() -// --------------------------------------------------------------------------- -// -void CObexutilsEntryhandler::DoUpdateEntryAttachmentL( - TFileName& aFileName, - CMsvAttachment* anOldAttachInfo, - CMsvAttachment* aNewAttachInfo, - CMsvStore* aStore) - { - FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoUpdateEntryAttachmentL()")); - aStore->AttachmentManagerL().RemoveAttachmentL(anOldAttachInfo->Id(), iStatus); - aStore->AttachmentManagerL().AddLinkedAttachmentL(aFileName,aNewAttachInfo, iStatus); - - //Complete request - TRequestStatus* status = &iStatus; - User::RequestComplete(status, KErrNone); - - FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoUpdateEntryAttachmentL() completed")); - } - -// --------------------------------------------------------------------------- // From class CActive. // RunL() // --------------------------------------------------------------------------- diff -r 0b2439c3e397 -r 4545c04e61e1 btobexprofiles/obexserviceman/utils/src/obexutilsmessagehandler.cpp --- a/btobexprofiles/obexserviceman/utils/src/obexutilsmessagehandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/btobexprofiles/obexserviceman/utils/src/obexutilsmessagehandler.cpp Wed Aug 18 09:59:05 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); @@ -342,11 +345,13 @@ TPtrC mimeType16(buf16->Des()); CleanupStack::PopAndDestroy(); // buf16 - CUpdateMusicCollection* updateMusicCollection = CUpdateMusicCollection::NewL() ; + CUpdateMusicCollection* updateMusicCollection = CUpdateMusicCollection::NewL(); + CleanupStack::PushL(updateMusicCollection); if (updateMusicCollection->isSupported(mimeType16)) { updateMusicCollection->addToCollectionL(aFileName); } + CleanupStack::PopAndDestroy(); // updateMusicCollection aAttachInfo->SetMimeTypeL( mimeType ); diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/data/2002C3BA_TDSCDMA.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/data/2002C3BA_TDSCDMA.rss Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,42 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// Initial Contributors: +// Nokia Corporation - initial contribution. +// Contributors: +// + +#include "../inc/atmisccmdpluginuids.hrh" +#include +#include + +RESOURCE REGISTRY_INFO theInfo + { + // UID for the DLL + dll_uid = 0x2002C3BA;//KUidATCFunEcomDll; + // Declare array of interface info + interfaces = + { + INTERFACE_INFO + { + // UID of interface that is implemented + interface_uid = 0x2001CBEE; // ATEXT_INTERFACE_DUN_UID; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x2002DC6B;// KUidATMiscCmdEcomImpl; + version_no = 1; + display_name = "Miscellaneous AT commands Implementation"; + default_data = "MAT+CLCK|MAT+CPWD|MAT+CUSD|MAT+CPIN|MAT+CNUM|MAT+CFUN|MAT+CBC|OAT+CMEE|MAT^HVER|MAT+CGSN|MAT+CGMR|MAT+CGMI|MAT+CMGD|OAT+CMGF|MAT+GMI|MAT+GMR|MAT+GSN|MAT+CGMM|MAT+GMM|MATI|MATI0|MATI1|MATI2|MATI3|MATI4|MAT^SCPBR|MAT^SCPBW"; + opaque_data = ""; + } + }; + } + }; + } + +// End of file diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/group/atmisccmdplugin.mmp --- a/cbsatplugin/atmisccmdplugin/group/atmisccmdplugin.mmp Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/group/atmisccmdplugin.mmp Wed Aug 18 09:59:05 2010 +0300 @@ -13,13 +13,19 @@ * */ +FEATUREVARIANT + #include #include #include "../inc/atmisccmdpluginuids.hrh" CAPABILITY CAP_ECOM_PLUGIN VENDORID VID_DEFAULT +#ifdef PROTOCOL_TDSCDMA +TARGET atmisccmdplugin_td.dll +#else TARGET atmisccmdplugin.dll +#endif TARGETTYPE PLUGIN UID 0x10009D8D 0x2002C3BA @@ -42,15 +48,33 @@ SOURCE ussdreadmessageimpl.cpp SOURCE ussdsendmessageimpl.cpp +#ifdef PROTOCOL_TDSCDMA +SOURCE hvercommandhandler.cpp +SOURCE cgsncommandhandler.cpp +SOURCE cgmrcommandhandler.cpp +SOURCE cmgwcommandhandler.cpp +SOURCE cgmicommandhandler.cpp +SOURCE cmgdcommandhandler.cpp +SOURCE telephonywrapper.cpp +SOURCE cgmmcommandhandler.cpp +SOURCE scpbrcommandhandler.cpp +SOURCE scpbwcommandhandler.cpp +#endif USERINCLUDE ../inc MW_LAYER_SYSTEMINCLUDE +// Resources - inclusion controlled by iby START RESOURCE ../data/2002C3BA.rss TARGET atmisccmdplugin.rsc END +START RESOURCE ../data/2002C3BA_TDSCDMA.rss +TARGET atmisccmdplugin_td.rsc +END + + LIBRARY ecom.lib LIBRARY euser.lib LIBRARY atextpluginbase.lib @@ -65,8 +89,10 @@ LIBRARY etel3rdparty.lib LIBRARY sysutil.lib -LIBRARY flogger.lib +#ifdef PROTOCOL_TDSCDMA +LIBRARY customapi.lib +#endif -MACRO _DEBUG -MACRO USE_FILE_LOGGING +DEBUGLIBRARY flogger.lib + // End of File diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/atcommandparser.h --- a/cbsatplugin/atmisccmdplugin/inc/atcommandparser.h Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/inc/atcommandparser.h Wed Aug 18 09:59:05 2010 +0300 @@ -53,7 +53,27 @@ ECmdAtCpin, ECmdAtCusd, ECmdAtCnum, - ECmdAtCmee + ECmdAtCmee, + ECmdAtHver, + ECmdAtCgsn, + ECmdAtGsn, + ECmdAtCgmr, + ECmdAtGmr, + ECmdAtCgmi, + ECmdAtGmi, + ECmdAtCmgw, + ECmdAtCmgd, + ECmdAtCmgf, + ECmdAtCgmm, + ECmdAtGmm, + ECmdAtI, + ECmdAtI0, + ECmdAtI1, + ECmdAtI2, + ECmdAtI3, + ECmdAtI4, + ECmdAtScpbr, + ECmdAtScpbw }; public: TAtCommandParser(); diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/atmisccmdplugin.h --- a/cbsatplugin/atmisccmdplugin/inc/atmisccmdplugin.h Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/inc/atmisccmdplugin.h Wed Aug 18 09:59:05 2010 +0300 @@ -81,6 +81,13 @@ */ virtual void CreateCMEReplyAndComplete(TInt aError) = 0; + /* + * Complete the AT command request with AT CMS error code according to given Symbian error code + * @param aError Symbian error code + */ + + virtual void CreateCMSReplyAndComplete(TInt aError) = 0; + /** * Returns plugin's character value settings (from CATExtPluginBase) * @@ -137,6 +144,10 @@ virtual TInt CreateOkOrErrorReply( RBuf8& aReplyBuffer, TBool aOkReply ); + + virtual TInt CreateEditModeBuffer( RBuf8& aReplyBuffer ); + virtual void CreateCMSReplyAndComplete(TInt aError); + virtual void CreateCMEReplyAndComplete(TInt aError); virtual TInt GetCharacterValue( TCharacterTypes aCharType, TChar& aChar ); virtual TInt GetModeValue( TModeTypes aModeType, TBool& aMode ); @@ -148,7 +159,8 @@ TInt CreatePartOfReply( RBuf8& aBuffer ); void HandleCMEECommand(); - + void HandleCMGFCommand(); + /* * Utility function that connect to Etel server and establish a subsession to RMobilePhone * Caller must close session and subsession after use. @@ -175,7 +187,18 @@ CATCmdAsyncBase* iCNUMHandler; CATCmdAsyncBase* iCFUNHandler; CATCmdAsyncBase* iCBCHandler; - + + // TDSCDMA only + CATCmdSyncBase* iHVERHandler; + CATCmdSyncBase* iCGSNHandler; + CATCmdSyncBase* iCGMRHandler; + CATCmdSyncBase* iCGMIHandler; + CATCmdAsyncBase* iCMGWHandler; + CATCmdAsyncBase* iCMGDHandler; + CATCmdSyncBase* iCGMMHandler; + CATCmdAsyncBase* iSCPBRHandler; + CATCmdAsyncBase* iSCPBWHandler; + /** * Buffer for handle command's command * Not own. diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/atmisccmdpluginconsts.h --- a/cbsatplugin/atmisccmdplugin/inc/atmisccmdpluginconsts.h Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/inc/atmisccmdpluginconsts.h Wed Aug 18 09:59:05 2010 +0300 @@ -21,15 +21,20 @@ _LIT8(KCRLF, "\r\n"); _LIT8(KOKCRLF, "\r\n\r\nOK\r\n"); -_LIT8(KAtCLCK, "+CLCK: "); +_LIT8(KAtCLCK, "\r\n+CLCK: "); _LIT8(KAtCFUN, "+CFUN: "); _LIT8(KAtCBC, "+CBC: "); _LIT8(KAtCUSD, "+CUSD: "); - -_LIT8(KCLCKSupportedCmdsList, "+CLCK: (\"PS\",\"SC\",\"AO\",\"OI\",\"OX\",\"AI\",\"IR\",\"AB\",\"AG\",\"AC\")\r\n\r\nOK\r\n"); -_LIT8(KCFUNSupportedCmdsList, "+CFUN: (0,1,4),(0,1)\r\n\r\nOK\r\n"); -_LIT8(KCBCSupportedCmdsList, "+CBC: (0,1,2,3),(1...100)\r\n\r\nOK\r\n"); +_LIT8(KAtCMGW, "+CMGW: "); +_LIT8(KSCPBR, "\r\n^SCPBR: "); +_LIT8(KCLCKSupportedCmdsList, "\r\n+CLCK: (\"PS\",\"SC\",\"AO\",\"OI\",\"OX\",\"AI\",\"IR\",\"AB\",\"AG\",\"AC\")\r\n\r\nOK\r\n"); +_LIT8(KCFUNSupportedCmdsList, "\r\n+CFUN: (0,1,4),(0,1)\r\n\r\nOK\r\n"); +_LIT8(KCBCSupportedCmdsList, "\r\n+CBC: (0,1,2,3),(1...100)\r\n\r\nOK\r\n"); _LIT8(KCUSDSupportedCmdsList, "+CUSD: (0,1)\r\n\r\nOK\r\n"); +_LIT8(KCMGDSupportedCmdsList, "\r\n+CMGD: (%S), (0,1,2,3,4)\r\n"); +_LIT8(KSCPBRSupportedEntriesIndexList,"\r\n^SCPBR:(1-%d),%d,%d,%d \r\n"); +_LIT8(KSCPBRReplyOneEntry,"%d,\"%S\",,\"%S\",,\"%S\",,\"%S\",,\"%S\",,\"%S\""); +_LIT8(KSCPBWSupportedCmdsList, "\r\n^SCPBW: (1-%d),%d,(),%d,%d\r\n"); _LIT8(KATCLCKPS, "PS"); _LIT8(KATCLCKSC, "SC"); @@ -42,7 +47,19 @@ _LIT8(KATCLCKAG, "AG"); _LIT8(KATCLCKAC, "AC"); +_LIT8(KHVERModelString, "RM-"); + +_LIT8(KCMSErr, "+CMS ERROR: "); + // Max buffer length for an MD5 digest - originally defined in SCPServerInterface.h const TInt KSCPMaxHashLength( 32 ); +const TInt KSCPBRDefaultSizeOfOneEntry( 320 ); +const TInt KSCPBRMaxNameLength( 64 ); +const TInt KSCPBRMaxNumberLength( 32 ); +const TInt KSCPBRMaxEmailLength( 64 ); +const TInt KSCPBRMaxNumberCount( 4 ); +const TInt KSCPBRMaxEntryCount( 1000 ); + +const TInt KBufBlockSize (1024); #endif // ATMISCCMDPLUGINCONSTS_H diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/cgmicommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/cgmicommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CGMICommandHandler class declaration for AT+CGMI command + * + */ + +#ifndef CGMICOMMANDHANDLER_H +#define CGMICOMMANDHANDLER_H + +#include "atcmdsyncbase.h" + +#include + +/** + * AT+CGMI command handler implementation class + */ +NONSHARABLE_CLASS( CCGMICommandHandler ) : public CATCmdSyncBase + { +public: + static CCGMICommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CCGMICommandHandler(); + +public: + void SetManufacturer(const TDesC8& aManufacturer); + void SetTelephonyError(TInt aTelError); + +private: // methods from CATCmdSyncBase + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + CCGMICommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + +private: + TInt iTelError; + TBuf8 iManufacturer; + + RBuf8 iReply; + }; + +#endif /* CGMICOMMANDHANDLER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/cgmmcommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/cgmmcommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CGMMCommandHandler class declaration for AT+CGMM command + * + */ + +#ifndef CGMMCOMMANDHANDLER_H +#define CGMMCOMMANDHANDLER_H + +#include "atcmdsyncbase.h" + +#include + +/** + * AT+CGMM command handler implementation class + */ +NONSHARABLE_CLASS( CCGMMCommandHandler ) : public CATCmdSyncBase + { +public: + static CCGMMCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CCGMMCommandHandler(); + +public: + void SetManufacturer(const TDesC8& aManufacturer); + void SetModelID(const TDesC8& aModelID); + void SetTelephonyError(TInt aTelError); + +private: // methods from CATCmdSyncBase + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + CCGMMCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + +private: + TInt iTelError; + TBuf8 iManufacturer; + TBuf8 iModel; + + RBuf8 iReply; + }; + +#endif /* CGMMCOMMANDHANDLER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/cgmrcommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/cgmrcommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CGMRCommandHandler class declaration for AT+CGMR command + * + */ + +#ifndef CGMRCOMMANDHANDLER_H +#define CGMRCOMMANDHANDLER_H + + +#include "atcmdsyncbase.h" + +/** + * AT+CGMR command handler implementation class + */ +NONSHARABLE_CLASS( CCGMRCommandHandler ) : public CATCmdSyncBase + { +public: + static CCGMRCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CCGMRCommandHandler(); + +private: // methods from CATCmdSyncBase + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + CCGMRCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + + TInt GetSoftwareVersion(); + +private: + RBuf8 iReply; + }; + +#endif /* CGMRCOMMANDHANDLER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/cgsncommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/cgsncommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CGSNCommandHandler class declaration for AT+CGSN command + * + */ + +#ifndef CGSNCOMMANDHANDLER_H +#define CGSNCOMMANDHANDLER_H + +#include "atcmdsyncbase.h" + +#include + +/** + * AT+CGSN command handler implementation class + */ +NONSHARABLE_CLASS( CCGSNCommandHandler ) : public CATCmdSyncBase + { +public: + static CCGSNCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CCGSNCommandHandler(); + +public: + void SetSerialNum(const TDesC8& aSerial); + void SetTelephonyError(TInt aTelError); + +private: // methods from CATCmdSyncBase + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + CCGSNCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + +private: + TInt iTelError; + TBuf8 iSN; + + RBuf8 iReply; + }; + +#endif /* CGSNCOMMANDHANDLER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/cmgdcommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/cmgdcommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CCMGDCommandHandler class declaration for AT+CMGD command + * + */ + +#ifndef CMGDCOMMANDHANDLER_H +#define CMGDCOMMANDHANDLER_H + +#include "atcmdasyncbase.h" + +#include + +class CMobilePhoneGsmSmsList; +class CRetrieveMobilePhoneSmsList; +/** + * AT+CMGD command handler implementation class + */ +NONSHARABLE_CLASS( CCMGDCommandHandler ) : public CATCmdAsyncBase + { +private: +/** + * States for CMGD command handler + */ +enum TCMGDState + { + ECMGDStateIdle, + ECMGDStateRetrieveAllIndices, + ECMGDStateDeleteOneEntry, + ECMGDStateDeleteFilteredEntries, + ECMGDStateDeleteAllEntries, + ECMGDStateSimStoreNotSupported + }; + +enum TCMGDFilter + { + ECMGDFilterReadMessagesOnly, + ECMGDFilterReadAndSentMessages, + ECMGDFilterReadSentAndUnsentMessages + }; + +public: + static CCMGDCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CCMGDCommandHandler(); + +private: // methods from CActive + + virtual void RunL(); + virtual void DoCancel(); + virtual TInt RunError(TInt aError); + +private: // methods from CATCmdAsyncBase + + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + + CCMGDCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + + TInt ParseParameters(); + TInt DoHandleCommand(); + + void GetMessageIndexListL(); + void FilterMessageListL(); + +private: + + RMobileSmsMessaging iMobileSmsMessaging; + RMobileSmsStore iMobileSmsStore; + + CRetrieveMobilePhoneSmsList* iRetrieveSmsList; + CMobilePhoneGsmSmsList* iGsmSmsList; + + TCMGDState iHandlerState; + TCMGDFilter iFilterType; + TInt iIndex; + TInt iDelFlag; + RArray iDeleteList; + + RBuf8 iReply; + }; + +#endif /* CMGDCommandHandler_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/cmgwcommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/cmgwcommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CMGWCommandHandler class declaration for AT+CMGW command + * + */ + +#ifndef CMGWCOMMANDHANDLER_H +#define CMGWCOMMANDHANDLER_H + +#include "atcmdasyncbase.h" + +#include +#include + +class CRetrieveMobilePhoneSmspList; +class CMobilePhoneSmspList; + +/** + * AT+CMGW command handler implementation class + */ +NONSHARABLE_CLASS( CCMGWCommandHandler ) : public CATCmdAsyncBase + { +private: + enum TCMGWState + { + ECMGWStateIdle, // Idle + ECMGWStateEditMode, // Edit mode + ECMGWStateRetrieveSCA, // Retrieve SCA + ECMGWStatePreparePDU, + ECMGWStateWritePDU, // Write PDU + ECMGWStateSimStoreNotSupported // Sim store not supported + }; + +public: + static CCMGWCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CCMGWCommandHandler(); + + void SetMessageFormat(TInt aFormat); + +private: // methods from CActive + virtual void RunL(); + virtual void DoCancel(); + virtual TInt RunError (TInt aError); + +private: // methods from CATCmdAsyncBase + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + CCMGWCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + + void HandleEditModeCommand( const TDesC8& aCmd ); + TInt ParseParameters(); + TInt CreateSmsEntry(); + TInt ExtractSCA(); + +private: + RMobileSmsMessaging iMobileSmsMessaging; + RMobileSmsStore iMobileSmsStore; + CRetrieveMobilePhoneSmspList* iRetrieveMobilePhoneSmspList; + CMobilePhoneSmspList* iMobilePhoneSmspList; + RMobileSmsMessaging::TMobileSmspEntryV1 iMobileSmspEntry; + + RMobilePhone::TMobileAddress iServiceCentre; + + TCMGWState iState; + RBuf8 iTPDU; + + TInt iTPDULength; + TInt iTPDUStat; + TUint8 iSCALength; + RMobileSmsStore::TMobileSmsStoreStatus iMessageStatus; + + RMobileSmsStore::TMobileGsmSmsEntryV1 iEntry; + RMobileSmsStore::TMobileGsmSmsEntryV1Pckg iEntryPckg; + + RBuf8 iReply; + + TInt iMsgFormat; + }; + +#endif /* CMGWCOMMANDHANDLER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/cmserror.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/cmserror.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : define all +CMS Error codes. + * Reference: + * 3GPP TS 27.007 version 6.9.0 Release 6 118 ETSI TS 127 007 V6.9.0 (2007-06) + * + */ + +#ifndef CMSERROR_H +#define CMSERROR_H + +enum TATCMSError + { + EATCmsErrGeneral = 0, + EATCMSErr301 = 301, + EATCMSErr304 = 304, + EATCMSErr310 = 310, + EATCMSErr311 = 311, + EATCMSErr312 = 312, + EATCMSErr316 = 316, + EATCMSErr320 = 320, + EATCMSErr321 = 321, + EATCMSErr322 = 322 + }; + +#endif /* CMSERROR_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/hvercommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/hvercommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CHVERCommandHandler class declaration for AT^HVER command + * + */ + +#ifndef CHVERCOMMANDHANDLER_H +#define CHVERCOMMANDHANDLER_H + +#include "atcmdsyncbase.h" +#include "debug.h" + +#include + +/** + * AT^HVER command handler implementation class + */ +NONSHARABLE_CLASS( CHVERCommandHandler ) : public CATCmdSyncBase + { +public: + static CHVERCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CHVERCommandHandler(); + +public: + void SetHWVersion(const TDesC8& aHWVersion); + void SetTelephonyError(TInt aTelError); + +private: // methods from CATCmdSyncBase + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + CHVERCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + + void ParseSWVersion(const TDesC8& aSWVersion); + +private: + TInt iTelError; + TBuf8 iModel; + + RBuf8 iSWVersion; + RBuf8 iReply; + }; + +#endif /* CHVERCOMMANDHANDLER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/scpbrcommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/scpbrcommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CSCPBRCommandHandler class declaration for AT^SCPBR command + * + */ + +#ifndef SCPBRCOMMANDHANDLER_H_ +#define SCPBRCOMMANDHANDLER_H_ + +#include +#include +#include +#include + +#include "atcmdasyncbase.h" +#include "atmisccmdpluginconsts.h" + +class CPhoneBookBuffer; + +/** + * AT^SCPBR command handler implementation class + */ +NONSHARABLE_CLASS( CSCPBRCommandHandler ) : public CATCmdAsyncBase + { +private: + + /** + * SCPBR States + */ + enum TSCPBRState + { + ESCPBRStateIdle, // Idle + ESCPBRStateRead, // Read + ESCPBRStateGetPhoneBookInfo, // Get phone book info. + ESCPBRStateGet3GPBInfo, // Get 3G phone book info. + ESCPBRStateNotSupported // phone book store not supported + }; +private: + /** + * The data structure of phone book entry. + * Inner class used by CSCPBRCommandHandler only. + */ + class TPhoneBookEntry + { + public: + TPhoneBookEntry(): iIndex(-1) + { + } + + void Externalize( TDes8& aDes ) const; + + TInt iIndex; + + TBuf8 iNumber1; + TBuf8 iNumber2; + TBuf8 iNumber3; + TBuf8 iNumber4; + + TBuf8 iName; + + TBuf8 iEmail; + }; + +public: + static CSCPBRCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone ); + + virtual ~CSCPBRCommandHandler(); + +private: // from CATCmdAsyncBase + virtual void HandleCommand(const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded); + +private: // from CActive + virtual void RunL(); + virtual void DoCancel(); + virtual TInt RunError(TInt aError); + +private: + CSCPBRCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone ); + void ConstructL(); + + void ExtractEntriesL(); + void CopyToPhonebookEntryField(TDes8& aDest, const TDesC16& aSrc); + void FormatReplyL(); + TInt ParseParameters(); + void AppendEntryL(const TPhoneBookEntry& aEntry); + +private: + /** + * The first index to be read from phonebook store. + */ + TInt iIndex1; + + /** + * The last index to be read from phonebook store. + */ + TInt iIndex2; + + /** + * The reply + */ + RBuf8 iReply; + + /** + * The phone book store. used to get entries information and entries. + */ + RMobilePhoneBookStore iPhoneBookStore; + + /** + * used to save the entries information. + */ + RArray iEntries; + + /** + * Used to parse the content get from PhoneBookStore. + */ + CPhoneBookBuffer* iPhoneBookBuffer; + + /** + * The buffer to get phonebookstore entries content. + */ + RBuf8 iContactsBuf; + + /** + * Current state + */ + TSCPBRState iState; + + /** + * The PhonebookInfo, used to get phone book entries information. + */ + RMobilePhoneBookStore::TMobilePhoneBookInfoV1 iPhoneBookInfo; + + /** + * Total entries supported by phonebook store. + */ + TInt iTotalEntries; + /** + * The max number length supported + */ + TInt iNLength; + + /** + * The max email length supported. + */ + TInt iMLength; + + /** + * The max text length supported. + */ + TInt iTLength; + + /** + * Used to get 3GPBInfo. + */ + RMmCustomAPI iCustomApi; + + /** + * Used to get 3GPBInfo. + */ + RMmCustomAPI::T3GPBInfo i3GPBInfo; + + }; + +#endif /* SCPBRCOMMANDHANDLER_H_ */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/scpbwcommandhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/scpbwcommandhandler.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * SCPBWCommandHandler class declaration for AT^SCPBW command + * + */ + +#ifndef SCPBWCOMMANDHANDLER_H +#define SCPBWCOMMANDHANDLER_H + +#include "atcmdasyncbase.h" + +#include +#include + +class CPhoneBookBuffer; + +/** + * AT^SCPBW command handler implementation class + */ +NONSHARABLE_CLASS( CSCPBWCommandHandler ) : public CATCmdAsyncBase + { +private: + enum TSCPBWState + { + ESCPBWStateIdle, + ESCPBWStateGetPhonebookInfo, + ESCPBWStateGet3GPBInfo, + ESCPBWStateWrite, + ESCPBWStateDelete, + ESCPBWStateSimStoreNotSupported + }; + +public: + static CSCPBWCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + ~CSCPBWCommandHandler(); + +private: // methods from CActive + virtual void RunL(); + virtual void DoCancel(); + +private: // methods from CATCmdAsyncBase + virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded ); + +private: + CSCPBWCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone); + void ConstructL(); + + TInt ParseParameters( TBool& aIsDeleteRequest ); + TInt CreateContactEntry(); + void ResetParameters(); + void SetBuffer(TDes& aDest, const TDesC8& aSource); + +private: + + RMobilePhoneBookStore iPhoneBookStore; + CPhoneBookBuffer* iPhoneBookBuffer; + RMobilePhoneBookStore::TMobilePhoneBookInfoV1 iPhoneBookStoreInfo; + RMmCustomAPI iMmCustomAPI; + RMmCustomAPI::T3GPBInfo i3GPBInfo; + + TInt iIndex; + RBuf iNum1; + TInt iType1; + RBuf iNum2; + TInt iType2; + RBuf iNum3; + TInt iType3; + RBuf iNum4; + TInt iType4; + RBuf iText; + TInt iCoding; + RBuf iEmail; + + TInt iNumLength; + TInt iTextLength; + TInt iEmailLength; + TInt iMaxEntries; + + RBuf8 iPbData; + + TSCPBWState iState; + + RBuf8 iReply; + + }; + +#endif /* SCPBWCOMMANDHANDLER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/inc/telephonywrapper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/inc/telephonywrapper.h Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description : + * + * CTelephonyWrapper class declaration for wrapping CTelephony::GetPhoneId + * + */ + +#ifndef TELEPHONYWRAPPER_H +#define TELEPHONYWRAPPER_H + +#include + +/** + * Synchronous wrapper for CTelephony::GetPhoneId + */ +NONSHARABLE_CLASS (CTelephonyWrapper) : public CActive + { +public: + static CTelephonyWrapper* NewL(); + virtual ~CTelephonyWrapper(); + + TInt SynchronousGetPhoneId(); + + const TDesC8& GetPhoneModel(); + const TDesC8& GetPhoneSerialNum(); + const TDesC8& GetPhoneManufacturer(); + +private: // From CActive + virtual void RunL(); + virtual void DoCancel(); + +private: // Constructors + CTelephonyWrapper(); + void ConstructL(); + +private: + CActiveSchedulerWait iWaiter; + + CTelephony* iTelephony; + CTelephony::TPhoneIdV1 iPhoneIdV1; + CTelephony::TPhoneIdV1Pckg iPhoneIdV1Pckg; + + TBufC8 iModel; + TBufC8 iSn; + TBufC8 iManufacturer; + + }; + +#endif /* TELEPHONYWRAPPER_H */ diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/rom/atmisccmdplugin.iby --- a/cbsatplugin/atmisccmdplugin/rom/atmisccmdplugin.iby Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/rom/atmisccmdplugin.iby Wed Aug 18 09:59:05 2010 +0300 @@ -16,7 +16,11 @@ #ifndef ATMISCCMDPLUGIN_IBY #define ATMISCCMDPLUGIN_IBY +#ifdef PROTOCOL_TDSCDMA +ECOM_PLUGIN(atmisccmdplugin_td.dll, atmisccmdplugin_td.rsc) +#else ECOM_PLUGIN(atmisccmdplugin.dll, atmisccmdplugin.rsc) +#endif #endif // ATMISCCMDPLUGIN_IBY diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp --- a/cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -58,7 +58,29 @@ _LIT8(KAtCpin, "AT+CPIN"); _LIT8(KAtCusd, "AT+CUSD"); _LIT8(KAtCnum, "AT+CNUM"); - _LIT8(KAtCmee, "AT+CMEE"); + _LIT8(KAtCmee, "AT+CMEE"); +#ifdef PROTOCOL_TDSCDMA + _LIT8(KAtHver, "AT^HVER"); + _LIT8(KAtCgsn, "AT+CGSN"); + _LIT8(KAtCgmr, "AT+CGMR"); + _LIT8(KAtCgmi, "AT+CGMI"); + _LIT8(KAtCmgw, "AT+CMGW"); + _LIT8(KAtCmgd, "AT+CMGD"); + _LIT8(KAtCmgf, "AT+CMGF"); + _LIT8(KAtiBase, "ATI"); + _LIT8(KAti0, "ATI0"); + _LIT8(KAti1, "ATI1"); + _LIT8(KAti2, "ATI2"); + _LIT8(KAti3, "ATI3"); + _LIT8(KAti4, "ATI4"); + _LIT8(KAtGmr, "AT+GMR"); + _LIT8(KAtGmi, "AT+GMI"); + _LIT8(KAtGsn, "AT+GSN"); + _LIT8(KAtCgmm, "AT+CGMM"); + _LIT8(KAtGmm, "AT+GMM"); + _LIT8(KAtScpbr, "AT^SCPBR"); + _LIT8(KAtScpbw, "AT^SCPBW"); +#endif Trace(KDebugPrintS, "token: ", &token); // Determine the AT command type @@ -90,10 +112,92 @@ { iCmdType = ECmdAtCnum; } - else if(!token.Compare(KAtCmee)) + else if(!token.CompareF(KAtCmee)) { iCmdType = ECmdAtCmee; + } +#ifdef PROTOCOL_TDSCDMA + else if(!token.CompareF(KAtHver)) + { + iCmdType = ECmdAtHver; } + else if(!token.CompareF(KAtCgsn)) + { + iCmdType = ECmdAtCgsn; + } + else if(!token.CompareF(KAtGsn)) + { + iCmdType = ECmdAtGsn; + } + else if(!token.CompareF(KAtCgmr)) + { + iCmdType = ECmdAtCgmr; + } + else if(!token.CompareF(KAtGmr)) + { + iCmdType = ECmdAtGmr; + } + else if(!token.CompareF(KAtCgmi)) + { + iCmdType = ECmdAtCgmi; + } + else if(!token.CompareF(KAtGmi)) + { + iCmdType = ECmdAtGmi; + } + else if(!token.CompareF(KAtCmgw)) + { + iCmdType = ECmdAtCmgw; + } + else if(!token.CompareF(KAtCmgd)) + { + iCmdType = ECmdAtCmgd; + } + else if(!token.CompareF(KAtCmgf)) + { + iCmdType = ECmdAtCmgf; + } + else if(!token.CompareF(KAtCgmm)) + { + iCmdType = ECmdAtCgmm; + } + else if(!token.CompareF(KAtGmm)) + { + iCmdType = ECmdAtGmm; + } + else if(!token.CompareF(KAtiBase)) + { + iCmdType = ECmdAtI; + } + else if(!token.CompareF(KAti0)) + { + iCmdType = ECmdAtI0; + } + else if(!token.CompareF(KAti1)) + { + iCmdType = ECmdAtI1; + } + else if(!token.CompareF(KAti2)) + { + iCmdType = ECmdAtI2; + } + else if(!token.CompareF(KAti3)) + { + iCmdType = ECmdAtI3; + } + else if(!token.CompareF(KAti4)) + { + iCmdType = ECmdAtI4; + } + else if(!token.CompareF(KAtScpbr)) + { + iCmdType = ECmdAtScpbr; + } + else if(!token.CompareF(KAtScpbw)) + { + iCmdType = ECmdAtScpbw; + } +#endif else { iCmdType = EUnknown; @@ -164,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; } diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/atmisccmdplugin.cpp --- a/cbsatplugin/atmisccmdplugin/src/atmisccmdplugin.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/src/atmisccmdplugin.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -24,20 +24,47 @@ #include "cnumcommandhandler.h" #include "cfuncommandhandler.h" #include "cbccommandhandler.h" +#ifdef PROTOCOL_TDSCDMA +#include "hvercommandhandler.h" +#include "cgsncommandhandler.h" +#include "cgmrcommandhandler.h" +#include "cgmicommandhandler.h" +#include "cmgwcommandhandler.h" +#include "cmgdcommandhandler.h" +#include "telephonywrapper.h" +#include "cgmmcommandhandler.h" +#include "scpbrcommandhandler.h" +#include "scpbwcommandhandler.h" +#endif + #include "atmisccmdpluginconsts.h" +#include "cmserror.h" #include "debug.h" -#include // Additional RMobilePhone error code +#include // Additional RMobilePhone error code +#include // ETelMM error code +#include // GSM error code // +CME error code +_LIT8(KCMEMemoryFailure, "+CME ERROR: 23\r\n"); // Memory failure.\r\n _LIT8(KCMEIncorrectPassword, "+CME ERROR: 16\r\n"); // Incorrect password.\r\n _LIT8(KCMEPUKRequired, "+CME ERROR: 12\r\n"); // PUK required.\r\n _LIT8(KCMENotAllowed, "+CME ERROR: 3\r\n"); // Operation not allowed.\r\n _LIT8(KCMEPhoneError, "+CME ERROR: 0\r\n"); // Phone failure.\r\n _LIT8(KCMEPhoneUnknown, "+CME ERROR: 100\r\n"); // unknown error +_LIT8(KCMESimNotInserted, "+CME ERROR: 10\r\n"); // SIM not inserted +_LIT8(KCMEMemoryFull, "+CME ERROR: 20\r\n"); // Memory full +_LIT8(KCMEInvalidIndex, "+CME ERROR: 21\r\n"); // Invalid index +_LIT8(KCMENotFound, "+CME ERROR: 22\r\n"); // Not found +_LIT8(KCMEDialStringTooLong, "+CME ERROR: 26\r\n"); // Dial string too long +_LIT8(KCMETextStringTooLong, "+CME ERROR: 24\r\n"); // Text string too long +_LIT8(KCMEInvalidCharacters, "+CME ERROR: 27\r\n"); // Invalid characters in dial string + + const TInt KErrorReplyLength = 9; // CR+LF+"ERROR"+CR+LF +const TInt KEditorReplyLength = 4; // CR+LF+'>'+' ' CATMiscCmdPlugin* CATMiscCmdPlugin::NewL() { @@ -59,7 +86,18 @@ delete iCNUMHandler; delete iCFUNHandler; delete iCBCHandler; - +#ifdef PROTOCOL_TDSCDMA + delete iHVERHandler; + delete iCGSNHandler; + delete iCGMRHandler; + delete iCGMIHandler; + delete iCMGWHandler; + delete iCMGDHandler; + delete iCGMMHandler; + delete iSCPBRHandler; + delete iSCPBWHandler; +#endif + iPhone.Close(); iTelServer.Close(); } @@ -81,6 +119,41 @@ iCNUMHandler = CCNUMCommandHandler::NewL(this, iCommandParser, iPhone, iTelServer); iCFUNHandler = CCFUNCommandHandler::NewL(this, iCommandParser, iPhone); iCBCHandler = CCBCCommandHandler::NewL(this, iCommandParser, iPhone); + +#ifdef PROTOCOL_TDSCDMA + iHVERHandler = CHVERCommandHandler::NewL(this, iCommandParser, iPhone); + iCGSNHandler = CCGSNCommandHandler::NewL(this, iCommandParser, iPhone); + iCGMRHandler = CCGMRCommandHandler::NewL(this, iCommandParser, iPhone); + iCGMIHandler = CCGMICommandHandler::NewL(this, iCommandParser, iPhone); + iCMGWHandler = CCMGWCommandHandler::NewL(this, iCommandParser, iPhone); + iCMGDHandler = CCMGDCommandHandler::NewL(this, iCommandParser, iPhone); + iCGMMHandler = CCGMMCommandHandler::NewL(this, iCommandParser, iPhone); + iSCPBRHandler = CSCPBRCommandHandler::NewL(this, iCommandParser, iPhone); + iSCPBWHandler = CSCPBWCommandHandler::NewL(this, iCommandParser, iPhone); + + + // Get telephony information - Model, IMEI, Manufacturer + CTelephonyWrapper* telephonyWrapper = CTelephonyWrapper::NewL(); + TInt result = telephonyWrapper->SynchronousGetPhoneId(); + + if (KErrNone == result) + { + static_cast(iHVERHandler)->SetHWVersion(telephonyWrapper->GetPhoneModel()); + static_cast(iCGSNHandler)->SetSerialNum(telephonyWrapper->GetPhoneSerialNum()); + static_cast(iCGMIHandler)->SetManufacturer(telephonyWrapper->GetPhoneManufacturer()); + static_cast(iCGMMHandler)->SetManufacturer(telephonyWrapper->GetPhoneManufacturer()); + static_cast(iCGMMHandler)->SetModelID(telephonyWrapper->GetPhoneModel()); + } + else // The result is used to determine whether to display CME error or not + { + static_cast(iHVERHandler)->SetTelephonyError(result); + static_cast(iCGSNHandler)->SetTelephonyError(result); + static_cast(iCGMIHandler)->SetTelephonyError(result); + static_cast(iCGMMHandler)->SetTelephonyError(result); + } + delete telephonyWrapper; +#endif + TRACE_FUNC_EXIT } @@ -150,9 +223,71 @@ } case (TAtCommandParser::ECmdAtCmee): { + iCurrentHandler = NULL; + break; + } +#ifdef PROTOCOL_TDSCDMA + case (TAtCommandParser::ECmdAtHver): + { + iCurrentHandler = iHVERHandler; + break; + } + case (TAtCommandParser::ECmdAtCgsn): // intentional fall through + case (TAtCommandParser::ECmdAtGsn): + case (TAtCommandParser::ECmdAtI1): + { + iCurrentHandler = iCGSNHandler; + break; + } + case (TAtCommandParser::ECmdAtCgmr): // intentional fall through + case (TAtCommandParser::ECmdAtGmr): + case (TAtCommandParser::ECmdAtI2): + case (TAtCommandParser::ECmdAtI4): + { + iCurrentHandler = iCGMRHandler; + break; + } + case (TAtCommandParser::ECmdAtCgmi): // intentional fall through + case (TAtCommandParser::ECmdAtGmi): + case (TAtCommandParser::ECmdAtI): + case (TAtCommandParser::ECmdAtI0): + { + iCurrentHandler = iCGMIHandler; + break; + } + case (TAtCommandParser::ECmdAtCmgw): + { + iCurrentHandler = iCMGWHandler; + break; + } + case (TAtCommandParser::ECmdAtCmgd): + { + iCurrentHandler = iCMGDHandler; + break; + } + case (TAtCommandParser::ECmdAtCmgf): + { iCurrentHandler = NULL; break; } + case (TAtCommandParser::ECmdAtCgmm): // intentional fall through + case (TAtCommandParser::ECmdAtGmm): + case (TAtCommandParser::ECmdAtI3): + { + iCurrentHandler = iCGMMHandler; + break; + } + case (TAtCommandParser::ECmdAtScpbr): + { + iCurrentHandler = iSCPBRHandler; + break; + } + case (TAtCommandParser::ECmdAtScpbw): + { + iCurrentHandler = iSCPBWHandler; + break; + } +#endif case (TAtCommandParser::EUnknown): default: { @@ -179,6 +314,13 @@ HandleCMEECommand(); HandleCommandCompleted( KErrNone, EReplyTypeOk); } +#ifdef PROTOCOL_TDSCDMA + else if (iCommandParser.Command() == TAtCommandParser::ECmdAtCmgf) + { + HandleCMGFCommand(); + HandleCommandCompleted( KErrNone, EReplyTypeOk); + } +#endif else if (iCurrentHandler != NULL) { iHcCmd = &aCmd; @@ -278,30 +420,29 @@ { TRACE_FUNC_ENTRY TInt ret = KErrNone; - TInt partLength; if ( iReplyBuffer.Length() <= 0 ) { ret = KErrGeneral; } else { - partLength = NextReplyPartLength(); + TInt partLength = NextReplyPartLength(); if ( iReplyBuffer.Length() < partLength ) { ret = KErrNotFound; } - } - Trace(KDebugPrintD, "ret: ", ret); - if (ret == KErrNone) - { - aBuffer.Create( iReplyBuffer, partLength ); - iReplyBuffer.Delete( 0, partLength ); - if ( iReplyBuffer.Length() == 0 ) - { - iReplyBuffer.Close(); - } + else if (ret == KErrNone) + { + aBuffer.Create( iReplyBuffer, partLength ); + iReplyBuffer.Delete( 0, partLength ); + if ( iReplyBuffer.Length() == 0 ) + { + iReplyBuffer.Close(); + } + } } + Trace(KDebugPrintD, "ret: ", ret); TRACE_FUNC_EXIT return ret; } @@ -348,6 +489,11 @@ { case EReplyTypeOther: break; +#ifdef PROTOCOL_TDSCDMA + case EReplyTypeEditor: + CreateEditModeBuffer( iReplyBuffer ); + break; +#endif case EReplyTypeOk: CreateOkOrErrorReply( iReplyBuffer, ETrue ); break; @@ -360,9 +506,12 @@ } CreatePartOfReply( *iHcReply ); HandleCommandCompleted( KErrNone, aReplyType ); - iHcCmd = NULL; - iHcReply = NULL; - iCurrentHandler = NULL; + if ( EReplyTypeEditor != aReplyType ) + { + iHcCmd = NULL; + iHcReply = NULL; + iCurrentHandler = NULL; + } TRACE_FUNC_EXIT return KErrNone; } @@ -414,6 +563,28 @@ } /** + * @see MATMiscCmdPlugin::CreateEditModeBuffer + */ +TInt CATMiscCmdPlugin::CreateEditModeBuffer( RBuf8& aReplyBuffer ) + { + TRACE_FUNC_ENTRY + _LIT8( KReplyPromptAndSpace, "> " ); + TBuf8 replyBuffer; + replyBuffer.Append( iCarriageReturn ); + replyBuffer.Append( iLineFeed ); + replyBuffer.Append( KReplyPromptAndSpace ); + + TInt err = aReplyBuffer.ReAlloc( aReplyBuffer.Length() + replyBuffer.Length() ); + if (KErrNone != err) + { + return err; + } + aReplyBuffer.Append( replyBuffer ); + TRACE_FUNC_EXIT + return KErrNone; + } + +/** * @see MATMiscCmdPlugin::GetCharacterValue */ TInt CATMiscCmdPlugin::GetCharacterValue( TCharacterTypes aCharType, @@ -501,12 +672,64 @@ response.Append(KCMENotAllowed); break; } + case KErrGsmMMImeiNotAccepted: + { + // Memory failure + response.Append(KCMEMemoryFailure); + break; + } case KErrUnknown: + case KErrGsmSimServAnrFull: { // unknown error response.Append(KCMEPhoneUnknown); break; } + case KErrNotFound: + { + response.Append(KCMENotFound); + break; + } + case KErrInUse: + case KErrGsmMMServiceOptionTemporaryOutOfOrder: + { + // SIM not inserted + response.Append(KCMESimNotInserted); + break; + } + case KErrArgument: + case KErrGsm0707InvalidIndex: + case KErrGsm0707NotFound: + { + // Invalid index + response.Append(KCMEInvalidIndex); + break; + } + case KErrGsm0707TextStringTooLong: + { + // Text string too long + response.Append(KCMETextStringTooLong); + break; + } + case KErrGsm0707DialStringTooLong: + { + // Dial string too long + response.Append(KCMEDialStringTooLong); + break; + } + case KErrGsmCCUnassignedNumber: + case KErrGsm0707InvalidCharsInDialString: + { + // Invalid characters in dial string + response.Append(KCMEInvalidCharacters); + break; + } + case KErrMMEtelMaxReached: + { + // Memory full + response.Append(KCMEMemoryFull); + break; + } default: { response.Append(KCMEPhoneError); @@ -524,6 +747,100 @@ TRACE_FUNC_EXIT } +void CATMiscCmdPlugin::CreateCMSReplyAndComplete(TInt aError) + { + TRACE_FUNC_ENTRY + + if(iQuietMode) + { + CreateReplyAndComplete(EReplyTypeError); + } + else + { + // return error code to AT client + RBuf8 response; + if (KErrNone != response.Create(KDefaultCmdBufLength)) + { + CreateReplyAndComplete(EReplyTypeError); + return; + } + + // return error code to AT client + response.Append(KCRLF); + response.Append(KCMSErr); + + switch(aError) + { + case KErrGsmSMSReserved: + { + // Other application cause SMS interface being reserved + response.AppendNum(EATCMSErr301); + break; + } + case KErrGsmSMSInvalidPDUModeParameter: + { + // Under the mode of PDU, PDU parameter error + response.AppendNum(EATCMSErr304); + break; + } + case KErrGsm0707SimFailure: + case KErrGsmMMServiceOptionTemporaryOutOfOrder: + { + // SIM card not inserted + response.AppendNum(EATCMSErr310); + break; + } + case KErrGsmSMSSimPin1Required: + { + // PIN request by SIM card + response.AppendNum(EATCMSErr311); + break; + } + case KErrGsmSMSPhoneToSimLockRequired: + { + // PH-(U) SIM PIN request by SIM card + response.AppendNum(EATCMSErr312); + break; + } + case KErrGsmSMSSimPuk1Required: + { + // PUK request by SIM card + response.AppendNum(EATCMSErr316); + break; + } + case KErrGsmSMSMemoryFailure: + { + // Memory error + response.AppendNum(EATCMSErr320); + break; + } + case KErrPathNotFound: + case KErrGsmSMSInvalidMemoryIndex: + { + // Invalid Memory index number + response.AppendNum(EATCMSErr321); + break; + } + case KErrOverflow: + case KErrGsmSMSMemoryFull: + { + // Memory is full + response.AppendNum(EATCMSErr322); + break; + } + default: + { + response.AppendNum(EATCmsErrGeneral); + break; + } + } + CreateReplyAndComplete( EReplyTypeError, response ); + response.Close(); + } + + TRACE_FUNC_EXIT + } + TInt CATMiscCmdPlugin::HandleUnsolicitedRequest(const TDesC8& aAT ) { TRACE_FUNC_ENTRY @@ -555,6 +872,29 @@ TRACE_FUNC_EXIT } + +void CATMiscCmdPlugin::HandleCMGFCommand() + { + TRACE_FUNC_ENTRY + +#ifdef PROTOCOL_TDSCDMA + TAtCommandParser::TCommandHandlerType cmdHandlerType = iCommandParser.CommandHandlerType(); + + if (cmdHandlerType == TAtCommandParser::ECmdHandlerTypeSet) + { + TInt msgFormat = 0; + TInt ret = iCommandParser.NextIntParam(msgFormat); + if(ret == KErrNone && iCMGWHandler) + { + static_cast (iCMGWHandler)->SetMessageFormat(msgFormat); + } + } +#endif + + TRACE_FUNC_EXIT + } + + void CATMiscCmdPlugin::ConnectToEtelL(RTelServer& aTelServer, RMobilePhone& aPhone) { TRACE_FUNC_ENTRY @@ -571,6 +911,12 @@ } User::LeaveIfError(aTelServer.GetPhoneInfo(0, info)); User::LeaveIfError(aPhone.Open(aTelServer, info.iName)); + + if (iTelServer.SetExtendedErrorGranularity(RTelServer::EErrorExtended)!=KErrNone) + { + User::LeaveIfError(iTelServer.SetExtendedErrorGranularity(RTelServer::EErrorBasic)); + } + TRACE_FUNC_EXIT } diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/cgmicommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/cgmicommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "cgmicommandhandler.h" + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +CCGMICommandHandler* CCGMICommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CCGMICommandHandler* self = new (ELeave) CCGMICommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CCGMICommandHandler::CCGMICommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdSyncBase(aCallback, aATCmdParser, aPhone) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CCGMICommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + iReply.CreateL(KDefaultCmdBufLength); + TRACE_FUNC_EXIT + } + +CCGMICommandHandler::~CCGMICommandHandler() + { + TRACE_FUNC_ENTRY + iReply.Close(); + TRACE_FUNC_EXIT + } + +void CCGMICommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + switch (cmdHandlerType) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + { + iCallback->CreateReplyAndComplete( EReplyTypeOk ); + break; + } + case (TAtCommandParser::ECmdHandlerTypeBase): + { + if(iTelError == KErrNone) + { + if (iReply.Length() == 0) + { + iReply.Append( KCRLF ); + iReply.Append( iManufacturer ); + iReply.Append( KCRLF ); + } + + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply); + } + else + { + iCallback->CreateCMEReplyAndComplete(iTelError); + } + break; + } + default: + { + iCallback->CreateReplyAndComplete(EReplyTypeError); + break; + } + } + + TRACE_FUNC_EXIT + } + +void CCGMICommandHandler::SetManufacturer(const TDesC8& aManufacturer) + { + TRACE_FUNC_ENTRY + ASSERT( aManufacturer.Length() <= CTelephony::KPhoneModelIdSize ); + iManufacturer.Zero(); + iManufacturer.Copy(aManufacturer); + TRACE_FUNC_EXIT + } + + +void CCGMICommandHandler::SetTelephonyError(TInt aTelError) + { + TRACE_FUNC_ENTRY + iTelError = aTelError; + TRACE_FUNC_EXIT + } + + diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/cgmmcommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/cgmmcommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "cgmmcommandhandler.h" + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +CCGMMCommandHandler* CCGMMCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CCGMMCommandHandler* self = new (ELeave) CCGMMCommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CCGMMCommandHandler::CCGMMCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdSyncBase(aCallback, aATCmdParser, aPhone) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CCGMMCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + iReply.CreateL(KDefaultCmdBufLength); + TRACE_FUNC_EXIT + } + +CCGMMCommandHandler::~CCGMMCommandHandler() + { + TRACE_FUNC_ENTRY + iReply.Close(); + TRACE_FUNC_EXIT + } + +void CCGMMCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + switch (cmdHandlerType) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + { + iCallback->CreateReplyAndComplete( EReplyTypeOk ); + break; + } + case (TAtCommandParser::ECmdHandlerTypeBase): + { + if(iTelError == KErrNone) + { + if (iReply.Length() == 0) + { + _LIT8( KSpace, " " ); + + iReply.Append( KCRLF ); + iReply.Append( iManufacturer ); + iReply.Append( KSpace ); + iReply.Append( iModel ); + iReply.Append( KCRLF ); + } + + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply); + } + else + { + iCallback->CreateCMEReplyAndComplete(iTelError); + } + break; + } + default: + { + iCallback->CreateReplyAndComplete(EReplyTypeError); + break; + } + } + + TRACE_FUNC_EXIT + } + +void CCGMMCommandHandler::SetManufacturer(const TDesC8& aManufacturer) + { + TRACE_FUNC_ENTRY + iManufacturer.Zero(); + if (aManufacturer.Length() <= CTelephony::KPhoneManufacturerIdSize) + { + iManufacturer.Copy(aManufacturer); + } + else + { + iManufacturer.Copy(aManufacturer.Left(CTelephony::KPhoneManufacturerIdSize)); + } + TRACE_FUNC_EXIT + } + +void CCGMMCommandHandler::SetModelID(const TDesC8& aModelID) + { + TRACE_FUNC_ENTRY + iModel.Zero(); + if (aModelID.Length() <= CTelephony::KPhoneModelIdSize) + { + iModel.Copy(aModelID); + } + else + { + iModel.Copy(aModelID.Left(CTelephony::KPhoneModelIdSize)); + } + TRACE_FUNC_EXIT + } + + +void CCGMMCommandHandler::SetTelephonyError(TInt aTelError) + { + TRACE_FUNC_ENTRY + iTelError = aTelError; + TRACE_FUNC_EXIT + } + + diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/cgmrcommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/cgmrcommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include + +#include "cgmrcommandhandler.h" + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +CCGMRCommandHandler* CCGMRCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CCGMRCommandHandler* self = new (ELeave) CCGMRCommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CCGMRCommandHandler::CCGMRCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdSyncBase(aCallback, aATCmdParser, aPhone) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CCGMRCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + iReply.CreateL(KDefaultCmdBufLength); + TRACE_FUNC_EXIT + } + +CCGMRCommandHandler::~CCGMRCommandHandler() + { + TRACE_FUNC_ENTRY + iReply.Close(); + TRACE_FUNC_EXIT + } + +void CCGMRCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + switch (cmdHandlerType) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + { + iCallback->CreateReplyAndComplete( EReplyTypeOk ); + break; + } + case (TAtCommandParser::ECmdHandlerTypeBase): + { + TInt replyType = EReplyTypeOk; + if (iReply.Length() == 0) + { + replyType = GetSoftwareVersion(); + } + + if ( (EReplyTypeOk != replyType) ) + { + iCallback->CreateCMEReplyAndComplete(KErrUnknown); + } + else + { + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply); + } + break; + } + default: + { + iCallback->CreateReplyAndComplete(EReplyTypeError); + break; + } + } + TRACE_FUNC_EXIT + } + +TInt CCGMRCommandHandler::GetSoftwareVersion() + { + TRACE_FUNC_ENTRY + iReply.Append( KCRLF ); + + // Get software version (e.g. 010.009) + TBuf swVersion; + TInt errorCode = SysUtil::GetSWVersion( swVersion ); + + if (KErrNone == errorCode) + { + TLex8 lex(swVersion.Collapse()); + lex.SkipCharacters(); + TPtrC8 token = lex.MarkedToken(); + iReply.Append(token); + + iReply.Append( KCRLF ); + TRACE_FUNC_EXIT + return EReplyTypeOk; + } + else + { + TRACE_FUNC_EXIT + return EReplyTypeError; + } + } + + + diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/cgsncommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/cgsncommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "cgsncommandhandler.h" + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +CCGSNCommandHandler* CCGSNCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CCGSNCommandHandler* self = new (ELeave) CCGSNCommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CCGSNCommandHandler::CCGSNCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdSyncBase(aCallback, aATCmdParser, aPhone) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CCGSNCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + iTelError = KErrNone; + iReply.CreateL(KDefaultCmdBufLength); + TRACE_FUNC_EXIT + } + +CCGSNCommandHandler::~CCGSNCommandHandler() + { + TRACE_FUNC_ENTRY + iReply.Close(); + TRACE_FUNC_EXIT + } + +void CCGSNCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + switch (cmdHandlerType) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + { + iCallback->CreateReplyAndComplete( EReplyTypeOk ); + break; + } + case (TAtCommandParser::ECmdHandlerTypeBase): + { + if(iTelError == KErrNone) + { + if (iReply.Length() == 0) + { + iReply.Append( KCRLF ); + iReply.Append( iSN ); + iReply.Append( KCRLF ); + } + + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply); + } + else + { + iCallback->CreateCMEReplyAndComplete(iTelError); + } + break; + } + default: + { + iCallback->CreateReplyAndComplete(EReplyTypeError); + break; + } + } + + TRACE_FUNC_EXIT + } + +void CCGSNCommandHandler::SetSerialNum(const TDesC8& aSerial) + { + TRACE_FUNC_ENTRY + ASSERT( aSerial.Length() <= CTelephony::KPhoneSerialNumberSize ); + iSN.Zero(); + iSN.Copy(aSerial); + TRACE_FUNC_EXIT + } + +void CCGSNCommandHandler::SetTelephonyError(TInt aTelError) + { + TRACE_FUNC_ENTRY + iTelError = aTelError; + TRACE_FUNC_EXIT + } + + diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/cmgdcommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/cmgdcommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,462 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "cmgdcommandhandler.h" +#include +#include +#include + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +const TInt KDefaultListLength = 256; + +CCMGDCommandHandler* CCMGDCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CCMGDCommandHandler* self = new (ELeave) CCMGDCommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CCMGDCommandHandler::CCMGDCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdAsyncBase(aCallback, aATCmdParser, aPhone) + { + TRACE_FUNC_ENTRY + + TRACE_FUNC_EXIT + } + +void CCMGDCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + + iReply.CreateL(KDefaultCmdBufLength); + + User::LeaveIfError( iMobileSmsMessaging.Open(iPhone) ); + + TInt err = iMobileSmsStore.Open(iMobileSmsMessaging, KETelIccSmsStore); + if (err != KErrNone) + { + iHandlerState = ECMGDStateSimStoreNotSupported; + } + + iRetrieveSmsList = CRetrieveMobilePhoneSmsList::NewL(iMobileSmsStore, RMobileSmsStore::KETelMobileGsmSmsEntryV1); + + TRACE_FUNC_EXIT + } + +CCMGDCommandHandler::~CCMGDCommandHandler() + { + TRACE_FUNC_ENTRY + Cancel(); + delete iGsmSmsList; + delete iRetrieveSmsList; + iMobileSmsStore.Close(); + iMobileSmsMessaging.Close(); + iReply.Close(); + iDeleteList.Close(); + TRACE_FUNC_EXIT + } + +void CCMGDCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + if (iHandlerState == ECMGDStateSimStoreNotSupported) + { + // Reply "ERROR" if SIM store is not supported + iCallback->CreateReplyAndComplete(EReplyTypeError); + TRACE_FUNC_EXIT + return; + } + + TInt ret = KErrNone; + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + switch (cmdHandlerType) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + { + iRetrieveSmsList->Start(iStatus); + iHandlerState = ECMGDStateRetrieveAllIndices; + SetActive(); + } + break; + case (TAtCommandParser::ECmdHandlerTypeSet): + { + ret = ParseParameters(); + if (ret == KErrNone) + { + Trace(_L("index = %d"), iIndex); + Trace(_L("delflag = %d"), iDelFlag); + ret = DoHandleCommand(); + } + else + { + ret = KErrArgument; + } + break; + } + default: + { + ret = KErrNotSupported; + break; + } + } + if (ret == KErrGsmSMSInvalidMemoryIndex) + { + iCallback->CreateCMSReplyAndComplete(ret); + } + else if (ret != KErrNone) + { + iCallback->CreateReplyAndComplete(EReplyTypeError); + } + + TRACE_FUNC_EXIT + } + +void CCMGDCommandHandler::RunL() + { + TRACE_FUNC_ENTRY + + Trace(_L("Error = %d"), iStatus.Int()); + Trace(_L("State = %d"), iHandlerState); + + iReply.Zero(); + + TInt err = iStatus.Int(); + if(err == KErrNone) + { + switch (iHandlerState) + { + case ECMGDStateRetrieveAllIndices: + { + GetMessageIndexListL(); + iDeleteList.Reset(); + break; + } + case ECMGDStateDeleteOneEntry: + case ECMGDStateDeleteAllEntries: + { + // do nothing + break; + } + case ECMGDStateDeleteFilteredEntries: + { + FilterMessageListL(); + break; + } + default: + { + iHandlerState = ECMGDStateIdle; + iCallback->CreateReplyAndComplete(EReplyTypeError); + TRACE_FUNC_EXIT + return; + } + } + + if (iDeleteList.Count() != 0) + { + // delete the first entry in the list + iMobileSmsStore.Delete(iStatus, iDeleteList[0]); + iDeleteList.Remove(0); + iHandlerState = ECMGDStateDeleteOneEntry; + SetActive(); + } + else + { + // deleting finished + iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply); + } + } + else if (err == KErrNotFound) + { + // no message found in SIM + switch (iHandlerState) + { + case ECMGDStateRetrieveAllIndices: + { + iHandlerState = ECMGDStateIdle; + iReply.Format(KCMGDSupportedCmdsList, &KNullDesC8); + iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply); + break; + } + case ECMGDStateDeleteFilteredEntries: + { + iMobileSmsStore.DeleteAll(iStatus); + iHandlerState = ECMGDStateDeleteAllEntries; + SetActive(); + break; + } + default: + iHandlerState = ECMGDStateIdle; + iCallback->CreateCMSReplyAndComplete(err); + break; + } + } + else + { + iHandlerState = ECMGDStateIdle; + iCallback->CreateCMSReplyAndComplete(err); + } + + TRACE_FUNC_EXIT + } + +TInt CCMGDCommandHandler::RunError(TInt aError) + { + TRACE_FUNC_ENTRY + + iCallback->CreateCMSReplyAndComplete(aError); + + TRACE_FUNC_EXIT + return KErrNone; + } + +void CCMGDCommandHandler::DoCancel() + { + TRACE_FUNC_ENTRY + + switch (iHandlerState) + { + case ECMGDStateRetrieveAllIndices: + case ECMGDStateDeleteFilteredEntries: + { + iRetrieveSmsList->Cancel(); + break; + } + case ECMGDStateDeleteOneEntry: + { + iMobileSmsStore.CancelAsyncRequest(EMobilePhoneStoreDelete); + break; + } + case ECMGDStateDeleteAllEntries: + { + iMobileSmsStore.CancelAsyncRequest(EMobilePhoneStoreDeleteAll); + break; + } + } + + TRACE_FUNC_EXIT + } + +TInt CCMGDCommandHandler::ParseParameters() + { + TRACE_FUNC_ENTRY + + TInt ret = KErrNone; + TInt index = 0; + TInt delflag = 0; // default value + TInt otherParams = 0; + + // get index + TInt retIndex = iATCmdParser.NextIntParam(index); + // get delflag + TInt retDelflag = iATCmdParser.NextIntParam(delflag); + // get other params + TInt retOther = iATCmdParser.NextIntParam(otherParams); + // Syntax error happens if + // a)there is no param2 or param2 error + // b)there is no param1 but param2==0 + // c)there are too many params + TBool noParam = (retIndex!=KErrNone && retDelflag!=KErrNone || retDelflag==KErrGeneral ); + TBool noParam1 = (retIndex!=KErrNone && retDelflag==KErrNone && delflag==0); + TBool tooManyParams = (retOther!=KErrNotFound); + + if (noParam || noParam1 || tooManyParams) + { + ret = KErrArgument; + } + else + { + iIndex = index; + iDelFlag = delflag; + } + + TRACE_FUNC_EXIT + return ret; + } + +TInt CCMGDCommandHandler::DoHandleCommand() + { + TRACE_FUNC_ENTRY + + TInt err = KErrNone; + + switch (iDelFlag) + { + case 0: + // deletes the designated message with . + { + if (iIndex == 0) + { + // The first position in SIM store is 1, + // so zero is not in the supported range. + err = KErrGsmSMSInvalidMemoryIndex; + } + else + { + iDeleteList.Reset(); + iMobileSmsStore.Delete(iStatus, iIndex); + iHandlerState = ECMGDStateDeleteOneEntry; + SetActive(); + } + } + break; + case 1: + // deletes all read message in first-choice memory and reserves unread message, + // sent message and unsent message. + { + iRetrieveSmsList->Start(iStatus); + iHandlerState = ECMGDStateDeleteFilteredEntries; + iFilterType = ECMGDFilterReadMessagesOnly; + SetActive(); + } + break; + case 2: + // deletes all read message and sent message in first-choice memory + // and reserves unread message and unsent message. + { + iRetrieveSmsList->Start(iStatus); + iHandlerState = ECMGDStateDeleteFilteredEntries; + iFilterType = ECMGDFilterReadAndSentMessages; + SetActive(); + } + break; + case 3: + // deletes all read message, sent message and unsent message in first-choice memory + // and reserves unread message. + { + iRetrieveSmsList->Start(iStatus); + iHandlerState = ECMGDStateDeleteFilteredEntries; + iFilterType = ECMGDFilterReadSentAndUnsentMessages; + SetActive(); + } + break; + case 4: + // deletes all messages in first-choice memory, including unread message. + { + iDeleteList.Reset(); + iMobileSmsStore.DeleteAll(iStatus); + iHandlerState = ECMGDStateDeleteAllEntries; + SetActive(); + } + break; + + default: + err = KErrNotSupported; + break; + } + + TRACE_FUNC_EXIT + return err; + } + +void CCMGDCommandHandler::GetMessageIndexListL() + { + TRACE_FUNC_ENTRY + + iReply.Zero(); + delete iGsmSmsList; + iGsmSmsList = NULL; + + RBuf8 list; + list.CreateL(KDefaultListLength); + CleanupClosePushL(list); + + iGsmSmsList = iRetrieveSmsList->RetrieveGsmListL(); + TInt entriesNum = iGsmSmsList->Enumerate(); + + if (entriesNum > 0) + { + // Append 1st item + RMobileSmsStore::TMobileGsmSmsEntryV1 entry; + entry = iGsmSmsList->GetEntryL(0); + list.AppendNum(entry.iIndex); + + for (TInt i=1; iGetEntryL(i); + list.Append(','); + list.AppendNum(entry.iIndex); + } + } + iReply.Format(KCMGDSupportedCmdsList, &list); + + CleanupStack::PopAndDestroy(&list); //list + + TRACE_FUNC_EXIT + } + +/** + * Filter message list with iFilterType + * ECMGDFilterReadSentAndUnsentMessages: read, sent and unsent messages + * ECMGDFilterReadAndSentMessages: read and sent messages + * ECMGDFilterReadMessagesOnly: read messages + */ +void CCMGDCommandHandler::FilterMessageListL() + { + TRACE_FUNC_ENTRY + + delete iGsmSmsList; + iGsmSmsList = NULL; + + iDeleteList.Reset(); + + iGsmSmsList = iRetrieveSmsList->RetrieveGsmListL(); + TInt entriesNum = iGsmSmsList->Enumerate(); + + for (TInt i=0; iGetEntryL(i); + switch (iFilterType) + { + case ECMGDFilterReadSentAndUnsentMessages: + { + // add unsent message + if (entry.iMsgStatus == RMobileSmsStore::EStoredMessageUnsent) + { + iDeleteList.AppendL(entry.iIndex); + break; + } + } + case ECMGDFilterReadAndSentMessages: + { + // add sent message + if (entry.iMsgStatus == RMobileSmsStore::EStoredMessageSent) + { + iDeleteList.AppendL(entry.iIndex); + break; + } + } + case ECMGDFilterReadMessagesOnly: + { + // add read message + if (entry.iMsgStatus == RMobileSmsStore::EStoredMessageRead ) + { + iDeleteList.AppendL(entry.iIndex); + break; + } + } + } + } + + TRACE_FUNC_EXIT + } diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/cmgwcommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/cmgwcommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,552 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "cmgwcommandhandler.h" +#include +#include +#include + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +const TUint KEOT = 26; // End of Transmission +const TUint KESC = 27; // Escape + +const TUint8 KSCATonBitMask = 0x70; +const TUint8 KSCANpiBitMask = 0x0F; + +CCMGWCommandHandler* CCMGWCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CCMGWCommandHandler* self = new (ELeave) CCMGWCommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CCMGWCommandHandler::CCMGWCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdAsyncBase(aCallback, aATCmdParser, aPhone), + iEntryPckg(iEntry) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CCMGWCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + iReply.CreateL(KDefaultCmdBufLength); + iTPDU.CreateL(KDefaultCmdBufLength); + + User::LeaveIfError( iMobileSmsMessaging.Open(iPhone) ); + + TInt err = iMobileSmsStore.Open(iMobileSmsMessaging, KETelIccSmsStore); + if (err != KErrNone) + { + iState = ECMGWStateSimStoreNotSupported; + } + iRetrieveMobilePhoneSmspList = CRetrieveMobilePhoneSmspList::NewL(iMobileSmsMessaging); + + TRACE_FUNC_EXIT + } + +CCMGWCommandHandler::~CCMGWCommandHandler() + { + TRACE_FUNC_ENTRY + Cancel(); + delete iRetrieveMobilePhoneSmspList; + delete iMobilePhoneSmspList; + iMobileSmsStore.Close(); + iMobileSmsMessaging.Close(); + iReply.Close(); + iTPDU.Close(); + TRACE_FUNC_EXIT + } + +/** + * Set message format + * 0: PDU mode + * 1: Text mode - not supported + */ +void CCMGWCommandHandler::SetMessageFormat(TInt aFormat) + { + TRACE_FUNC_ENTRY + if (aFormat == 0 || aFormat == 1) + { + iMsgFormat = aFormat; + } + Trace(_L("Message format: %d"), iMsgFormat); + TRACE_FUNC_ENTRY + } + +void CCMGWCommandHandler::HandleCommand(const TDesC8& aCmd, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + if (iMsgFormat == 1 || iState == ECMGWStateSimStoreNotSupported ) + { + // Reply "ERROR" if text mode is set + // Reply "ERROR" if SIM store is not supported + iCallback->CreateReplyAndComplete( EReplyTypeError ); + TRACE_FUNC_EXIT + return; + } + + TInt err = KErrNone; + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + switch (cmdHandlerType) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + { + iCallback->CreateReplyAndComplete( EReplyTypeOk ); + break; + } + case (TAtCommandParser::ECmdHandlerTypeSet): + { + switch(iState) + { + case ECMGWStateIdle: + { + // Parse parameters + err = ParseParameters(); + if (err == KErrNone) + { + Trace(_L("Parse parameters OK.")); + Trace(_L("Length = %d"), iTPDULength); + Trace(_L("stat = %d"), iTPDUStat); + + iTPDU.Zero(); + iState = ECMGWStateEditMode; + iCallback->CreateReplyAndComplete( EReplyTypeEditor ); + } + else + { + // Syntax error + Trace(_L("Syntax error. err = %d"), err); + iState = ECMGWStateIdle; + iCallback->CreateReplyAndComplete(EReplyTypeError); + } + break; + } + case ECMGWStateEditMode: // Edit state + { + HandleEditModeCommand(aCmd); + break; + } + default: // Other states + { + Cancel(); + iCallback->CreateReplyAndComplete( EReplyTypeError ); + } + } + break; + } + default: + { + iCallback->CreateReplyAndComplete( EReplyTypeError ); + break; + } + } + + TRACE_FUNC_EXIT + } + +void CCMGWCommandHandler::HandleEditModeCommand( const TDesC8& aCmd ) + { + TRACE_FUNC_ENTRY + + TInt err = KErrNone; + TUint8 cmdCharVal = 0; + if (aCmd.Length()) + { + cmdCharVal = aCmd[0]; + } + + switch ( cmdCharVal ) + { + case KEOT: // End of Transmission: Now write the message + { + // Extract SCA fro PDU + err = ExtractSCA(); + if (err == KErrNotFound) + { + // SCA not provided by client + if (iMobileSmspEntry.iServiceCentre.iTelNumber.Length() == 0) + { + // Retrieve SMS parameter list + iRetrieveMobilePhoneSmspList->Start(iStatus); + iState = ECMGWStateRetrieveSCA; + SetActive(); + } + else + { + // Got the SCA from SIM params already - self complete + iServiceCentre = iMobileSmspEntry.iServiceCentre; + + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + iState = ECMGWStatePreparePDU; + SetActive(); + } + } + else if( err == KErrNone ) + { + // Got the SCA from client (in iService Centre) - self complete + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + iState = ECMGWStatePreparePDU; + SetActive(); + } + else + { + // Extract SCA failed + iState = ECMGWStateIdle; + iCallback->CreateCMSReplyAndComplete(KErrGsmSMSInvalidPDUModeParameter); + } + break; + } + case KESC: // Escape + { + iState = ECMGWStateIdle; + iCallback->CreateReplyAndComplete( EReplyTypeOk ); + break; + } + default: // Still entering PDU data + { + iTPDU.Append( aCmd ); + iCallback->CreateReplyAndComplete( EReplyTypeEditor ); + break; + } + } + + TRACE_FUNC_EXIT + } + +void CCMGWCommandHandler::RunL() + { + TRACE_FUNC_ENTRY + + iReply.Zero(); + TInt err = iStatus.Int(); + Trace(_L("State = %d, err = %d"), iState, err); + + if (err == KErrNone) + { + switch (iState) + { + case ECMGWStateRetrieveSCA: + { + // Got SCA from SIM params - update iServiceCentre + iMobilePhoneSmspList = iRetrieveMobilePhoneSmspList->RetrieveListL(); + iMobileSmspEntry = iMobilePhoneSmspList->GetEntryL(0); + iServiceCentre = iMobileSmspEntry.iServiceCentre; + + // Complete self to send PDU in next state + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + iState = ECMGWStatePreparePDU; + SetActive(); + } + break; + case ECMGWStatePreparePDU: + { + // Create an SMS entry from PDU + iEntry.iServiceCentre = iServiceCentre; + + err = CreateSmsEntry(); + if (err == KErrNone) + { + Trace(_L("Create SMS entry OK.")); + Trace(_L("Service center: %S"), + &iEntry.iServiceCentre.iTelNumber); + Trace(_L("Type of number: %d"), + iEntry.iServiceCentre.iTypeOfNumber); + Trace(_L("Number plan: %d"), + iEntry.iServiceCentre.iNumberPlan); + Trace(_L("Message status: %d"), iEntry.iMsgStatus); + + // Start to write PDU + iEntry.iIndex = -1; + iMobileSmsStore.Write(iStatus, iEntryPckg); + iState = ECMGWStateWritePDU; + SetActive(); + } + else + { + // Create failed + iState = ECMGWStateIdle; + iCallback->CreateCMSReplyAndComplete(KErrGsmSMSInvalidPDUModeParameter); + } + break; + } + case ECMGWStateWritePDU: + { + Trace(_L("Write successful. Index = %d"), iEntry.iIndex); + + iReply.Append(KCRLF); + iReply.Append(KAtCMGW); + iReply.AppendNum(iEntry.iIndex); + iState = ECMGWStateIdle; + iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply); + } + break; + default: + iState = ECMGWStateIdle; + iCallback->CreateReplyAndComplete(EReplyTypeError); + break; + } + } + else + { + iState = ECMGWStateIdle; + iCallback->CreateCMSReplyAndComplete(err); + } + + TRACE_FUNC_EXIT + } + +TInt CCMGWCommandHandler::RunError(TInt aError) + { + TRACE_FUNC_ENTRY + + delete iMobilePhoneSmspList; + iMobilePhoneSmspList = NULL; + iState = ECMGWStateIdle; + iCallback->CreateCMSReplyAndComplete(aError); + + TRACE_FUNC_EXIT + return KErrNone; + } + +void CCMGWCommandHandler::DoCancel() + { + TRACE_FUNC_ENTRY + + switch (iState) + { + case ECMGWStateRetrieveSCA: + { + iRetrieveMobilePhoneSmspList->Cancel(); + break; + } + case ECMGWStateWritePDU: + { + iMobileSmsStore.CancelAsyncRequest(EMobilePhoneStoreWrite); + break; + } + } + iState = ECMGWStateIdle; + + TRACE_FUNC_EXIT + } +/** + * Parse parameters of +CMGW=, + */ +TInt CCMGWCommandHandler::ParseParameters() + { + TRACE_FUNC_ENTRY + + TInt ret = KErrNone; + iTPDULength = 0; + iTPDUStat = 0; // default value + TInt otherParams = 0; + // Get length + TInt retLength = iATCmdParser.NextIntParam(iTPDULength); + // Get status + TInt retStat = iATCmdParser.NextIntParam(iTPDUStat); + // Get other parameters + TInt retOther = iATCmdParser.NextIntParam(otherParams); + // syntax error happens if + // a)there is no param 1 + // b)there are 3 params + // c)param 2 is not 0,1,2 or 3 + TBool noParam1 = (retLength != KErrNone); + TBool badParam2 = (retStat == KErrGeneral); + TBool tooManyParams = (retOther != KErrNotFound); + + if (noParam1 || badParam2 || tooManyParams) + { + ret = KErrArgument; + } + else + { + switch (iTPDUStat) + { + case 0: + // to receive unread message + iMessageStatus = RMobileSmsStore::EStoredMessageUnread; + break; + case 1: + // to receive read message + iMessageStatus = RMobileSmsStore::EStoredMessageRead; + break; + case 2: + // Unsent is not supported in this version + ret = KErrNotSupported; + break; + case 3: + // Sent is not supported in this version + ret = KErrNotSupported; + break; + default: + ret = KErrArgument; + break; + } + iEntry.iMsgStatus = iMessageStatus; + } + + TRACE_FUNC_EXIT + return ret; + } + +/** + * Create an SMS entry from the PDU string + */ +TInt CCMGWCommandHandler::CreateSmsEntry() + { + TRACE_FUNC_ENTRY + + TInt err = KErrNone; + + // Check the length + if (iTPDU.Length() != (iSCALength+iTPDULength+1)*2) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + + RBuf8 buf; + err = buf.Create(iTPDULength); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + // Convert to binary format + for(TInt i=(iSCALength+1)*2; i< iTPDU.Length(); i+=2) + { + TLex8 lex(iTPDU.Mid(i, 2)); + TUint8 val = 0; + err = lex.Val(val, EHex); + if (err != KErrNone) + { + buf.Close(); + TRACE_FUNC_EXIT + return err; + } + buf.Append(val); + } + iEntry.iMsgData.Copy(buf); + + buf.Close(); + TRACE_FUNC_EXIT + return KErrNone; + } + +/** + * Extract the SMS service center address from the head of PDU string + */ +TInt CCMGWCommandHandler::ExtractSCA() + { + TRACE_FUNC_ENTRY + + TInt err = KErrNone; + TLex8 lex; + RMobilePhone::TMobileAddress sca; + // SCA length + lex.Assign(iTPDU.Left(2)); + err = lex.Val(iSCALength, EHex); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + TInt length = iTPDU.Length(); + if (iSCALength == 0) + { + // Service center is not found in PDU + err = KErrNotFound; + } + else if (iSCALength > (length-2)/2) + { + // Service certer length error + err = KErrArgument; + } + else + { + // SCA is given + // Parse SCA TON and NPI + TUint8 val = 0; + lex.Assign(iTPDU.Mid(2,2)); + err = lex.Val(val, EHex); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + TUint8 ton = (val&KSCATonBitMask)>>4; + TUint8 npi = val&KSCANpiBitMask; + switch (ton) // TON + { + case 0: // 000 + sca.iTypeOfNumber = RMobilePhone::EUnknownNumber; + break; + case 1: // 001 + sca.iTypeOfNumber = RMobilePhone::EInternationalNumber; + sca.iTelNumber.Append('+'); + break; + case 2: // 010 + sca.iTypeOfNumber = RMobilePhone::ENationalNumber; + break; + default: + // CMCC doesn't support other types + TRACE_FUNC_EXIT + return KErrArgument; + } + switch (npi) // NPI + { + case 0: // 0000 + sca.iNumberPlan = RMobilePhone::EUnknownNumberingPlan; + break; + case 1: // 0001 + sca.iNumberPlan = RMobilePhone::EIsdnNumberPlan; + break; + default: + // CMCC doesn't support other number plans + TRACE_FUNC_EXIT + return KErrArgument; + } + // Extract SCA number + for (TInt i=4; i<(iSCALength+1)*2; i+=2) + { + sca.iTelNumber.Append(iTPDU[i+1]); + sca.iTelNumber.Append(iTPDU[i]); + } + if(sca.iTelNumber[sca.iTelNumber.Length()-1] == 'F' + || sca.iTelNumber[sca.iTelNumber.Length()-1] == 'f') + { + sca.iTelNumber.Delete(sca.iTelNumber.Length()-1, 1); + } + iServiceCentre = sca; + } + TRACE_FUNC_EXIT + return err; + } + + diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/cpincommandhandler.cpp --- a/cbsatplugin/atmisccmdplugin/src/cpincommandhandler.cpp Tue Jul 06 14:27:09 2010 +0300 +++ b/cbsatplugin/atmisccmdplugin/src/cpincommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -18,7 +18,7 @@ #include "cpincommandhandler.h" #include // define AO wrapper -#include // Additional RMobilePhone error code +#include // Additional RMobilePhone error code #include "debug.h" diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/hvercommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/hvercommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "hvercommandhandler.h" +#include + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +const TUint KCommaValue = 44; +const TUint KSpaceValue = 32; + +CHVERCommandHandler* CHVERCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CHVERCommandHandler* self = new (ELeave) CHVERCommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CHVERCommandHandler::CHVERCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdSyncBase(aCallback, aATCmdParser, aPhone) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CHVERCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + iTelError = KErrNone; + iSWVersion.CreateL(KSysUtilVersionTextLength); + iReply.CreateL(KDefaultCmdBufLength); + TRACE_FUNC_EXIT + } + +CHVERCommandHandler::~CHVERCommandHandler() + { + TRACE_FUNC_ENTRY + iSWVersion.Close(); + iReply.Close(); + TRACE_FUNC_EXIT + } + +void CHVERCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + if (cmdHandlerType != TAtCommandParser::ECmdHandlerTypeBase) + { + iCallback->CreateReplyAndComplete(EReplyTypeError); + } + else if(iTelError == KErrNone) + { + if (iReply.Length() == 0) + { + // Get model + iReply.Append( KCRLF ); + iReply.Append( iModel ); + + TChar commaValue = KCommaValue; + TChar spaceValue = KSpaceValue; + iReply.Append( commaValue ); + iReply.Append( spaceValue ); + + // Get software version (RM-xxx) + TBuf swVersion; + TInt errorCode = SysUtil::GetSWVersion( swVersion ); + + if (KErrNone == errorCode) + { + ParseSWVersion(swVersion.Collapse()); + iReply.Append(iSWVersion); + } + iReply.Append( KCRLF ); + } + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply); + } + else + { + iCallback->CreateCMEReplyAndComplete(iTelError); + } + + TRACE_FUNC_EXIT + } + +void CHVERCommandHandler::ParseSWVersion(const TDesC8& aSWVersion) + { + TRACE_FUNC_ENTRY + if (iSWVersion.Length() != 0) + { + TRACE_FUNC_EXIT + return; + } + + TInt start = aSWVersion.Find(KHVERModelString); + + if ( KErrNotFound != start ) + { + TLex8 lex(aSWVersion); + lex.Inc(start); + lex.Mark(); + lex.SkipCharacters(); + TPtrC8 token = lex.MarkedToken(); + + iSWVersion.Append(token); + } + TRACE_FUNC_EXIT + } + +void CHVERCommandHandler::SetHWVersion(const TDesC8& aHWVersion) + { + TRACE_FUNC_ENTRY + iModel.Zero(); + if (aHWVersion.Length() <= CTelephony::KPhoneModelIdSize) + { + iModel.Copy(aHWVersion); + } + else + { + iModel.Copy(aHWVersion.Left(CTelephony::KPhoneModelIdSize)); + } + TRACE_FUNC_EXIT + } + + + +void CHVERCommandHandler::SetTelephonyError(TInt aTelError) + { + TRACE_FUNC_ENTRY + iTelError = aTelError; + TRACE_FUNC_EXIT + } + diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/scpbrcommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/scpbrcommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "scpbrcommandhandler.h" + +#include +#include "debug.h" +#include "atmisccmdpluginconsts.h" + +CSCPBRCommandHandler::CSCPBRCommandHandler( + MATMiscCmdPlugin* aCallback, + TAtCommandParser& aATCmdParser, + RMobilePhone& aPhone) + : CATCmdAsyncBase( aCallback, aATCmdParser, aPhone ) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +CSCPBRCommandHandler::~CSCPBRCommandHandler() + { + TRACE_FUNC_ENTRY + Cancel(); + iPhoneBookStore.Close(); + iCustomApi.Close(); + iReply.Close(); + delete iPhoneBookBuffer; + iEntries.Close(); + iContactsBuf.Close(); + TRACE_FUNC_EXIT + } + +void CSCPBRCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + TInt err = iPhoneBookStore.Open( iPhone, KETelIccAdnPhoneBook); + if( err != KErrNone ) // if the phonebookstore can't be opened or error occurs when try to open it. + { + iState = ESCPBRStateNotSupported; + TRACE_FUNC_EXIT + return; + } + err = iCustomApi.Open( iPhone ); + if( err != KErrNone ) // If the custom api can't be opened. + { + iPhoneBookStore.Close(); + iState = ESCPBRStateNotSupported; + TRACE_FUNC_EXIT + return; + } + iReply.CreateL( KBufBlockSize ); + iPhoneBookBuffer = new ( ELeave ) CPhoneBookBuffer(); + TRACE_FUNC_EXIT + } + +CSCPBRCommandHandler* CSCPBRCommandHandler::NewL( + MATMiscCmdPlugin* aCallback, + TAtCommandParser& aATCmdParser, + RMobilePhone& aPhone ) + { + TRACE_FUNC_ENTRY + CSCPBRCommandHandler * self = new ( ELeave ) CSCPBRCommandHandler( aCallback, aATCmdParser, aPhone ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + TRACE_FUNC_EXIT + return self; + } + +void CSCPBRCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/ ) + { + TRACE_FUNC_ENTRY + if( iState == ESCPBRStateIdle ) // Not supported or have unfinished task. + { + iReply.Zero(); + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + switch( cmdHandlerType ) + { + case TAtCommandParser::ECmdHandlerTypeTest: // command: AT^SCPBR=? + { + if( iTotalEntries == 0 ) + { + iState = ESCPBRStateGetPhoneBookInfo; + RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg pkg( iPhoneBookInfo ); + iPhoneBookStore.GetInfo( iStatus, pkg ); + SetActive(); + } + else if ( iMLength ==0 ) + { + iState = ESCPBRStateGet3GPBInfo; + iCustomApi.Get3GPBInfo( iStatus, i3GPBInfo ); + SetActive(); + } + else + { + iReply.Format( KSCPBRSupportedEntriesIndexList, + iTotalEntries, iNLength, iTLength, iMLength ); + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply ); + } + break; + } + case TAtCommandParser::ECmdHandlerTypeSet: // command: AT^SCPBR=[,] + { + if( ParseParameters() == KErrNone ) + { + iEntries.Reset(); + TInt amountOfEntries = iIndex2 - iIndex1 + 1; // the amount of entries. + Trace( _L8("The amount of entries: %d "), amountOfEntries ); + iContactsBuf.Zero(); + TInt bufSize; + if( amountOfEntries >= KSCPBRMaxEntryCount ) + { + bufSize= KSCPBRMaxEntryCount * KSCPBRDefaultSizeOfOneEntry; + amountOfEntries = KSCPBRMaxEntryCount; + } + else + { + bufSize = amountOfEntries * KSCPBRDefaultSizeOfOneEntry; + } + + if( bufSize >= iContactsBuf.MaxLength() ) + { + TInt err = iContactsBuf.ReAlloc( bufSize ); + Trace( _L8("The error code of the realloc: %d "), err ); + if( err != KErrNone ) + { + iState = ESCPBRStateIdle; + iCallback->CreateReplyAndComplete( EReplyTypeError ); + break; + } + } + iState = ESCPBRStateRead; + iPhoneBookStore.Read( iStatus, iIndex1, amountOfEntries, iContactsBuf ); + SetActive(); + } + else + { + iCallback->CreateReplyAndComplete( EReplyTypeError ); + } + break; + } + default: + { + iCallback->CreateReplyAndComplete( EReplyTypeError ); + break; + } + } + } + else + { + iCallback->CreateReplyAndComplete( EReplyTypeError ); + } + TRACE_FUNC_EXIT + } + +TInt CSCPBRCommandHandler::ParseParameters() + { + TRACE_FUNC_ENTRY + iIndex1 = 0; + iIndex2 = 0; + TInt index3; + TInt ret1 = iATCmdParser.NextIntParam( iIndex1 ); + TInt ret2 = iATCmdParser.NextIntParam( iIndex2 ); + TInt ret3 = iATCmdParser.NextIntParam( index3 ); + + if( ret1 != KErrNone + || ( ret2 != KErrNone && ret2 != KErrNotFound ) + || ret3 != KErrNotFound ) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + if( ret2 == KErrNotFound ) + { + iIndex2 = iIndex1; + } + if (iIndex2 < iIndex1) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + TRACE_FUNC_EXIT + return KErrNone; + } + +void CSCPBRCommandHandler::RunL() + { + TRACE_FUNC_ENTRY + iReply.Zero(); + TInt result = iStatus.Int(); + if( result == KErrNone ) + { + switch( iState ) + { + case ESCPBRStateRead: + { + ExtractEntriesL(); + FormatReplyL(); + iState = ESCPBRStateIdle; + iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply); + break; + } + case ESCPBRStateGetPhoneBookInfo: + { + iTotalEntries = iPhoneBookInfo.iTotalEntries; + iNLength = iPhoneBookInfo.iMaxNumLength; + iTLength = iPhoneBookInfo.iMaxTextLength; + if (iMLength == 0) + { + iState = ESCPBRStateGet3GPBInfo; + iCustomApi.Get3GPBInfo( iStatus, i3GPBInfo ); + SetActive(); + } + else + { + iReply.Format( KSCPBRSupportedEntriesIndexList, + iTotalEntries, iNLength, iTLength, iMLength ); + iState = ESCPBRStateIdle; + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply ); + } + break; + } + case ESCPBRStateGet3GPBInfo: + { + iMLength = i3GPBInfo.iMaxLenEmail; + iReply.Format( KSCPBRSupportedEntriesIndexList, + iTotalEntries, iNLength, iTLength, iMLength ); + iState = ESCPBRStateIdle; + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply ); + break; + } + default: + { + iState = ESCPBRStateIdle; + iCallback->CreateReplyAndComplete( EReplyTypeError ); + break; + } + } + } + else + { + iState = ESCPBRStateIdle; + iCallback->CreateCMEReplyAndComplete( result ); + } + TRACE_FUNC_EXIT + } + +TInt CSCPBRCommandHandler::RunError(TInt aError) + { + TRACE_FUNC_ENTRY + iState = ESCPBRStateIdle; + iCallback->CreateReplyAndComplete( EReplyTypeError ); + TRACE_FUNC_EXIT + return KErrNone; + } + +void CSCPBRCommandHandler::ExtractEntriesL() + { + TRACE_FUNC_ENTRY + iPhoneBookBuffer->Set( &iContactsBuf ); + iPhoneBookBuffer->StartRead(); + TUint8 fieldTag; + CPhoneBookBuffer::TPhBkTagType dataType; + TInt numCount = 0; + // clear entry arry for use. + iEntries.Reset(); + User::LeaveIfError(iPhoneBookBuffer->GetTagAndType( fieldTag, dataType )); + if( fieldTag != RMobilePhoneBookStore::ETagPBNewEntry ) + { + // Buffer corrupt + User::Leave(KErrCorrupt); + } + TInt ret = KErrNone; + TInt index = -1; // at least one entry + while (ret != KErrNotFound) // if reach the buffer end. + { + switch (fieldTag) + { + case RMobilePhoneBookStore::ETagPBNewEntry: + { + TPhoneBookEntry entry; + iEntries.AppendL(entry); + ++index; + numCount = 0; // set the number count of new entry to 0. + break; + } + case RMobilePhoneBookStore::ETagPBAdnIndex: + { + TUint16 simIndex = 0; + if (dataType != CPhoneBookBuffer::EPhBkTypeInt16) + { + User::Leave(KErrCorrupt); + } + User::LeaveIfError( iPhoneBookBuffer->GetValue(simIndex) ); + + iEntries[index].iIndex = simIndex; + break; + } + case RMobilePhoneBookStore::ETagPBText: + { + TPtrC16 text; + if (dataType != CPhoneBookBuffer::EPhBkTypeDes16) + { + User::Leave(KErrCorrupt); + } + User::LeaveIfError( iPhoneBookBuffer->GetValue(text) ); + CopyToPhonebookEntryField(iEntries[index].iName, text); + break; + } + case RMobilePhoneBookStore::ETagPBNumber: + { + TPtrC16 number; + if (dataType != CPhoneBookBuffer::EPhBkTypeDes16) + { + User::Leave(KErrCorrupt); + } + User::LeaveIfError( iPhoneBookBuffer->GetValue(number) ); + ++numCount; + switch (numCount) + { + case 1: // The first number + CopyToPhonebookEntryField(iEntries[index].iNumber1, number); + break; + case 2: // The Second number + CopyToPhonebookEntryField(iEntries[index].iNumber2, number); + break; + case 3: // the Third number + CopyToPhonebookEntryField(iEntries[index].iNumber3, number); + break; + case 4: // the fourth number. + CopyToPhonebookEntryField(iEntries[index].iNumber4, number); + break; + } + break; + } + case RMobilePhoneBookStore::ETagPBEmailAddress: + { + TPtrC16 email; + if (dataType != CPhoneBookBuffer::EPhBkTypeDes16) + { + User::Leave(KErrCorrupt); + } + User::LeaveIfError( iPhoneBookBuffer->GetValue(email) ); + CopyToPhonebookEntryField(iEntries[index].iEmail, email); + break; + } + default: + { + iPhoneBookBuffer->SkipValue(dataType); + break; + } + } + ret = iPhoneBookBuffer->GetTagAndType(fieldTag, dataType); + } + + TRACE_FUNC_EXIT + } + +void CSCPBRCommandHandler::CopyToPhonebookEntryField(TDes8& aDest, const TDesC16& aSrc) + { + TRACE_FUNC_ENTRY + TInt maxLength = aDest.MaxLength(); + if ( aSrc.Length() <= maxLength ) + { + aDest.Copy(aSrc); + } + else + { + aDest.Copy( aSrc.Left(maxLength) ); + } + TRACE_FUNC_EXIT + } + +void CSCPBRCommandHandler::FormatReplyL() + { + TRACE_FUNC_ENTRY + + TInt count = iEntries.Count(); + for (TInt i = 0; i < count; ++i) + { + AppendEntryL(iEntries[i]); + } + + TRACE_FUNC_EXIT + } + +void CSCPBRCommandHandler::AppendEntryL(const TPhoneBookEntry& aEntry) + { + TRACE_FUNC_ENTRY + TBuf8 entryBuffer; + aEntry.Externalize(entryBuffer); + + TInt length = entryBuffer.Length() + KSCPBR().Length(); + if (length + iReply.Length() > iReply.MaxLength()) + { + iReply.ReAllocL(iReply.MaxLength()+KBufBlockSize); + } + + iReply.Append(KSCPBR); + iReply.Append(entryBuffer); + TRACE_FUNC_EXIT + } + +void CSCPBRCommandHandler::DoCancel() + { + TRACE_FUNC_ENTRY + switch( iState ) + { + case ESCPBRStateRead: + { + iPhoneBookStore.CancelAsyncRequest( EMobilePhoneStoreRead ); + break; + } + case ESCPBRStateGetPhoneBookInfo: + { + iPhoneBookStore.CancelAsyncRequest( EMobilePhoneStoreGetInfo ); + break; + } + case ESCPBRStateGet3GPBInfo: + { + iPhoneBookStore.CancelAsyncRequest( EGet3GPBInfoIPC ); + break; + } + default: + break; + } + iState = ESCPBRStateIdle; + TRACE_FUNC_EXIT + } + + +void CSCPBRCommandHandler::TPhoneBookEntry::Externalize(TDes8& aDes) const + { + TRACE_FUNC_ENTRY + + aDes.Format(KSCPBRReplyOneEntry, iIndex, &iNumber1, &iNumber2, &iNumber3, &iNumber4, &iName, &iEmail); + + TRACE_FUNC_EXIT + } diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/scpbwcommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/scpbwcommandhandler.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,616 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "scpbwcommandhandler.h" +#include +#include +#include + +#include "atmisccmdpluginconsts.h" +#include "debug.h" + +const TInt KMaxContactEntrySize = 512; +const TInt KMaxTextLength = 64; +const TInt KMaxNumberLength = 64; +const TInt KMaxEmailLength = 64; + +CSCPBWCommandHandler* CSCPBWCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) + { + TRACE_FUNC_ENTRY + CSCPBWCommandHandler* self = new (ELeave) CSCPBWCommandHandler(aCallback, aATCmdParser, aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CSCPBWCommandHandler::CSCPBWCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) : + CATCmdAsyncBase(aCallback, aATCmdParser, aPhone) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CSCPBWCommandHandler::ConstructL() + { + TRACE_FUNC_ENTRY + + TInt err = iPhoneBookStore.Open(iPhone, KETelIccAdnPhoneBook); + if (err != KErrNone) + { + iState = ESCPBWStateSimStoreNotSupported; + TRACE_FUNC_EXIT + return; + } + err = iMmCustomAPI.Open(iPhone); + if (err != KErrNone) + { + iPhoneBookStore.Close(); + iState = ESCPBWStateSimStoreNotSupported; + TRACE_FUNC_EXIT + return; + } + iPhoneBookBuffer = new (ELeave) CPhoneBookBuffer; + + iReply.CreateL(KDefaultCmdBufLength); + iNum1.CreateL(KMaxNumberLength); + iNum2.CreateL(KMaxNumberLength); + iNum3.CreateL(KMaxNumberLength); + iNum4.CreateL(KMaxNumberLength); + iText.CreateL(KMaxTextLength); + iEmail.CreateL(KMaxEmailLength); + iPbData.CreateL(KMaxContactEntrySize); + + TRACE_FUNC_EXIT + } + +CSCPBWCommandHandler::~CSCPBWCommandHandler() + { + TRACE_FUNC_ENTRY + Cancel(); + delete iPhoneBookBuffer; + iPhoneBookStore.Close(); + iMmCustomAPI.Close(); + iPbData.Close(); + iReply.Close(); + iNum1.Close(); + iNum2.Close(); + iNum3.Close(); + iNum4.Close(); + iText.Close(); + iEmail.Close(); + TRACE_FUNC_EXIT + } + +void CSCPBWCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/) + { + TRACE_FUNC_ENTRY + + if (iState != ESCPBWStateIdle) + { + // Reply "ERROR" if handler is not in idle + iCallback->CreateReplyAndComplete(EReplyTypeError); + TRACE_FUNC_EXIT + return; + } + TInt err = KErrNone; + + TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType(); + + switch (cmdHandlerType) + { + case (TAtCommandParser::ECmdHandlerTypeTest): + { + if (iMaxEntries == 0) + { + RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg pckg(iPhoneBookStoreInfo); + iPhoneBookStore.GetInfo(iStatus, pckg); + iState = ESCPBWStateGetPhonebookInfo; + SetActive(); + } + else if (iEmailLength == 0) + { + iState = ESCPBWStateGet3GPBInfo; + iMmCustomAPI.Get3GPBInfo(iStatus, i3GPBInfo); + SetActive(); + } + else + { + // Phonebook info has been obtained + iReply.Zero(); + iReply.Format(KSCPBWSupportedCmdsList, iMaxEntries, iNumLength, iTextLength, iEmailLength); + iCallback->CreateReplyAndComplete( EReplyTypeOk, iReply ); + } + } + break; + case (TAtCommandParser::ECmdHandlerTypeSet): + { + ResetParameters(); + TBool isDeleteRequest = EFalse; + err = ParseParameters(isDeleteRequest); + Trace(_L("Parse completed, err = %d"), err); + if (isDeleteRequest) + { + // Delete entry at iIndex + iState = ESCPBWStateDelete; + iPhoneBookStore.Delete(iStatus, iIndex); + SetActive(); + } + else if (err == KErrNone) + { + // Create an entry + err = CreateContactEntry(); + if (err == KErrNone) + { + iPhoneBookStore.Write(iStatus, iPbData, iIndex); + iState = ESCPBWStateWrite; + SetActive(); + } + else + { + iCallback->CreateReplyAndComplete( EReplyTypeError ); + } + } + else + { + iCallback->CreateReplyAndComplete( EReplyTypeError ); + } + break; + } + default: + { + iCallback->CreateReplyAndComplete( EReplyTypeError ); + break; + } + } + + TRACE_FUNC_EXIT + } + +void CSCPBWCommandHandler::RunL() + { + TRACE_FUNC_ENTRY + + iReply.Zero(); + TInt err = iStatus.Int(); + Trace(_L("State = %d, err = %d"), iState, err); + + if (err == KErrNone) + { + switch (iState) + { + case ESCPBWStateGetPhonebookInfo: + { + Trace(_L("Get info successful.")); + iNumLength = iPhoneBookStoreInfo.iMaxNumLength; + iTextLength = iPhoneBookStoreInfo.iMaxTextLength; + iMaxEntries = iPhoneBookStoreInfo.iTotalEntries; + if (iEmailLength == 0) + { + iMmCustomAPI.Get3GPBInfo(iStatus, i3GPBInfo); + iState = ESCPBWStateGet3GPBInfo; + SetActive(); + } + else + { + iReply.Format(KSCPBWSupportedCmdsList, iMaxEntries, iNumLength, iTextLength, iEmailLength); + iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply); + iState = ESCPBWStateIdle; + } + } + break; + case ESCPBWStateGet3GPBInfo: + { + Trace(_L("Get 3GPB info successful.")); + iEmailLength = i3GPBInfo.iMaxLenEmail; + iReply.Format(KSCPBWSupportedCmdsList, iMaxEntries, iNumLength, iTextLength, iEmailLength); + iCallback->CreateReplyAndComplete(EReplyTypeOk, iReply); + iState = ESCPBWStateIdle; + } + break; + case ESCPBWStateWrite: + { + Trace(_L("Write successful. Index = %d"), iIndex); + iCallback->CreateReplyAndComplete(EReplyTypeOk); + iState = ESCPBWStateIdle; + } + break; + case ESCPBWStateDelete: + { + Trace(_L("Delete successful.")); + iCallback->CreateReplyAndComplete(EReplyTypeOk); + iState = ESCPBWStateIdle; + } + break; + default: + { + iState = ESCPBWStateIdle; + iCallback->CreateReplyAndComplete(EReplyTypeError); + break; + } + } + } + else + { + iState = ESCPBWStateIdle; + iCallback->CreateCMEReplyAndComplete(err); + } + + TRACE_FUNC_EXIT + } + +void CSCPBWCommandHandler::DoCancel() + { + TRACE_FUNC_ENTRY + + switch (iState) + { + case ESCPBWStateGetPhonebookInfo: + { + iPhoneBookStore.CancelAsyncRequest(EMobilePhoneStoreGetInfo); + } + break; + case ESCPBWStateGet3GPBInfo: + { + iMmCustomAPI.CancelAsyncRequest(EGet3GPBInfoIPC); + } + break; + case ESCPBWStateDelete: + { + iPhoneBookStore.CancelAsyncRequest(EMobilePhoneStoreDelete); + } + break; + case ESCPBWStateWrite: + { + iPhoneBookStore.CancelAsyncRequest(EMobilePhoneStoreWrite); + } + break; + } + iState = ESCPBWStateIdle; + + TRACE_FUNC_EXIT + } + +TInt CSCPBWCommandHandler::ParseParameters( TBool& aIsDeleteRequest ) + { + TRACE_FUNC_ENTRY + + TInt ret = KErrNone; + // Paese index + ret = iATCmdParser.NextIntParam(iIndex); + Trace(_L("Parse index err: %d"), ret); + Trace(_L("index: %d"), iIndex); + if (ret != KErrNone && ret != KErrNotFound) + { + // Bad index + TRACE_FUNC_EXIT + return KErrArgument; + } + + TPtrC8 ptrc; + // Parse num1 + ptrc.Set(iATCmdParser.NextParam()); + if (ptrc.Length() != 0) + { + Trace(_L("Parse num1 OK: %S"), &ptrc); + SetBuffer(iNum1, ptrc); + } + else if (ret == KErrNone ) + { + // Only index given + Trace(_L("Only index given.")); + aIsDeleteRequest = ETrue; + TRACE_FUNC_EXIT + return KErrNone; + } + else + { + // no num1 found + TRACE_FUNC_EXIT + return KErrArgument; + } + ret = iATCmdParser.NextIntParam(iType1); + if (ret == KErrNotFound) + { + TRACE_FUNC_EXIT + return KErrNone; + } + else if (ret != KErrNone) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + + // Parse num2 + ptrc.Set(iATCmdParser.NextParam()); + if (ptrc.Length() != 0) + { + Trace(_L("Parse num2 OK: %S"), &ptrc); + SetBuffer(iNum2, ptrc); + } + else + { + // no num2 found + TRACE_FUNC_EXIT + return KErrNone; + } + ret = iATCmdParser.NextIntParam(iType2); + if (ret == KErrNotFound) + { + TRACE_FUNC_EXIT + return KErrNone; + } + else if (ret != KErrNone) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + + // Parse num3 + ptrc.Set(iATCmdParser.NextParam()); + if (ptrc.Length() != 0) + { + Trace(_L("Parse num3 OK: %S"), &ptrc); + SetBuffer(iNum3, ptrc); + } + else + { + // no num3 found + TRACE_FUNC_EXIT + return KErrNone; + } + ret = iATCmdParser.NextIntParam(iType3); + if (ret == KErrNotFound) + { + TRACE_FUNC_EXIT + return KErrNone; + } + else if (ret != KErrNone) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + + // Parse num4 + ptrc.Set(iATCmdParser.NextParam()); + if (ptrc.Length() != 0) + { + Trace(_L("Parse num4 OK: %S"), &ptrc); + SetBuffer(iNum4, ptrc); + } + else + { + // no num4 found + TRACE_FUNC_EXIT + return KErrNone; + } + ret = iATCmdParser.NextIntParam(iType4); + if (ret == KErrNotFound) + { + TRACE_FUNC_EXIT + return KErrNone; + } + else if (ret != KErrNone) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + + // Parse text + ptrc.Set(iATCmdParser.NextParam()); + if (ptrc.Length() != 0) + { + Trace(_L("Parse text OK: %S"), &ptrc); + SetBuffer(iText, ptrc); + } + else + { + // no text found + TRACE_FUNC_EXIT + return KErrNone; + } + ret = iATCmdParser.NextIntParam(iCoding); + if (ret == KErrNotFound) + { + TRACE_FUNC_EXIT + return KErrNone; + } + else if (ret != KErrNone) + { + TRACE_FUNC_EXIT + return KErrArgument; + } + + // Parse email + ptrc.Set(iATCmdParser.NextParam()); + if (ptrc.Length() != 0) + { + Trace(_L("Parse email OK: %S"), &ptrc); + SetBuffer(iEmail, ptrc); + } + else + { + // no email found + TRACE_FUNC_EXIT + return KErrNone; + } + + if (iATCmdParser.NextParam().Length() != 0) + { + // too many parameters + Trace(_L("Too many parameters.")); + TRACE_FUNC_EXIT + return KErrArgument; + } + + TRACE_FUNC_EXIT + return KErrNone; + } + +TInt CSCPBWCommandHandler::CreateContactEntry() + { + TRACE_FUNC_ENTRY + + TInt err = KErrNone; + iPhoneBookBuffer->Set(&iPbData); + // Add new entry tag + err = iPhoneBookBuffer->AddNewEntryTag(); + Trace(_L("New entry tag added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + // Put index into the entry + err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBAdnIndex, (TUint16)iIndex); + Trace(_L("Index added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + // Put text into the entry + if (iText.Length() != 0) + { + err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBText, iText); + Trace(_L("Text added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + } + // Put num1 into the entry + if (iNum1.Length() != 0) + { + err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum1); + Trace(_L("Number 1 added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + } + // Put num2 into the entry + if (iNum2.Length() != 0) + { + // Add anr tag + err = iPhoneBookBuffer->AddNewNumberTag(); + Trace(_L("New number tag added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum2); + Trace(_L("Number 2 added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + } + // Put num3 into the entry + if (iNum3.Length() != 0) + { + // Add anr tag + err = iPhoneBookBuffer->AddNewNumberTag(); + Trace(_L("New number tag added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum3); + Trace(_L("Number 3 added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + } + // Put num4 into the entry + if (iNum4.Length() != 0) + { + // Add anr tag + err = iPhoneBookBuffer->AddNewNumberTag(); + Trace(_L("New number tag added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, iNum4); + Trace(_L("Number 4 added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + } + // Put email address into the entry + if (iEmail.Length() != 0) + { + err = iPhoneBookBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBEmailAddress, iEmail); + Trace(_L("Email added, err = %d"), err); + if (err != KErrNone) + { + TRACE_FUNC_EXIT + return err; + } + } + + TRACE_FUNC_EXIT + return KErrNone; + } + +void CSCPBWCommandHandler::ResetParameters() + { + TRACE_FUNC_ENTRY + + iPbData.Zero(); + iIndex = -1; + iNum1.Zero(); + iType1 = 0x91; // International & ISDN + iNum2.Zero(); + iType2 = 0x91; + iNum3.Zero(); + iType3 = 0x91; + iNum4.Zero(); + iType4 = 0x91; + iText.Zero(); + iCoding = 0; // GSM 7 bit + iEmail.Zero(); + + TRACE_FUNC_EXIT + } + +void CSCPBWCommandHandler::SetBuffer(TDes& aDest, const TDesC8& aSource) + { + TRACE_FUNC_ENTRY + TInt maxLength = aDest.MaxLength(); + if (aSource.Length() <= maxLength) + { + aDest.Copy(aSource); + } + else + { + aDest.Copy(aSource.Left(maxLength)); + } + TRACE_FUNC_EXIT + } + + diff -r 0b2439c3e397 -r 4545c04e61e1 cbsatplugin/atmisccmdplugin/src/telephonywrapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbsatplugin/atmisccmdplugin/src/telephonywrapper.cpp Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * Description : + * + */ + +#include "telephonywrapper.h" +#include "debug.h" + +CTelephonyWrapper* CTelephonyWrapper::NewL() + { + TRACE_FUNC_ENTRY + CTelephonyWrapper* self = new (ELeave) CTelephonyWrapper(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_FUNC_EXIT + return self; + } + +CTelephonyWrapper::CTelephonyWrapper() : + CActive(CActive::EPriorityStandard), + iPhoneIdV1Pckg(iPhoneIdV1) + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + } + +void CTelephonyWrapper::ConstructL() + { + TRACE_FUNC_ENTRY + CActiveScheduler::Add(this); + iTelephony = CTelephony::NewL(); + TRACE_FUNC_EXIT + } + +CTelephonyWrapper::~CTelephonyWrapper() + { + TRACE_FUNC_ENTRY + Cancel(); + delete iTelephony; + TRACE_FUNC_EXIT + } + +TInt CTelephonyWrapper::SynchronousGetPhoneId() + { + TRACE_FUNC_ENTRY + + if (!IsActive()) + { + iTelephony->GetPhoneId(iStatus, iPhoneIdV1Pckg); + SetActive(); + iWaiter.Start(); + + if (KErrNone == iStatus.Int()) + { + iModel = iPhoneIdV1.iModel.Collapse(); + iSn = iPhoneIdV1.iSerialNumber.Collapse(); + iManufacturer = iPhoneIdV1.iManufacturer.Collapse(); + } + } + else + { + TRACE_FUNC_EXIT + return KErrInUse; + } + + TRACE_FUNC_EXIT + return iStatus.Int(); + } + +const TDesC8& CTelephonyWrapper::GetPhoneModel() + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + return iModel; + } + +const TDesC8& CTelephonyWrapper::GetPhoneSerialNum() + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + return iSn; + } + +const TDesC8& CTelephonyWrapper::GetPhoneManufacturer() + { + TRACE_FUNC_ENTRY + TRACE_FUNC_EXIT + return iManufacturer; + } + +void CTelephonyWrapper::RunL() + { + TRACE_FUNC_ENTRY + iWaiter.AsyncStop(); + TRACE_FUNC_EXIT + } + +void CTelephonyWrapper::DoCancel() + { + TRACE_FUNC_ENTRY + iTelephony->CancelAsync(CTelephony::EGetPhoneIdCancel); + iWaiter.AsyncStop(); + TRACE_FUNC_EXIT + } + + diff -r 0b2439c3e397 -r 4545c04e61e1 package_map.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/package_map.xml Wed Aug 18 09:59:05 2010 +0300 @@ -0,0 +1,2 @@ + + \ No newline at end of file