lbs/common/src/ctlbsposclientholder.cpp
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lbs/common/src/ctlbsposclientholder.cpp	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,224 @@
+// Copyright (c) 2000-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:
+//
+
+
+
+//  INCLUDES
+#include "ctlbsposclientholder.h"
+#include "ctlbsposclient.h"
+
+// CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CT_LbsPosClientHolder::CT_LbsPosClientHolder() 
+: CActive(EPriorityHigh), iRequestsActive(EFalse), iCancelTime(0)
+    {
+    }
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::ConstructL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::ConstructL(TInt aRequestCount, TUid aPsy, TBool aSameServer) 
+    {
+    User::LeaveIfError(iTimer.CreateLocal());
+    CActiveScheduler::Add(this);
+    User::LeaveIfError(iPosServer.Connect());
+    CT_LbsPosClient* requester = NULL;
+    for (TInt i = 0; i < aRequestCount; i++)
+        {
+        if (aSameServer)
+            {
+            requester = CT_LbsPosClient::NewL(this, aPsy,iPosServer);
+            }
+        else
+            {
+            requester = CT_LbsPosClient::NewL(this, aPsy);
+            }
+        CleanupStack::PushL(requester);
+        User::LeaveIfError(iRequesters.Append(requester));
+        CleanupStack::Pop(requester);
+        }
+    }
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::NewLC
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CT_LbsPosClientHolder* CT_LbsPosClientHolder::NewLC(TInt aRequestCount, TUid aPsy, TBool aSameServer) 
+    {
+    CT_LbsPosClientHolder* self = new (ELeave) CT_LbsPosClientHolder;
+    CleanupStack::PushL(self);
+    self->ConstructL(aRequestCount, aPsy, aSameServer);
+    return self;
+    }
+     
+
+
+// Destructor
+CT_LbsPosClientHolder::~CT_LbsPosClientHolder()
+    {
+    Cancel();
+    iTimer.Close();
+    iRequesters.ResetAndDestroy();
+    iRequesters.Close();
+    iRequestersWhoWillCancel.Close();
+    iPosServer.Close();
+    }
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::MakeRequests
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::MakeRequests()
+    {
+    if (iRequestsActive)
+        {
+        return;
+        }
+    iRequestsActive = ETrue;
+    TInt requesterCount = iRequesters.Count();
+    iNofRequestsDone = 0;
+    for (TInt i = 0; i < requesterCount; i++)
+        {
+        iRequesters[i]->MakeRequest();
+        }
+
+    // initiate cancelling if this is set.
+    if (iRequestersWhoWillCancel.Count() > 0)
+        {
+        iTimer.After(iStatus, iCancelTime);
+        SetActive();
+        }
+
+    CActiveScheduler::Start();
+    }
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::HandleRequestDone
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::HandleRequestDone()
+    {
+    iNofRequestsDone++;
+    if (iNofRequestsDone == iRequesters.Count())
+        {
+        iRequestsActive = EFalse;
+        CActiveScheduler::Stop();
+        }
+    }
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::RunL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::RunL()
+    {
+    // Cancel certain requests.
+    TInt nofRequestersWhoWillCancel = iRequestersWhoWillCancel.Count();
+    for (TInt i = 0; i < nofRequestersWhoWillCancel; i++)
+        {
+        iRequesters[iRequestersWhoWillCancel[i]]->Cancel();
+        HandleRequestDone();
+        }
+    }
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::DoCancel
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::DoCancel()
+    {
+    iTimer.Cancel();
+    }
+
+void CT_LbsPosClientHolder::StopRequests()
+    {
+    if (!iRequestsActive)
+        {
+        return;
+        }
+    Cancel();
+    TInt requesterCount = iRequesters.Count();
+    for (TInt i = 0; i < requesterCount; i++)
+        {
+        iRequesters[i]->Cancel();
+        }
+    CActiveScheduler::Stop();
+    iRequestsActive = EFalse;
+    }
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::GetResult
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::GetResult(
+            TInt& aStatus, 
+            TPositionInfo& aModuleInfo,
+            TTimeIntervalMicroSeconds& aRequestTime,
+            TInt aRequesterIndex)
+    {
+    iRequesters[aRequesterIndex]->GetResult(aStatus, aModuleInfo, aRequestTime);
+    }
+
+
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::SetRequesterWillCancelL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::SetCancelTime(TTimeIntervalMicroSeconds32 aTimeInterval)
+	{
+	iCancelTime = aTimeInterval;
+	}
+
+// ---------------------------------------------------------
+// CT_LbsPosClientHolder::SetRequesterWillCancelL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CT_LbsPosClientHolder::SetRequesterWillCancelL(TInt aIndex)
+    {
+    TInt length = iRequestersWhoWillCancel.Count();
+    for (TInt i = 0; i < length; i++)
+        {
+        if (iRequestersWhoWillCancel[i] == aIndex) return;
+        }
+    User::LeaveIfError(iRequestersWhoWillCancel.Append(aIndex));
+    }
+
+
+// End of File