diff -r 000000000000 -r c53acadfccc6 contextengine/plugins/locationplugin/src/locationcontextplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextengine/plugins/locationplugin/src/locationcontextplugin.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2007-2009 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: A Context Engine Plug-in to get location context information. +* +*/ + + +#include +#include +#include +#include +#include + +#include "locationcontextplugin.h" +#include "mdenamespacedef.h" +#include "mdeobject.h" +#include "mdeharvestersession.h" +#include "mdeproperty.h" +#include "harvesterlog.h" +#include "mdsutils.h" +#include "mdeconstants.h" +#include "mdeobjectdef.h" +#include "harvesterdata.h" + +using namespace MdeConstants; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Default constructor for first phase construction. +// Don't export these - used only by functions in this DLL, eg our NewL(). +// --------------------------------------------------------------------------- +// +CLocationContextPlugin::CLocationContextPlugin() : + iObserver( NULL ), iMdeSession( NULL ), iLocationTrailConnected( EFalse ) + { + } + + +// --------------------------------------------------------------------------- +// Second phase construction +// --------------------------------------------------------------------------- +// +void CLocationContextPlugin::ConstructL() // second-phase constructor + { + // No implementation required + } + + +// --------------------------------------------------------------------------- +// The usual NewL() +// --------------------------------------------------------------------------- +// +CLocationContextPlugin* CLocationContextPlugin::NewL() + { + CLocationContextPlugin* self = new (ELeave) CLocationContextPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CLocationContextPlugin::~CLocationContextPlugin() + { + iLocationTrail.Close(); + iManipulator.Close(); + } + + +// --------------------------------------------------------------------------- +// From CContextPlugin. +// Initialization of Location Context Plugin. +// --------------------------------------------------------------------------- +// +void CLocationContextPlugin::Init( MContextPluginObserver& aObserver ) + { + WRITELOG("CLocationContextPlugin::Init()"); + + TInt err = iLocationTrail.Connect(); + if ( err == KErrNone ) + { + err = iManipulator.Connect(); + if (err == KErrNone) + { + iLocationTrailConnected = ETrue; + } + } + else + { + iLocationTrailConnected = EFalse; + } + aObserver.PluginInitializationStatus( KErrNone ); // notify the context framework + } + +// --------------------------------------------------------------------------- +// Set a pointer to MdESession. +// Session is used to store harvested context data. +// --------------------------------------------------------------------------- +// +void CLocationContextPlugin::SetMdeSession( CMdESession& aSession ) + { + iMdeSession = &aSession; + } + +// --------------------------------------------------------------------------- +// From CContextPlugin. +// This method takes a location context snapshot for one metadata object +// and writes the information to the object received as parameter. +// The observer will be informed about the status of the operation. +// --------------------------------------------------------------------------- +// +void CLocationContextPlugin::ContextSnapshot( MContextPluginObserver& aObserver, + CHarvesterData& aHD ) + { + WRITELOG( "CLocationContextPlugin::ContextSnapshot()" ); + + if( !aHD.AddLocation() ) + { + WRITELOG( "CLocationContextPlugin::ContextSnapshot() - aHd.AddLocation returned false" ); + aHD.SetErrorCode( KErrNone ); + aObserver.PluginSnapshotStatus( &aHD ); + return; + } + + if ( !iLocationTrailConnected ) // no trail, no snapshot + { + aHD.SetErrorCode( KErrDisconnected ); + aObserver.PluginSnapshotStatus( &aHD ); + return; + } + + TInt ret = KErrNone; + + ret = iManipulator.LocationSnapshot( aHD.MdeObject().Id() ); + + aHD.SetErrorCode( ret ); + aObserver.PluginSnapshotStatus( &aHD ); + } + +// --------------------------------------------------------------------------- +// From CContextPlugin. +// This method takes a location context snapshot for several metadata objects +// and writes the information to the all the objects received as parameter. +// The observer will be informed about the status of the operation. +// --------------------------------------------------------------------------- +// +void CLocationContextPlugin::ContextSnapshot( MContextPluginObserver& aObserver, + RPointerArray& aHDArray ) + { + const TInt count( aHDArray.Count() ); + WRITELOG( "CLocationContextPlugin::ContextSnapshot()" ); + + if ( !iLocationTrailConnected ) // no trail, no snapshot + { + for(TInt i = 0; i < count; i++) + { + CHarvesterData* hd = aHDArray[i]; + hd->SetErrorCode( KErrDisconnected ); + aObserver.PluginSnapshotStatus( hd ); + } + return; + } + + TLocationData data; + RLocationTrail::TTrailState state; + CMdEProperty* timeProp = NULL; + TInt ret = KErrNone; + iLocationTrail.GetLocationTrailState( state ); + + if ( state != RLocationTrail::ETrailStopped && state != RLocationTrail::ETrailStopping ) + { + for (TInt i = 0; i < aHDArray.Count(); ++i) + { + CMdEObject& mdeObject = ((CHarvesterData*)aHDArray[i])->MdeObject(); + TRAP( ret, GetMdeObjectCreationTimeL( mdeObject, timeProp ) ); + if ( ret != KErrNone ) + { + continue; + } +#ifdef _DEBUG + TRAP_IGNORE( + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() - timeProp: %Ld", + timeProp->TimeValueL().Int64() ) ); + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() - Location trail state: %d", + state ); +#endif + + TRAP_IGNORE(ret = iLocationTrail.RetrieveLocation( timeProp->TimeValueL(), data, state )); + +#ifdef _DEBUG + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() - Retrieve location returned: %d", ret ); + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() - Latitude was: %f", data.iPosition.Latitude() ); + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() - Longitude was: %f", data.iPosition.Longitude() ); + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() - Altitude was: %f", data.iPosition.Altitude() ); +#endif + + if (ret == KErrNone) + { + if ( !Math::IsNaN(data.iPosition.Latitude() ) || + !Math::IsNaN(data.iPosition.Longitude() ) || + !Math::IsNaN(data.iPosition.Altitude() ) || + data.iNetworkInfo.iCellId > 0 || data.iNetworkInfo.iLocationAreaCode > 0 || + data.iNetworkInfo.iCountryCode.Length() > 0 || + data.iCountry.Length() > 0 || data.iNetworkInfo.iNetworkId.Length() > 0 ) + { +#ifdef _DEBUG + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() Create location object for id: %d", mdeObject.Id()); +#endif + ret = iManipulator.CreateLocationObject(data, mdeObject.Id()); + WRITELOG1( "CLocationContextPlugin::ContextSnapshot() Create location object returned: %d", ret); + } + } + else + { + ret = KErrNone; + } + + } + } + + // Notify to context framework + for(TInt i = 0; i < count; i++) + { + CHarvesterData* hd = aHDArray[i]; + hd->SetErrorCode( KErrNone ); + aObserver.PluginSnapshotStatus( hd ); + } + } + +// --------------------------------------------------------------------------- +// Get mde object creation date/time. +// --------------------------------------------------------------------------- +// +void CLocationContextPlugin::GetMdeObjectCreationTimeL( CMdEObject& aObject, + CMdEProperty*& aProperty ) + { + CMdENamespaceDef& namespaceDef = iMdeSession->GetDefaultNamespaceDefL(); + + CMdEObjectDef& objectDef = namespaceDef.GetObjectDefL( Object::KBaseObject ); + CMdEPropertyDef& creationDef = objectDef.GetPropertyDefL( Object::KLastModifiedDateProperty ); + + CMdEProperty* property = NULL; + aObject.Property( creationDef, property, 0 ); + if ( !property ) + { + User::Leave( KErrNotFound ); + } + aProperty = property; + }