Migrated the writing fshell commands guide to the wiki.
// 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 analyseheapclass 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 insteadclass TTomsciHeapDetails : public THeapDetails {public: TInt iMaxSize; TInt iMinSize; TInt iNumUnusedPages; TInt iFragmentedSpaceNotInPages; // size of the free space minus iNumUnusedPages*KPageSize };// Deprecated, use RProxyAllocatorHelper insteadclass 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 insteadNONSHARABLE_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#endifenum 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