locationmanager/server/inc/clocationmanagerserver.h
changeset 0 c53acadfccc6
child 1 acef663c1218
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationmanager/server/inc/clocationmanagerserver.h	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,467 @@
+/*
+* Copyright (c) 2006-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:  Header file for Location Manager Server.
+*
+*/
+
+#ifndef C_CLOCATIONMANAGERSERVER_H
+#define C_CLOCATIONMANAGERSERVER_H
+
+
+#include <e32base.h>
+#include <etel3rdparty.h>
+#include <centralrepository.h>
+#include <locationdatatype.h>
+#include <locationeventdef.h>
+
+#include "rlocationtrail.h"
+#include "rlocationobjectmanipulator.h"
+#include "clocationrecord.h"
+#include "ctracklog.h"
+#include "mdeconstants.h"
+#include "mdsutils.h"
+#include "mdesession.h"
+#include "mdequery.h"
+#include "mderelationquery.h"
+#include "locationmanagerdefs.h"
+
+
+class CMdESession;
+
+// Total number of ranges
+const TUint KLocationManagerRangeCount = 1;
+
+// Definition of the ranges of IPC numbers
+const TInt KLocationManagerRanges[KLocationManagerRangeCount] = 
+    {
+    0,
+    }; 
+
+// Policy to implement for each of the above ranges        
+const TUint8 KLocationManagerElementsIndex[KLocationManagerRangeCount] = 
+    {
+    0,
+    };
+
+const CPolicyServer::TPolicyElement KLocationManagerPolicyElements[] = 
+    {
+    { _INIT_SECURITY_POLICY_C3(ECapabilityReadUserData,
+                               ECapabilityWriteUserData,
+                               ECapabilityLocation),
+                               CPolicyServer::EFailClient }
+    };
+
+// Package all the above together into a policy
+const CPolicyServer::TPolicy KLocationManagerPolicy =
+    {
+    CPolicyServer::EAlwaysPass,     // all attempts should pass
+    KLocationManagerRangeCount,     // number of ranges
+    KLocationManagerRanges,         // ranges array
+    KLocationManagerElementsIndex,  // elements<->ranges index
+    KLocationManagerPolicyElements, // array of elements
+    };
+    
+class CLocationRecord;
+//class CLocationWrite;
+
+/**
+*  A server class to initialize server. 
+*
+*  @since S60 3.1
+*/
+class CLocationManagerServer : public CPolicyServer,
+                               public MLocationTrailObserver,
+                               public MMdESessionObserver,
+                               public MMdEQueryObserver,
+                               public MMdEObjectObserver,
+                               public MGpxConversionObserver
+    {
+private:
+	struct TMessageQuery
+		{
+		CMdERelationQuery* iQuery;
+		const RMessage2& iMessage;
+		
+		TMessageQuery( CMdERelationQuery* aQuery, const RMessage2& aMessage ) 
+			:  iQuery ( aQuery ), iMessage( aMessage ) { }
+		};
+    
+public:
+    /**
+    * 2-phased constructor.
+    */
+    static CLocationManagerServer* NewLC();
+    
+    /**
+    * C++ destructor.
+    */ 
+    virtual ~CLocationManagerServer();
+  
+public:
+    /**
+    * From CServer2, creates a new session.
+    */
+    CSession2* NewSessionL( const TVersion& aVersion, 
+                            const RMessage2& aMessage ) const;
+
+public: // From MMdESessionObserver
+	void HandleSessionOpened(CMdESession& aSession, TInt aError);
+    void HandleSessionError(CMdESession& aSession, TInt aError);
+    
+public: // From MMdEQueryObserver
+	void HandleQueryNewResults(CMdEQuery& aQuery, TInt aFirstNewItemIndex, TInt aNewItemCount);
+	void HandleQueryCompleted(CMdEQuery& aQuery, TInt aError);
+
+public:
+    /**
+     * Increase session count.
+     * @since S60 3.1
+     * @param None.
+     * @return None.
+     */
+    void AddSession();
+    
+    /**
+     * Decrease session count, close server if count is zero.
+     * @since S60 3.1
+     * @param None.
+     * @return None.
+     */
+    void RemoveSession();
+
+public:
+    /**
+     * Starts to record locations to the trail.
+     * @since S60 3.1
+     * @param None.
+     * @return None.
+     */     
+    void StartGPSPositioningL( RLocationTrail::TTrailCaptureSetting aCaptureSetting );
+    
+    /**
+     * Stops trail recording.
+     * @since S60 3.1
+     * @param None.
+     * @return None.
+     */     
+    void StopGPSPositioningL();
+    
+    /**
+     * Gets the current state of the location trail.
+     * @since S60 3.1
+     * @param aState, The state of the trail is written to this param.
+     * @return None.
+     */     
+    void GetLocationTrailState( RLocationTrail::TTrailState& aState );
+    
+    /**
+     * Adds client's notification request to the request array.
+     * @since S60 3.1
+     * @param aNotifReq, asynchonous RMessage is stored to be completed
+     *                   when the state of the trail changes.
+     * @return None.
+     */     
+    void AddNotificationRequestL( const RMessage2& aNotifReq );
+    
+    /**
+     * Add client's track log notification request to the request array.
+     * @param aNotifReq, asynchonous RMessage is stored to be completed
+     *                   when the state of the track log changes.
+     * @return None.
+     */
+    void AddTrackLogNotificationRequestL( const RMessage2& aNotifReq );
+    
+    /**
+     * Cancel notification request from client.
+     * @since S60 3.1
+     * @param aHandle, A handle of the request to be cancelled.
+     * @return None.
+     */     
+    void CancelNotificationRequest( const TInt aHandle );
+    
+    /**
+     * Get a location by time stamp.
+     * @since S60 3.1
+     * @param aTimeStamp, A time stamp to get corresponding location.
+     * @param aPosition, Location info is written to this param.
+     * @return None.
+     */     
+    void GetLocationByTimeL( const TTime& aTimeStamp, 
+    						 TLocationData& aLocationData,
+                             /*TLocality& aPosition, 
+                             CTelephony::TNetworkInfoV1& aNetworkInfo,*/
+                             TLocTrailState& aState );
+
+    /**
+     * Get current location.
+     * @since S60 3.1
+     * @param aCurrLocReq 
+     * @return None.
+     */     
+    void RequestCurrentLocationL( const RMessage2& aCurrLocReq ); 
+
+    /**
+     * Cancel location request.
+     * @since S60 3.1
+     * @param aCurrLocReq 
+     * @return None.
+     */     
+    void CancelLocationRequest( const TInt aHandle ); 
+    
+    /**
+     * Cancel tracklog notification request.
+     * @param aHandle
+     * @return None.
+     */
+    void CLocationManagerServer::CancelTrackLogNotificationRequest( const TInt aHandle );
+
+    /**
+     * Get current network cell id.
+     * @since S60 3.1
+     * @param aCurrLocReq 
+     * @return None.
+     */     
+    void GetCurrentNetworkInfo( CTelephony::TNetworkInfoV1& aNetworkInfo );
+    
+    /**
+     * Create a location context object in DB and create relationships to objects
+     * whose id is given in the array.
+     * @param aLocationData
+     * @param aObjectId
+     */
+	void CreateLocationObjectL( const TLocationData& aLocationData, 
+    						   	   const TUint& aObjectId );
+	
+    /**
+     * Create a location context object in DB and create relationships to objects
+     * whose id is given in the array.
+     * Location information is taken from location trail
+     * @param aObjectId
+     */
+	void LocationSnapshotL( const TUint& aObjectId );
+	
+	/**
+	 * Deletes the relationship between an object and 
+	 * the location context object associated with it.
+	 * @since S60 3.2
+	 * @param aObjectId
+	 * @return None.
+	 */ 
+	void RemoveLocationObjectL(TUint& aObjectId);
+	void CopyLocationObjectL( TItemId aSource, const RArray<TItemId>& aTargets, TMessageQuery& aQuery );
+	void CopyLocationObjectL( const TDesC& aSource, const RArray<TPtrC>& aTargets, TMessageQuery& aQuery );
+	
+	TBool IsSessionReady();
+	
+	TItemId StartTrackLogL();
+	
+	void StopTrackLogL();
+	
+	void IsTrackLogRecording( TBool &aRec );
+	
+	TInt GetTrackLogStatus( TBool& aRecording, TPositionSatelliteInfo& aFixQuality);
+	
+	TInt DeleteTrackLogL(const TDesC& aUri);
+	
+	TInt TrackLogName(TFileName& aFileName);
+	
+	void GetCaptureSetting( RLocationTrail::TTrailCaptureSetting& aCaptureSetting );
+	
+	void AddGpxObserver( MGpxConversionObserver* aObserver );
+	
+	void InitCopyLocationByIdL( const RMessage2& aMessage );
+	void InitCopyLocationByURIL( const RMessage2& aMessage );
+
+public: // from MLocationTrailObserver.
+    /**
+     * Callback method to get notification about trail state change.
+     * @since S60 3.1
+     * @param None.
+     * @return None.
+     */
+    void LocationTrailStateChange();
+    
+    /**
+     * Callback method to return current location.
+     * @since S60 3.1
+     * @param aSatelliteInfo, includes position and satellite info.
+     * @param aNetworkInfo, network and cell info.
+     * @param aError.
+     * @return None.
+     */
+    void CurrentLocation( const TPositionSatelliteInfo& aSatelliteInfo,
+    		const CTelephony::TNetworkInfoV1& aNetworkInfo, const TInt aError );
+    
+    /**
+     * Callback method to notify observer of changes in GPS signal quality.
+     * @param aSatelliteInfo, includes position and satellite info
+     * @return None.
+     */
+    void GPSSignalQualityChanged( const TPositionSatelliteInfo& aSatelliteInfo );
+    
+public: // from MMdeObjectObserver
+	/**
+	 * Called to notify the observer that new objects has been
+	 * added/modified/removed in the metadata engine database.
+	 *
+	 * @param aSession session
+	 * @param aType defines if object was added/modified/remove
+	 * @param aObjectIdArray IDs of added object
+	 */
+	void HandleObjectNotification( CMdESession& aSession, 
+						TObserverNotificationType aType,
+						const RArray<TItemId>& aObjectIdArray );
+	
+public: // from MGpxConversionObserver
+
+	void GpxFileCreated( const TDesC& aFileName, TItemId aTagId, TReal32 aLength,
+			TTime aStart, TTime aEnd );
+
+private:    
+    /**
+    * C++ constructor.
+    */
+    CLocationManagerServer();
+    
+    /**
+    * 2nd phase constructor.
+    */
+    void ConstructL();
+    
+    void CopyLocationL( CMdEQuery& aQuery );
+
+    /**
+     * Go through all messages in lists, complete request
+     * with KErrCancel status and remove items from list.
+     */ 
+    void CancelRequests(RArray<RMessage2>& aMessagesList);
+    
+    
+    void CancelCopyRequests(RArray<TMessageQuery>& aMessageList);
+    
+    /**
+     * Create a new tracklog tag object in the database.
+     * @return TItemId tag ID in the database
+     */ 
+    TItemId CreateTrackLogTagL();
+    
+    /**
+     * Create a new tracklog object in the database and link tracklog tag to it.
+     * @param aTagId, tracklog tag id
+     */ 
+    void CreateTrackLogL( TItemId aTagId, const TDesC& aUri, TReal32 aLength,
+    		TTime aStart, TTime aEnd );
+    
+    /**
+     * Start listening for tracklog tag removals.
+     */
+    void StartListeningTagRemovalsL();
+    
+    /**
+     * Start listening for media object creations.
+     */
+    void StartListeningObjectCreationsL();
+    
+    /**
+     * Create a relationship between mediaobject(s) and a tracklog tag.
+     * @param aObjectIdArray, array of media object ids
+     */
+    void LinkObjectToTrackLogTagL( const RArray<TItemId>& aObjectIdArray );
+    
+    /**
+     * Callback function for positioning stop timer.
+     * @param aAny, a pointer to CLocationRecord object
+     * @return Error code
+     */
+    static TInt PositioningStopTimeout( TAny* aAny );
+    
+    /**
+     * Stops location trail and deletes the positioning stop timer.
+     */
+    void StopRecording();
+    
+    void CompleteNotifyRequest( TEventTypes aEventType, TInt aError );
+
+private:
+    /**
+     * A class for recording and storing locations.
+     * Own.
+     */
+    CLocationRecord* iLocationRecord;
+    
+    /**
+     * Pointer to TrackLog
+     * Own.
+     */
+    CTrackLog* iTrackLog;
+    
+    /**
+     * An active scheduler wait loop for waiting a session to MdE to open.
+     */
+    CActiveSchedulerWait* iASW;
+    
+    /**
+     * An array for asynchronous notification requests.
+     * Own.
+     */
+    RArray<RMessage2> iNotifReqs;
+    
+    /**
+     * An array for asynchronous location requests.
+     * Own.
+     */
+    RArray<RMessage2> iLocationReqs;
+    
+    /**
+     * An array for track log notification requests.
+     * Own.
+     */
+    RArray<RMessage2> iTrackLogNotifyReqs;
+    
+    /**
+     * An array for location copy requests.
+     * Own.
+     */
+    RArray<TMessageQuery> iCopyReqs;
+    
+    /**
+     * A session to Metadata Engine for creating and manipulating location objects.
+     */
+    CMdESession* iMdeSession;
+    
+    /** A relation query used to seach for related location objects */
+    CMdERelationQuery* iRelationQuery;
+    
+    /**
+     * A timer to stop location trail.
+     * Own.
+     */
+    CPeriodic* iTimer;
+    
+    TBool iClientSwitch;    
+    TInt iSessionCount;
+    TBool iSessionReady;  
+    
+    RArray<TItemId> iTargetObjectIds;
+    TItemId iTagId;
+    TInt iLocManStopDelay;
+    
+    RLocationTrail::TTrailCaptureSetting iCaptureSetting;
+    TBool iRemoveLocation;    
+    };
+
+
+#endif // C_CLOCATIONMANAGERSERVER_H
+
+// End of file.