libraries/clogger/debugRouter/debugRouter.h
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Sat, 31 Jul 2010 19:07:57 +0100
changeset 23 092bcc217d9d
parent 0 7f656887cf89
permissions -rw-r--r--
Tidied iocli exports, build macro tweaks. Removed 4 overloads of CCommandBase::RunCommand[L] that are no longer used at all, and changed one more to not be exported as it's only used internally to iocli.dll. fixed builds on platforms that don't support btrace or any form of tracing.

// debugRouter.h
// 
// Copyright (c) 2007 - 2010 Accenture. All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the "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:
// Accenture - Initial contribution
//

#ifndef __DebugRouter_H__
#define __DebugRouter_H__

#ifndef __KERNEL_MODE__
#include <e32std.h>
#endif
#include <u32std.h>

_LIT(KDebugRouterName,"Clogger-DebugRouter");
class RChunk;

struct SCloggerCrashDumpArea
	{
	TInt iChunkHandle;
	TUint iOffset;
	TUint iSize;
	TBuf8<32> iName;
	};

struct SCreateChunkParams
	{
	TInt iHandleOfOtherThread;
	TInt iMaxSize;
	TInt iCommittedSize;
	TInt iChunkHandle; // Return value
	TInt iOtherThreadChunkHandle; // Return value, If iHandleOfOtherThread != 0
	};

struct SCloggerTraceInfo
	{
	TUint8 iTraceType; // 'P', 'K', 'U'
	TUint8 iReserved;
	TUint16 iLength; // Kern trace is always <=256 chars but unfortunately platsec diagnostics aren't!
	TUint32 iTickCount;
	TUint iThreadId;
	};

struct SDebugChunkHeader
	{
	TUint iStartOffset;
	TUint iEndOffset;
	TUint iOverflows; // Number of log statements that were dropped because the buffer was full (measured since last completion, not cumulative)
	};
	
class RCloggerDebugRouter : public RBusLogicalChannel
	{
public:
	enum TControl
		{
		EControlEnableRouting,
		EControlOpenChunk,
		ERequestGetData,
		EControlRegisterBuffers,
		EControlCreateAndOpenAChunk,
		EControlAdjustChunk,
		ENumRequests,  // Add new commands above this line
		EAllRequests= (1<<ENumRequests)-1
        };
	enum TEnableOption
		{
		EDisable,
		EEnableRouting,
		EEnableRoutingAndConsume,
		};
public:
	static TInt LoadDriver();
	static void CloseDriver();
	TInt Open();
	void Close();

public: // For retreiving RDebug::Print data
	TInt OpenChunk(RChunk& aChunk);
	void ReceiveData(TRequestStatus& aStatus);
	void CancelReceive();
	TInt EnableDebugRouting(TEnableOption aEnable);

public: // For registering buffers with the crash dumber (NOTE: requires support in the baseport to have any effect)
	// This supercedes any previous call to RegisterCrashDumpAreas. Therefore to unregister everything, call RegisterCrashDumpAreas(KNullDesC8)
	TInt RegisterCrashDumpAreas(const TDesC8& aCrashDumpAreas); // packed array of SCloggerCrashDumpAreas
	
	TInt CreateChunk(SCreateChunkParams& aParams); // returns chunk handle or error
	TInt AdjustChunk(RChunk& aChunk, TInt aNewSize);
	};

#ifndef __KERNEL_MODE__
// Inline implementations of user side interface

inline TInt RCloggerDebugRouter::LoadDriver()
	{	return User::LoadLogicalDevice(KDebugRouterName);	}
inline void RCloggerDebugRouter::CloseDriver()
	{	User::FreeLogicalDevice(KDebugRouterName);	}
inline void RCloggerDebugRouter::Close()
	{	RHandleBase::Close(); }
inline TInt RCloggerDebugRouter::Open()
	{	return DoCreate(KDebugRouterName,TVersion(1,0,0),KNullUnit,NULL,NULL); 	}
	
inline TInt RCloggerDebugRouter::EnableDebugRouting(TEnableOption aEnable)
	{	return DoControl(EControlEnableRouting, (TAny*)aEnable);	}

inline TInt RCloggerDebugRouter::OpenChunk(RChunk& aChunk)
	{	
	TInt res = DoControl(EControlOpenChunk);
	if (res >= 0) 
		{
		aChunk.SetHandle(res);
		return KErrNone;
		}
	return res;
	}

inline void RCloggerDebugRouter::ReceiveData(TRequestStatus& aStatus)
	{
	DoRequest(ERequestGetData, aStatus);
	}

inline void RCloggerDebugRouter::CancelReceive()
	{
	DoCancel(0xFFFFFFFF); // We only have 1 async request at the moment
	}

inline TInt RCloggerDebugRouter::RegisterCrashDumpAreas(const TDesC8& aCrashDumpAreas)
	{
	return DoControl(EControlRegisterBuffers, (TAny*)&aCrashDumpAreas);
	}

inline TInt RCloggerDebugRouter::CreateChunk(SCreateChunkParams& aParams)
	{
	return DoControl(EControlCreateAndOpenAChunk, (TAny*)&aParams);
	}

inline TInt RCloggerDebugRouter::AdjustChunk(RChunk& aChunk, TInt aNewSize)
	{
	return DoControl(EControlAdjustChunk, (TAny*)aChunk.Handle(), (TAny*)aNewSize);
	}

#endif //__KERNEL_MODE__

#endif //__DebugRouter_H__