// Copyright (c) 2007-2009 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:
//



/**
 @file
 @publishedPartner 
 @released
*/

#ifndef THREADDATA_H
#define THREADDATA_H

#include <streamelement.h>


/**
@publishedPartner 
@released

Class that represents a thread on the target. It is based on CStreamElementBase, so
it can be streamed between client and server.
It is used by the Core Dump server, its clients and the plugins.
*/
class CThreadInfo : public CStreamElementBase
{

public:

	IMPORT_C static CThreadInfo* NewL(  const TUint64	& aId,
										const TDesC		& aName, 
										const TUint64	& aProcessId,
										const TUint		& aPriority,
										const TLinAddr	& aSvcStackPtr,
										const TLinAddr	& aSvcStackAddr,
										const TUint		& aSvcStackSize,
										const TLinAddr	& aUsrStackAddr,
										const TUint		& aUsrStackSize);

	IMPORT_C static CThreadInfo* NewL( const TDesC8 & aStreamData );

	IMPORT_C ~CThreadInfo();

public:

	// Methods specific to CThreadInfo

	IMPORT_C const TUint64 & Id( ) const;

	IMPORT_C void NameL( const TDesC & aName );
	IMPORT_C const TDesC & Name() const;
	
	IMPORT_C const TUint64 & ProcessId( ) const;

	IMPORT_C TUint Priority( ) const;
	IMPORT_C TUint SvcStackPtr( ) const;
	IMPORT_C TUint SvcStackAddr( ) const;
	IMPORT_C TUint SvcStackSize( ) const;
	IMPORT_C TUint UsrStackAddr( ) const;
	IMPORT_C TUint UsrStackSize( ) const;

	IMPORT_C TBool Observed( ) const;
	IMPORT_C void Observed( TBool aFlag );
	
	IMPORT_C void SetLastCpuId(TInt32 aLastCpu); 
	IMPORT_C TInt32 LastCpuId() const;
	
	IMPORT_C void SetHeapBase(TUint32 aHeapSize); 
	IMPORT_C TUint32 HeapBase() const;
	
	IMPORT_C void SetHeapSize(TUint32 lastCpu); 
	IMPORT_C TUint32 HeapSize() const;
	
public:
	// Methods required by streaming interface 

	IMPORT_C TInt static MaxSize();

	IMPORT_C TInt Size() const;

	IMPORT_C void InternalizeL( RReadStream & aStream );

	IMPORT_C void ExternalizeL( RWriteStream & aStream, CBufFlat* buf );
	
private:

	CThreadInfo(	const TUint64	& aId,
					const TUint64	& aProcessId,
					const TUint		& aPriority,
					const TLinAddr	& aSvcStackPtr,
					const TLinAddr	& aSvcStackAddr,
					const TUint		& aSvcStackSize,
					const TLinAddr	& aUsrStackAddr,
					const TUint		& aUsrStackSize);

	CThreadInfo();

	void ConstructL( const TDesC & aName );

private:

	/** Symbian kernel thread id */
	TUint64				iId;

	/** Symbian kernel thread name */
	HBufC  *			iName;

	/** Symbian kernel process id of owning process */
	TUint64				iProcessId;

	/** Symbian kernel thread priority TThreadPriority */
	TUint				iPriority;

	/** Thread supervisor stack pointer */
	TLinAddr			iSvcStackPtr;

	/** Thread supervisor mode stack base address */
	TLinAddr			iSvcStackAddr;

	/** Thread supervisor mode stack size in bytes */
	TUint				iSvcStackSize;

	/** Thread user mode stack base address */
	TLinAddr			iUsrStackAddr;

	/** Thread user mode stack base size in bytes */
	TUint				iUsrStackSize;

	/** Set to ETrue if the thread is being explicitly observed for crashes 
	by the Core Dump Server. If only the owning process is being observed, 
	this should be EFalse. */
	TBool				iObserved;

	/** Externalized size */
	TUint				iSize;

	/** last cpu in use when crash occurred */
	TInt32 			iLastCpuId;  
	
	/** threads heap base */
	TInt32				iHeapBase;
	
	/** thread heap size  */
	TUint32				iHeapSize;

	// These are not internalised/externalised since they are spare
	TUint32 iSpare1;
	TUint32 iSpare2;

	};


/**
@publishedPartner 
@released

List of CThreadInfo object pointers.
@see CThreadInfo
@see RPointerArray
*/
typedef RPointerArray<CThreadInfo>	RThreadPointerList;


#endif // THREADDATA_H
