sensorservices/sensorserver/src/client/sensrvchannelfinderimpl.cpp
changeset 0 4e1aa6a622a0
--- /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" ) ) );
+    }
+