diff -r e8e63152f320 -r 2a9601315dfc javaextensions/location/position/src/cpositioner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/location/position/src/cpositioner.cpp Mon May 03 12:27:20 2010 +0300 @@ -0,0 +1,220 @@ +/* +* 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: Handles getLocation requests + * +*/ + + +// INCLUDE FILES +#include "cpositioner.h" +#include "logger.h" +#include "locationfunctionserver.h" + +using namespace java::location; + +// UNNAMED LOCAL NAMESPACE +namespace +{ +// Delay subsequent getLocation() calls. This way the failing +// requests do not steal all processing time +const TInt KLocCallDelay = 500000; +} + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPositioner::CPositioner +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPositioner::CPositioner(LocationFunctionServer* aFunctionSource) : + CPositionerBase(aFunctionSource) +{ +} + +// ----------------------------------------------------------------------------- +// CPositioner::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPositioner::ConstructL(RPositionServer& aServer, + TPositionModuleId aModuleId, + TPositionModuleInfo::TCapabilities aCapabilities) +{ + BaseConstructL(aServer, aModuleId, aCapabilities); + User::LeaveIfError(iTimer.CreateLocal()); +} + +// ----------------------------------------------------------------------------- +// CPositioner::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPositioner* CPositioner::NewL(LocationFunctionServer* aFunctionSource, + RPositionServer& aServer, TPositionModuleId aModuleId, + TPositionModuleInfo::TCapabilities aCapabilities) +{ + CPositioner* self = new(ELeave) CPositioner(aFunctionSource); + CleanupStack::PushL(self); + self->ConstructL(aServer, aModuleId, aCapabilities); + CleanupStack::Pop(self); + return self; +} + +// Destructor +CPositioner::~CPositioner() +{ + iTimer.Close(); + Cancel(); +} + +// ----------------------------------------------------------------------------- +// CPositioner::StaticCancel +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPositioner::StaticCancel(CPositioner* aSelf) +{ + aSelf->Cancel(); +} + +// ----------------------------------------------------------------------------- +// CPositioner::SetCallBackData +// ----------------------------------------------------------------------------- +// +void CPositioner::SetCallBackData(jobject aJavaPositioner, JNIEnv* aJni) +{ + mJni = aJni; + mPeer = aJavaPositioner; + + jclass positionerClass = (*mJni).GetObjectClass(mPeer); + + //Get Method ID of Get Location Data Callback + mGetLocationCallBack = mJni->GetMethodID(positionerClass, "syncComplete", + "(I)V"); +} + +// ----------------------------------------------------------------------------- +// CPositioner::RunL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPositioner::RunL() +{ + TInt returnCode = iStatus.Int(); + + switch (returnCode) + { + case KErrNone: + { + // If previously returned code was buffer overflow just inform + // that the request was successful. + TInt ret = (iDelayedCode == KErrPositionBufferOverflow) + || (iDelayedCode == KErrOverflow) ? KErrNone : iDelayedCode; + // Obtained location information successfully, location fix is partial, + // or the quality of the fix is poor. In the last two cases the + // Java implementation tries to obtain location fix again. see API + // specification about location fixes when temporary unavailable. + // This is because the current implementation does not support partial + // location fixes + mJni = mFunctionServer->getValidJniEnv(); + (*mJni).CallVoidMethod(mPeer, mGetLocationCallBack, ret); + break; + } + case KErrOverflow: // Fallthrough + case KErrPositionBufferOverflow: + { + // CPositionerBase handles buffer size errors + HandleBufferSizeErrorL(returnCode); + // Buffer increased successfully. Make a new request + UpdatePosition(); + break; + } + // Handle other return codes of RPositioner::NotifyPositionUpdate() + // Partial update feature is not supported by this implementation + case KPositionPartialUpdate: // Fallthrough + case KPositionQualityLoss: // Fallthrough + // KErrTimedOut is handled on Java-side + case KErrTimedOut: // Fallthrough + // KErrNotFound is returned if current module is invalid + case KErrNotFound: // Fallthrough + // HPositionGenericInfo should be supported by all PSYs + case KErrArgument: // Fallthrough + // KErrAccessDenied if no requestor specified + case KErrAccessDenied: // Fallthrough + case KErrUnknown: // Used in MLFW + // Position request was canceled + case KErrCancel: // Fallthrough + // Bad implementation but due to partial fixes this cannot be fixed + // at the moment. Correct when partial fixes are supported. Java tries + // to obtain location fixes until time specified in Java-side expires + // Delay response so that repeated calls to getLocation do not steal + // all CPU time + default: + { + iTimer.After(iStatus, KLocCallDelay); + SetActive(); + break; + } + } + iDelayedCode = returnCode; +} + +// ----------------------------------------------------------------------------- +// CPositioner::DoCancel +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPositioner::DoCancel() +{ + iTimer.Cancel(); + iPositioner.CancelRequest(EPositionerNotifyPositionUpdate); + mJni = mFunctionServer->getValidJniEnv(); + (*mJni).CallVoidMethod(mPeer, mGetLocationCallBack, KErrCancel); +} + +// ----------------------------------------------------------------------------- +// CPositioner::RunError +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CPositioner::RunError(TInt aError) +{ + mJni = mFunctionServer->getValidJniEnv(); + (*mJni).CallVoidMethod(mPeer, mGetLocationCallBack, aError); + return KErrNone; +} + +// ----------------------------------------------------------------------------- +// CPositioner::GetLocation +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CPositioner::GetLocation(TInt aTimeout) +{ + TTimeIntervalMicroSeconds timeout = MAKE_TINT64(0, aTimeout) * 1000000; + TPositionUpdateOptions updateOptions; + updateOptions.SetUpdateTimeOut(timeout); + + TInt err = iPositioner.SetUpdateOptions(updateOptions); + + if (err == KErrNone) + { + UpdatePosition(); + } + return err; +} + +// End of File