// 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 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 "ctlbsclientpostp173.h"
#include <badesca.h>
#include <EPos_CPosModules.h>
#include <EPos_CPosModuleUpdate.h>
#include <EPos_CPosModuleIdList.h>
#include <LbsCommon.h>
#include <LbsPositionInfo.h>
#include "tctlbsclientmodulesobserver.h"


void MyStopActive(TAny* /*aAny*/)
    {
    CActiveScheduler::Stop();
    }

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// Constructor.
// ---------------------------------------------------------
CT_LbsClientPosTp173::CT_LbsClientPosTp173(CT_LbsServer& aParent): CT_LbsPortedStepBase(aParent)
	{
	_LIT(KTestName, "TP173 - Notify Module Events");
	SetTestStepName(KTestName); 
	}


// ---------------------------------------------------------
// Destructor.
// ---------------------------------------------------------
CT_LbsClientPosTp173::~CT_LbsClientPosTp173()
	{
	}

// ---------------------------------------------------------
// CT_LbsClientPosTp173::StartL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CT_LbsClientPosTp173::StartL()
    {
    iNoEvents = EFalse;
    iError = EFalse;
    // This test listens for events.
    // There is no data in the event, so all that is needed to be done is
    // to see that an event is generated. This test doesn't fail if unsuccessful,
    // it hangs.

    CPosModules* db = CPosModules::OpenL();
    CleanupStack::PushL(db);

    db->SetObserverL(*this);

    TInt prio = db->PriorityL(iUidTestPsy2);
    if (prio > 0)
        {
        prio = 0;
        }
    else
        {
        prio = 1; // this assumes that more that one PSY is installed
        }

    CPosModuleUpdate* visibileUpdate = CPosModuleUpdate::NewLC();
    visibileUpdate->SetUpdateVisibility(ETrue);
    db->UpdateModuleL(iUidTestPsy2, *visibileUpdate);
    
    db->SetModulePriorityL(iUidTestPsy2, prio);
    CleanupStack::PopAndDestroy(visibileUpdate);
    

    // Wait for event
    DoEventHandlingL();

    CPosModuleUpdate* availUpdate = CPosModuleUpdate::NewLC();


	TPositionModuleInfo info;
	db -> GetModuleInfoL(iUidTestPsy2, info);
	TBool available = info.IsAvailable();

    availUpdate->SetUpdateAvailability(/*ETrue*/ !available);
    db->UpdateModuleL(iUidTestPsy2, *availUpdate);
    
    CleanupStack::PopAndDestroy(availUpdate);

    // Wait for event
    DoEventHandlingL();

    CPosModuleUpdate* costUpdate = CPosModuleUpdate::NewLC();
	
	TPositionQuality quality;
	info.GetPositionQuality(quality);
	TPositionQuality::TCostIndicator indicator = quality.CostIndicator();
    switch (indicator)
    {
        case TPositionQuality::ECostUnknown:
            indicator = TPositionQuality::ECostZero;
            break;
        case TPositionQuality::ECostZero:
            indicator = TPositionQuality::ECostPossible;
            break;
        case TPositionQuality::ECostPossible:
            indicator = TPositionQuality::ECostCharge;
            break;
        case TPositionQuality::ECostCharge:
            indicator = TPositionQuality::ECostPossible;
            break;
        default:
        	_LIT(KErrorAndLeave, "quality indicator does not exist");
            LogErrorAndLeaveL(KErrorAndLeave);
    }

    costUpdate->SetUpdateCost(/*TPositionQuality::ECostCharge*/ indicator);
    db->UpdateModuleL(iUidTestPsy2, *costUpdate);
    
    CleanupStack::PopAndDestroy(costUpdate);

    // Wait for event
    DoEventHandlingL();

    ////////////////////////////////////

    CPosModuleUpdate* visibilityUpdate = CPosModuleUpdate::NewLC();
    visibilityUpdate->SetUpdateVisibility(EFalse);
    db->UpdateModuleL(iUidTestPsy2, *visibilityUpdate);
    CleanupStack::PopAndDestroy(visibilityUpdate);
    
    DoEventHandlingL();
    
    ////////////////////////////////////
    
    CMyNotificationTimer* timer = CMyNotificationTimer::NewLC(this);
	
    TTimeIntervalMicroSeconds ttfUpdate(1000000);
    TPositionQuality dynQualityUpdate;
    dynQualityUpdate.SetHorizontalAccuracy(30.0);
    dynQualityUpdate.SetTimeToNextFix(ttfUpdate);

    timer->StartNotificationTimer();
    iNoEvents = ETrue;
    // Wait for event
    DoEventHandlingL();
    
////////////////////////////////////
   
   
    
    
    db->RemoveObserver();
    CleanupStack::PopAndDestroy(2, db);
    }

// ---------------------------------------------------------
// CT_LbsClientPosTp173::DoEventHandlingL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CT_LbsClientPosTp173::DoEventHandlingL()
    {
	//User::After(20);
	CActiveScheduler::Start();
    CheckErrorL();
    }

// ---------------------------------------------------------
// CT_LbsClientPosTp173::CheckErrorL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CT_LbsClientPosTp173::CheckErrorL()
    {
    if (iError)
        {
        LogErrorAndLeaveL(iErrorText);
        }
    }

// ---------------------------------------------------------
// CT_LbsClientPosTp173::HandleDatabaseChangeL
//
// (other items were commented in a header).
// ---------------------------------------------------------
void CT_LbsClientPosTp173::HandleSettingsChangeL(TPosModulesEvent /*aModuleEvent*/)
    {
       
    CleanupStack::PushL(TCleanupItem(MyStopActive));
    if (iNoEvents)
        {
        _LIT(KErrorText, "Event received when no event should have been received");
        iErrorText = KErrorText;
        iError = ETrue;
        }

    CleanupStack::PopAndDestroy();
    }

// ---------------------------------------------------------
// CT_LbsClientPosTp173::AssertTrueSecL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CT_LbsClientPosTp173::AssertTrueSecL(TBool aCondition, const TDesC& aErrorMsg, TInt aErrorCode)
    {
    if (!aCondition)
        {
        TBuf<100> buf;
        buf.Format(aErrorMsg, aErrorCode);
        LogErrorAndLeaveL(buf);
        }
    }

// ---------------------------------------------------------
// CT_LbsClientPosTp173::NotifyTimeout
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CT_LbsClientPosTp173::NotifyTimeout()
	{
    CleanupStack::PushL(TCleanupItem(MyStopActive));
    if (!iNoEvents)
        {
        _LIT(KErrorText, "No event received when event should have been received");
        iErrorText = KErrorText;
        iError = ETrue;
        }

    CleanupStack::PopAndDestroy();
	}

// ---------------------------------------------------------
// CNotificationTimer::~CNotificationTimer
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
//Implementation of a CNotificationTimer

// destructor
CMyNotificationTimer::~CMyNotificationTimer()
	{
	Cancel();
	iMainControl = NULL;
	}

// ---------------------------------------------------------
// CNotificationTimer::NewLC
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
// Two-phased constructor.
CMyNotificationTimer* CMyNotificationTimer::NewLC(CT_LbsClientPosTp173* aMainControl)
	{
	CMyNotificationTimer* self=new (ELeave) CMyNotificationTimer(aMainControl);
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

// ---------------------------------------------------------
// CNotificationTimer::NewL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
// Two-phased constructor.
CMyNotificationTimer* CMyNotificationTimer::NewL(CT_LbsClientPosTp173* aMainControl)
	{
	CMyNotificationTimer* self = NewLC(aMainControl);
	CleanupStack::Pop();
	return self;
	}
	
// ---------------------------------------------------------
// CNotificationTimer::StartNotificationTimer
//
// (other items were commented in a header).
// ---------------------------------------------------------
void CMyNotificationTimer::StartNotificationTimer()
	{
	CTimer::After(iNotificationTimout);
	}

// ---------------------------------------------------------
// CNotificationTimer::DoCancel
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CMyNotificationTimer::DoCancel()
	{
	CTimer::DoCancel();
	}

// ---------------------------------------------------------
// CNotificationTimer::ConstructL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CMyNotificationTimer::ConstructL()
	{
	CTimer::ConstructL();
	iNotificationTimout = 5000000;
	//add this object to the active scheduler
	CActiveScheduler::Add(this); 
	}

// ---------------------------------------------------------
// CNotificationTimer::CNotificationTimer
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
//c++ default constructor
CMyNotificationTimer::CMyNotificationTimer(CT_LbsClientPosTp173* aMainControl)
:CTimer(CActive::EPriorityStandard)
	{
	iMainControl = aMainControl;
	}
        
// ---------------------------------------------------------
// CNotificationTimer::RunL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CMyNotificationTimer::RunL()
	{
	iMainControl->NotifyTimeout();
	}


