datasourcemodules/locationapesuplpsy/src/suplpsypositioner.cpp
changeset 0 9cfd9a3ee49c
equal deleted inserted replaced
-1:000000000000 0:9cfd9a3ee49c
       
     1 /*
       
     2 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  This is SUPL PSY Positioning Plug-in ( PSY )
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <e32std.h>            
       
    22 #include <centralrepository.h>
       
    23 #include <ecom/implementationproxy.h>  // TImplementationProxy
       
    24 #include <lbspositioninfo.h>      // TPositionInfoBase
       
    25 
       
    26 #include "suplpsypositioner.h"
       
    27 #include "suplpsycrkeys.h"
       
    28 #include "suplpsyrequestmanager.h"
       
    29 #include "suplpsygenericinfouser.h"
       
    30 #include "suplpsylogging.h"
       
    31 #include "suplpsypanic.h"
       
    32 #include "suplpsy.hrh"
       
    33 
       
    34 
       
    35 // LOCAL CONSTANTS AND MACROS
       
    36 const TImplementationProxy KFactoryPtr =
       
    37     IMPLEMENTATION_PROXY_ENTRY( KSuplPsyImplUid, CSuplPsyPositioner::NewL );
       
    38 
       
    39 // ========================= ==   == LOCAL FUNCTIONS ===============================
       
    40 
       
    41 // Following function is required by Positioning Plug-in API at ordinal 1.
       
    42 
       
    43 EXPORT_C const TImplementationProxy* ImplementationGroupProxy( 
       
    44     TInt& aTableCount )
       
    45     {
       
    46     aTableCount = 1;
       
    47     return &KFactoryPtr;
       
    48     }
       
    49 
       
    50 // ======================== ==   == MEMBER FUNCTIONS ===============================
       
    51 
       
    52 // -----------------------------------------------------------------------------
       
    53 // CSuplPsyPositioner::CSuplPsyPositioner
       
    54 // C++default constructor can NOT contain any code, that
       
    55 // might leave.
       
    56 // -----------------------------------------------------------------------------
       
    57 //
       
    58 CSuplPsyPositioner::CSuplPsyPositioner()
       
    59     {
       
    60     // Nothing to do here
       
    61     }
       
    62 
       
    63 
       
    64 // -----------------------------------------------------------------------------
       
    65 // CSuplPsyPositioner::ConstructL
       
    66 // Symbian 2nd phase constructor can leave.
       
    67 // -----------------------------------------------------------------------------
       
    68 //
       
    69 void CSuplPsyPositioner::ConstructL( TAny* aConstructionParameters )
       
    70     {
       
    71     TRACESTRING( "CSuplPsyPositioner::ConstructL start" )
       
    72     // Calling BaseConstructL is required by Positioning Plug-in API.
       
    73     BaseConstructL( aConstructionParameters );
       
    74 
       
    75     // Get instance of request manager, and register to it
       
    76     iRequestManager = CSuplPsyRequestManager::RegisterL( *this );
       
    77 
       
    78     CRepository *repository = CRepository::NewL(KCRUidSuplPsy);
       
    79 
       
    80     TInt keyValue;
       
    81 
       
    82     TInt ret = repository->Get(KSuplPsyAllowedAccuracy, keyValue);
       
    83    
       
    84     if (ret == KErrNone)
       
    85         {            
       
    86         if (keyValue <= 0)
       
    87             {            
       
    88             TRACESTRING( "CSuplPsyPositioner::ConstructL, invalid value in the configuration " )
       
    89     	    iAllowedAccr = 0;
       
    90             }
       
    91         else		
       
    92     	    iAllowedAccr = keyValue;
       
    93         }
       
    94     else
       
    95     	iAllowedAccr = 0;
       
    96 
       
    97 	
       
    98    	TRACESTRING2( "Allowes Accurracy...:%d", iAllowedAccr )
       
    99     delete repository;
       
   100     repository = NULL;
       
   101     TRACESTRING( "CSuplPsyPositioner::ConstructL end" )
       
   102     }
       
   103 
       
   104 
       
   105 // -----------------------------------------------------------------------------
       
   106 // CSuplPsyPositioner::NewL
       
   107 // Two - phased constructor.
       
   108 // -----------------------------------------------------------------------------
       
   109 //
       
   110 CSuplPsyPositioner* CSuplPsyPositioner::NewL( TAny* aConstructionParameters )
       
   111     {
       
   112     CSuplPsyPositioner* self = new( ELeave ) CSuplPsyPositioner;
       
   113     
       
   114     CleanupStack::PushL( self );
       
   115     self->ConstructL( aConstructionParameters );
       
   116     CleanupStack::Pop( self );
       
   117 
       
   118     return self;
       
   119     }
       
   120 
       
   121     
       
   122 // -----------------------------------------------------------------------------
       
   123 // CSuplPsyPositioner::~CSuplPsyPositioner
       
   124 // Destructor
       
   125 // -----------------------------------------------------------------------------
       
   126 //
       
   127 CSuplPsyPositioner::~CSuplPsyPositioner()
       
   128     {
       
   129     // Unregister to request manager
       
   130     if ( iRequestManager != NULL )
       
   131         {
       
   132         iRequestManager->Unregister( *this );
       
   133         }
       
   134     TRACESTRING( "CSuplPsyPositioner:: destructed" )
       
   135     }
       
   136 
       
   137 
       
   138 // -----------------------------------------------------------------------------
       
   139 // CSuplPsyPositioner::NotifyPositionUpdate
       
   140 // 
       
   141 // -----------------------------------------------------------------------------
       
   142 //
       
   143 void CSuplPsyPositioner::NotifyPositionUpdate ( 
       
   144     TPositionInfoBase& aPosInfo,  
       
   145     TRequestStatus&    aStatus )
       
   146     {
       
   147     TRACESTRING( "CSuplPsyPositioner::NotifyPositionUpdate start" )
       
   148 
       
   149     //Supl psy will not handle simultaneous location request
       
   150     if ( iRequestStatus != NULL )
       
   151         {
       
   152         Panic( EPanicPositionRequestOngoing );
       
   153         }
       
   154     
       
   155     aStatus = KRequestPending;    
       
   156         
       
   157     //Clear position info data
       
   158     if ( ClearPositionInfoData( aPosInfo ) != KErrNone )
       
   159         {
       
   160         TRequestStatus* status = &aStatus;
       
   161         User::RequestComplete( status, KErrArgument );
       
   162         }
       
   163     
       
   164     //Check maxAge
       
   165     TPosition lastPos;
       
   166     TTime maxAge;
       
   167     GetMaxAge( maxAge );
       
   168     iRequestManager->RecieveMaxAge( maxAge );
       
   169        
       
   170     //Issue location request to request manager
       
   171     iRequestManager->NotifyPositionUpdate( *this );
       
   172     iRequestStatus = &aStatus;
       
   173     iPositionInfo = &aPosInfo;
       
   174     TRACESTRING( "CSuplPsyPositioner::NotifyPositionUpdate end" )
       
   175     }
       
   176 
       
   177 
       
   178 // -----------------------------------------------------------------------------
       
   179 // CSuplPsyPositioner::CancelNotifyPositionUpdate
       
   180 // 
       
   181 // -----------------------------------------------------------------------------
       
   182 //
       
   183 void CSuplPsyPositioner::CancelNotifyPositionUpdate ()
       
   184     {
       
   185     TRACESTRING( "CSuplPsyPositioner::CancelNotifyPositionUpdate start" )
       
   186     if ( iRequestStatus != NULL )
       
   187         {
       
   188         iRequestManager->CancelNotifyPositionUpdate( *this );
       
   189         User::RequestComplete( iRequestStatus, KErrCancel );
       
   190         }
       
   191     TRACESTRING( "CSuplPsyPositioner::CancelNotifyPositionUpdate end" )
       
   192     }
       
   193 
       
   194 
       
   195 // -----------------------------------------------------------------------------
       
   196 // CSuplPsyPositioner::RequestComplete
       
   197 // -----------------------------------------------------------------------------
       
   198 //
       
   199 TBool CSuplPsyPositioner::RequestComplete( 
       
   200             TInt aErr,
       
   201             const HPositionGenericInfo& aPosInfo )
       
   202     {
       
   203     TInt err = aErr;
       
   204     if ( err == KErrNone )
       
   205         {
       
   206         //Fill position info
       
   207         err = FillPositionInfoData( aPosInfo, *iPositionInfo );
       
   208         }
       
   209 
       
   210     //Complete the request with err code
       
   211     User::RequestComplete( iRequestStatus, err );
       
   212     return ETrue;
       
   213     }
       
   214 
       
   215 // -----------------------------------------------------------------------------
       
   216 // CSuplPsyPositioner::ClearPositionInfoData
       
   217 // -----------------------------------------------------------------------------
       
   218 //
       
   219 TInt CSuplPsyPositioner::ClearPositionInfoData( 
       
   220             TPositionInfoBase& aPosInfo )
       
   221     {
       
   222     TInt err( KErrNone );
       
   223     TInt classType = aPosInfo.PositionClassType();
       
   224     if ( classType & EPositionSatelliteInfoClass )
       
   225         {
       
   226         err = KErrNotSupported;
       
   227         }
       
   228     else if ( classType & EPositionCourseInfoClass )
       
   229         {
       
   230         err = KErrNotSupported;
       
   231         }
       
   232     else if ( classType & EPositionGenericInfoClass )
       
   233         {
       
   234         // HPositionGenericInfo
       
   235         HPositionGenericInfo* genInfo =
       
   236             static_cast < HPositionGenericInfo*> ( &aPosInfo );
       
   237         
       
   238         genInfo->ClearPositionData();
       
   239         }
       
   240     else if ( classType & EPositionInfoClass )
       
   241         {
       
   242         // TPositionInfo
       
   243         ( void ) new ( &aPosInfo ) ( TPositionInfo );
       
   244         }
       
   245     else
       
   246         {
       
   247         // Unknown type, this should never happen
       
   248         // -->Panic if we get here
       
   249         Panic( EPanicUnknownPositioningClass );
       
   250         }
       
   251 
       
   252     aPosInfo.SetModuleId( ImplementationUid() );
       
   253     return err;
       
   254     }
       
   255 
       
   256 // -----------------------------------------------------------------------------
       
   257 // CSuplPsyPositioner::FillPositionInfoData
       
   258 // -----------------------------------------------------------------------------
       
   259 //
       
   260 TInt CSuplPsyPositioner::FillPositionInfoData( 
       
   261             const HPositionGenericInfo& aSrcPosInfo,
       
   262             TPositionInfoBase& aDesPosInfo )
       
   263     {
       
   264     
       
   265     TInt err( KErrNone );
       
   266     TInt classType = aDesPosInfo.PositionClassType();
       
   267     if ( classType & EPositionSatelliteInfoClass )
       
   268         {
       
   269         err = KErrNotSupported;
       
   270         }
       
   271     else if ( classType & EPositionCourseInfoClass )
       
   272         {
       
   273         err = KErrNotSupported;
       
   274         }
       
   275     else if ( classType & EPositionGenericInfoClass )
       
   276         {
       
   277         // HPositionGenericInfo
       
   278         HPositionGenericInfo* genInfo =
       
   279             static_cast < HPositionGenericInfo*> ( &aDesPosInfo );
       
   280         
       
   281         if (iAllowedAccr > 0)
       
   282             {                
       
   283             
       
   284             TPosition position;
       
   285             aSrcPosInfo.GetPosition( position );
       
   286             TReal32 hAcc = position.HorizontalAccuracy();
       
   287             TInt acc = 	hAcc;
       
   288             TRACESTRING2( "EPositionGenericInfoClass : Received Accurracy...:%d",acc )
       
   289             
       
   290 	            if (hAcc > 0 && hAcc > iAllowedAccr)
       
   291 	            {
       
   292 	            		TRACESTRING( "Returning Error...")
       
   293 	                return KErrGeneral;
       
   294 	            }    
       
   295             }
       
   296         err = SuplPsyGenericInfoUser::CopyHGenericInfo( aSrcPosInfo, *genInfo );
       
   297         }
       
   298     else if ( classType & EPositionInfoClass )
       
   299         {
       
   300         // TPositionInfo
       
   301         TPosition position;
       
   302         aSrcPosInfo.GetPosition( position );
       
   303 
       
   304         if (iAllowedAccr > 0)
       
   305             {                
       
   306             TReal32 hAcc = position.HorizontalAccuracy();
       
   307             TInt acc = 	hAcc;
       
   308             TRACESTRING2( "EPositionInfoClass : Received Accurracy...:%d",acc )
       
   309             
       
   310 	            if (hAcc > 0 && hAcc > iAllowedAccr)
       
   311 	            {
       
   312 	            		TRACESTRING( "Returning Error...")
       
   313 	                return KErrGeneral;
       
   314 	            }    
       
   315 
       
   316             }
       
   317 
       
   318         ( reinterpret_cast < TPositionInfo&>( aDesPosInfo ) ).SetPosition( position );
       
   319         }
       
   320     else
       
   321         {
       
   322         // Unknown type, this should never happen
       
   323         // -->Panic if we get here
       
   324         Panic( EPanicUnknownPositioningClass );
       
   325         }
       
   326 
       
   327     return err;
       
   328     }
       
   329 
       
   330 
       
   331 //  End of File