diff -r 000000000000 -r 4e1aa6a622a0 sensorservices/sensorserver/src/client/sensrvchannelfinderimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sensorservices/sensorserver/src/client/sensrvchannelfinderimpl.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,218 @@ +/* +* Copyright (c) 2006-2008 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: CSensrvChannelFinderImpl implementation +* +*/ + + +#include "sensrvchannelfinderimpl.h" +#include "sensrvchannelchangehandler.h" +#include "sensrvtrace.h" + +const TInt KDefaultChannelCount = 10; + + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CSensrvChannelFinderImpl::CSensrvChannelFinderImpl() + { + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::CSensrvChannelFinderImpl()" ) ) ); + } + + +// --------------------------------------------------------------------------- +// 2nd phase of construction +// --------------------------------------------------------------------------- +// +void CSensrvChannelFinderImpl::ConstructL() + { + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::ConstructL() - Start" ) ) ); + + User::LeaveIfError( iSensrvClient.Connect() ); + + iChannelChangeHandler = CSensrvChannelChangeHandler::NewL( iSensrvClient ); + + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::ConstructL() - Return" ) ) ); + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CSensrvChannelFinderImpl::~CSensrvChannelFinderImpl() + { + delete iChannelChangeHandler; + iSensrvClient.Close(); + } + + +// --------------------------------------------------------------------------- +// CSensrvChannelFinderImpl::FindChannelsL +// --------------------------------------------------------------------------- +// +void CSensrvChannelFinderImpl::FindChannelsL( + RSensrvChannelInfoList& aChannelList, + const TSensrvChannelInfo& aSearchConditions ) + { + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::FindChannelsL() - Start" ) ) ); + + // Create condition buffer + TSensrvChannelInfoPckgBuf searchConditionsBuf( aSearchConditions ); + + // Create channel info array + RSensrvChannelInfoList channelInfoList(KDefaultChannelCount); + CleanupClosePushL( channelInfoList ); + + for( TInt i = 0; i < KDefaultChannelCount; i++ ) + { + channelInfoList.AppendL( TSensrvChannelInfo() ); + } + + TInt arraySize = ( sizeof(TSensrvChannelInfo) ) * KDefaultChannelCount; + TPtr8 arrayPtr( (TUint8*)&channelInfoList[0], arraySize, arraySize ); + + TInt channelInfoCount(0); + TSensrvTIntPckgBuf intBuf( channelInfoCount ); + + + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::FindChannels() - SendReceive..." ) ) ); + TInt err = iSensrvClient.SendReceiveSync( ESensrvSrvReqQueryChannels, TIpcArgs( &searchConditionsBuf, + &arrayPtr, &intBuf ) ); + + channelInfoCount = intBuf(); + + if( err == KErrNone ) // Copy channels info to aChannelList + { + for( TInt i = 0; i < channelInfoCount; ++i ) + { + aChannelList.AppendL( channelInfoList[i] ); + } + } + + else if( err == KErrOverflow ) // buffer overflow. Allocate new buffer + { + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::FindChannels() - KErrOverflow" ) ) ); + + for( TInt i = KDefaultChannelCount; i < channelInfoCount; i++ ) + { + channelInfoList.AppendL( TSensrvChannelInfo() ); + } + + TInt newArraySize = ( sizeof(TSensrvChannelInfo) ) * channelInfoCount; + TPtr8 newArrayPtr( (TUint8*)&channelInfoList[0], newArraySize, newArraySize ); + + // Send new request + User::LeaveIfError( iSensrvClient.SendReceiveSync( ESensrvSrvReqQueryChannels, + TIpcArgs( &searchConditionsBuf, &newArrayPtr, &intBuf ) ) ); + + channelInfoCount = intBuf(); + + for( TInt i = 0; i < channelInfoCount; ++i ) + { + aChannelList.AppendL( channelInfoList[i] ); + } + + } + else + { + User::Leave( err ); + } + + CleanupStack::PopAndDestroy( &channelInfoList ); + + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::FindChannels() - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSensrvChannelFinderImpl::SetChannelListenerL +// --------------------------------------------------------------------------- +// +void CSensrvChannelFinderImpl::SetChannelListenerL( MSensrvChannelListener* aChannelListener, + const TSensrvChannelInfo& aSearchParameters ) + { + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::SetChannelListenerL() - Start" ) ) ); + + if( iChannelChangeListener && aChannelListener ) + { + ERROR_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::SetChannelListenerL() - ERROR: Already listening: return KErrAlreadyExists" ) ) ); + User::Leave( KErrAlreadyExists ); + } + + iChannelChangeListener = aChannelListener; + + if( iChannelChangeListener ) + { + iChannelChangeHandler->StartListening( this, aSearchParameters ); + } + else + { + if( iChannelChangeHandler->IsActive() ) + { + iChannelChangeHandler->Cancel(); + } + else + { + TInt ignore = iSensrvClient.SendReceiveSync( ESensrvSrvReqStopChannelChangeListening, + TIpcArgs() ); + } + } + + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::SetChannelListenerL() - Return" ) ) ); + } + + +// --------------------------------------------------------------------------- +// CSensrvChannelFinderImpl::ChannelChangeDetected +// --------------------------------------------------------------------------- +// +void CSensrvChannelFinderImpl::ChannelChangeDetected( const TSensrvChannelInfo& aDetectedChannel, + TSensrvChannelChangeType aChangeType ) + { + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::ChannelChangeDetected()" ) ) ); + + if( iChannelChangeListener ) + { + iChannelChangeListener->ChannelChangeDetected( aDetectedChannel, aChangeType ); + } + + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::ChannelChangeDetected - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSensrvChannelFinderImpl::ChannelDetectionError +// --------------------------------------------------------------------------- +// +void CSensrvChannelFinderImpl::ChannelDetectionError( TSensrvErrorSeverity aError ) + { + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::ChannelDetectionError()" ) ) ); + + if( aError == ESensrvErrorSeverityFatal ) + { + iSensrvClient.Close(); + } + + if( iChannelChangeListener ) + { + iChannelChangeListener->ChannelDetectionError( *this, aError ); + } + + COMPONENT_TRACE( ( _L( "Sensrv Client - CSensrvChannelFinderImpl::ChannelDetectionError - return" ) ) ); + } +