landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTP27.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:37:04 +0300
branchRCL_3
changeset 44 2b4ea9893b66
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004 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: 
*   ?description_line
*
*/


//  INCLUDES
#include "FT_CPosTp27.h"
#include <EPos_CPosLmTextCriteria.h>
#include <EPos_CPosLMItemIterator.h>
#include <EPos_CPosLmCatNameCriteria.h>
#include <EPos_CPosLmCategoryCriteria.h>

// CONSTANTS

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

// ---------------------------------------------------------
// CPosTp27::CloseTest
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp27::CloseTest()
    {
    delete iPeriodicTimer;
    iPeriodicTimer = NULL;

    delete iDatabase;
    iDatabase = NULL;
    }

// ---------------------------------------------------------
// CPosTp27::StartL
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp27::StartL()
    {
    iDatabase = UseGeneratedDbFileL();   

    if (iDatabase->IsInitializingNeeded())
       {
       CPosLmOperation* op = iDatabase->InitializeL();
       delete op;
       }

    CancelLandmarkCategorySearch();

    CancelLandmarkSearch();

    AssertTrueSecL(iGlobalErr != KErrNone, _L("Errors found in TP27"));
    }

// ---------------------------------------------------------
// CPosTp27::CancelLandmarkCategorySearch
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp27::CancelLandmarkCategorySearch()
    {
    iLog->Log(_L("CancelLandmarkCategorySearch"));
    CPosLmCatNameCriteria* searchCriteria = CPosLmCatNameCriteria::NewLC();

    // Use name specified in test landmarksdb
    searchCriteria->SetSearchPatternL(_L("Taxi"));       

    iLandmarkSearch = CPosLandmarkSearch::NewL(*iDatabase, this);
    // Get maximum number of search attempts
    iLandmarkSearch->StartCategorySearchL(*searchCriteria, CPosLmCategoryManager::ECategorySortOrderNone);

    iHandleOperationDisabled = EFalse;
    iActiveSchedulerWait->Start();
    iHandleOperationDisabled = ETrue;
    // Get the maximum of needed search rounds until search is complete
    TInt MaxNrOfSearchRounds = iNrSearchRounds;

    // First test to cancel the search before it even has started
    // use the callback StopActiveSchedulerWait to stop the active scheduler
    // just to make sure that no HandleOperationProgress take place
    iNrSearchRounds = 0;
    iLandmarkSearch->StartCategorySearchL(*searchCriteria, CPosLmCategoryManager::ECategorySortOrderNone);
    iLandmarkSearch->Cancel();

    TCallBack callback(StopActiveSchedulerWait, this);
    iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityStandard);
    TTimeIntervalMicroSeconds32 stopTime = TTimeIntervalMicroSeconds32(4000000); // 4 sec
    iPeriodicTimer->Start(stopTime, stopTime, callback);
    iHandleOperationDisabled = ETrue;
    iActiveSchedulerWait->Start();

    delete iPeriodicTimer;
    iPeriodicTimer = NULL;

    iLog->Log(_L("Starting"));
    TInt i=0;
    for (i=0; i<=MaxNrOfSearchRounds; i++)
        {
        iNrSearchRounds = 0;
        iBreakSearch = i;
        // Set to 100 so that it differs from progress the first time
        iProgress=100;
        iLog->Log(_L("StartCategorySearchL->"));
        iLandmarkSearch->StartCategorySearchL(*searchCriteria, CPosLmCategoryManager::ECategorySortOrderNone);
        iHandleOperationDisabled = EFalse;
        iActiveSchedulerWait->Start();

        iLog->Log(_L("After iActiveSchedulerWait->Start() inside for loop"));
        iHandleOperationDisabled = ETrue;

        // Check if anything was found
        CPosLmItemIterator* iterator = iLandmarkSearch->MatchIteratorL();
        CleanupStack::PushL(iterator);
        
        TInt numOfItems = 0;
        numOfItems = iLandmarkSearch->NumOfMatches();
       
        RArray<TPosLmItemId> ids;
        CleanupClosePushL(ids);
        
        if (numOfItems != 0)
            {
            iLog->Log(_L("Found something"));
            // Maybe we should check this item
            iterator->GetItemIdsL(ids, 0, numOfItems);
            }
        
        CleanupStack::PopAndDestroy(&ids);
        CleanupStack::PopAndDestroy(iterator);
        }
    
    iNrSearchRounds=0;
    iBreakSearch = -1;
    iCancelOrDelete = ETrue;

    delete iLandmarkSearch;
    iLandmarkSearch = NULL;

    iLog->Log(_L("This time, delete the search object to cancel the search"));
    for (i=0; i<=MaxNrOfSearchRounds; i++)
        {
        iLandmarkSearch = CPosLandmarkSearch::NewL(*iDatabase, this);   
        // Set to 100 so that it differs from progress the first time
        iProgress=100;
        iNrSearchRounds = 0;
        iBreakSearch = i;
        iLog->Log(_L("StartCategorySearchL2->"));
        iLandmarkSearch->StartCategorySearchL(*searchCriteria, CPosLmCategoryManager::ECategorySortOrderNone);
        iHandleOperationDisabled = EFalse;
        iActiveSchedulerWait->Start();
        iHandleOperationDisabled = ETrue;
        iLog->Log(_L("After iActiveSchedulerWait->Start() inside for loop"));
        }
    iHandleOperationDisabled = EFalse;
    CleanupStack::PopAndDestroy(searchCriteria);

    iCancelOrDelete = EFalse;
    delete iLandmarkSearch;
    iLandmarkSearch = NULL;
    }

// ---------------------------------------------------------
// CPosTp27::CancelLandmarkSearch
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp27::CancelLandmarkSearch()
    {
    iLog->Log(_L("CancelLandmarkSearch"));

    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
    TUint attr = CPosLandmark::ELandmarkName | CPosLandmark::EDescription;
    textCriteria->SetAttributesToSearch(attr);
    // Use name specified in test landmarksdb
    textCriteria->SetTextL(_L("enator"));
        
    iLandmarkSearch = CPosLandmarkSearch::NewL(*iDatabase, this);
    iLandmarkSearch->StartLandmarkSearchL(*textCriteria);
    iHandleOperationDisabled = EFalse;
    iActiveSchedulerWait->Start();
    iHandleOperationDisabled = ETrue;

    // Get the maximum of needed search rounds until search is complete
    TInt MaxNrOfSearchRounds = iNrSearchRounds;

    // First test to cancel the search before it even has started
    // use the callback StopActiveSchedulerWait to stop the active scheduler
    // just to make sure that no HandleOperationProgress take place
    iNrSearchRounds = 0;
    iLandmarkSearch->StartLandmarkSearchL(*textCriteria);
    iLandmarkSearch->Cancel();

    TCallBack callback(StopActiveSchedulerWait, this);
    iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityStandard);
    TTimeIntervalMicroSeconds32 stopTime = TTimeIntervalMicroSeconds32(4000000); // 4 sec
    iPeriodicTimer->Start(stopTime, stopTime, callback);
    iHandleOperationDisabled = ETrue;
    iActiveSchedulerWait->Start();

    delete iPeriodicTimer;
    iPeriodicTimer = NULL;

    iLog->Log(_L("Starting"));
    TInt i=0;
    for (i=0; i<=MaxNrOfSearchRounds; i++)
        {
        iNrSearchRounds = 0;
        iBreakSearch = i;
        // Set to 100 so that it differs from progress the first time
        iProgress=100;
        iLog->Log(_L("StartLandmarkSearchL->"));
        iLandmarkSearch->StartLandmarkSearchL(*textCriteria);
        iHandleOperationDisabled = EFalse;
        iActiveSchedulerWait->Start();

        iLog->Log(_L("After iActiveSchedulerWait->Start() inside for loop"));
        iHandleOperationDisabled = ETrue;

        // Check if anything was found
        CPosLmItemIterator* iterator = iLandmarkSearch->MatchIteratorL();
        CleanupStack::PushL(iterator);
        
        TInt numOfItems = 0;
        numOfItems = iLandmarkSearch->NumOfMatches();
       
        RArray<TPosLmItemId> ids;
        CleanupClosePushL(ids);
        
        if (numOfItems != 0)
            {
            iLog->Log(_L("Found something"));
            iterator->GetItemIdsL(ids, 0, numOfItems);
            }
        
        CleanupStack::PopAndDestroy(&ids);
        CleanupStack::PopAndDestroy(iterator);
        }
    
    iNrSearchRounds=0;
    iBreakSearch = -1;
    iCancelOrDelete = ETrue;

    delete iLandmarkSearch;
    iLandmarkSearch = NULL;

    iLog->Log(_L("This time, delete the search object to cancel the search"));
    for (i=0; i<=MaxNrOfSearchRounds; i++)
        {
        iLandmarkSearch = CPosLandmarkSearch::NewL(*iDatabase, this);   
        // Set to 100 so that it differs from progress the first time
        iProgress=100;
        iNrSearchRounds = 0;
        iBreakSearch = i;
        iLog->Log(_L("StartLandmarkSearchL2->"));
        iLandmarkSearch->StartLandmarkSearchL(*textCriteria);
        iHandleOperationDisabled = EFalse;
        iActiveSchedulerWait->Start();
        iHandleOperationDisabled = ETrue;
        iLog->Log(_L("After iActiveSchedulerWait->Start() inside for loop"));
        }
    iHandleOperationDisabled = EFalse;
    CleanupStack::PopAndDestroy(textCriteria);

    iCancelOrDelete = EFalse;

    delete iLandmarkSearch;
    iLandmarkSearch = NULL;    
    }


// ---------------------------------------------------------
// CPosTp27::StopActiveSchedulerWait
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
TInt CPosTp27::StopActiveSchedulerWait(TAny* aSelf)
    {
    //do not forget to cancel the timer
    CPosTp27* self = static_cast<CPosTp27*> (aSelf);
    self->iPeriodicTimer->Cancel();
    self->iActiveSchedulerWait->AsyncStop();
    return KErrNone;
    }

// ---------------------------------------------------------
// CPosTp27::HandleOperationProgress
//
// (other items were commented in a header).
// ---------------------------------------------------------
//
void CPosTp27::HandleOperationProgress(CPosLmOperation*  aOperation)
    {
    //if (iDebug) iLog->Log(_L("HandleOperationProgress"));

    // If no HandleOperationProgress should occur, eg no search is started
    if (iHandleOperationDisabled)
        {
        iLog->Log(_L("ERROR: No HandleOperationProgress should occur"));
        iGlobalErr++;
        }
    else
    {
    // If progress is 100%, always stop the search
    // Check that progress is moving
    TReal32 progress = aOperation->Progress();
    if (iProgress == progress)
        {
        iLog->Log(_L("MyError:Progressindicator not moving"));
        iGlobalErr++;
        }
    iProgress = progress;
    TBuf<50> buf;
    buf.Format(_L("****Progress %f"), progress);
    if (iDebug) iLog->Log(buf);

    // Not sure about this condition, is it ok to compare TReal32 like this
    if (progress == 1)
        {
        if (iDebug) iLog->Log(_L("Stopping"));
        iActiveSchedulerWait->AsyncStop();
        return;
        }

    if (iNrSearchRounds == iBreakSearch)
        {
        if (!iCancelOrDelete)
            {
            if (iDebug) iLog->Log(_L("Cancelling"));
            aOperation->Cancel();
            iActiveSchedulerWait->AsyncStop();
            if (aOperation->Status() != KErrCancel)
                {
                TBuf<50> buf;
                buf.Format(_L("MyError: Wrong status, should be KErrCancel, but was %d"), aOperation->Status());
                iLog->Log(buf);
                iGlobalErr++;
                }
            }
        else
            {
            if (iDebug) iLog->Log(_L("Cancel by deleting search object"));
            delete iLandmarkSearch;
            iLandmarkSearch = NULL;
            iActiveSchedulerWait->AsyncStop();
            }
        }
        iNrSearchRounds++;
    }
    }
// End of file