diff -r e8e63152f320 -r 2a9601315dfc javaextensions/sensor/src.s60/csensorfinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/sensor/src.s60/csensorfinder.cpp Mon May 03 12:27:20 2010 +0300 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 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: Factory for sensors +* +*/ + + +// INTERNAL INCLUDES +#include "csensorfinder.h" +#include "cpsbatterychargesensor.h" +#include "cpschargerstatesensor.h" +#include "cacceleratorsensor.h" +#include "cnetworkfieldintensitysensor.h" +#include "cacceleratorsensorrawdata.h" +#include "logger.h" + +// EXTERNAL INCLUDES +#include +#include +#include + + + +CSensorFinder::CSensorFinder() +{ + JELOG2(ESensor); +} + +CSensorFinder::~CSensorFinder() +{ + JELOG2(ESensor); + iSensors.ResetAndDestroy(); +} + +unsigned short** CSensorFinder::FindSensors(int* aSensorCount) +{ + JELOG2(ESensor); + unsigned short** result = NULL; + TRAPD(err, + FindSensorsL(); + TInt sensorCount = iSensors.Count(); + if (sensorCount > 0) +{ + result = new unsigned short*[ sensorCount ]; + User::LeaveIfNull(result); + } + + for (TInt i = 0; i < sensorCount; i++) +{ + HBufC* description = iSensors[ i ]->CreateDescriptionLC(); + + // one slot for terminator + TInt resultStringLength = description->Length() + 1; + result[ i ] = new unsigned short[ resultStringLength ]; + User::LeaveIfNull(result[ i ]); + TPtr resPtr((TUint16*)result[ i ], resultStringLength); + resPtr.Copy(*description); + resPtr.Append('\0'); + CleanupStack::PopAndDestroy(); + } + ); + if (err != KErrNone) + { + delete[] result; + result = NULL; + } + *aSensorCount = iSensors.Count(); + return result; +} + +Sensor* CSensorFinder::CreateSensor(int aIndex) +{ + JELOG2(ESensor); + CSensorBase* base = NULL; + TRAP_IGNORE(base = iSensors[ aIndex ]->DuplicateL()); + return base; +} + +void CSensorFinder::AddCustomSensorsL() +{ + JELOG2(ESensor); + CPSBatteryChargeSensor* battery_charge = CPSBatteryChargeSensor::NewL(); + CleanupStack::PushL(battery_charge); + iSensors.AppendL(battery_charge); + CleanupStack::Pop(); // self + + CPSChargerStateSensor* charger_state = CPSChargerStateSensor::NewL(); + CleanupStack::PushL(charger_state); + iSensors.AppendL(charger_state); + CleanupStack::Pop(); // self + + CNetworkFieldIntensitySensor* network_field_intensity = + CNetworkFieldIntensitySensor::NewL(); + CleanupStack::PushL(network_field_intensity); + iSensors.AppendL(network_field_intensity); + CleanupStack::Pop(); // self +} + + +void CSensorFinder::FindSensorsL() +{ + JELOG2(ESensor); + if (iSensors.Count() == 0) + { + //Construct a channel finder. + if (!(CActiveScheduler::Current())) + { + CActiveScheduler::Install(new(ELeave)CActiveScheduler()); + } + CSensrvChannelFinder* channelFinder; + channelFinder = CSensrvChannelFinder::NewL(); + CleanupStack::PushL(channelFinder); + + //List of found channels. + RSensrvChannelInfoList channelInfoList; + CleanupClosePushL(channelInfoList); + + //Create and fill channel search criteria. + TSensrvChannelInfo accelerationChannelInfo; + accelerationChannelInfo.iQuantity = ESensrvQuantityAcceleration; + + //Find the channel for acceleration sensor + channelFinder->FindChannelsL(channelInfoList, accelerationChannelInfo); + + + + TInt sensorCount = channelInfoList.Count(); + for (TInt i = 0; i < sensorCount; i++) + { + + CAcceleratorSensor* sensor = CAcceleratorSensor::NewLC(channelInfoList[i]); + iSensors.AppendL(sensor); + CleanupStack::Pop(); + + CAcceleratorSensorRawData* sensor2 = CAcceleratorSensorRawData::NewLC(channelInfoList[i]); + iSensors.AppendL(sensor2); + CleanupStack::Pop(); + + } + CleanupStack::PopAndDestroy(2); + AddCustomSensorsL(); + } +} + + +// End of file