lbs/lbsclient/lbsexeclient/src/ctlbsexeclient.cpp
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lbs/lbsclient/lbsexeclient/src/ctlbsexeclient.cpp	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,254 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+
+#include <e32base.h>
+#include <f32file.h>
+#include <LbsPositionInfo.h>
+#include <Lbs.h>
+#include <LbsCommon.h>
+#include <LbsRequestor.h>
+#include <EPos_CPosModules.h>
+#include <EPos_CPosModuleUpdate.h>
+#include <EPos_CPosModuleIdList.h>
+
+TInt DoTestL();
+
+TInt TestMainL()
+    {
+     // Create and install the active scheduler 
+    CActiveScheduler* exampleScheduler=new (ELeave) CActiveScheduler; 
+    CleanupStack::PushL(exampleScheduler); 
+    CActiveScheduler::Install(exampleScheduler); 
+    // Call function
+    TInt result = DoTestL();  
+    CleanupStack::PopAndDestroy(exampleScheduler);
+    return result;
+    }
+
+void TraceL(const TDesC& aMsg, RFile& aFile) 
+    {
+    const TInt KBufSize = 200;
+    TBuf8<KBufSize> tmp;
+    tmp.Copy(aMsg);
+    _LIT(KEnd,";\r\n");
+    tmp.Append(KEnd);
+    aFile.Write(tmp);
+    }
+
+/**
+* Setup PSY
+*/
+void SetupPsyL(const TUid aPsyUid)
+    {
+    CPosModules* db = CPosModules::OpenL();
+    CleanupStack::PushL(db);
+
+    CPosModuleUpdate* enable = CPosModuleUpdate::NewLC();
+    CPosModuleUpdate* disable = CPosModuleUpdate::NewLC();
+
+    disable->SetUpdateAvailability(EFalse);
+    enable->SetUpdateAvailability(ETrue);
+
+    CPosModuleIdList* prioList = db->ModuleIdListLC();
+
+    for (TInt i = 0 ; i < prioList->Count(); i++)
+        {
+        if ((*prioList)[i] != aPsyUid)
+            {
+            // Disable all PSYs except one given as parameter
+            db->UpdateModuleL((*prioList)[i], *disable);
+            }
+        else
+            {
+            // Enable the PSY that came as an in parameter
+            db->UpdateModuleL((*prioList)[i], *enable);
+            }
+        }
+
+    CleanupStack::PopAndDestroy(prioList);
+    CleanupStack::PopAndDestroy(disable);
+    CleanupStack::PopAndDestroy(enable);
+    CleanupStack::PopAndDestroy(db);
+    }
+
+/**
+* Method used to generate a file name for trace.
+* If a trace file exist an index number i counted
+* one step until a trace file can be created.
+* Maximun number of exe client are currently hard
+* coded to 10;
+*/
+TBuf<40> GenerateFileNameForTraceL()
+    {
+    _LIT(KFileTrace, "c:\\logs\\execlientresult%d.txt");
+    RFs fileserver;
+    RFile file;
+    User::LeaveIfError(fileserver.Connect());
+    TBuf<40> ff;
+    ff.Append(KFileTrace);
+ 
+    for (TInt i = 1; i<10;i++) 
+        {
+        ff.Format(KFileTrace,i);
+        TInt err = file.Open(fileserver,ff, EFileWrite);
+        if (err == KErrNotFound) 
+            {
+            User::LeaveIfError(file.Create(fileserver,ff, EFileWrite));
+            break;
+            }
+        }
+    file.Close();
+    fileserver.Close();
+    return ff;
+}
+
+/**
+* Error checking and output error to Trace File.
+*/
+void AssertTrueL(TBool aCondition, const TDesC& aErrorMsg, TInt aErrorCode, RFile& aFile)
+  {
+  if (!aCondition)
+		{
+		TBuf<100> buf;
+		buf.Format(aErrorMsg, aErrorCode);
+		TraceL(buf, aFile);
+        //User::Leave(aErrorCode);
+		}
+  }
+
+/**
+* Performes the test by connecting to MLFW and makes 50 Location request
+*/
+TInt DoTestL()
+    {
+    TBuf<40> traceFile = GenerateFileNameForTraceL();
+
+    RFs fileserver;
+    RFile file;
+    User::LeaveIfError(fileserver.Connect());
+    CleanupClosePushL(fileserver);
+    User::LeaveIfError(file.Open(fileserver, traceFile, EFileWrite));
+    CleanupClosePushL(file);
+    _LIT(KClientStarted, "Client Started");
+    TraceL(KClientStarted, file);
+
+    const TInt32 KUidMultiPsy = 0x01010176;
+    TUid uidMultiPsy;
+    uidMultiPsy.iUid = KUidMultiPsy;      
+	SetupPsyL(uidMultiPsy);
+
+    _LIT(KMultiPsySetup, "MultiPsy set up");
+    TraceL(KMultiPsySetup, file);
+
+	TInt numberOfRuns = 50;
+    
+    RPositionServer	posServer;
+    CleanupClosePushL(posServer);
+    RPositioner positioner;
+    CleanupClosePushL(positioner);
+    TPositionInfo positionInfo = TPositionInfo();
+
+	_LIT(KConnectErr, "ERROR: Error when connecing to EPos server,  %d");
+	TInt err = posServer.Connect();
+	AssertTrueL(err == KErrNone, KConnectErr, err, file);
+
+	_LIT(KOpenErr, "ERROR: Error when opening positioner,  %d");
+	err = positioner.Open(posServer, uidMultiPsy);
+	AssertTrueL(err == KErrNone, KOpenErr, err, file);
+
+    _LIT(KService ,"Service");
+	err = positioner.SetRequestor(CRequestor::ERequestorService,
+							 CRequestor::EFormatApplication, KService);
+    _LIT(KRequestor, "ERROR: Not possible to set requestor");
+    AssertTrueL(err == KErrNone, KRequestor, err, file);
+    
+    TTime now, startTime;
+    TTimeIntervalMicroSeconds requestTime;
+    TRequestStatus status;
+    TInt64 reqTime;
+    TCoordinate corr(0,0,0);
+    TLocality loca(corr,0);
+    TPosition pos(loca, TTime(0));
+    TBool success = ETrue;
+    _LIT(KStartingRequests, "Starting requests");
+    TraceL(KStartingRequests, file);
+
+    for (TInt i = 0; i < numberOfRuns; i++)
+        {
+        startTime.UniversalTime();
+        positionInfo.SetPosition(pos);
+        positioner.NotifyPositionUpdate(positionInfo, status);
+        User::WaitForRequest(status);
+        err = status.Int();
+        if (err != KErrNone)
+            {
+            success=EFalse;
+            }
+        now.UniversalTime();
+        requestTime = now.MicroSecondsFrom(startTime);
+        _LIT(KError, "Request time, %d µs. Error code from Notify = %d");
+        TBuf<100> buf;
+        reqTime = requestTime.Int64();
+        buf.Format(KError, reqTime, err);
+        TraceL(buf, file);
+        TPosition result;
+        positionInfo.GetPosition(result);
+        // Sanity check
+        if (result.Latitude() == pos.Latitude() ||
+		    result.Longitude() == pos.Longitude() ||
+		    result.Altitude() == pos.Altitude())
+            {
+             success = EFalse;
+             _LIT(KErrorPositon, "ERROR:: The postion was not updated");
+             TraceL(KErrorPositon, file);
+            }
+        }
+    
+    CleanupStack::PopAndDestroy(&positioner);
+    CleanupStack::PopAndDestroy(&posServer);
+
+    if (success)
+        {
+        _LIT(KOk, "SUCCESS");
+        TraceL(KOk, file);
+        }
+    else
+        {
+        _LIT(KErr, "FAILED");
+        TraceL(KErr, file);
+        }
+
+    CleanupStack::PopAndDestroy(&file);
+    CleanupStack::PopAndDestroy(&fileserver);
+    
+    return (success) ? 0 : 1;
+    }
+
+// Cleanup stack harness
+GLDEF_C TInt E32Main()
+    {
+    __UHEAP_MARK;
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    TInt result = 1;
+    TRAPD(error, result = TestMainL());
+    _LIT(KLbsExeClient, "CT Lbs Exe Client");
+    __ASSERT_ALWAYS(!error, User::Panic(KLbsExeClient, error));
+    delete cleanupStack;
+    __UHEAP_MARKEND;
+    return result;
+    }
+