contextengine/plugins/locationplugin/src/locationcontextplugin.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
--- /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 <e32std.h>
+#include <uri16.h>
+#include <e32math.h>
+#include <LbsPosition.h> 
+#include <etel3rdparty.h>
+
+#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<CHarvesterData>& 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;
+    }