/*
 ============================================================================
 Name		: CDelayRuner.cpp
 Author	  : R. Drutsky
 Version	 : 1.0
 Copyright   : Copyright (c) 2010 Soft Industry
 Description : CCDelayRuner implementation
 ============================================================================
 */

#include "DelayRuner.h"
#include "zrtp_iface_system.h"

void zrtp_internal_delete_task_from_list(zrtp_stream_t* ctx, zrtp_retry_task_t* ztask);

CDelayRuner::CDelayRuner() :
	CActive(EPriorityLow) // Standard priority
	{
	}

CDelayRuner* CDelayRuner::NewLC()
	{
	CDelayRuner* self = new (ELeave) CDelayRuner();
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}

CDelayRuner* CDelayRuner::NewL()
	{
	CDelayRuner* self = CDelayRuner::NewLC();
	CleanupStack::Pop(); // self;
	return self;
	}

void CDelayRuner::ConstructL()
	{
	User::LeaveIfError(iTimer.CreateLocal()); // Initialize timer
	CActiveScheduler::Add(this); // Add to scheduler
	}

CDelayRuner::~CDelayRuner()
	{
	Cancel(); // Cancel any request, if outstanding
	iTimer.Close(); // Destroy the RTimer object
	// Delete instance variables if any
	}

void CDelayRuner::DoCancel()
	{
	iTimer.Cancel();
	}

void CDelayRuner::StartL(zrtp_stream_t *ctx, zrtp_retry_task_t* ztask)
	{
	Cancel(); // Cancel any request, just to be sure
	//iState = EUninitialized;
	iCtx = ctx;
	iZTask = ztask;
	iTimer.After(iStatus, ztask->timeout * 1000); // Set for later
	SetActive(); // Tell scheduler a request is active
	}

void CDelayRuner::RunL()
	{
	if (iStatus == KErrNone)
		{
		// Do something useful
		iZTask->_is_busy = 1 ; // may be we don't need this
		(iZTask->callback)(iCtx,iZTask);
		iZTask->_is_busy = 0 ; // may be we don't need this
		}
	zrtp_internal_delete_task_from_list(iCtx,iZTask);
	}

TInt CDelayRuner::RunError(TInt aError)
	{
	return aError;
	}