diff -r 000000000000 -r 667063e416a2 supl/locationsuplfw/terminalinitiationapi/src/epos_suplterminalapi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/supl/locationsuplfw/terminalinitiationapi/src/epos_suplterminalapi.cpp Tue Feb 02 01:06:48 2010 +0200 @@ -0,0 +1,1233 @@ +/* +* Copyright (c) 2002-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: Client-Server communication +* +*/ + +#include +#include +#include + +#include +#include +#include + +#include "epos_suplterminalipc.h" +#include "epos_suplterminalerrors.h" +#include "epos_startsuplserver.h" +#include "epos_suplterminalptrholder.h" +#include "epos_suplterminalqop.h" +#include "epos_suplparameters.h" + +#include "epos_csuplsettings.h" +#include "epos_csuplsettingparams.h" + +const TUint KFirstReq = 0x1000; +const TInt KMaxBufLength = 255; + +//----------------------------------------------------------------------------- +// RSuplTerminalServer +//----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// RSuplTerminalServer::RSuplTerminalServer() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RSuplTerminalServer::RSuplTerminalServer() + : RSessionBase(), + iReserved(NULL) + { + } + +// ----------------------------------------------------------------------------- +// RSuplTerminalServer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void RSuplTerminalServer::ConstructL() + { + } + +// --------------------------------------------------------- +// RSuplTerminalServer::Destruct +// +// Destruction method for RSuplTerminalServer. +// --------------------------------------------------------- +// +void RSuplTerminalServer::Destruct() + { + } + +// --------------------------------------------------------- +// RSuplTerminalServer::Connect +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalServer::Connect() + { + __ASSERT_ALWAYS(Handle() == 0, + User::Panic(KSuplClientFault, ESuplServerHandleNotClosed)); + + TRAPD(ret, ConstructL()); + + if (ret == KErrNone) + { + //TInt retry = 200; + TInt retry = 3; + for (;;) // FOREVER + { + ret = CreateSession(KSuplServerName, Version(), KDefaultMessageSlots); + + if (ret != KErrNotFound && ret != KErrServerTerminated) + { + break; + } + + if (--retry == 0) + { + break; + } + + ret = StartServer(); + + if (ret != KErrAlreadyExists && ret != KErrNone) + { + break; + } + } + } + + if (ret != KErrNone) + { + Destruct(); + } + + return ret; + } + +// --------------------------------------------------------- +// RSuplTerminalServer::Close +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalServer::Close() + { + RSessionBase::Close(); + Destruct(); + } + +// --------------------------------------------------------- +// RSuplTerminalServer::Version +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TVersion RSuplTerminalServer::Version() const + { + return TVersion( + KSuplMajorVersionNumber, + KSuplMinorVersionNumber, + KSuplBuildVersionNumber); + } +// --------------------------------------------------------- +// RSuplTerminalServer::Connect +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalServer::Connect(TRequestStatus& aStatus) + { + __ASSERT_ALWAYS(Handle() == 0, User::Panic(KSuplClientFault, ESuplServerHandleNotClosed)); + TRAPD(ret, ConstructL()); + + if (ret == KErrNone) + { + TInt retry = 200; + for (;;) // FOREVER + { + ret = CreateSession(KSuplServerName, Version(), KDefaultMessageSlots, EIpcSession_Unsharable, (TSecurityPolicy*)0, &aStatus); + + if (ret != KErrNotFound && ret != KErrServerTerminated) + { + break; + } + + if (--retry == 0) + { + break; + } + + ret = StartServer(); + + if (ret != KErrAlreadyExists && ret != KErrNone) + { + break; + } + } + } + + if (ret != KErrNone) + { + Destruct(); + } + + return ret; + } +//----------------------------------------------------------------------------- +// RSuplTerminalSubSession +//----------------------------------------------------------------------------- + +// --------------------------------------------------------- +// RSuplTerminalSubSession::RSuplTerminalSubSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C RSuplTerminalSubSession::RSuplTerminalSubSession() + : RSubSessionBase(), + iPtrHolder(NULL), + iReserved(NULL), + isTriggeringUsed(EFalse), + iNotifyRequestCtr(0) + { + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::ConstructL +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::ConstructL() + { + __ASSERT_ALWAYS(iPtrHolder == NULL, + User::Panic(KSuplClientFault, ESuplServerHandleNotClosed)); + + iPtrHolder = CSuplSubSessnPtrHolder::NewL(1, 1); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::Destruct +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::Destruct() + { + delete iPtrHolder; + iPtrHolder = NULL; + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::Open +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalSubSession::Open( + RSuplTerminalServer& aSuplServer, + TSuplServiceType aSuplService) + { + __ASSERT_ALWAYS(aSuplServer.Handle() != 0, + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + iSuplService = aSuplService; + + TInt suplVersion; + + switch( aSuplService ) + { + case ESUPL_1_0: + { + suplVersion = 1; + break; + } + case ESUPL_2_0: + { + suplVersion = 2; + break; + } + default: + { + suplVersion = 1; + break; + } + } + + TIpcArgs args; + args.Set(0, suplVersion); + + TRAPD(ret, ConstructL()); + if (ret == KErrNone) + { + ret = CreateSubSession(aSuplServer, ESuplTerminalSubssnOpen, args); + } + if (ret != KErrNone) + { + Destruct(); + } + + return ret; + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::RunSession( + TRequestStatus& aStatus, + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aSETCaps < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + args.Set(0, setCaps); + args.Set(1, aRequestId); + + SendReceive(ESuplTerminalSubssnAsyncRunsession, args, aStatus); + } + +//---------------TDESC METHODS START HERE--------------------------------------- +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::RunSession( + TRequestStatus& aStatus, + TSuplTerminalQop& aQop, + const TDesC& aHslpAddress, + TBool aFallBack, + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aSETCaps < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aHslpAddress.Length() < 0 || aHslpAddress.Length() > KMaxHslpAddressLength ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + //Check if the passed HSLPAddress exists or not! + TInt serverExists = CheckIfSlpExists(aHslpAddress); + if(serverExists != KErrNone) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,serverExists); + return; + } + + TReal32 aHorAcc,aVerAcc; + TInt aDelay,aMaxAge; + if((aQop.GetHorizontalAccuracy(aHorAcc)==KErrNotFound)&& + (aQop.GetVerticalAccuracy(aVerAcc)==KErrNotFound)&& + (aQop.GetDelay(aDelay)==KErrNotFound)&& + (aQop.GetMaxLocationAge(aMaxAge)==KErrNotFound)) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + iSuplParameters.qop = aQop; + iSuplParameters.HslpAddress = aHslpAddress; + iSuplParameters.FallBack = aFallBack; + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&iSuplParameters), + sizeof(iSuplParameters),sizeof(iSuplParameters)); + + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + + args.Set(0, setCaps); + args.Set(1,aRequestId); + args.Set(2,&iPtrHolder->Ptr(0)); + + SendReceive(ESuplTerminalSubssnASyncRunsessionWithServernameQop, args, aStatus); + } + +//-------------------2ND METHOD(SYNCHRONOUS)-------------------------- +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalSubSession::RunSession( + TSuplTerminalQop& aQop, + const TDesC& aHslpAddress, + TBool aFallBack, + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + return KErrArgument; + } + + if(aSETCaps < 0 ) + { + return KErrArgument; + } + + if(aHslpAddress.Length() < 0 || aHslpAddress.Length() > KMaxHslpAddressLength ) + { + return KErrArgument; + } + + //Check if the passed HSLPAddress exists or not! + TInt serverExists = CheckIfSlpExists(aHslpAddress); + if(serverExists != KErrNone) + { + return serverExists; + } + + TReal32 aHorAcc,aVerAcc; + TInt aDelay,aMaxAge; + if((aQop.GetHorizontalAccuracy(aHorAcc)==KErrNotFound) + &&(aQop.GetVerticalAccuracy(aVerAcc)==KErrNotFound) + &&(aQop.GetDelay(aDelay)==KErrNotFound) + &&(aQop.GetMaxLocationAge(aMaxAge)==KErrNotFound)) + { + return KErrArgument; + } + + iSuplParameters.qop = aQop; + iSuplParameters.HslpAddress = aHslpAddress; + iSuplParameters.FallBack = aFallBack; + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&iSuplParameters), + sizeof(iSuplParameters),sizeof(iSuplParameters)); + + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + + args.Set(0, setCaps); + args.Set(1,aRequestId); + args.Set(2,&iPtrHolder->Ptr(0)); + return SendReceive(ESuplTerminalSubssnSyncRunsessionWithServernameQop, args); + } + +//------------------------------ASYNC WITHOUT QOP-------------------------------------------------------------- +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::RunSession( + TRequestStatus& aStatus, + const TDesC& aHslpAddress, + TBool aFallBack, + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aSETCaps < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aHslpAddress.Length() < 0 || aHslpAddress.Length() > KMaxHslpAddressLength ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + //Check if the passed HSLPAddress exists or not! + TInt serverExists = CheckIfSlpExists(aHslpAddress); + if(serverExists != KErrNone) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,serverExists); + return; + } + + iSuplParameters.HslpAddress = aHslpAddress; + iSuplParameters.FallBack = aFallBack; + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&iSuplParameters), + sizeof(iSuplParameters),sizeof(iSuplParameters)); + + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + + args.Set(0, setCaps); + args.Set(1,aRequestId); + args.Set(2,&iPtrHolder->Ptr(0)); + SendReceive(ESuplTerminalSubssnASyncRunsessionServernameWithoutQop, args, aStatus); + } + +//--------------------------------SYNC WITHOUT QOP-------------------------------------------------------- +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalSubSession::RunSession( + const TDesC& aHslpAddress, + TBool aFallBack, + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + return KErrArgument; + } + + if(aSETCaps < 0 ) + { + return KErrArgument; + } + + if(aHslpAddress.Length() < 0 || aHslpAddress.Length() > KMaxHslpAddressLength ) + { + return KErrArgument; + } + + //Check if the passed HSLPAddress exists or not! + TInt serverExists = CheckIfSlpExists(aHslpAddress); + if(serverExists != KErrNone) + { + return serverExists; + } + + iSuplParameters.HslpAddress = aHslpAddress; + iSuplParameters.FallBack = aFallBack; + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&iSuplParameters), + sizeof(iSuplParameters),sizeof(iSuplParameters)); + + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + + args.Set(0, setCaps); + args.Set(1,aRequestId); + args.Set(2,&iPtrHolder->Ptr(0)); + return SendReceive(ESuplTerminalSubssnSyncRunsessionServernameWithoutQop, args); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::RunSession( + TRequestStatus& aStatus, + TSuplTerminalQop& aQop, + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aSETCaps < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + TReal32 aHorAcc,aVerAcc; + TInt aDelay,aMaxAge; + if((aQop.GetHorizontalAccuracy(aHorAcc)==KErrNotFound) + &&(aQop.GetVerticalAccuracy(aVerAcc)==KErrNotFound) + &&(aQop.GetDelay(aDelay)==KErrNotFound) + &&(aQop.GetMaxLocationAge(aMaxAge)==KErrNotFound)) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + iQoP = aQop; + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&iQoP), + sizeof(iQoP),sizeof(iQoP)); + + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + + args.Set(0, setCaps); + args.Set(1,aRequestId); + args.Set(2,&iPtrHolder->Ptr(0)); + + SendReceive(ESuplTerminalSubssnAsyncRunsessionWithQop, args, aStatus); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalSubSession::RunSession( + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + return KErrArgument; + } + + if(aSETCaps < 0 ) + { + return KErrArgument; + } + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + args.Set(0, setCaps); + args.Set(1, aRequestId); + return SendReceive(ESuplTerminalSubssnSyncRunsession, args); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::RunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalSubSession::RunSession( + TSuplTerminalQop& aQop, + TInt aSETCaps, + TInt aRequestId, + TBool aFirstReq) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if(aRequestId < 0 ) + { + return KErrArgument; + } + + if(aSETCaps < 0 ) + { + return KErrArgument; + } + + TReal32 aHorAcc,aVerAcc; + TInt aDelay,aMaxAge; + if((aQop.GetHorizontalAccuracy(aHorAcc)==KErrNotFound) + &&(aQop.GetVerticalAccuracy(aVerAcc)==KErrNotFound) + &&(aQop.GetDelay(aDelay)==KErrNotFound) + &&(aQop.GetMaxLocationAge(aMaxAge)==KErrNotFound)) + { + return KErrArgument; + } + + iQoP = aQop; + + TInt setCaps; + + if (aFirstReq) + setCaps = aSETCaps | KFirstReq; + else + setCaps = aSETCaps; + + TIpcArgs args; + TPtrC8 ptr( + reinterpret_cast(&iQoP), + sizeof(TSuplTerminalQop)); + + args.Set(0, setCaps); + args.Set(1, aRequestId); + args.Set(2,&ptr); + + return SendReceive(ESuplTerminalSubssnSyncRunsessionWithQop, args); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::GetPosition +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C TInt RSuplTerminalSubSession::GetPosition(TPositionInfoBase& aSuplPosInfo) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if( isTriggeringUsed ) + { + return KErrNotSupported; + } + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&aSuplPosInfo), + aSuplPosInfo.PositionClassSize(), + aSuplPosInfo.PositionClassSize()); + + return SendReceive(ESuplTerminalSubssnGetPosition, TIpcArgs(&iPtrHolder->Ptr(0))); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::GetServerAddress +// +// (other items were commented in a header). +// --------------------------------------------------------- + +EXPORT_C TInt RSuplTerminalSubSession::GetServerAddress(TDes& aHslpAddress) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&aHslpAddress), + aHslpAddress.MaxSize(), + aHslpAddress.MaxSize() + ); + + return SendReceive(ESuplTerminalSubssnGetServerAddress, + TIpcArgs(&iPtrHolder->Ptr(0))); + } + +//------------------------------------------------------------------------------------ + +// --------------------------------------------------------- +// RSuplTerminalSubSession::GetSlpList +// +// (other items were commented in a header). +// --------------------------------------------------------- +EXPORT_C TInt RSuplTerminalSubSession::GetSlpList( + RPointerArray &aParamValues) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + RPointerArray parValues; + + TInt64 slpId; + HBufC* serverAddress = HBufC::New(KMaxBufLength); + HBufC* iapName = HBufC::New(KMaxBufLength); + TBool serverEnabled; + TBool simChangeRemove; + TBool usageInHomeNw; + TBool editable; + + if (!serverAddress || !iapName) + { + return KErrNoMemory; + } + delete iSuplStorageSettings; + iSuplStorageSettings = NULL; + + // create local object iSuplStorageSettings + TRAPD(err,iSuplStorageSettings = CSuplSettings::NewL()); + if(err!=KErrNone) + { + delete serverAddress; + delete iapName; + parValues.Close(); + parValues.ResetAndDestroy(); + return err; + } + + parValues.ResetAndDestroy(); + aParamValues.ResetAndDestroy(); + TInt error = iSuplStorageSettings->GetAllSlp(parValues); //handle return value... + if (error!=KErrNone) + { + delete serverAddress; + delete iapName; + parValues.Close(); + parValues.ResetAndDestroy(); + return error; + } + TInt count = parValues.Count(); + for(TInt i = 0; i < count; i++ ) + { + CSuplTerminalParams *params = NULL; + TRAPD(err,params = CSuplTerminalParams::NewL()); + if(err!=KErrNone) + { + delete serverAddress; + delete iapName; + parValues.Close(); + parValues.ResetAndDestroy(); + return err; + } + parValues[i]->Get( + slpId, + serverAddress->Des(), + iapName->Des(), + serverEnabled, + simChangeRemove, + usageInHomeNw, + editable); + + params->Set( + *serverAddress, + *iapName, + serverEnabled, + simChangeRemove, + usageInHomeNw, + editable, + slpId); + + aParamValues.Append(params); + } + delete serverAddress; + delete iapName; + aParamValues.Close(); + if (iSuplStorageSettings) + { + delete iSuplStorageSettings; + iSuplStorageSettings = NULL; + } + + return KErrNone; + } + +//------------------------------------------------------------------------------------ + + +// --------------------------------------------------------- +// RSuplTerminalSubSession::CheckIfSlpExists +// +// (other items were commented in a header). +// --------------------------------------------------------- + +TInt RSuplTerminalSubSession::CheckIfSlpExists(const TDesC& aHslpAddress) + { + if(iSuplStorageSettings) + { + delete iSuplStorageSettings; + iSuplStorageSettings = NULL; + } + + //Check if the passed HSLPAddress exists or not! + TRAPD(err1,iSuplStorageSettings = CSuplSettings::NewL()); + if(err1!=KErrNone) + { + return err1; + } + CServerParams *paramValues = NULL; + TRAPD(err,paramValues = CServerParams::NewL()); + if(err!=KErrNone) + { + delete iSuplStorageSettings; + iSuplStorageSettings = NULL; + return err; + } + TInt retValue = iSuplStorageSettings->GetSlpInfoAddress(aHslpAddress,paramValues); + + if(retValue == KErrNotFound) + { + delete iSuplStorageSettings; + iSuplStorageSettings = NULL; + delete paramValues; + paramValues = NULL; + return KErrNotFound; + } + delete paramValues; + paramValues = NULL; + + delete iSuplStorageSettings; + iSuplStorageSettings = NULL; + + return KErrNone; + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::CancelRunSession +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::CancelRunSession() + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if( !isTriggeringUsed ) + { + SendReceive(ESuplTerminalSubssnCancelRunsession); + } + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::Close +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::Close() + { + CloseSubSession(ESuplTerminalSubssnClose); + //Destruct(); + } + +// --------------------------------------------------------- +// This method is used to allow polymorphic extensions to the API without breaking +// BC. See documentation for explanation. +// +// @publishedAll +// @param aFunctionNumber contains the Id of the function to be invoked. +// @param aPtr1 a pointer to any data +// @param aPtr2 a pointer to any data. +// --------------------------------------------------------- +// +EXPORT_C TAny* RSuplTerminalSubSession::ExtendedInterface(TInt /* aFunctionNumber */, + TAny* /* aPtr1 */, + TAny* /* aPtr2 */) + { + return NULL; + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::StartSuplTriggerSession +// without supl server address +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::StartSuplTriggerSession( + TRequestStatus& aStatus, + TSuplTerminalPeriodicTrigger& aPeriodicTrigger, + TInt aSETCaps, + TInt aRequestId + ) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if( iSuplService != ESUPL_2_0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrNotSupported); + return; + } + + if(aRequestId < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aSETCaps < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + TUint noOfFixes, interval, startTime; + if( aPeriodicTrigger.Get(noOfFixes,interval,startTime) != KErrNone ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + iPeriodicTrigger = aPeriodicTrigger; + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&iPeriodicTrigger), + sizeof(iPeriodicTrigger),sizeof(iPeriodicTrigger)); + + TIpcArgs args; + + args.Set(0, aSETCaps); + args.Set(1, aRequestId); + args.Set(2, &iPtrHolder->Ptr(0)); + + isTriggeringUsed = ETrue; + + // resetting the counter + iNotifyRequestCtr = 0; + + return SendReceive( + ESuplTerminalSubssnStartPeriodicTrigger, args, aStatus); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::StartSuplTriggerSession +// with supl server address +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::StartSuplTriggerSession( + TRequestStatus& aStatus, + TSuplTerminalPeriodicTrigger& aPeriodicTrigger, + const TDesC& aHslpAddress, + TBool aFallBack, + TInt aSETCaps, + TInt aRequestId + ) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if( iSuplService != ESUPL_2_0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrNotSupported); + return; + } + + if(aRequestId < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aSETCaps < 0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + TUint noOfFixes, interval, startTime; + if( aPeriodicTrigger.Get(noOfFixes,interval,startTime) != KErrNone ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + if(aHslpAddress.Length() < 0 || aHslpAddress.Length() > KMaxHslpAddressLength ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrArgument); + return; + } + + //Check if the passed HSLPAddress exists or not! + TInt serverExists = CheckIfSlpExists(aHslpAddress); + if(serverExists != KErrNone) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,serverExists); + return; + } + + iSuplParameters.PeriodicTrigger = aPeriodicTrigger; + iSuplParameters.HslpAddress = aHslpAddress; + iSuplParameters.FallBack = aFallBack; + + iPeriodicTrigger = aPeriodicTrigger; + + iPtrHolder->Ptr(0).Set( + reinterpret_cast(&iSuplParameters), + sizeof(iSuplParameters),sizeof(iSuplParameters)); + + TIpcArgs args; + + args.Set(0, aSETCaps); + args.Set(1, aRequestId); + args.Set(2, &iPtrHolder->Ptr(0)); + + isTriggeringUsed = ETrue; + // resetting the counter + iNotifyRequestCtr = 0; + + return SendReceive( + ESuplTerminalSubssnStartPeriodicTriggerWithServer, args, aStatus); + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::StopSuplTriggerring +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::StopSuplTriggerSession() + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + if( isTriggeringUsed ) + { + SendReceive(ESuplTerminalSubssnStopTriggerSession); + isTriggeringUsed = EFalse; + } + } + +// --------------------------------------------------------- +// RSuplTerminalSubSession::NotifyTriggerFired +// +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C void RSuplTerminalSubSession::NotifyTriggerFired( + TRequestStatus& aStatus, + TSuplTriggerFireInfo& aFireInfo) + { + __ASSERT_ALWAYS(SubSessionHandle(), + User::Panic(KSuplClientFault, ESuplServerBadHandle)); + + if( iSuplService != ESUPL_2_0 ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrNotSupported); + return; + } + + if ( !isTriggeringUsed ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrNotFound); + return; + } + + TUint noOfFixes,interval,startTime; + if( iPeriodicTrigger.Get(noOfFixes,interval,startTime) != KErrNone ) + { + if( iNotifyRequestCtr >= noOfFixes ) + { + TRequestStatus *status = &aStatus; + User::RequestComplete(status,KErrNotFound); + return; + } + } + + aStatus=KRequestPending; + + TIpcArgs args; + + TPckg fireInfo(aFireInfo); + + iPtrHolder->Ptr(0).Set(fireInfo); + args.Set(2, &iPtrHolder->Ptr(0)); + + iNotifyRequestCtr++; + + SendReceive(ESuplTerminalSubssnNotifyTriggerFired, args, aStatus); + } + +// end of file