diff -r 000000000000 -r 9cfd9a3ee49c locationrequestmgmt/locationserver/lbstestpsys/lcfpsy6/src/lcfpsy6.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationrequestmgmt/locationserver/lbstestpsys/lcfpsy6/src/lcfpsy6.cpp Tue Feb 02 01:50:39 2010 +0200 @@ -0,0 +1,305 @@ +// Copyright (c) 2007-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: +// + + + +#include // basic types + +#include // for TImplementationProxy +#include // for TPositionInfoBase +#include // for TPositionSatelliteInfo + +#include + +#include "lcfpsy6.h" +#include "lcfpsy6.hrh" + + +const TImplementationProxy KFactoryPtr = {{KLcfPsy6ImplUid}, (TProxyNewLPtr)CLcfPsy6::NewL}; + +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount) + { + aTableCount = 1; + return &KFactoryPtr; + } + +CLcfPsy6* CLcfPsy6::NewL(TAny* aConstructionParameters) + { + CLcfPsy6* self = new(ELeave) CLcfPsy6; + + CleanupStack::PushL(self); + self->ConstructL(aConstructionParameters); + CleanupStack::Pop(self); + + return self; + } + +void CLcfPsy6::ConstructL(TAny* aConstructionParameters) +{ + BaseConstructL(aConstructionParameters); + iUid = ImplementationUid(); +} + + +CLcfPsy6::~CLcfPsy6() +{ + iEvents.Close(); +} + +void CLcfPsy6::NewEvent(EEventType aEventType) +{ + TQueryEvent event; + event.iEventType = aEventType; + event.iTime.UniversalTime(); + if (iEvents.Count() > DEF_MAX_EVENT_COUNT) iEvents.Remove(0); + iEvents.Append(event); +} + +void CLcfPsy6::NewRequest( + TPositionInfoBase* aPosInfo, + TRequestStatus* aRequestStatus) +{ + iRequest.iRequestStatus = aRequestStatus; + iRequest.iPositionInfoBase = aPosInfo; + iRequest.iPostponed = EFalse; + iRequest.iDelayed = EFalse; + iRequest.iDelayTimer = NULL; +} + +void CLcfPsy6::NotifyPositionUpdate( + TPositionInfoBase& aPosInfo, + TRequestStatus& aStatus) +{ + TRequestStatus* status = &aStatus; + + // save current information + NewRequest(&aPosInfo, status); + NewEvent(EUpdate); + + // check that requested class is supported + if (aPosInfo.PositionClassType() & + ~(EPositionInfoClass | EPositionGenericInfoClass)) + { + // some more bits are set + CompleteRequest(KErrArgument); + return; + } + + if (aPosInfo.PositionClassType() & EPositionInfoClass) + { + // provide basic functionality for checking purposes + GetBasicPositionInfo(aPosInfo); + } + + if (aPosInfo.PositionClassType() & EPositionGenericInfoClass) + { + // The position info object is at least a HPositionGenericInfo + HPositionGenericInfo* posInfo = + static_cast(iRequest.iPositionInfoBase); + + if (posInfo->IsRequestedField(KPSY6FieldEventLogReset)) + { + iEvents.Reset(); + NewEvent(EUpdate); + } + + ProcessRequest(); + } + else + { + CompleteRequest(KErrNone); + } +} + +void CLcfPsy6::GetBasicPositionInfo(TPositionInfoBase& aPosInfo) +{ + // The position info object is at least a TPositionInfo + TPositionInfo* posInfo = static_cast(&aPosInfo); + + TPosition pos; + // Just for the purpose to know that the PSY is working + // we return 1 in all fields + pos.SetCoordinate(1.0, 1.0, 1.0); + pos.SetAccuracy(1.0, 1.0); + posInfo->SetPosition(pos); +} + +void CLcfPsy6::GetMandatoryPositionInfo(TPositionInfoBase& aPosInfo) + { + TPositionInfo* posInfo = static_cast(&aPosInfo); + TPosition pos; + posInfo->GetPosition(pos); + pos.SetCurrentTime(); + posInfo->SetPosition(pos); + posInfo->SetModuleId(iUid); + } + +void CLcfPsy6::ProcessRequest() +{ + // Here is the main stuff + + // The position info object is at least a HPositionGenericInfo + HPositionGenericInfo* posInfo = + static_cast(iRequest.iPositionInfoBase); + + TInt returnCode = KErrNone; + + // Check commands from test client + // do everything it says + + if (posInfo->IsRequestedField(KPSY6FieldDelayProcessing) && !returnCode) + { + if (!iRequest.iDelayed) + { + // delay completing of the request by the given timeout + TTimeIntervalMicroSeconds delay; + posInfo->GetValue(KPSY6FieldDelayProcessing, delay); + + TRAP(returnCode, + iRequest.iDelayTimer = new(ELeave) CDelayTimer; + iRequest.iDelayTimer->ConstructL(); + ) + if (returnCode == KErrNone) + { + iRequest.iDelayTimer->Start(0, delay.Int64(), this); + iRequest.iDelayed = ETrue; + *iRequest.iRequestStatus = KRequestPending; + } + return; + } + } + if (posInfo->IsRequestedField(KPSY6FieldProcessingStartTime) && !returnCode) + { + // set current time in the field to check at client side + TTime time; + time.UniversalTime(); + posInfo->SetValue(KPSY6FieldProcessingStartTime, time); + } + + if (posInfo->IsRequestedField(KPSY6FieldGetMaxAge) && !returnCode) + { + // obtain and return MaxUpdateAge parameter + + TTime maxAge(TInt64(0)); + this->GetMaxAge(maxAge); + + returnCode = posInfo->SetValue(KPSY6FieldGetMaxAge, maxAge); + } + + if (posInfo->IsRequestedField(KPSY6FieldEventLog) && !returnCode) + { + // pack and return the log of events + TRAP(returnCode, + User::LeaveIfError(posInfo->SetValue(KPSY6FieldEventLogSize, TInt32(iEvents.Count()))); + + TInt bufferSize = sizeof(TQueryEvent) * iEvents.Count(); + HBufC8* hbuf = HBufC8::NewLC(bufferSize); + TQueryEvent* eventArray = + reinterpret_cast(const_cast(hbuf->Ptr())); + for (TInt i = 0; i < iEvents.Count(); i++) + { + eventArray[i] = iEvents[i]; + } + TPtrC8 data(hbuf->Ptr(), bufferSize); // descriptor of the data + User::LeaveIfError(posInfo->SetValue(KPSY6FieldEventLog, data)); + + CleanupStack::PopAndDestroy(hbuf); + ); + } + + if (posInfo->IsRequestedField(KPSY6FieldRequestedUid) && !returnCode) + { + // get requested uid from posInfo + TInt32 requestedUid = KErrNone; + posInfo->GetValue(KPSY6FieldRequestedUid, requestedUid); + iUid.iUid = requestedUid; + } + else + { + iUid = ImplementationUid(); + } + + if (posInfo->IsRequestedField(KPSY6FieldLeaveOnStartTracking) && !returnCode) + { + iLeaveOnStartTracking = ETrue; + } + + if (posInfo->IsRequestedField(KPSY6FieldRequestedResult) && !returnCode) + { + // get requested complete code from posInfo + TInt32 requestedResult = KErrNone; + posInfo->GetValue(KPSY6FieldRequestedResult, requestedResult); + returnCode = requestedResult; + } + + if (posInfo->IsRequestedField(KPSY6FieldReportStatus) && !returnCode) + { + // get requested module status from posInfo + TPositionModuleStatus modStatus; + TPckg status(modStatus); + posInfo->GetValue(KPSY6FieldReportStatus, status); + + MPositionerStatus* observer = PositionerStatus(); + observer->ReportStatus(modStatus); + } + CompleteRequest(returnCode); +} + +void CLcfPsy6::CompleteRequest(TInt aCompletionCode) +{ + // timer must be deleted + if (iRequest.iDelayTimer) + { + delete iRequest.iDelayTimer; + iRequest.iDelayTimer = NULL; + } + GetMandatoryPositionInfo(*iRequest.iPositionInfoBase); + User::RequestComplete(iRequest.iRequestStatus, aCompletionCode); +} + +void CLcfPsy6::CancelNotifyPositionUpdate() +{ + NewEvent(ECancel); + CompleteRequest(KErrCancel); +} + +void CLcfPsy6::TimerCompleted(TInt /*aTimerId*/) +{ + ProcessRequest(); +} + +TBool CLcfPsy6::TrackingOverridden() const +{ + return ETrue; +} + +void CLcfPsy6::StartTrackingL(const TTimeIntervalMicroSeconds& /*aInterval*/) +{ + NewEvent(ETrackingStart); + if (iLeaveOnStartTracking) + { + iLeaveOnStartTracking = EFalse; + User::Leave(KErrGeneral); + } +} + +void CLcfPsy6::StopTracking() +{ + NewEvent(ETrackingStop); +} + +// End of file +