diff -r e71858845f73 -r e1758cbb96ac systemswstubs/ssyreference/src/ssyreferencechannel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/systemswstubs/ssyreference/src/ssyreferencechannel.cpp Mon Oct 04 00:04:35 2010 +0300 @@ -0,0 +1,443 @@ +/* +* Copyright (c) 2006 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: Reference implementation of SSY Channel +* +*/ + + +#include // MSsyCallback +#include "ssyreferencechannel.h" +#include "ssyreferencecontrol.h" // SSY Control +#include "ssyreferencepropertyprovider.h" // iChannelPropertyProvider +#include "ssyreferencechanneldataprovider.h" // iChannelDataProvider +#include "ssyreferencetrace.h" +#include "ssyreferencecmdhandler.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel C++ constructor +// --------------------------------------------------------------------------- +// +CSsyReferenceChannel::CSsyReferenceChannel( CSsyReferenceControl& aSsyControl, TSensrvChannelInfo aChannelInfo ) : + iSsyControl( aSsyControl ), + iChannelInfo( aChannelInfo ), + iState( ESsyReferenceChannelIdle ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::CSsyReferenceChannel()" ) ) ); + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::CSsyReferenceChannel() - return" ) ) ); + } + + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CSsyReferenceChannel::ConstructL() + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ConstructL()" ) ) ); + + // Create command handler + iCmdHandler = CSsyReferenceCmdHandler::NewL( *this ); + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ConstructL() - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::NewL +// --------------------------------------------------------------------------- +// +CSsyReferenceChannel* CSsyReferenceChannel::NewL( CSsyReferenceControl& aSsyControl, TSensrvChannelInfo aChannelInfo ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::NewL()" ) ) ); + CSsyReferenceChannel* self = new ( ELeave ) CSsyReferenceChannel( aSsyControl, aChannelInfo ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::NewL() - return" ) ) ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CSsyReferenceChannel::~CSsyReferenceChannel() + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::~CSsyReferenceChannel()" ) ) ); + + // In case channel is not closed before destruction, providers are not deleted + if ( iChannelDataProvider ) + { + delete iChannelDataProvider; + iChannelDataProvider = NULL; + } + + if ( iChannelPropertyProvider ) + { + delete iChannelPropertyProvider; + iChannelPropertyProvider = NULL; + } + + if ( iCmdHandler ) + { + delete iCmdHandler; + iCmdHandler = NULL; + } + + iProperties.Reset(); + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::~CSsyReferenceChannel() - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::ChannelId +// --------------------------------------------------------------------------- +// +TInt CSsyReferenceChannel::ChannelId() + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ChannelId() - %i" ), iChannelInfo.iChannelId ) ); + return iChannelInfo.iChannelId; + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::SsyControl +// --------------------------------------------------------------------------- +// +CSsyReferenceControl& CSsyReferenceChannel::SsyControl() const + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::SsyControl()" ) ) ); + return iSsyControl; + } + +// --------------------------------------------------------------------------- +// CSsyReferenceControl::SsyCmdHandler +// --------------------------------------------------------------------------- +// +CSsyReferenceCmdHandler& CSsyReferenceChannel::CommandHandler() const + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::SsyCmdHandler()" ) ) ); + return *iCmdHandler; + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::FindPropertyL +// --------------------------------------------------------------------------- +// +TSensrvProperty& CSsyReferenceChannel::FindPropertyL( + const TSensrvPropertyId aPropertyId, + TInt aItemIndex, + TInt aArrayIndex ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::FindPropertyL()" ) ) ); + TSensrvProperty* property = NULL; + TBool propertyFound( EFalse ); + + // Search property + for ( TInt i = 0; i < iProperties.Count() && !propertyFound; i++ ) + { + property = static_cast( &iProperties[i] ); + + // Compare property IDs and array index + if ( property->GetPropertyId() == aPropertyId ) + { + // Compare item index if it is given + if ( ( KErrNotFound == aItemIndex ) || ( property->PropertyItemIndex() == aItemIndex ) ) + { + // Correct property ID is found, now check is it array type of property. + // Either array indexes must match or propertys array index has to be array info + if ( ( property->GetArrayIndex() == aArrayIndex ) || + ( ( property->GetArrayIndex() == ESensrvArrayPropertyInfo ) && + ( ESensrvSingleProperty == aArrayIndex ) ) ) + { + // Correct array index found + propertyFound = ETrue; + } + } + } + } + + // Leave if not found + if ( !propertyFound ) + { + iSsyControl.FindPropertyL( aPropertyId, aArrayIndex, *property ); + } + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::FindPropertyL() - return" ) ) ); + return *property; + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::FindAndUpdatePropertyL +// --------------------------------------------------------------------------- +// +void CSsyReferenceChannel::FindAndUpdatePropertyL( const TSensrvProperty& aProperty ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::FindAndUpdatePropertyL()" ) ) ); + TBool propertyFound( EFalse ); + + // Search property + for ( TInt i = 0; i < iProperties.Count() && !propertyFound; i++ ) + { + // Compare property IDs + if ( iProperties[i].GetPropertyId() == aProperty.GetPropertyId() ) + { + // Compare item index if it is given + if ( ( KErrNotFound != aProperty.PropertyItemIndex() ) && + ( iProperties[i].PropertyItemIndex() == aProperty.PropertyItemIndex() ) ) + { + // Property found -> update if possible + if ( iProperties[i].ReadOnly() ) + { + User::Leave( KErrAccessDenied ); + } + // If modifiable, get type and update value + switch ( iProperties[i].PropertyType() ) + { + case ESensrvIntProperty: + { + TInt value( 0 ); + aProperty.GetValue( value ); + iProperties[i].SetValue( value ); + break; + } + case ESensrvRealProperty: + { + TReal value( 0 ); + aProperty.GetValue( value ); + iProperties[i].SetValue( (TReal) value ); + break; + } + case ESensrvBufferProperty: + { + TBuf8<20> propValue; + aProperty.GetValue( propValue ); + iProperties[i].SetValue( propValue ); + break; + } + default: + { + break; + } + } + propertyFound = ETrue; + } + } + } + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::FindPropertyL() - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::GetProperties +// --------------------------------------------------------------------------- +// +void CSsyReferenceChannel::GetProperties( RSensrvPropertyList& aPropertyList ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::GetProperties()" ) ) ); + // Copy properties one by one to param aPropertyList + TInt propCount( iProperties.Count() ); + RSensrvPropertyList propList( propCount ); + + for ( TInt i = 0; i < propCount; i++ ) + { + propList.Append( iProperties[i] ); + } + + aPropertyList = propList; + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::GetProperties() - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::UpdateState +// --------------------------------------------------------------------------- +// +void CSsyReferenceChannel::UpdateState( const TSsyReferenceChannelState aNewState ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::UpdateState() - %i" ), aNewState ) ); + iState = aNewState; + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::ProcessResponse +// --------------------------------------------------------------------------- +// +void CSsyReferenceChannel::ProcessResponse( TSsyReferenceMsg* aMessage ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ProcessResponse()" ) ) ); + + if ( aMessage ) + { + switch ( aMessage->Function() ) + { + case ESsyReferenceOpenChannelResp: + { + // Open channel specific handling here + TRAPD( err, HandleOpenChannelRespL( aMessage->Error() ) ); + if ( KErrNone != err ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ProcessResponse() - Error opening channel: %i" ), err ) ); + } + break; + } + case ESsyReferenceDataItemReceived: + { + // Send data item to data provider + TRAPD( err, iChannelDataProvider->ChannelDataReceivedL( aMessage ) ); + if ( KErrNone != err ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ProcessResponse() - Error receiving data: %i" ), err ) ); + } + break; + } + case ESsyReferenceCloseChannelResp: + { + // Close channel specific handling here + HandleCloseChannelResp(); + break; + } + default: + { + // This command was not intended to process here, try Control class + iSsyControl.ProcessResponse( aMessage ); + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ProcessResponse() - Unknown function" ) ) ); + } + } + } + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::ProcessResponse() - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::OpenChannel +// --------------------------------------------------------------------------- +// +TInt CSsyReferenceChannel::OpenChannel() + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::OpenChannel()" ) ) ); + + TInt err( KErrAlreadyExists ); + + // Check that this channel is not already open + if ( ESsyReferenceChannelIdle == iState ) + { + // Update state and issue request. Will continue in HandleOpenChannelResp + UpdateState( ESsyReferenceChannelOpening ); + + // Create message with function spesific information + // and pass it to command handler + err = iCmdHandler->ProcessCommand( TSsyReferenceMsg( ChannelId(), ESsyReferenceOpenChannel ) ); + } + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::OpenChannel() - return" ) ) ); + return err; + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::HandleOpenChannelResp +// --------------------------------------------------------------------------- +// +void CSsyReferenceChannel::HandleOpenChannelRespL( const TInt aError ) + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::HandleOpenChannelResp()" ) ) ); + + // Open channel asynhronously and complete request with MSsyCallback::ChannelOpened() when + // channel is opened. + + // Create instance of the data provider of this channel + iChannelDataProvider = CSsyReferenceChannelDataProvider::NewL( *this ); + // Create instance of the property provider of this channel + iChannelPropertyProvider = CSsyReferencePropertyProvider::NewL( *this ); + + TInt error( aError ); + + // If channel opening succeeds, update state to Open + if ( KErrNone == aError ) + { + // Update state to Open + UpdateState( ESsyReferenceChannelOpen ); + // Get channel properties + TRAP( error, iSsyControl.SsyConfig().GetChannelPropertiesL( ChannelId(), iProperties ) ); + } + else + { + // Channel opening failed, back to idle + UpdateState( ESsyReferenceChannelIdle ); + } + + // Complete transaction + iSsyControl.SsyCallback().ChannelOpened( ChannelId(), + error, + iChannelDataProvider, + iChannelPropertyProvider ); + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::HandleOpenChannelResp() - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::CloseChannel +// --------------------------------------------------------------------------- +// +TInt CSsyReferenceChannel::CloseChannel() + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::CloseChannel()" ) ) ); + + TInt err( KErrNotFound ); + + // Check that this channel is open + if ( ESsyReferenceChannelOpen == iState ) + { + // Update state and issue request. Will continue in HandleCloseChannelResp + UpdateState( ESsyReferenceChannelClosing ); + // Create message with function spesific information + // and pass it to command handler + err = iCmdHandler->ProcessCommand( TSsyReferenceMsg( ChannelId(), ESsyReferenceCloseChannel ) ); + } + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::CloseChannel() - return" ) ) ); + return err; + } + +// --------------------------------------------------------------------------- +// CSsyReferenceChannel::HandleCloseChannelResp +// --------------------------------------------------------------------------- +// +void CSsyReferenceChannel::HandleCloseChannelResp() + { + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::HandleCloseChannelResp()" ) ) ); + + // Close channel and complete request with MSsyCallback::ChannelClosed() when + // channel is closed. + + // Delete providers + delete iChannelDataProvider; + iChannelDataProvider = NULL; + + delete iChannelPropertyProvider; + iChannelPropertyProvider = NULL; + + // Update state to idle + UpdateState( ESsyReferenceChannelIdle ); + + // Reset properties + iProperties.Reset(); + + // Complete transaction + iSsyControl.SsyCallback().ChannelClosed( ChannelId() ); + + COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannel::HandleCloseChannelResp() - return" ) ) ); + } + +// End of file