genericpositioningplugins/locationsuplpsy/src/suplpsypositioner.cpp
changeset 0 667063e416a2
equal deleted inserted replaced
-1:000000000000 0:667063e416a2
       
     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 <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     delete repository;
       
    99     repository = NULL;
       
   100     TRACESTRING( "CSuplPsyPositioner::ConstructL end" )
       
   101     }
       
   102 
       
   103 
       
   104 // -----------------------------------------------------------------------------
       
   105 // CSuplPsyPositioner::NewL
       
   106 // Two - phased constructor.
       
   107 // -----------------------------------------------------------------------------
       
   108 //
       
   109 CSuplPsyPositioner* CSuplPsyPositioner::NewL( TAny* aConstructionParameters )
       
   110     {
       
   111     CSuplPsyPositioner* self = new( ELeave ) CSuplPsyPositioner;
       
   112     
       
   113     CleanupStack::PushL( self );
       
   114     self->ConstructL( aConstructionParameters );
       
   115     CleanupStack::Pop( self );
       
   116 
       
   117     return self;
       
   118     }
       
   119 
       
   120     
       
   121 // -----------------------------------------------------------------------------
       
   122 // CSuplPsyPositioner::~CSuplPsyPositioner
       
   123 // Destructor
       
   124 // -----------------------------------------------------------------------------
       
   125 //
       
   126 CSuplPsyPositioner::~CSuplPsyPositioner()
       
   127     {
       
   128     // Unregister to request manager
       
   129     if ( iRequestManager != NULL )
       
   130         {
       
   131         iRequestManager->Unregister( *this );
       
   132         }
       
   133     TRACESTRING( "CSuplPsyPositioner:: destructed" )
       
   134     }
       
   135 
       
   136 
       
   137 // -----------------------------------------------------------------------------
       
   138 // CSuplPsyPositioner::NotifyPositionUpdate
       
   139 // 
       
   140 // -----------------------------------------------------------------------------
       
   141 //
       
   142 void CSuplPsyPositioner::NotifyPositionUpdate ( 
       
   143     TPositionInfoBase& aPosInfo,  
       
   144     TRequestStatus&    aStatus )
       
   145     {
       
   146     TRACESTRING( "CSuplPsyPositioner::NotifyPositionUpdate start" )
       
   147 
       
   148     //Supl psy will not handle simultaneous location request
       
   149     if ( iRequestStatus != NULL )
       
   150         {
       
   151         Panic( EPanicPositionRequestOngoing );
       
   152         }
       
   153     
       
   154     aStatus = KRequestPending;    
       
   155         
       
   156     //Clear position info data
       
   157     if ( ClearPositionInfoData( aPosInfo ) != KErrNone )
       
   158         {
       
   159         TRequestStatus* status = &aStatus;
       
   160         User::RequestComplete( status, KErrArgument );
       
   161         }
       
   162     
       
   163     //Check maxAge
       
   164     TPosition lastPos;
       
   165     TTime maxAge;
       
   166     GetMaxAge( maxAge );
       
   167     iRequestManager->RecieveMaxAge( maxAge );
       
   168        
       
   169     //Issue location request to request manager
       
   170     iRequestManager->NotifyPositionUpdate( *this );
       
   171     iRequestStatus = &aStatus;
       
   172     iPositionInfo = &aPosInfo;
       
   173     TRACESTRING( "CSuplPsyPositioner::NotifyPositionUpdate end" )
       
   174     }
       
   175 
       
   176 
       
   177 // -----------------------------------------------------------------------------
       
   178 // CSuplPsyPositioner::CancelNotifyPositionUpdate
       
   179 // 
       
   180 // -----------------------------------------------------------------------------
       
   181 //
       
   182 void CSuplPsyPositioner::CancelNotifyPositionUpdate ()
       
   183     {
       
   184     TRACESTRING( "CSuplPsyPositioner::CancelNotifyPositionUpdate start" )
       
   185     if ( iRequestStatus != NULL )
       
   186         {
       
   187         iRequestManager->CancelNotifyPositionUpdate( *this );
       
   188         User::RequestComplete( iRequestStatus, KErrCancel );
       
   189         }
       
   190     TRACESTRING( "CSuplPsyPositioner::CancelNotifyPositionUpdate end" )
       
   191     }
       
   192 
       
   193 
       
   194 // -----------------------------------------------------------------------------
       
   195 // CSuplPsyPositioner::RequestComplete
       
   196 // -----------------------------------------------------------------------------
       
   197 //
       
   198 TBool CSuplPsyPositioner::RequestComplete( 
       
   199             TInt aErr,
       
   200             const HPositionGenericInfo& aPosInfo )
       
   201     {
       
   202     TInt err = aErr;
       
   203     if ( err == KErrNone )
       
   204         {
       
   205         //Fill position info
       
   206         err = FillPositionInfoData( aPosInfo, *iPositionInfo );
       
   207         }
       
   208 
       
   209     //Complete the request with err code
       
   210     User::RequestComplete( iRequestStatus, err );
       
   211     return ETrue;
       
   212     }
       
   213 
       
   214 // -----------------------------------------------------------------------------
       
   215 // CSuplPsyPositioner::ClearPositionInfoData
       
   216 // -----------------------------------------------------------------------------
       
   217 //
       
   218 TInt CSuplPsyPositioner::ClearPositionInfoData( 
       
   219             TPositionInfoBase& aPosInfo )
       
   220     {
       
   221     TInt err( KErrNone );
       
   222     TInt classType = aPosInfo.PositionClassType();
       
   223     if ( classType & EPositionSatelliteInfoClass )
       
   224         {
       
   225         err = KErrNotSupported;
       
   226         }
       
   227     else if ( classType & EPositionCourseInfoClass )
       
   228         {
       
   229         err = KErrNotSupported;
       
   230         }
       
   231     else if ( classType & EPositionGenericInfoClass )
       
   232         {
       
   233         // HPositionGenericInfo
       
   234         HPositionGenericInfo* genInfo =
       
   235             static_cast < HPositionGenericInfo*> ( &aPosInfo );
       
   236         
       
   237         genInfo->ClearPositionData();
       
   238         }
       
   239     else if ( classType & EPositionInfoClass )
       
   240         {
       
   241         // TPositionInfo
       
   242         ( void ) new ( &aPosInfo ) ( TPositionInfo );
       
   243         }
       
   244     else
       
   245         {
       
   246         // Unknown type, this should never happen
       
   247         // -->Panic if we get here
       
   248         Panic( EPanicUnknownPositioningClass );
       
   249         }
       
   250 
       
   251     aPosInfo.SetModuleId( ImplementationUid() );
       
   252     return err;
       
   253     }
       
   254 
       
   255 // -----------------------------------------------------------------------------
       
   256 // CSuplPsyPositioner::FillPositionInfoData
       
   257 // -----------------------------------------------------------------------------
       
   258 //
       
   259 TInt CSuplPsyPositioner::FillPositionInfoData( 
       
   260             const HPositionGenericInfo& aSrcPosInfo,
       
   261             TPositionInfoBase& aDesPosInfo )
       
   262     {
       
   263     
       
   264     TInt err( KErrNone );
       
   265     TInt classType = aDesPosInfo.PositionClassType();
       
   266     if ( classType & EPositionSatelliteInfoClass )
       
   267         {
       
   268         err = KErrNotSupported;
       
   269         }
       
   270     else if ( classType & EPositionCourseInfoClass )
       
   271         {
       
   272         err = KErrNotSupported;
       
   273         }
       
   274     else if ( classType & EPositionGenericInfoClass )
       
   275         {
       
   276         // HPositionGenericInfo
       
   277         HPositionGenericInfo* genInfo =
       
   278             static_cast < HPositionGenericInfo*> ( &aDesPosInfo );
       
   279         
       
   280         if (iAllowedAccr > 0)
       
   281             {                
       
   282             TPosition position;
       
   283             aSrcPosInfo.GetPosition( position );
       
   284             TReal32 hAcc = position.HorizontalAccuracy();
       
   285             if (hAcc > 0 && hAcc > iAllowedAccr)
       
   286                 return KErrGeneral;
       
   287             }
       
   288         err = SuplPsyGenericInfoUser::CopyHGenericInfo( aSrcPosInfo, *genInfo );
       
   289         }
       
   290     else if ( classType & EPositionInfoClass )
       
   291         {
       
   292         // TPositionInfo
       
   293         TPosition position;
       
   294         aSrcPosInfo.GetPosition( position );
       
   295 
       
   296         if (iAllowedAccr > 0)
       
   297             {                
       
   298             TReal32 hAcc = position.HorizontalAccuracy();
       
   299             if (hAcc > 0 && hAcc > iAllowedAccr)
       
   300                 return KErrGeneral;
       
   301             }
       
   302 
       
   303         ( reinterpret_cast < TPositionInfo&>( aDesPosInfo ) ).SetPosition( position );
       
   304         }
       
   305     else
       
   306         {
       
   307         // Unknown type, this should never happen
       
   308         // -->Panic if we get here
       
   309         Panic( EPanicUnknownPositioningClass );
       
   310         }
       
   311 
       
   312     return err;
       
   313     }
       
   314 
       
   315 
       
   316 //  End of File