searcher/searchserver/src/chousekeepinghandler.cpp
author Pat Downey <patd@symbian.org>
Tue, 15 Jun 2010 12:49:00 +0100
branchGCC_SURGE
changeset 5 32c1e5a1c52c
parent 0 671dee74050a
permissions -rw-r--r--
Bug 2957: Quote Template_type_T_is_not_a_character_type parameter to remove error. Template_type_T_is_not_a_character_type doesn't seem to be defined anyware.

/*
* Copyright (c) 2010 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: 
*
*/

#include "CHouseKeepingHandler.h"
#include "CHeartBeatTimer.h"
#include "CLogPlayerRecorder.h"

#include "CCPixAsyncronizer.h"

TBool CHouseKeepingHandler::iCallBackValid = EFalse;

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::NewL
// -----------------------------------------------------------------------------
//
CHouseKeepingHandler* CHouseKeepingHandler::NewL()
	{
	CHouseKeepingHandler* self = new ( ELeave ) CHouseKeepingHandler();
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	return self;
	}

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::~CHouseKeepingHandler
// -----------------------------------------------------------------------------
//
CHouseKeepingHandler::~CHouseKeepingHandler()
	{
	iCallBackValid = EFalse;
	
	delete iHeartBeatTimer;
	
	delete iAsyncronizer;
	}

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::StartL
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::StartL()
    {
    if ( !iHeartBeatTimer )
        {
        iHeartBeatTimer = CHeartBeatTimer::NewL(this);
        }
    }

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::StopHouseKeeping()
// Stop housekeeping
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::StopHouseKeeping()
    {
    iHeartBeatTimer->StopTimer();
    }

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::ContinueHouseKeeping()
// Continue housekeeping
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::ContinueHouseKeeping()
    {
    iHeartBeatTimer->ContinueTimer();
    }

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::ForceHouseKeeping()
// Force housekeeping
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::ForceHouseKeeping()
    {
    DoHouseKeeping();
    }

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::StartL
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::CompletionCallback(void *aCookie, cpix_JobId aJobId)
    {
    if ( !iCallBackValid )
        {
        // CPiX layer could call this callback function after CHouseKeepingHandler
        // is already deleted.
        return;
        }
    
    CHouseKeepingHandler* object = (CHouseKeepingHandler*)aCookie;

    // Sanity check
    if (!object || object->iPendingJobId != aJobId)
        {
        return;
        }
    
    // Call the asyncronizers completion code
    CCPixAsyncronizer* asyncronizer = object->iAsyncronizer;
    asyncronizer->CompletionCallback();
    }


// -----------------------------------------------------------------------------
// CSearchServer::HandleHeartBeatL()
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::HandleHeartBeatL()
    {
    DoHouseKeeping();
    }

// -----------------------------------------------------------------------------
// CSearchServer::HandleAsyncronizerComplete()
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::HandleAsyncronizerComplete(TCPixTaskType /*aType*/,
        TInt aError, const RMessage2& /*aMessage*/)
    {
    iIsPending = EFalse;
    if (aError == KErrNone)
        {
        cpix_Result result;
        cpix_asyncDoHousekeepingResults(&result, iPendingJobId);
        cpix_ClearError(&result);
        }
    }

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::CHouseKeepingHandler
// -----------------------------------------------------------------------------
//
CHouseKeepingHandler::CHouseKeepingHandler()
	{
	iCallBackValid = ETrue;
	}
	
// -----------------------------------------------------------------------------
// CHouseKeepingHandler::ConstructL
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::ConstructL()
	{
	iAsyncronizer = CCPixAsyncronizer::NewL();
	}

// -----------------------------------------------------------------------------
// CHouseKeepingHandler::DoHouseKeeping
// -----------------------------------------------------------------------------
//
void CHouseKeepingHandler::DoHouseKeeping()
    {
    if ( iIsPending )
        {
        // Sanity check. If previous house keeping operation is still 
        // ongoing just ignore house keeping this time.
        return;
        }
    
    cpix_Result result;
    iPendingJobId = cpix_asyncDoHousekeeping(&result, (void*)this, &CompletionCallback);
    
    TRAP_IGNORE( LOG_PLAYER_RECORD( CLogPlayerRecorder::LogHouseKeepL() ) );
    
    if ( cpix_Failed( &result ) )
        {
        // Clean error to avoid memory leaks.
        cpix_ClearError(&result);
        }
    else
        {
        iAsyncronizer->Start(ECPixTaskTypeHouseKeeping, this, iMessage);
        iIsPending = ETrue;
        }
    }