diff -r 000000000000 -r a4daefaec16c sipvoipprovider/src/svppositioningprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipvoipprovider/src/svppositioningprovider.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,209 @@ +/* +* Copyright (c) 2007 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: Provides position information +* +*/ + + +#include + +#include "svppositioningprovider.h" +#include "svppositioningproviderobserver.h" +#include "svplogger.h" // For logging + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +// +CSVPPositioningProvider::CSVPPositioningProvider( + TPriority aPriority, MSVPPositioningProviderObserver& aObserver ) + : CActive( aPriority ), + iObserver( aObserver ) + { + iPositionServer = RPositionServer(); + iPositioner = RPositioner(); + + CActiveScheduler::Add( this ); + } + + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CSVPPositioningProvider::ConstructL() + { + User::LeaveIfError( iPositionServer.Connect() ); + } + + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CSVPPositioningProvider* CSVPPositioningProvider::NewL( + TPriority aPriority, MSVPPositioningProviderObserver& aObserver ) + { + CSVPPositioningProvider* self = + CSVPPositioningProvider::NewLC( aPriority, aObserver ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// NewLC +// --------------------------------------------------------------------------- +// +CSVPPositioningProvider* CSVPPositioningProvider::NewLC( + TPriority aPriority, MSVPPositioningProviderObserver& aObserver ) + { + SVPDEBUG1("CSVPPositioningProvider::NewLC"); + + CSVPPositioningProvider* self = + new( ELeave ) CSVPPositioningProvider( aPriority, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CSVPPositioningProvider::~CSVPPositioningProvider() + { + SVPDEBUG1("CSVPPositioningProvider::~CSVPPositioningProvider"); + + Cancel(); + + iPositioner.Close(); + iPositionServer.Close(); + + delete iPositionGenericInfo; + } + + +// --------------------------------------------------------------------------- +// Opens positioning module +// --------------------------------------------------------------------------- +// +void CSVPPositioningProvider::OpenModuleL( TInt aModuleId ) + { + SVPDEBUG1("CSVPPositioningProvider::OpenModuleL"); + + TPositionModuleId moduleId; + moduleId.iUid = aModuleId; + User::LeaveIfError( iPositioner.Open( iPositionServer, moduleId ) ); + } + + +// --------------------------------------------------------------------------- +// Closes positioning module +// --------------------------------------------------------------------------- +// +void CSVPPositioningProvider::CloseModule() + { + SVPDEBUG1("CSVPPositioningProvider::CloseModule"); + + Cancel(); + + iPositioner.Close(); + } + + +// --------------------------------------------------------------------------- +// Requests position information asynchronically for the given SIP profile +// --------------------------------------------------------------------------- +// +void CSVPPositioningProvider::MakePositioningRequestL( + TUint32 aIapId, const TDesC& aApplicationName, TUint32 /*aTimeout*/ ) + { + SVPDEBUG1("CSVPPositioningProvider::MakePositioningRequestL"); + + delete iPositionGenericInfo; + iPositionGenericInfo = NULL; + iPositionGenericInfo = HPositionGenericInfo::NewL(); + + // Set requested field + iPositionGenericInfo->SetRequestedField( EDhcpPsyIAPProfileIdField ); + iPositionGenericInfo->SetValue( EDhcpPsyIAPProfileIdField, aIapId ); + + // Set requestor + // - ERequestorService: request originates from an application + // - EFormatApplication: request contains the textual name of an + // application + User::LeaveIfError( iPositioner.SetRequestor( + CRequestor::ERequestorService, + CRequestor::EFormatApplication, + aApplicationName ) ); + + /* TEMPORARY FIX + // Set timeout + TPositionUpdateOptions positionUpdateOptions; + positionUpdateOptions.SetUpdateTimeOut( + TTimeIntervalMicroSeconds( aTimeout ) ); + User::LeaveIfError( + iPositioner.SetUpdateOptions( positionUpdateOptions ) ); + */ + + // Make position request + iPositioner.NotifyPositionUpdate( *iPositionGenericInfo, iStatus); + SetActive(); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// DoCancel +// --------------------------------------------------------------------------- +// +void CSVPPositioningProvider::DoCancel() + { + iPositioner.CancelRequest( EPositionerNotifyPositionUpdate ); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// RunL +// --------------------------------------------------------------------------- +// +void CSVPPositioningProvider::RunL() + { + SVPDEBUG1("CSVPPositioningProvider::RunL"); + + if ( KErrNone != iStatus.Int() ) + { + iObserver.PositioningErrorOccurred( iStatus.Int() ); + } + else if ( iPositionGenericInfo && + iPositionGenericInfo->IsRequestedField( + EDhcpPsyLocationResultDataField ) + ) + { + TPtrC8 locInfo; + iPositionGenericInfo->GetValue( + EDhcpPsyLocationResultDataField, locInfo ); + iObserver.PositioningRequestComplete( locInfo ); + } + else + { + iObserver.PositioningErrorOccurred( KErrNotFound ); + } + }