// Copyright (c) 2004-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" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
// which accompanies this distribution, and is available
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// Representation of a task: 
// Includes both user-defined data (iInfo+iData) and data set by system
// construction from stream & accessors are exported for task executors
// 
//

#if !defined(__SCHTASK_H__)
#define __SCHTASK_H__

#if !defined(__SCHINFO_H__)
#include <schinfo.h>
#endif 

#include <s32file.h>


/**
@publishedPartner

When SYMBIAN_SECURE_TASK_SCHEDULER is defined, platform security
support functionality is included in Task Scheduler.

This means that:

(i) Scheduled executables will be passed a shared file handle to
the scheduled task file by the Task Scheduler.

(ii) The CScheduledTask::SecurityInfo() API is availble to
retrieve security information about the schedule creator.
*/
#ifndef SYMBIAN_SECURE_TASK_SCHEDULER
#define SYMBIAN_SECURE_TASK_SCHEDULER
#endif

/**
Class used by registered programs to access the scheduled task file store.

When tasks are due, the Task Scheduler encapsulates task information within 
CScheduledTask objects, and externalises them to a direct file store.

This file store is located in the task scheduler's private data cage and thus
cannot be accessed directly.  Instead the task scheduler passes a shared RFs and
RFile handle to the registered program.

The registered program can use the RFile::AdoptFromCreator API in conjunction
with the APIs provided by this class to access the scheduled task file store as
shown in the following example:

@code
	RFile file;
	TInt error = file.AdoptFromCreator(TScheduledTaskFile::FsHandleIndex(),
											TScheduledTaskFile::FileHandleIndex());
@endcode
@see CScheduledTask
@see RFile::AdoptFromCreator
@publishedAll
@released
*/
class TScheduledTaskFile
	{
public:
	IMPORT_C static TInt FsHandleIndex();
	IMPORT_C static TInt FileHandleIndex();
	};

/** 
The representation of a scheduled task that is passed to registered programs.

When tasks are due, the Task Scheduler encapsulates task information within 
CScheduledTask objects, and externalises them to a direct file store.

The root stream of the direct file store contains a 32 bit value, followed 
by the external representations of one or more CScheduledTask objects. The 
32 bit value is interpreted as a TInt32 and contains the number of CScheduledTask 
objects that follow in the stream.

The registered program can create successive CScheduledTask objects from this 
stream using the static NewLC() function.
 
@see TScheduledTaskFile
@see RStoreReadStream 
@publishedAll
@released
*/
class CScheduledTask : public CBase
	{
public:
	IMPORT_C static CScheduledTask* NewLC(RReadStream& aStream);
	~CScheduledTask();
	IMPORT_C const TTaskInfo& Info() const;
	IMPORT_C const HBufC& Data() const;
	IMPORT_C const TTsTime& ValidUntil() const;
	IMPORT_C TScheduleType ScheduleType() const;
	IMPORT_C const TSecurityInfo& SecurityInfo() const;
	
	// These methods only used by task scheduler server
	CScheduledTask(TTaskInfo& aInfo, 
					HBufC* aData, 
					TScheduleType aScheduleType,
					const TSecurityInfo& aSecurityInfo);

	TBool Due() const;
	void SetDue(TBool aDue);
	void OnDue(const TTsTime& aValidUntil);
	void DecRepeat();
	void Remove();
	void ExternalizeL(RWriteStream& aStream) const;
	//
	TInt ScheduleId() const;
	void SetScheduleId(TInt aScheduleId);	
	//
	TBool Persists() const;
	void SetPersists();
	//
	static TInt Offset();
	//
private:
	CScheduledTask();	
	void InternalizeL(RReadStream& aStream);
private:
	TPriQueLink iPLink;
	TTaskInfo iInfo;
	HBufC* iData;
	TTsTime iValidUntil;
	TBool iDue;
	TInt iScheduleId;
	TScheduleType iScheduleType;
	TSecurityInfo iSecurityInfo;
	TBool iPersists;
	};
	
/**
Streaming operators for TSecurityInfo
@internalComponent
*/	
RWriteStream& operator<<(RWriteStream& aWriteStream, 
						const TSecurityInfo& aSecurityInfo);

/**
Streaming operators for TSecurityInfo
@internalComponent
*/	
RReadStream& operator>>(RReadStream& aReadStream,
						TSecurityInfo& aSecurityInfo);

#endif
