continued here...
and this is the file which contains active object class
Code:
#include "clocationexamplepositionrequestor.h"
#include "ClientEngine.h"
const TInt KSecond = 1000000;
const TInt KMaxAge = KSecond;
const TInt KErrBuffer = 100;
const TInt KGPSSleepingMinor = KSecond*10; // GPS sleeping time after error
CLocationExamplePositionRequestor::CLocationExamplePositionRequestor(TInt aInterval)
: CActive(CActive::EPriorityStandard),
iInterval(aInterval),
iPosInfoBase( &iPositionInfo ),
iGettingLastknownPosition( EFalse )
{
}
void CLocationExamplePositionRequestor::ConstructL()
{
iUpdateops.SetUpdateInterval(TTimeIntervalMicroSeconds(6*10000000));
iUpdateTimeout=60*1000000;
iUpdateops.SetUpdateTimeOut(TTimeIntervalMicroSeconds(65000000));
iUpdateops.SetMaxUpdateAge(TTimeIntervalMicroSeconds(1000000));
iUpdateops.SetAcceptPartialUpdates(ETrue);
CActiveScheduler::Current()->Add( this );
DoInitialiseL();
}
CLocationExamplePositionRequestor* CLocationExamplePositionRequestor::NewL(TInt aInterval)
{
CLocationExamplePositionRequestor* self = new( ELeave ) CLocationExamplePositionRequestor(aInterval);
CleanupStack::PushL( self );
self->ConstructL();
CleanupStack::Pop( self );
return self;
}
CLocationExamplePositionRequestor::~CLocationExamplePositionRequestor()
{
Cancel();
delete iEngine;
iPositioner.Close();
iPosServer.Close();
Deque();
}
void CLocationExamplePositionRequestor::DoCancel()
{
CancelWait();
if ( iGettingLastknownPosition )
{
iPositioner.CancelRequest(EPositionerGetLastKnownPosition);
}
else
{
iPositioner.CancelRequest(EPositionerNotifyPositionUpdate);
}
iGettingLastknownPosition = ETrue;
}
void CLocationExamplePositionRequestor::RunL()
{
TBuf<KPositionMaxModuleName> buffer;
if ( iGettingLastknownPosition )
{
iGettingLastknownPosition = EFalse;
}
switch ( iStatus.Int() )
{
case KErrNone:
{
PositionUpdatedL();
break;
}
case KPositionPartialUpdate:
{
Wait();
break;
}
case KPositionQualityLoss:
{
PositionLost();
break;
}
case KErrAccessDenied:
{
buffer.Format(KLbsErrAccess, iStatus.Int());
break;
}
case KErrTimedOut:
{
PositionLost();
break;
}
case KErrCancel:
{
break;
}
case KErrUnknown:
{
PositionLost();
break;
}
default:
{
buffer.Format(KLbsErrLocRequest, iStatus.Int());
break;
}
}
}
void CLocationExamplePositionRequestor::DoInitialiseL()
{
TInt error = iPosServer.Connect( );
TBuf<KErrBuffer> buffer;
if ( KErrNone != error )
{
buffer.Format(KLbsErrPosServConn, error);
return;
}
error = iPositioner.Open(iPosServer);
if ( KErrNone != error )
{
buffer.Format(KLbsErrOpenPos, error);
iPosServer.Close();
return;
}
error = iPositioner.SetRequestor( CRequestor::ERequestorService ,CRequestor::EFormatApplication ,_L("Track.exe"));
if ( KErrNone != error )
{
buffer.Format(KLbsErrSetRequestor, error);
iPositioner.Close();
iPosServer.Close();
return;
}
error = iPositioner.SetUpdateOptions( iUpdateops );
if ( KErrNone != error )
{
buffer.Format(KLbsErrSetUpOpt, error);
iPositioner.Close();
iPosServer.Close();
return;
}
}
TInt CLocationExamplePositionRequestor::RunError(TInt /*aError*/)
{
return KErrNone;
}
void CLocationExamplePositionRequestor::Pause()
{
if (IsActive())
{
Cancel();
}
}
void CLocationExamplePositionRequestor::Continue()
{
if (!IsActive())
{
Start();
}
}
TPositionInfoBase* CLocationExamplePositionRequestor::CurrentPosition()
{
return iPosInfoBase;
}
void CLocationExamplePositionRequestor::Wait()
{
if (!iPeriodic)
{
// Close GPS handles
Cancel();
// Sleep
iPeriodic = CPeriodic::NewL(CActive::EPriorityIdle);
iPeriodic->Start(KGPSSleepingMinor,KGPSSleepingMinor,TCallBack(PeriodicTick, this));
}
}
TInt CLocationExamplePositionRequestor::PeriodicTick(TAny* aObject)
{
CLocationExamplePositionRequestor* gpslistener = (CLocationExamplePositionRequestor*)aObject;
if (gpslistener)
{
// Cancel timer running
gpslistener->CancelWait();
// Start listening GPS again after waiting a while
gpslistener->Start();
}
return EFalse; // Does not continue again (Note: Does not work with this CPeriodic class)
}
void CLocationExamplePositionRequestor::Start()
{
if (!IsActive())
{
if (iGettingLastknownPosition)
{
iPositioner.GetLastKnownPosition(*iPosInfoBase,iStatus);
}
else
{
RFileReadStream readStream;
RFs aFs;
User::LeaveIfError(aFs.Connect());
User::LeaveIfError(readStream.Open(aFs, _L("c:\\data\\nel.txt"), EFileRead));
CleanupClosePushL(readStream);
TBuf<1000> value;
TStreamPos eofPos(readStream.Source()->SizeL());
TStreamPos currentPos(0);
TBuf<25> eofPosStr;
eofPosStr.AppendNum(eofPos.Offset());
readStream.ReadL(value,(readStream.Source()->SizeL()/2));
CleanupStack::PopAndDestroy(&readStream);
readStream.Release();
ShowMessage(_L("value"));
ShowMessage(value);
aFs.Close();
TBuf<100> bufr=_L("");
TBuf<100> status=_L("");
ShowMessage(_L("outer before status"));
TInt serPos2=value.Find(_L("[status]"));
if(serPos2!=KErrNotFound)
{
TBuf<800> leftPart=value.MidTPtr(serPos2+8);
ShowMessage(_L("status1 found"));
TInt serpos3=leftPart.Find(_L("[status]"));
if(serpos3!=KErrNotFound)
{
ShowMessage(_L("status2 found"));
status=leftPart.MidTPtr(0,serpos3);
status.Trim();
ShowMessage(status);
}
}
if(status.Compare(_L("Completed"))!=0)
{
ShowMessage(_L("inside not completed----"));
iPositioner.NotifyPositionUpdate(*iPosInfoBase,iStatus);
SetActive();
}
else if(status.Compare(_L("Completed"))==0)
{
ShowMessage(_L("inside completed----"));
return;
}
}
}
}
void CLocationExamplePositionRequestor::CancelWait()
{
if (iPeriodic)
{
iPeriodic->Cancel();
delete iPeriodic;
iPeriodic = NULL;
}
}
void CLocationExamplePositionRequestor::PositionLost()
{
Wait();
}
void CLocationExamplePositionRequestor::ShowMessage(const TDesC& aMsg) const
{
if (aMsg.Length()) // If there's something to show, otherwise do nothing
{
// No need to react if this leaves, just trap
TRAPD(err, ShowMessageL(aMsg));
if( err != KErrNone )
{
}
}
}
void CLocationExamplePositionRequestor::ShowMessageL(const TDesC& aMsg) const
{
CAknGlobalNote* note = CAknGlobalNote::NewLC();
note->ShowNoteL(EAknGlobalConfirmationNote, aMsg);
CleanupStack::PopAndDestroy(note);
}
see i construct an object of type CLocationExamplePositionRequestor which is used to retrieve the [lat,lon] which inturn calls DoInitializeL() and make all the initializations till there i know it is synchronous and i am getting message in the console after cunstruction of the object of type CLocationExamplePositionRequestor.
after that see i call start() method from inside main and call CActiveScheduler::Start(). in void CLocationExamplePositionRequestor::Start() i check the status by extracting status content from inside file named nel.txt which is under c:\data. i am sure that i am successfully getting the status from file. now nel.txt contains status as Completed and i am sure i am getting that message.i.e.,
i am sure that i am coming here
Code:
else if(status.Compare(_L("Completed"))==0)
{
ShowMessage(_L("inside completed----"));
return;
}
what is happening now is my console application is not exiting by itself.
i want my console application to exit once it reaches this stage i.e., when i get status as Completed in other words if(status.Compare(_L("Completed"))==0) this satisfies.
please help