libraries/qr3/inc/QR3Dll.h
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Thu, 26 Aug 2010 00:49:35 +0100
changeset 37 534b01198c2d
parent 0 7f656887cf89
permissions -rw-r--r--
Added ENotifyKeypresses and ECaptureCtrlC flags to CCommandBase. Commands can now get keypresses and handle ctrl-C via callbacks instead of having to implement custom active objects. As part of this extended the CCommandBase extension interface to MCommandExtensionsV2 for the new virtual functions KeyPressed(TUint aKeyCode, TUint aModifiers) and CtrlCPressed(). sudo now cleans up correctly by using ECaptureCtrlC.

// QR3Dll.h
// 
// Copyright (c) 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 QR3DLL_H
#define QR3DLL_H

#include <e32base.h>
#include <e32property.h>
#include <fshell/common.mmh>

class RFile;
class RMemoryAccess;


// Deprecated, use RProxyAllocatorHelper instead
// Break dependancy on analyseheap
class THeapDetails
	{
public:
	/** Base address of the heap. Not very useful. */
	TUint8* iBase;
	/** First free cell on the heap. Not very useful either. */
	TUint8* iFirstFree;
	/** Top address of the heap. Not very useful. */
	TUint8* iTop;
	/** Size of heap. This includes free space. */
	TInt iSize;
	/** Size of a heap cell header. This is not directly useful, but is necessary
	    when calculating the amount of free space. */
	TInt iCellHeaderSize;
	/** Total allocated space in the heap. This excludes cell headers. */
	TInt iTotalAllocSize;
	/** Number of allocated cells on the heap. */
	TInt iCellCount;
	/** Returns the amount of free space on the heap. This is the size of the heap,
	    minus the free space, minus the space occupied by the heap cell headers. */
	inline TInt FreeSpace() 
		{
		return iSize - iTotalAllocSize - (iCellHeaderSize * iCellCount);
		}
	};

// Deprecated, use RProxyAllocatorHelper instead
class TTomsciHeapDetails : public THeapDetails
	{
public:
	TInt iMaxSize;
	TInt iMinSize;
	TInt iNumUnusedPages;
	TInt iFragmentedSpaceNotInPages; // size of the free space minus iNumUnusedPages*KPageSize
	};

// Deprecated, use RProxyAllocatorHelper instead
class RProxyHeap : public RHeap
	{
public:
#ifdef FSHELL_ANALYSEHEAP_SUPPORT
	TInt MinLength() { return iMinLength; }
	TInt MaxLength() { return iMaxLength; }
	using RHeap::iFree;
	using RHeap::iTop;
	using RHeap::GetAddress;
#endif
	using RAllocator::iCellCount;
	using RAllocator::iTotalAllocSize;

	IMPORT_C RProxyHeap(RMemoryAccess& aMem, TUint aThreadId);

	IMPORT_C void GetHeapDetailsL(THeapDetails& aDetails);
	IMPORT_C void DumpHeapToSuitableFileInDirectoryL(TFileName& aName); // pass in directory path in aName, it returns the file name
	IMPORT_C void DumpHeapToFileL(const TDesC& aFileName);
	IMPORT_C void DumpHeapL(RFile& aDumpFile);


public:
	RMemoryAccess& iMem;
	TUint iThreadId;
	TUint iPadding[6];
	};

IMPORT_C void GetHeapDetailsL(THeapDetails& aDetails, RProxyHeap& heap); // Deprecated, use RProxyAllocatorHelper instead

NONSHARABLE_CLASS(CPropertyManager) : public CActive
	{
public:
	IMPORT_C static CPropertyManager* NewL(TCallBack aCallback);
	IMPORT_C void SetPropertyFromStringL(const TDesC& aString);
	IMPORT_C HBufC* GetValueL();
	IMPORT_C TInt ChangeProperty(TUint aCategory, TUint aKey);

	inline TInt Category() { return iCat; }
	inline TInt Key() { return iKey; }

	~CPropertyManager();

private:
	void RunL();
	void DoCancel();
	CPropertyManager(TCallBack aCallback);
	void Watch();

private:
	RProperty iProperty;
	RProperty::TType iPropertyType;
	TUint iCat;
	TUint iKey;
	TCallBack iChangedFn;
	};

//////// Key capturing stuff

// The simple interface for people who only want simple callbacks equivalent to EEventKey events.
class MCaptureInterface
	{
public:
	virtual void CapturedKeyPressedL(TInt aIdentifier)=0;
	};

/*
class MDetailedCaptureInterface : public MCaptureInterface
	{
public:
	// If you implement both overloads of CapturedKeyPressedL, this one will be called {before,after} the simple one above
	virtual void CapturedKeyPressedL(TInt aIdentifier, const TKeyEvent& aKeyEvent, TEventCode aType)=0;
	};
*/

struct SCapture;

NONSHARABLE_CLASS(CKeyCapturer) : public CActive
	{
public:
	IMPORT_C static CKeyCapturer* GetCapturerL();
	IMPORT_C static void DeleteCapturer();
	IMPORT_C void AddCaptureL(MCaptureInterface* aClient, TInt aIdentifier, TInt aKeyCode);
	IMPORT_C void AddCaptureL(MCaptureInterface* aClient, TInt aIdentifier, TInt aKeyCode, TInt aScanCode, TInt aCapturePriority);
	IMPORT_C void AddLongCaptureL(MCaptureInterface* aClient, TInt aIdentifier, TInt aKeyCode, TInt aScanCode); // Annoying as it is, the scan code is required to sucessfully perform a long capture across window groups
	IMPORT_C void AddLongCaptureL(MCaptureInterface* aClient, TInt aIdentifier, TInt aKeyCode, TInt aScanCode, TInt aCapturePriority);
	//void AddCaptureL(MDetailedCaptureInterface* aClient, TInt aIdentifier, TInt aKeyCode); // Can't do a long capture and get detailed info back - it's too confusing to support
	IMPORT_C void RemoveCapture(MCaptureInterface* aClient, TInt aIdentifier);
	IMPORT_C TInt IsCaptured(TInt aIdentifier); // Returns the keycode it's captured as
	IMPORT_C TInt IsCaptured(TInt aIdentifier, TBool& aIsLong);
	IMPORT_C void PushCurrentCapturesL(); // Removes all current captures. They may be restored by calling PopCapturesL(). This function may be called repeatedly, you must call Pop once for each push
	IMPORT_C void PopCapturesL();
	IMPORT_C TInt GetScanCodeOfLastEvent(); // This is only usefully called from within CapturedKeyPressedL

	~CKeyCapturer();
	void RunL();
	void DoCancel();
	TInt RunError(TInt aError);

private:
	static CKeyCapturer* NewLC();
	CKeyCapturer();
	void ConstructL();
	void CancelCapture(SCapture& cap);
	void AddCaptureL(SCapture& cap);
	void RemoveDummyForCapture(const SCapture& aCapture);

private:
	enum
		{
		EOpaquePadding1 = 12,
		EOpaquePadding2 = 8,
		};
	// Data structures are not exposed
	TUint8 iOpaque1[EOpaquePadding1];
	TUint8 iOpaque2[EOpaquePadding2];
	TAny* iOpaque3; 
	TAny* iOpaque4;
	TInt32 iUsedSpareKeys; // Used for doing long captures
	TInt iLastEventScanCode;
	};

#ifdef FSHELL_QR3_SUPPORT_LOGGINGALLOCATOR
#include <fshell/LoggingAllocator.h> // Old definition was in this header, so for compatibility pull it in
#endif

enum TKernelObjectType
	{
	EListProcess,
	EListThread,
	EListChunk,
	EListServer,
	EListCodeSeg,
	EListHal,
	EListWindowGroups,
	EListMimeTypes,
	EListOpenFiles,
	EListFeatureReg,
	EListMessageQueue,
	EListMutex,
	EListSemaphore,
	EListTimer,
	};

class MQikListBoxModel;
class CKernListBoxModel;
class RClogger;

NONSHARABLE_CLASS(CKernelObjectList) : public CBase
	{
public:
	IMPORT_C static CKernelObjectList* NewL(RMemoryAccess* aMemAccess); // aMemAccess can be null
	~CKernelObjectList();

	IMPORT_C void SetCurrentType(TKernelObjectType aType);
	IMPORT_C void RefreshDataL(TInt aIndex=-1); // -1 means refresh all
	IMPORT_C MQikListBoxModel* GetQikListBoxModel(); // Returns an object suitable for controlling a UIQ3 list box.
	IMPORT_C void SetInfoChangedCallback(TInt aIndex, const TCallBack& aCallback); // Sets up a callback that will be completed whenever the model detects that aIndex's entry is out of date. Clunky, should be replaced with something neater...

	IMPORT_C TInt Count() const;
	
	// Following two functions are deprecated in favour of GetInfoByIndexL
	IMPORT_C void GetInfoL(TInt aIndex, RBuf& aTitle, RBuf& aInfo); // aInfo is a one-liner
	IMPORT_C void GetVerboseInfoL(TInt aIndex, RBuf& aTitle, RBuf& aInfo); // aInfo is multi-line, formatted with LFs
	
	IMPORT_C TInt GetInfoByIndexL(TInt aIndex, TBool aVerbose, RBuf& aTitle, RBuf& aInfo); // Returns the item id if supported by the current type
	IMPORT_C void GetInfoByIdL(TInt aId, TBool aVerbose, RBuf& aTitle, RBuf& aInfo); // Looks up by id rather than index. Id is specific to the current type - for threads it is thread ID, for others it may be arbitrary

	IMPORT_C void DumpAllInfoL(RClogger& aClogger);

private:
	CKernelObjectList(RMemoryAccess* aMemAccess);
	void ConstructL();

private:
	RMemoryAccess* iMemAccess;
	CKernListBoxModel* iModel;
	TKernelObjectType iCurrent;
	};

IMPORT_C TInt StartNotifierProxyThreadFunction(TAny*);
IMPORT_C TInt ShutdownProxyNotifier();
IMPORT_C TBool NotifierProxyIsRunning();

IMPORT_C TInt ExeNameForSid(TUint aSid, RBuf& aBuf);

#endif