supl/supltiapiimplementation/src/lbssupltiapirequestor.cpp
changeset 0 667063e416a2
equal deleted inserted replaced
-1:000000000000 0:667063e416a2
       
     1 /*
       
     2 * Copyright (c) 2005 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:  CActive derived class for making asynchronous request to TI API
       
    15 *
       
    16 */
       
    17 
       
    18 #include <lbs/supltiapi.h>
       
    19 #include <lbscommon.h> // for TPositionModuleInfo
       
    20 
       
    21 #include "lbssupltiapirequestor.h"
       
    22 #include "epos_suplterminalconstants.h"
       
    23 #include "epos_tiapiimpltrace.h"
       
    24 
       
    25 
       
    26 const TInt KSetBasedBits = 5; // Assisted|Network|Terminal = 101
       
    27 const TInt KSetAssistedBits = 6;//Assisted|Network|Terminal = 110
       
    28 const TInt KNetworkBits = 2;//Assisted|Network|Terminal = 010
       
    29 
       
    30 _LIT(KTraceFileName,"lbssupltiapirequestor.cpp");
       
    31 
       
    32 // -----------------------------------------------------------------------------
       
    33 // CCLbsSuplTiApiRequestor::CCLbsSuplTiApiRequestor
       
    34 // Other items were commented in a header
       
    35 // -----------------------------------------------------------------------------
       
    36 //
       
    37 CCLbsSuplTiApiRequestor::CCLbsSuplTiApiRequestor(MLbsSuplTiObserver& aObserver,RSuplTerminalServer& aServer) :CActive(EPriorityStandard), // Standard priority
       
    38     iServer(aServer),iObserver(aObserver)
       
    39     {    
       
    40     }
       
    41 
       
    42 // -----------------------------------------------------------------------------
       
    43 //  CCLbsSuplTiApiRequestor::NewLC
       
    44 // Other items were commented in a header
       
    45 // -----------------------------------------------------------------------------
       
    46 //
       
    47 CCLbsSuplTiApiRequestor* CCLbsSuplTiApiRequestor::NewLC(MLbsSuplTiObserver& aObserver,RSuplTerminalServer& aServer)
       
    48     {
       
    49     CCLbsSuplTiApiRequestor* self = new (ELeave) CCLbsSuplTiApiRequestor(aObserver,aServer);
       
    50     CleanupStack::PushL(self);
       
    51     self->ConstructL();
       
    52     return self;
       
    53     }
       
    54 
       
    55 // -----------------------------------------------------------------------------
       
    56 // CCLbsSuplTiApiRequestor::NewL
       
    57 // Other items were commented in a header
       
    58 // -----------------------------------------------------------------------------
       
    59 //
       
    60 CCLbsSuplTiApiRequestor* CCLbsSuplTiApiRequestor::NewL(MLbsSuplTiObserver& aObserver,RSuplTerminalServer& aServer)
       
    61     {
       
    62     CCLbsSuplTiApiRequestor* self = CCLbsSuplTiApiRequestor::NewLC(aObserver,aServer);
       
    63     CleanupStack::Pop(); // self;
       
    64     return self;
       
    65     }
       
    66 // -----------------------------------------------------------------------------
       
    67 // CCLbsSuplTiApiRequestor::ConstructL
       
    68 // Other items were commented in a header
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 void CCLbsSuplTiApiRequestor::ConstructL()
       
    72     {
       
    73     CActiveScheduler::Add(this); // Add to scheduler    
       
    74     iTrace = COMASuplTrace::NewL(); 
       
    75     iTrace->Trace(_L("CLbsSuplTiApiImplementation::ConstructL()"), KTraceFileName, __LINE__); 
       
    76     }
       
    77 // -----------------------------------------------------------------------------
       
    78 // CCLbsSuplTiApiRequestor::~CCLbsSuplTiApiRequestor
       
    79 // Other items were commented in a header
       
    80 // -----------------------------------------------------------------------------
       
    81 //
       
    82 CCLbsSuplTiApiRequestor::~CCLbsSuplTiApiRequestor()
       
    83     {
       
    84     Cancel(); // Cancel any request, if outstanding
       
    85     if(iSubSession.SubSessionHandle() != NULL)
       
    86         iSubSession.Close(); // Close sub-session
       
    87     if(iTrace)
       
    88         {
       
    89         iTrace->Trace(_L("CCLbsSuplTiApiRequestor::~CCLbsSuplTiApiRequestor..."), KTraceFileName, __LINE__); 
       
    90         delete iTrace;
       
    91         iTrace = NULL;
       
    92         }
       
    93     }
       
    94 // -----------------------------------------------------------------------------
       
    95 // CCLbsSuplTiApiRequestor::DoCancel
       
    96 // Other items were commented in a header
       
    97 // -----------------------------------------------------------------------------
       
    98 //
       
    99 void CCLbsSuplTiApiRequestor::DoCancel()
       
   100     {
       
   101     iTrace->Trace(_L("CLbsSuplTiApiImplementation::DoCancel()"), KTraceFileName, __LINE__);
       
   102     if(iSubSession.SubSessionHandle() != NULL)
       
   103         {
       
   104         iTrace->Trace(_L("CLbsSuplTiApiImplementation::subsession handle not NULL calling cancel runsession)"), KTraceFileName, __LINE__);
       
   105         iSubSession.CancelRunSession();
       
   106         iObserver.RequestComplete(KErrCancel,iNetSessionId);
       
   107         }
       
   108     }
       
   109 // -----------------------------------------------------------------------------
       
   110 // CCLbsSuplTiApiRequestor::RequestLocation
       
   111 // Other items were commented in a header
       
   112 // -----------------------------------------------------------------------------
       
   113 //
       
   114 void CCLbsSuplTiApiRequestor::RequestLocation(const TLbsNetSessionId& aSessionId, const TLbsNetPosRequestOptionsBase& aOptions, const TLbsNetPosRequestMethod& aMethod)
       
   115     {
       
   116     iTrace->Trace(_L("CCLbsSuplTiApiRequestor::RequestLocation()"), KTraceFileName, __LINE__);
       
   117     Cancel(); // Cancel any request, just to be sure
       
   118     iState = EUninitialized;
       
   119     iNetSessionId = aSessionId;
       
   120     if(iSubSession.SubSessionHandle() == NULL)
       
   121         {
       
   122         TInt error = iSubSession.Open( iServer );
       
   123         
       
   124         //If can't open session signal error to client
       
   125         if ( error != KErrNone )
       
   126             {
       
   127             iStatus = KRequestPending;
       
   128             iTrace->Trace(_L("Subsession handle open failed"), KTraceFileName, __LINE__);
       
   129             SetActive();
       
   130             TRequestStatus* status = &iStatus;
       
   131             User::RequestComplete( status, error );
       
   132             return;
       
   133             }
       
   134         iTrace->Trace(_L("Subsession handle open succeeded"), KTraceFileName, __LINE__);
       
   135         }
       
   136     
       
   137     TInt setCaps = ProcessPosMethods(aMethod);
       
   138     if ( setCaps < 0 )
       
   139         {
       
   140         iStatus = KRequestPending;
       
   141         iTrace->Trace(_L("process pos methods failed"), KTraceFileName, __LINE__);
       
   142         SetActive();
       
   143         TRequestStatus* status = &iStatus;
       
   144         User::RequestComplete( status, KErrArgument );
       
   145         return;
       
   146         }
       
   147     else
       
   148     	{
       
   149     	TBuf<32> setcapsbuf;
       
   150     	setcapsbuf.Copy(_L("Final Set Caps = "));
       
   151     	setcapsbuf.AppendNum(setCaps);
       
   152     	iTrace->Trace(setcapsbuf,KTraceFileName,__LINE__);
       
   153     	}
       
   154     //convert TLbsNetPosRequestOptions to TSuplTerminalQop
       
   155     TLbsNetPosRequestQuality quality;
       
   156 
       
   157     TLbsNetPosRequestOptionsBase& optionsbase = const_cast<TLbsNetPosRequestOptionsBase&>(aOptions);
       
   158 
       
   159     TLbsNetPosRequestOptions& options = static_cast<TLbsNetPosRequestOptions&>(optionsbase);
       
   160 
       
   161     options.GetRequestQuality(quality);
       
   162 
       
   163      if(quality.MinHorizontalAccuracy() != 0)//mandatory value has been set, so use RunSession with Qop
       
   164         {
       
   165         TSuplTerminalQop qop;
       
   166         qop.SetHorizontalAccuracy(quality.MinHorizontalAccuracy());
       
   167         
       
   168         if(quality.MinVerticalAccuracy() != 0)
       
   169             qop.SetVerticalAccuracy(quality.MinVerticalAccuracy());
       
   170         
       
   171         TInt maxAge = quality.MaxFixAge().Int64()/1000000;
       
   172         if(maxAge != 0)
       
   173             qop.SetMaxLocationAge(maxAge);
       
   174         
       
   175         TInt delay = quality.MaxFixTime().Int64()/1000000;
       
   176         if(delay != 0)
       
   177             qop.SetDelay(delay);
       
   178         
       
   179         iTrace->Trace(_L("CCLbsSuplTiApiRequestor:Calling RunSession-with qop "), KTraceFileName, __LINE__);
       
   180          //use terminal initiation library to make request
       
   181          iSubSession.RunSession(iStatus,qop,setCaps,iNetSessionId.SessionNum(),options.NewClientConnected());
       
   182          SetActive(); // Tell scheduler a request is active
       
   183         }
       
   184     else // no qop available so call run session without qop
       
   185         {
       
   186         iTrace->Trace(_L("CCLbsSuplTiApiRequestor:Calling Run Session-no qop "), KTraceFileName, __LINE__);
       
   187         //use terminal initiation library to make request
       
   188         iSubSession.RunSession(iStatus,setCaps,iNetSessionId.SessionNum(),options.NewClientConnected());
       
   189         SetActive(); // Tell scheduler a request is active
       
   190         }
       
   191 
       
   192     }
       
   193 // -----------------------------------------------------------------------------
       
   194 // CCLbsSuplTiApiRequestor::RunL
       
   195 // Other items were commented in a header
       
   196 // -----------------------------------------------------------------------------
       
   197 //
       
   198 void CCLbsSuplTiApiRequestor::RunL()
       
   199     {
       
   200     if (iState == EUninitialized)
       
   201         {
       
   202         iState = EInitialized;
       
   203         iTrace->Trace(_L("CCLbsSuplTiApiRequestor :Run Session completed"), KTraceFileName, __LINE__);
       
   204         iObserver.RequestComplete(iStatus.Int(),iNetSessionId);
       
   205         }
       
   206     }
       
   207 // -----------------------------------------------------------------------------
       
   208 // CCLbsSuplTiApiRequestor::RunError
       
   209 // Other items were commented in a header
       
   210 // -----------------------------------------------------------------------------
       
   211 //
       
   212 TInt CCLbsSuplTiApiRequestor::RunError(TInt aError)
       
   213     {
       
   214     iTrace->Trace(_L("CCLbsSuplTiApiRequestor :RunError called"), KTraceFileName, __LINE__);
       
   215     iObserver.RequestComplete(aError,iNetSessionId);
       
   216     return aError;
       
   217     }
       
   218 // -----------------------------------------------------------------------------
       
   219 // CCLbsSuplTiApiRequestor::GetPosition
       
   220 // Other items were commented in a header
       
   221 // -----------------------------------------------------------------------------
       
   222 //
       
   223 TInt CCLbsSuplTiApiRequestor::GetPosition(TPositionInfoBase& aPositionInfo)
       
   224     {
       
   225     // if run session was called before calling GetPosition and completed successfully
       
   226     if(iState == EInitialized && iStatus.Int() == KErrNone) 
       
   227         {
       
   228         //Runsession has completed, so call get position and return the position
       
   229         iTrace->Trace(_L("CCLbsSuplTiApiRequestor :Calling get position"), KTraceFileName, __LINE__);
       
   230         return iSubSession.GetPosition(aPositionInfo);
       
   231         }
       
   232     else
       
   233         {
       
   234         iTrace->Trace(_L("CCLbsSuplTiApiRequestor::GetPosition returning -1"), KTraceFileName, __LINE__);
       
   235         return KErrNotFound; //Check this error code
       
   236         }
       
   237     }
       
   238 // -----------------------------------------------------------------------------
       
   239 // CCLbsSuplTiApiRequestor::GetSessionId
       
   240 // Other items were commented in a header
       
   241 // -----------------------------------------------------------------------------
       
   242 //
       
   243 TLbsNetSessionId CCLbsSuplTiApiRequestor::GetSessionId()
       
   244     {
       
   245     return iNetSessionId;
       
   246     }
       
   247 // -----------------------------------------------------------------------------
       
   248 // CCLbsSuplTiApiRequestor::ProcessPosMethods
       
   249 // Other items were commented in a header
       
   250 // -----------------------------------------------------------------------------
       
   251 //
       
   252 TInt CCLbsSuplTiApiRequestor::ProcessPosMethods( const TLbsNetPosRequestMethod& aMethod)
       
   253     {
       
   254     TInt setcaps = 0;
       
   255     
       
   256     TInt numOfPosMethods = aMethod.NumPosMethods();
       
   257     if(numOfPosMethods == 0)
       
   258         {
       
   259         iTrace->Trace(_L("CCLbsSuplTiApiRequestor::ProcessPosMethods pos methods zero"), KTraceFileName, __LINE__);
       
   260         return KErrArgument;
       
   261         }
       
   262     TInt methods = 0;
       
   263     for(TInt methodIter = 0; methodIter < numOfPosMethods; methodIter++)
       
   264         {
       
   265         TLbsNetPosMethod posMethod;
       
   266         aMethod.GetPosMethod(methodIter,posMethod);
       
   267         methods |= posMethod.PosMode();
       
   268         }
       
   269     if(methods == KSetBasedBits)
       
   270         {
       
   271         iTrace->Trace(_L("CCLbsSuplTiApiRequestor::ProcessPosMethods Recieved SET Based"), KTraceFileName, __LINE__);
       
   272         setcaps |= KGpsSETBased;
       
   273         }
       
   274     else if(methods == KSetAssistedBits)
       
   275         {
       
   276         iTrace->Trace(_L("CCLbsSuplTiApiRequestor::ProcessPosMethods Recieved SET Assisted"), KTraceFileName, __LINE__);
       
   277         setcaps |= KGpsSETAssisted;
       
   278         }
       
   279     else if(methods == KNetworkBits)
       
   280         {
       
   281         iTrace->Trace(_L("CCLbsSuplTiApiRequestor::ProcessPosMethods Recieved only Network"), KTraceFileName, __LINE__);
       
   282         setcaps |= KAutonomousGps|KAFLT |KECID|KEOTD|KOTDOA;
       
   283         }
       
   284     else
       
   285         {
       
   286         iTrace->Trace(_L("CCLbsSuplTiApiRequestor::ProcessPosMethods enabling all"), KTraceFileName, __LINE__);
       
   287         setcaps |= KGpsSETAssisted | KGpsSETBased | KAutonomousGps|KAFLT |  
       
   288                        KECID|KEOTD|KOTDOA;
       
   289         }
       
   290     return setcaps;
       
   291     }