/*
* Copyright (c) 2006 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:   Transition server repository handler.
*
*/


#include "repositoryhandler.h"
#include <alflogger.h>
#include <centralrepository.h>

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
CRepositoryHandler::CRepositoryHandler(TInt aPriority, const TUid& aRepository, TInt aKey) :
    CActive(aPriority),
    iRepository(aRepository),
    iKey(aKey)
    {
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void CRepositoryHandler::ConstructL()
    {
    iCrep = CRepository::NewL(iRepository);
    __ALFFXLOGSTRING("CRepositoryHandler: Starting");
    CActiveScheduler::Add(this);
    RunL();
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
CRepositoryHandler* CRepositoryHandler::NewL(TInt aPriority, const TUid& aRepository, TUint32 aKey)
    {
    CRepositoryHandler* self = new (ELeave) CRepositoryHandler(aPriority, aRepository, aKey);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
CRepositoryHandler::~CRepositoryHandler()
    {
    Cancel();
    delete iCrep;
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void CRepositoryHandler::RunL()
    {
    iError = iCrep->NotifyRequest(iKey, iStatus);
    TInt value;
    TInt err = iCrep->Get(iKey, value);
    if( err == KErrNone )
    	{
    	iValue = value;
    	}
    
    if(iError == KErrNone)
    	{
    	SetActive();
    	iError = err;
    	}
    }
    
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
TInt CRepositoryHandler::GetValue(TInt& aValue)
	{
	if(iError != KErrNone) //if we had an error eariler
		{
		TInt value;
		iError = iCrep->Get(iKey, value); //try to get the value
		if(iError == KErrNone)
			{
			iValue = value;
			if (!IsActive())
			    {
    			iError = iCrep->NotifyRequest(iKey, iStatus); //try to start request
    			if(iError == KErrNone)
    				{
    				SetActive();
    				}
			    }
			}
		}
	aValue = iValue;
	return iError;
	}


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void CRepositoryHandler::DoCancel()
    {
    __ALFFXLOGSTRING("CRepositoryHandler: Canceled");
    iCrep->NotifyCancel(iKey);
    }
