--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/e32cmn.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,6796 @@
+// Copyright (c) 1994-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 "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:
+// e32\include\e32cmn.h
+//
+//
+
+#ifndef __E32CMN_H__
+#define __E32CMN_H__
+#include <e32const.h>
+
+extern "C" {
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that compares two memory buffers for equality.
+
+The two buffers are considered equal only if:
+
+1. the buffers have the same length
+
+and
+
+2. the binary content of both buffers is the same.
+
+@param aLeft The start address of the first buffer in the comparison.
+@param aLeftLen The length of the first buffer in the comparison.
+@param aRight The start address of the second buffer in the comparison.
+@param aRightLen The length of the second buffer in the comparison.
+
+@return Zero if both buffers are equal; non-zero, otherwise.
+
+@panic USER 88 In debug mode only, if aLeftL is negative,
+ and the function is called on the user side.
+@panic KERN-COMMON 88 In debug mode only, if aLeftL is negative,
+ and the function is called on the kernel side.
+@panic USER 89 In debug mode only, if aRightL is negative,
+ and the function is called on the user side.
+@panic KERN-COMMON 89 In debug mode only, if aRightL is negative,
+ and the function is called on the kernel side.
+*/
+IMPORT_C TInt memcompare(const TUint8* aLeft, TInt aLeftLen, const TUint8* aRight, TInt aRightLen);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that moves (copies) bytes in memory.
+
+The function assumes that the addresses are aligned on word boundaries,
+and that the length value is a multiple of 4.
+
+@param aTrg The target address.
+@param aSrc The source address.
+@param aLength The number of bytes to be moved.
+
+@return The target address.
+
+@panic USER 91 In debug mode only, if aLength is not a multiple of 4,
+ and the function is called on the user side.
+@panic KERN-COMMON 91 In debug mode only, if aLength is not a multiple of 4,
+ and the function is called on the kernel side.
+@panic USER 92 In debug mode only, if aSrc is not aligned on a word boundary,
+ and the function is called on the user side.
+@panic KERN-COMMON 92 In debug mode only, if aSrc is not aligned on a word boundary,
+ and the function is called on the kernel side.
+@panic USER 93 In debug mode only, if aTrg is not aligned on a word boundary,
+ and the function is called on the user side.
+@panic KERN-COMMON 93 In debug mode only, if aTrg is not aligned on a word boundary,
+ and the function is called on the kernel side.
+*/
+IMPORT_C TAny* wordmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that sets the specified number of bytes
+to binary zero.
+
+@param aTrg The start address.
+@param aLength The number of bytes to be set.
+
+@return The target address.
+*/
+IMPORT_C TAny* memclr(TAny* aTrg, unsigned int aLength);
+}
+
+
+
+
+#ifndef __TOOLS__
+extern "C" {
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that sets all of the specified number of bytes to
+the specified fill value.
+
+@param aTrg The start address.
+@param aValue The fill value (the first or junior byte).
+@param aLength The number of bytes to be set.
+
+@return The target address.
+*/
+ IMPORT_C TAny* memset(TAny* aTrg, TInt aValue, unsigned int aLength);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that copies bytes in memory.
+
+@param aTrg The target address.
+@param aSrc The source address.
+@param aLength The number of bytes to be moved.
+
+@return The target address.
+*/
+ IMPORT_C TAny* memcpy(TAny* aTrg, const TAny* aSrc, unsigned int aLength);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Nanokernel utility function that moves (copies) bytes in memory.
+
+@param aTrg The target address.
+@param aSrc The source address.
+@param aLength The number of bytes to be moved.
+
+@return The target address.
+*/
+ IMPORT_C TAny* memmove(TAny* aTrg, const TAny* aSrc, unsigned int aLength);
+}
+#else
+#include <string.h>
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Tests whether the specified value is less than or equal to the
+specified upper limit.
+
+@param aVal The value to be tested.
+@param aLimit The upper limit.
+
+@return True, if the value is less than or equal to the specified upper limit;
+ false, otherwise.
+*/
+inline TInt Lim(TInt aVal,TUint aLimit)
+ {return(((TUint)aVal)<=aLimit);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Tests whether the specified value is strictly less than the
+specified upper limit.
+
+@param aVal The value to be tested.
+@param aLimit The upper limit.
+
+@return True, if the value is strictly less than the specified upper limit;
+ false, otherwise.
+*/
+inline TInt LimX(TInt aVal,TUint aLimit)
+ {return(((TUint)aVal)<aLimit);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns the smaller of two values.
+
+@param aLeft The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The smaller value.
+*/
+template <class T>
+inline T Min(T aLeft,T aRight)
+ {return(aLeft<aRight ? aLeft : aRight);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns the smaller of two objects, where the right hand object is a treated
+as a TInt for the purpose of comparison.
+
+@param aLeft The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The smaller value.
+*/
+template <class T>
+inline T Min(T aLeft,TUint aRight)
+ {return(aLeft<(TInt)aRight ? aLeft : (T)aRight);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns the larger of two values.
+
+@param aLeft The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The larger value.
+*/
+template <class T>
+inline T Max(T aLeft,T aRight)
+ {return(aLeft<aRight ? aRight : aLeft);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns the larger of two objects, where the right hand object is a treated
+as a TInt for the purpose of comparison.
+
+@param aLeft The first value to be compared.
+@param aRight The second value to be compared.
+
+@return The larger value.
+*/
+template <class T>
+inline T Max(T aLeft,TUint aRight)
+ {return(aLeft<(TInt)aRight ? (TInt)aRight : aLeft);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Returns an absolute value.
+
+@param aVal The source value.
+
+@return The absolute value
+*/
+template <class T>
+inline T Abs(T aVal)
+ {return(aVal<0 ? -aVal : aVal);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Determines whether a specified value lies within a defined range of values.
+
+@param aMin The lower value of the range.
+@param aVal The value to be compared.
+@param aMax The higher value of the range.
+
+@return True, if the specified value lies within the range; false, otherwise.
+*/
+template <class T>
+inline TBool Rng(T aMin,T aVal,T aMax)
+ {return(aVal>=aMin && aVal<=aMax);}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Adds a value to a pointer.
+
+@param aPtr Pointer to an object of type T.
+@param aVal The value to be added.
+
+@return The resulting pointer value, as a pointer to a type T.
+*/
+template <class T,class S>
+inline T* PtrAdd(T* aPtr,S aVal)
+ {return((T*)(((TUint8*)aPtr)+aVal));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Subtracts a value from a pointer.
+
+@param aPtr Pointer to an object of type T.
+@param aVal The value to be added.
+
+@return The resulting pointer value, as a pointer to a type T.
+*/
+template <class T,class S>
+inline T* PtrSub(T* aPtr,S aVal)
+ {return((T*)(((TUint8*)aPtr)-aVal));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Aligns the specified value onto a 2-byte boundary.
+
+@param aValue The value to be aligned.
+
+@return The aligned value.
+*/
+template <class T>
+inline T Align2(T aValue)
+ {return((T)((((TUint)aValue)+sizeof(TUint16)-1)&~(sizeof(TUint16)-1)));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Aligns the specified value onto a 4-byte boundary.
+
+@param aValue The value to be aligned.
+
+@return The aligned value.
+*/
+template <class T>
+inline T Align4(T aValue)
+ {return((T)((((TUint)aValue)+sizeof(TUint32)-1)&~(sizeof(TUint32)-1)));}
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class which encapsulates a reference to an object within a wrapper.
+
+The wrapper object can be passed to a function as a value type. This allows
+a reference to be passed to a function as a value type.
+
+This wrapper object is commonly termed a value reference.
+*/
+template <class T>
+class TRefByValue
+ {
+public:
+ inline TRefByValue(T& aRef);
+ inline operator T&();
+private:
+ TRefByValue& operator=(TRefByValue aRef);
+private:
+ T &iRef;
+ };
+
+
+
+
+#if !defined (__KERNEL_MODE__)
+class TDesC16; // forward declaration for TChar member functions
+class TPtrC16; // forward declaration for TChar member functions
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Holds a character value and provides a number of utility functions to
+manipulate it and test its properties.
+
+For example, there are functions to convert the character
+to uppercase and test whether or not it is a control character.
+
+The character value is stored as a 32-bit unsigned integer. The shorthand
+"TChar value" is used to describe the character value wrapped by a TChar
+object.
+
+TChar can be used to represent Unicode values outside plane 0 (that is, the
+extended Unicode range from 0x10000 to 0xFFFFF). This differentiates it from
+TText which can only be used for 16-bit Unicode character values.
+
+@see TText
+*/
+class TChar
+ {
+public:
+
+
+ /**
+ General Unicode character category.
+
+ The high nibble encodes the major category (Mark, Number, etc.) and a low
+ nibble encodes the subdivisions of that category.
+
+ The category codes can be used in three ways:
+
+ (i) as unique constants: there is one for each Unicode category, with a
+ name of the form
+ @code
+ E<XX>Category
+ @endcode
+ where
+ @code
+ <XX>
+ @endcode
+ is the category name given by
+ the Unicode database (e.g., the constant ELuCategory is used for lowercase
+ letters, category Lu);
+
+ (ii) as numbers in certain ranges: letter categories are all <= EMaxLetterCategory;
+
+ (iii) as codes in which the upper nibble gives the category group
+ (e.g., punctuation categories all yield TRUE for
+ the test (category & 0xF0) ==EPunctuationGroup).
+ */
+ enum TCategory
+ {
+ /**
+ Alphabetic letters.
+
+ Includes ELuCategory, ELlCategory and ELtCategory.
+ */
+ EAlphaGroup = 0x00,
+
+
+ /**
+ Other letters.
+
+ Includes ELoCategory.
+ */
+ ELetterOtherGroup = 0x10,
+
+
+ /**
+ Letter modifiers.
+
+ Includes ELmCategory.
+ */
+ ELetterModifierGroup = 0x20,
+
+
+ /**
+ Marks group.
+
+ Includes EMnCategory, EMcCategory and EMeCategory.
+ */
+ EMarkGroup = 0x30,
+
+
+ /**
+ Numbers group.
+
+ Includes ENdCategory, ENlCategory and ENoCategory.
+ */
+ ENumberGroup = 0x40,
+
+
+ /**
+ Punctuation group.
+
+ IncludesEPcCategory, PdCategory, EpeCategory, EPsCategory and EPoCategory.
+ */
+ EPunctuationGroup = 0x50,
+
+
+ /**
+ Symbols group.
+
+ Includes ESmCategory, EScCategory, ESkCategory and ESoCategory.
+ */
+ ESymbolGroup = 0x60,
+
+
+ /**
+ Separators group.
+
+ Includes EZsCategory, EZlCategory and EZlpCategory.
+ */
+ ESeparatorGroup = 0x70,
+
+
+ /**
+ Control, format, private use, unassigned.
+
+ Includes ECcCategory, ECtCategory, ECsCategory,
+ ECoCategory and ECnCategory.
+ */
+ EControlGroup = 0x80,
+
+
+ /**
+ The highest possible groups category.
+ */
+ EMaxAssignedGroup = 0xE0,
+
+
+ /**
+ Unassigned to any other group.
+ */
+ EUnassignedGroup = 0xF0,
+
+
+ /**
+ Letter, Uppercase.
+ */
+ ELuCategory = EAlphaGroup | 0,
+
+
+ /**
+ Letter, Lowercase.
+ */
+ ELlCategory = EAlphaGroup | 1,
+
+
+ /**
+ Letter, Titlecase.
+ */
+ ELtCategory = EAlphaGroup | 2,
+
+
+ /**
+ Letter, Other.
+ */
+ ELoCategory = ELetterOtherGroup | 0,
+
+
+ /**
+ The highest possible (non-modifier) letter category.
+ */
+ EMaxLetterCategory = ELetterOtherGroup | 0x0F,
+
+ /**
+ Letter, Modifier.
+ */
+ ELmCategory = ELetterModifierGroup | 0,
+
+
+ /**
+ The highest possible letter category.
+ */
+ EMaxLetterOrLetterModifierCategory = ELetterModifierGroup | 0x0F,
+
+ /**
+ Mark, Non-Spacing
+ */
+ EMnCategory = EMarkGroup | 0,
+
+
+ /**
+ Mark, Combining.
+ */
+ EMcCategory = EMarkGroup | 1,
+
+
+ /**
+ Mark, Enclosing.
+ */
+ EMeCategory = EMarkGroup | 2,
+
+
+ /**
+ Number, Decimal Digit.
+ */
+ ENdCategory = ENumberGroup | 0,
+
+
+ /**
+ Number, Letter.
+ */
+ ENlCategory = ENumberGroup | 1,
+
+
+ /**
+ Number, Other.
+ */
+ ENoCategory = ENumberGroup | 2,
+
+
+ /**
+ Punctuation, Connector.
+ */
+ EPcCategory = EPunctuationGroup | 0,
+
+
+ /**
+ Punctuation, Dash.
+ */
+ EPdCategory = EPunctuationGroup | 1,
+
+
+ /**
+ Punctuation, Open.
+ */
+ EPsCategory = EPunctuationGroup | 2,
+
+
+ /**
+ Punctuation, Close.
+ */
+ EPeCategory = EPunctuationGroup | 3,
+
+
+ /**
+ Punctuation, Initial Quote
+ */
+ EPiCategory = EPunctuationGroup | 4,
+
+
+ /**
+ Punctuation, Final Quote
+ */
+ EPfCategory = EPunctuationGroup | 5,
+
+
+ /**
+ Punctuation, Other.
+ */
+ EPoCategory = EPunctuationGroup | 6,
+
+
+ /**
+ Symbol, Math.
+ */
+ ESmCategory = ESymbolGroup | 0,
+
+
+ /**
+ Symbol, Currency.
+ */
+ EScCategory = ESymbolGroup | 1,
+
+
+ /**
+ Symbol, Modifier.
+ */
+ ESkCategory = ESymbolGroup | 2,
+
+
+ /**
+ Symbol, Other.
+ */
+ ESoCategory = ESymbolGroup | 3,
+
+
+ /**
+ The highest possible graphic character category.
+ */
+ EMaxGraphicCategory = ESymbolGroup | 0x0F,
+
+
+ /**
+ Separator, Space.
+ */
+ EZsCategory = ESeparatorGroup | 0,
+
+
+ /**
+ The highest possible printable character category.
+ */
+ EMaxPrintableCategory = EZsCategory,
+
+
+ /**
+ Separator, Line.
+ */
+ EZlCategory = ESeparatorGroup | 1,
+
+
+ /**
+ Separator, Paragraph.
+ */
+ EZpCategory = ESeparatorGroup | 2,
+
+
+ /**
+ Other, Control.
+ */
+ ECcCategory = EControlGroup | 0,
+
+
+ /**
+ Other, Format.
+ */
+ ECfCategory = EControlGroup | 1,
+
+
+ /**
+ The highest possible category for assigned 16-bit characters; does not
+ include surrogates, which are interpreted as pairs and have no meaning
+ on their own.
+ */
+ EMaxAssignedCategory = EMaxAssignedGroup | 0x0F,
+
+
+ /**
+ Other, Surrogate.
+ */
+ ECsCategory = EUnassignedGroup | 0,
+
+
+ /**
+ Other, Private Use.
+ */
+ ECoCategory = EUnassignedGroup | 1,
+
+
+ /**
+ Other, Not Assigned.
+ */
+ ECnCategory = EUnassignedGroup | 2
+ };
+
+
+ /**
+ The bi-directional Unicode character category.
+
+ For more information on the bi-directional algorithm, see Unicode Technical
+ Report No. 9 available at: http://www.unicode.org/unicode/reports/tr9.
+ */
+ enum TBdCategory
+ {
+ /**
+ Left to right.
+ */
+ ELeftToRight, // L Left-to-Right
+
+
+ /**
+ Left to right embedding.
+ */
+ ELeftToRightEmbedding, // LRE Left-to-Right Embedding
+
+
+ /**
+ Left-to-Right Override.
+ */
+ ELeftToRightOverride, // LRO Left-to-Right Override
+
+
+ /**
+ Right to left.
+ */
+ ERightToLeft, // R Right-to-Left
+
+
+ /**
+ Right to left Arabic.
+ */
+ ERightToLeftArabic, // AL Right-to-Left Arabic
+
+
+ /**
+ Right to left embedding.
+ */
+ ERightToLeftEmbedding, // RLE Right-to-Left Embedding
+
+
+ /**
+ Right-to-Left Override.
+ */
+ ERightToLeftOverride, // RLO Right-to-Left Override
+
+
+ /**
+ Pop Directional Format.
+ */
+ EPopDirectionalFormat, // PDF Pop Directional Format
+
+
+ /**
+ European number.
+ */
+ EEuropeanNumber, // EN European Number
+
+
+ /**
+ European number separator.
+ */
+ EEuropeanNumberSeparator, // ES European Number Separator
+
+
+ /**
+ European number terminator.
+ */
+ EEuropeanNumberTerminator, // ET European Number Terminator
+
+
+ /**
+ Arabic number.
+ */
+ EArabicNumber, // AN Arabic Number
+
+
+ /**
+ Common number separator.
+ */
+ ECommonNumberSeparator, // CS Common Number Separator
+
+
+ /**
+ Non Spacing Mark.
+ */
+ ENonSpacingMark, // NSM Non-Spacing Mark
+
+
+ /**
+ Boundary Neutral.
+ */
+ EBoundaryNeutral, // BN Boundary Neutral
+
+
+ /**
+ Paragraph Separator.
+ */
+ EParagraphSeparator, // B Paragraph Separator
+
+
+ /**
+ Segment separator.
+ */
+ ESegmentSeparator, // S Segment Separator
+
+
+ /**
+ Whitespace
+ */
+ EWhitespace, // WS Whitespace
+
+
+ /**
+ Other neutrals; all other characters: punctuation, symbols.
+ */
+ EOtherNeutral // ON Other Neutrals
+ };
+
+
+ /**
+ Notional character width as known to East Asian (Chinese, Japanese,
+ Korean (CJK)) coding systems.
+ */
+ enum TCjkWidth
+ {
+ /**
+ Includes 'ambiguous width' defined in Unicode Technical Report 11: East Asian Width
+ */
+ ENeutralWidth,
+
+
+ /**
+ Character which occupies a single cell.
+ */
+ EHalfWidth, // other categories are as defined in the report
+
+
+ /**
+ Character which occupies 2 cells.
+ */
+ EFullWidth,
+
+
+ /**
+ Characters that are always narrow and have explicit full-width
+ counterparts. All of ASCII is an example of East Asian Narrow
+ characters.
+ */
+ ENarrow,
+
+ /**
+ Characters that are always wide. This category includes characters that
+ have explicit half-width counterparts.
+ */
+ EWide
+ };
+
+
+ /**
+ @deprecated
+
+ Encoding systems used by the translation functions.
+ */
+ enum TEncoding
+ {
+ /**
+ The Unicode encoding.
+ */
+ EUnicode,
+
+
+ /**
+ The shift-JIS encoding (used in Japan).
+ */
+ EShiftJIS
+ };
+
+
+ /**
+ Flags defining operations to be performed using TChar::Fold().
+
+ The flag values are passed to the Fold() funtion.
+
+ @see TChar::Fold
+ */
+ enum
+ {
+ /**
+ Convert characters to their lower case form if any.
+ */
+ EFoldCase = 1,
+
+
+ /**
+ Strip accents
+ */
+ EFoldAccents = 2,
+
+
+ /**
+ Convert digits representing values 0..9 to characters '0'..'9'
+ */
+ EFoldDigits = 4,
+
+
+ /**
+ Convert all spaces (ordinary, fixed-width, ideographic, etc.) to ' '
+ */
+ EFoldSpaces = 8,
+
+
+ /**
+ Convert hiragana to katakana.
+ */
+ EFoldKana = 16,
+
+
+ /**
+ Fold fullwidth and halfwidth variants to their standard forms
+ */
+ EFoldWidth = 32,
+
+
+ /**
+ Perform standard folding operations, i.e.those done by Fold() with no argument
+ */
+ EFoldStandard = EFoldCase | EFoldAccents | EFoldDigits | EFoldSpaces,
+
+
+ /**
+ Perform all possible folding operations
+ */
+ EFoldAll = -1
+ };
+
+
+ struct TCharInfo
+ /**
+ A structure to hold information about a Unicode character.
+
+ An object of this type is passed to TChar::GetInfo().
+
+ @see TChar::GetInfo
+ */
+ {
+ /**
+ General category.
+ */
+ TCategory iCategory;
+
+
+ /**
+ Bi-directional category.
+ */
+ TBdCategory iBdCategory;
+
+
+ /**
+ Combining class: number (currently) in the range 0..234
+ */
+ TInt iCombiningClass;
+
+
+ /**
+ Lower case form.
+ */
+ TUint iLowerCase;
+
+
+ /**
+ Upper case form.
+ */
+ TUint iUpperCase;
+
+
+ /**
+ Title case form.
+ */
+ TUint iTitleCase;
+
+
+ /**
+ True, if the character is mirrored.
+ */
+ TBool iMirrored;
+
+
+ /**
+ Integer numeric value: -1 if none, -2 if a fraction.
+ */
+ TInt iNumericValue;
+ };
+
+ inline TChar();
+ inline TChar(TUint aChar);
+ inline TChar& operator-=(TUint aChar);
+ inline TChar& operator+=(TUint aChar);
+ inline TChar operator-(TUint aChar);
+ inline TChar operator+(TUint aChar);
+ inline operator TUint() const;
+#ifndef __KERNEL_MODE__
+ inline void Fold();
+ inline void LowerCase();
+ inline void UpperCase();
+ inline TBool Eos() const;
+ IMPORT_C TUint GetUpperCase() const;
+ IMPORT_C TUint GetLowerCase() const;
+ IMPORT_C TBool IsLower() const;
+ IMPORT_C TBool IsUpper() const;
+ IMPORT_C TBool IsAlpha() const;
+ IMPORT_C TBool IsDigit() const;
+ IMPORT_C TBool IsAlphaDigit() const;
+ IMPORT_C TBool IsHexDigit() const;
+ IMPORT_C TBool IsSpace() const;
+ IMPORT_C TBool IsPunctuation() const;
+ IMPORT_C TBool IsGraph() const;
+ IMPORT_C TBool IsPrint() const;
+ IMPORT_C TBool IsControl() const;
+ inline void Fold(TInt aFlags);
+ inline void TitleCase();
+ IMPORT_C TUint GetTitleCase() const;
+ IMPORT_C TBool IsTitle() const;
+ IMPORT_C TBool IsAssigned() const;
+ IMPORT_C void GetInfo(TCharInfo& aInfo) const;
+ IMPORT_C TCategory GetCategory() const;
+ IMPORT_C TBdCategory GetBdCategory() const;
+ IMPORT_C TInt GetCombiningClass() const;
+ IMPORT_C TBool IsMirrored() const;
+ IMPORT_C TInt GetNumericValue() const;
+ IMPORT_C TCjkWidth GetCjkWidth() const;
+ IMPORT_C static TBool Compose(TUint& aResult,const TDesC16& aSource);
+ IMPORT_C TBool Decompose(TPtrC16& aResult) const;
+
+protected:
+ inline void SetChar(TUint aChar);
+#endif
+private:
+ TUint iChar;
+ __DECLARE_TEST;
+ };
+
+#include <e32des8.h>
+#ifndef __KERNEL_MODE__
+#include <e32des16.h>
+#endif
+
+
+
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+#define __Size (sizeof(TUint)/sizeof(TUint16))
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit
+or 16-bit type is required.
+
+@see TDesC8
+@see TDesC16
+*/
+typedef TDesC16 TDesC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable pointer descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit
+or 16-bit type is required.
+
+@see TPtrC8
+@see TPtrC16
+*/
+typedef TPtrC16 TPtrC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit
+or 16-bit type is required.
+
+@see TDes8
+@see TDes16
+*/
+typedef TDes16 TDes;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable pointer descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit
+or 16-bit type is required.
+
+@see TPtr8
+@see TPtr16
+*/
+typedef TPtr16 TPtr;
+
+
+
+
+#ifndef __KERNEL_MODE__
+/**
+@publishedAll
+@released
+
+Defines a build-independent heap descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit
+or 16-bit type is required.
+
+@see HBufC8
+@see HBufC16
+*/
+typedef HBufC16 HBufC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent descriptor overflow handler.
+
+A 16-bit build variant is generated for a Unicode, non-kernel
+mode build.
+
+A build-independent type should always be used unless an explicit 8-bit
+or 16-bit type is required.
+
+@see TDes8Overflow
+@see TDes16Overflow
+*/
+typedef TDes16Overflow TDesOverflow;
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent resizable buffer descriptor.
+
+A 16-bit build variant is generated for a Unicode, non-kernel mode build.
+
+A build-independent type should always be used unless an explicit 8-bit
+or 16-bit type is required.
+
+@see RBuf8
+@see RBuf16
+*/
+typedef RBuf16 RBuf;
+
+#endif
+#else
+#define __Size (sizeof(TUint)/sizeof(TUint8))
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit
+or 16-bit build variant is required.
+
+@see TDesC8
+@see TDesC16
+*/
+typedef TDesC8 TDesC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent non-modifiable pointer descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit
+or 16-bit build variant is required.
+
+@see TPtrC8
+@see TPtrC16
+*/
+typedef TPtrC8 TPtrC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit
+or 16-bit build variant is required.
+
+@see TDes8
+@see TDes16
+*/
+typedef TDes8 TDes;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent modifiable pointer descriptor.
+
+An 8-bit build variant is generated for a non-Unicode build.
+
+This build-independent type should always be used unless an explicit 8-bit
+or 16-bit build variant is required.
+
+@see TPtr8
+@see TPtr16
+*/
+typedef TPtr8 TPtr;
+#ifndef __KERNEL_MODE__
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent heap descriptor.
+
+An 8-bit build variant is generated for a non-Unicode, non-kernel
+mode build.
+
+This build-independent type should always be used unless an explicit 8-bit
+or 16-bit build variant is required.
+
+@see HBufC8
+@see HBufC16
+*/
+typedef HBufC8 HBufC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent descriptor overflow handler.
+
+An 8-bit build variant is generated for a non-Unicode, non-kernel
+mode build.
+
+This build-independent type should always be used unless an explicit 8-bit
+or 16-bit build variant is required.
+
+@see TDes8Overflow
+@see TDes16Overflow
+*/
+typedef TDes8Overflow TDesOverflow;
+
+
+/**
+@publishedAll
+@released
+
+Defines a build-independent resizable buffer descriptor.
+
+An 8-bit build variant is generated for a non-Unicode, non-kernel mode build.
+
+This build-independent type should always be used unless an explicit 8-bit
+or 16-bit build variant is required.
+
+@see RBuf8
+@see RBuf16
+*/
+typedef RBuf8 RBuf;
+
+#endif
+#endif
+
+
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+typedef TBufCBase16 TBufCBase;
+#else
+typedef TBufCBase8 TBufCBase;
+#endif
+
+/**
+@publishedAll
+@released
+
+A build-independent non-modifiable buffer descriptor.
+
+This is a descriptor class which provides a buffer of fixed length for
+containing and accessing TUint16 or TUint8 data, depending on the build.
+
+The class intended for instantiation. The data that the descriptor represents
+is part of the descriptor object itself.
+
+The class is templated, based on an integer value which defines the size of
+the descriptor's data area.
+
+The data is intended to be accessed, but not modified; however, it can be
+completely replaced using the assignment operators of this class. The base
+class provides the functions through which the data is accessed.
+
+This class derives from TBufCBase16 for a Unicode, non-kernel build, but
+derives from TBufCBase8 for a non-Unicode build.
+
+@see TDesC
+@see TDesC8
+@see TDesC16
+@see TPtr
+@see TPtr8
+@see TPtr16
+@see TBufC8
+@see TBufC16
+*/
+template <TInt S>
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+class TBufC : public TBufCBase16
+#else
+class TBufC : public TBufCBase8
+#endif
+ {
+public:
+ inline TBufC();
+ inline TBufC(const TText* aString);
+ inline TBufC(const TDesC& aDes);
+ inline TBufC<S>& operator=(const TText* aString);
+ inline TBufC<S>& operator=(const TDesC& aDes);
+ inline TPtr Des();
+private:
+ TText iBuf[__Align(S)];
+ };
+
+
+
+/**
+@publishedAll
+@released
+
+A build-independent modifiable buffer descriptor.
+
+This is a descriptor class which provides a buffer of fixed length for
+containing, accessing and manipulating TUint16 or TUint8 data, depending
+on the build.
+
+The class is intended for instantiation. The data that the descriptor represents
+is part of the descriptor object itself.
+
+The class is templated, based on an integer value which determines the size
+of the data area created as part of the buffer descriptor object; this is
+also the maximum length of the descriptor.
+
+The data is intended to be both accessed and modified. The base classes provide
+the functions through which the data is accessed.
+
+This class derives from TBufCBase16 for a Unicode, non-kernel build, but
+derives from TBufCBase8 for a non-Unicode build.
+
+@see TDesC
+@see TDesC8
+@see TDesC16
+@see TDes
+@see TDes8
+@see TDes16
+@see TPtr
+@see TPtr8
+@see TPtr16
+*/
+template <TInt S>
+#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
+class TBuf : public TBufBase16
+#else
+class TBuf : public TBufBase8
+#endif
+ {
+public:
+ inline TBuf();
+ inline explicit TBuf(TInt aLength);
+ inline TBuf(const TText* aString);
+ inline TBuf(const TDesC& aDes);
+ inline TBuf<S>& operator=(const TText* aString);
+ inline TBuf<S>& operator=(const TDesC& aDes);
+ inline TBuf<S>& operator=(const TBuf<S>& aBuf);
+private:
+ TText iBuf[__Align(S)];
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Value reference used in operator TLitC::__TRefDesC().
+
+@see TRefByValue
+*/
+typedef TRefByValue<const TDesC> __TRefDesC;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates literal text.
+
+This is always constructed using an _LIT macro.
+
+This class is build independent; i.e. for a non-Unicode build, an 8-bit build
+variant is generated; for a Unicode build, a 16 bit build variant is generated.
+
+The class has no explicit constructors. See the _LIT macro definition.
+*/
+template <TInt S>
+class TLitC
+ {
+public:
+ /**
+ @internalComponent
+ */
+ enum {BufferSize=S-1};
+ inline const TDesC* operator&() const;
+ inline operator const TDesC&() const;
+ inline const TDesC& operator()() const;
+ inline operator const __TRefDesC() const;
+public:
+#if !defined(_UNICODE) || defined(__KERNEL_MODE__)
+
+ /**
+ @internalComponent
+ */
+ typedef TUint8 __TText;
+#elif defined(__GCC32__)
+
+ /**
+ @internalComponent
+ */
+ typedef wchar_t __TText;
+#elif defined(__VC32__)
+
+ /**
+ @internalComponent
+ */
+ typedef TUint16 __TText;
+
+#elif defined(__CW32__)
+
+ /**
+ @internalComponent
+ */
+ typedef TUint16 __TText;
+#elif !defined(__TText_defined)
+#error no typedef for __TText
+#endif
+public:
+ /**
+ @internalComponent
+ */
+ TUint iTypeLength;
+
+ /**
+ @internalComponent
+ */
+ __TText iBuf[__Align(S)];
+ };
+
+
+/**
+@publishedAll
+@released
+
+Defines an empty or null literal descriptor.
+
+This is the build independent form.
+An 8 bit build variant is generated for a non-Unicode build;
+a 16 bit build variant is generated for a Unicode build.
+*/
+_LIT(KNullDesC,"");
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an empty or null literal descriptor for use with 8-bit descriptors.
+*/
+_LIT8(KNullDesC8,"");
+#ifndef __KERNEL_MODE__
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an empty or null literal descriptor for use with 16-bit descriptors
+*/
+_LIT16(KNullDesC16,"");
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Packages a non-modifiable pointer descriptor which represents an object of
+specific type.
+
+The template parameter defines the type of object.
+
+The object represented by the packaged pointer descriptor is accessible through
+the package but cannot be changed. */
+template <class T>
+class TPckgC : public TPtrC8
+ {
+public:
+ inline TPckgC(const T& aRef);
+ inline const T& operator()() const;
+private:
+ TPckgC<T>& operator=(const TPckgC<T>& aRef);
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Packages a modifiable pointer descriptor which represents an object of specific
+type.
+
+The template parameter defines the type of object.
+
+The object represented by the packaged pointer descriptor is accessible through
+the package.
+*/
+template <class T>
+class TPckg : public TPtr8
+ {
+public:
+ inline TPckg(const T& aRef);
+ inline T& operator()();
+private:
+ TPckg<T>& operator=(const TPckg<T>& aRef);
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Packages an object into a modifiable buffer descriptor.
+
+The template parameter defines the type of object to be packaged.
+
+The package provides a type safe way of transferring an object or data structure
+which is contained within a modifiable buffer descriptor. Typically, a package
+is used for passing data via inter thread communication.
+
+The contained object is accessible through the package.
+*/
+template <class T>
+class TPckgBuf : public TAlignedBuf8<sizeof(T)>
+ {
+public:
+ inline TPckgBuf();
+ inline TPckgBuf(const T& aRef);
+ inline TPckgBuf& operator=(const TPckgBuf<T>& aRef);
+ inline T& operator=(const T& aRef);
+ inline T& operator()();
+ inline const T& operator()() const;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor that can contain the name of a reference
+counting object.
+
+@see TBuf
+@see CObject
+*/
+typedef TBuf<KMaxName> TName;
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor that can contain the full name of a
+reference counting object.
+
+@see TBuf
+@see CObject
+*/
+typedef TBuf<KMaxFullName> TFullName;
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor to contain the category name identifying
+the cause of thread or process termination. The buffer takes a maximum length
+of KMaxExitCategoryName.
+
+@see RThread::ExitCategory
+@see RThread::ExitCategory
+*/
+typedef TBuf<KMaxExitCategoryName> TExitCategoryName;
+
+
+
+/**
+@publishedAll
+@released
+
+A buffer that can contain the name of a file.
+The name can have a maximum length of KMaxFileName
+(currently 256 but check the definition of KMaxFileName).
+
+@see KMaxFileName
+*/
+typedef TBuf<KMaxFileName> TFileName;
+
+
+
+/**
+@publishedAll
+@released
+
+A buffer that can contain the name of a path.
+The name can have a maximum length of KMaxPath
+(currently 256 but check the definition of KMaxPath).
+
+@see KMaxPath
+*/
+typedef TBuf<KMaxPath> TPath;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Version name type.
+
+This is a buffer descriptor with a maximum length of KMaxVersionName.
+A TVersion object returns the formatted character representation of its version
+information in a descriptor of this type.
+
+@see TVersion
+*/
+typedef TBuf<KMaxVersionName> TVersionName;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a modifiable buffer descriptor for the text form of the UID.
+The descriptor has a maximum length of KMaxUidName and is used to contain
+the standard text format returned by the function TUid::Name().
+
+@see TUid::Name
+*/
+typedef TBuf<KMaxUidName> TUidName;
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a null UID
+*/
+#define KNullUid TUid::Null()
+
+
+
+
+/**
+@publishedAll
+@released
+
+A globally unique 32-bit number.
+*/
+class TUid
+ {
+public:
+#ifndef __KERNEL_MODE__
+ IMPORT_C TBool operator==(const TUid& aUid) const;
+ IMPORT_C TBool operator!=(const TUid& aUid) const;
+ IMPORT_C TUidName Name() const;
+#endif
+ static inline TUid Uid(TInt aUid);
+ static inline TUid Null();
+public:
+ /**
+ The 32-bit integer UID value.
+ */
+ TInt32 iUid;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Encapsulates a set of three unique identifiers (UIDs) which, in combination,
+identify a system object such as a GUI application or a DLL. The three
+component UIDs are referred to as UID1, UID2 and UID3.
+
+An object of this type is referred to as a compound identifier or a UID type.
+*/
+class TUidType
+ {
+public:
+#ifndef __KERNEL_MODE__
+ IMPORT_C TUidType();
+ IMPORT_C TUidType(TUid aUid1);
+ IMPORT_C TUidType(TUid aUid1,TUid aUid2);
+ IMPORT_C TUidType(TUid aUid1,TUid aUid2,TUid aUid3);
+ IMPORT_C TBool operator==(const TUidType& aUidType) const;
+ IMPORT_C TBool operator!=(const TUidType& aUidType) const;
+ IMPORT_C const TUid& operator[](TInt anIndex) const;
+ IMPORT_C TUid MostDerived() const;
+ IMPORT_C TBool IsPresent(TUid aUid) const;
+ IMPORT_C TBool IsValid() const;
+private:
+#endif
+ TUid iUid[KMaxCheckedUid];
+ };
+
+
+
+
+/**
+A class used to represent the Secure ID of a process or executable image.
+
+Constructors and conversion operators are provided to enable conversion
+of this class to and from both TUint32 and TUid objects.
+
+Because this class has non-default constructors, compilers will not initialise
+this objects at compile time, instead code will be generated to construct the object
+at run-time. This is wastefull, and Symbian OS DLLs are not permitted to have
+such uninitialised data. To overcome these problems a macro is provided to construct
+a const object which behaves like a TSecureId. This is _LIT_SECURE_ID.
+This macro should be used where it is desirable to define const TSecureId objects,
+like in header files. E.g. Instead of writing:
+@code
+ const TSecureId MyId=0x1234567
+@endcode
+use
+@code
+ _LIT_SECURE_ID(MyId,0x1234567)
+@endcode
+
+@publishedAll
+@released
+
+@see _LIT_SECURE_ID
+*/
+class TSecureId
+ {
+public:
+ inline TSecureId();
+ inline TSecureId(TUint32 aId);
+ inline operator TUint32() const;
+ inline TSecureId(TUid aId);
+ inline operator TUid() const;
+public:
+ TUint32 iId;
+ };
+
+
+
+
+/**
+A class used to represent the Vendor ID of a process or executable image
+
+Constructors and conversion operators are provided to enable conversion
+of this class to and from both TUint32 and TUid objects.
+
+Because this class has non-default constructors, compilers will not initialise
+this objects at compile time, instead code will be generated to construct the object
+at run-time. This is wastefull, and Symbian OS DLLs are not permitted to have
+such uninitialised data. To overcome these problems a macro is provided to construct
+a const object which behaves like a TSecureId. This is _LIT_VENDOR_ID.
+This macro should be used where it is desirable to define const TSecureId objects,
+like in header files. E.g. Instead of writing:
+@code
+ const TVendorId MyId=0x1234567
+@endcode
+use
+@code
+ _LIT_VENDOR_ID(MyId,0x1234567)
+@endcode
+
+@publishedAll
+@released
+
+@see _LIT_VENDOR_ID
+*/
+class TVendorId
+ {
+public:
+ inline TVendorId();
+ inline TVendorId(TUint32 aId);
+ inline operator TUint32() const;
+ inline TVendorId(TUid aId);
+ inline operator TUid() const;
+public:
+ TUint32 iId;
+ };
+
+
+
+/**
+Structure for compile-time definition of a secure ID
+@internalComponent
+*/
+class SSecureId
+ {
+public:
+ inline const TSecureId* operator&() const;
+ inline operator const TSecureId&() const;
+ inline operator TUint32() const;
+ inline operator TUid() const;
+public:
+ TUint32 iId;
+ };
+
+
+
+
+/**
+Structure for compile-time definition of a vendor ID
+@internalComponent
+*/
+class SVendorId
+ {
+public:
+ inline const TVendorId* operator&() const;
+ inline operator const TVendorId&() const;
+ inline operator TUint32() const;
+ inline operator TUid() const;
+public:
+ TUint32 iId;
+ };
+
+
+
+
+/**
+Macro for compile-time definition of a secure ID
+@param name Name to use for secure ID
+@param value Value of secure ID
+@publishedAll
+@released
+*/
+#define _LIT_SECURE_ID(name,value) const SSecureId name={value}
+
+
+
+
+/**
+Macro for compile-time definition of a vendor ID
+@param name Name to use for vendor ID
+@param value Value of vendor ID
+@publishedAll
+@released
+*/
+#define _LIT_VENDOR_ID(name,value) const SVendorId name={value}
+
+
+
+
+/**
+@publishedAll
+@released
+
+Contains version information.
+
+A version is defined by a set of three numbers:
+
+1. the major version number, ranging from 0 to 127, inclusive
+
+2. the minor version number, ranging from 0 to 99 inclusive
+
+3. the build number, ranging from 0 to 32767 inclusive.
+
+The class provides a constructor for setting all three numbers.
+It also provides a member function to build a character representation of
+this information in a TVersionName descriptor.
+
+@see TVersionName
+*/
+class TVersion
+ {
+public:
+ IMPORT_C TVersion();
+ IMPORT_C TVersion(TInt aMajor,TInt aMinor,TInt aBuild);
+ IMPORT_C TVersionName Name() const;
+public:
+ /**
+ The major version number.
+ */
+ TInt8 iMajor;
+
+
+ /**
+ The minor version number.
+ */
+ TInt8 iMinor;
+
+
+ /**
+ The build number.
+ */
+ TInt16 iBuild;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Indicates the completion status of a request made to a service provider.
+
+When a thread makes a request, it passes a request status as a parameter.
+On completion, the provider signals the requesting thread's request semaphore
+and stores a completion code in the request status. Typically, this is KErrNone
+or one of the other system-wide error codes.
+
+This class is not intended for user derivation.
+*/
+class TRequestStatus
+ {
+public:
+ inline TRequestStatus();
+ inline TRequestStatus(TInt aVal);
+ inline TInt operator=(TInt aVal);
+ inline TBool operator==(TInt aVal) const;
+ inline TBool operator!=(TInt aVal) const;
+ inline TBool operator>=(TInt aVal) const;
+ inline TBool operator<=(TInt aVal) const;
+ inline TBool operator>(TInt aVal) const;
+ inline TBool operator<(TInt aVal) const;
+ inline TInt Int() const;
+private:
+ enum
+ {
+ EActive = 1, //bit0
+ ERequestPending = 2, //bit1
+ };
+ TInt iStatus;
+ TUint iFlags;
+ friend class CActive;
+ friend class CActiveScheduler;
+ friend class CServer2;
+ };
+
+
+
+
+class TSize;
+/**
+@publishedAll
+@released
+
+Stores a two-dimensional point in Cartesian co-ordinates.
+
+Its data members (iX and iY) are public and can be manipulated directly, or
+by means of the functions provided. Functions are provided to set and manipulate
+the point, and to compare points for equality.
+*/
+class TPoint
+ {
+public:
+#ifndef __KERNEL_MODE__
+ enum TUninitialized { EUninitialized };
+ /**
+ Constructs default point, initialising its iX and iY members to zero.
+ */
+ TPoint(TUninitialized) {}
+ inline TPoint();
+ inline TPoint(TInt aX,TInt aY);
+ IMPORT_C TBool operator==(const TPoint& aPoint) const;
+ IMPORT_C TBool operator!=(const TPoint& aPoint) const;
+ IMPORT_C TPoint& operator-=(const TPoint& aPoint);
+ IMPORT_C TPoint& operator+=(const TPoint& aPoint);
+ IMPORT_C TPoint& operator-=(const TSize& aSize);
+ IMPORT_C TPoint& operator+=(const TSize& aSize);
+ IMPORT_C TPoint operator-(const TPoint& aPoint) const;
+ IMPORT_C TPoint operator+(const TPoint& aPoint) const;
+ IMPORT_C TPoint operator-(const TSize& aSize) const;
+ IMPORT_C TPoint operator+(const TSize& aSize) const;
+ IMPORT_C TPoint operator-() const;
+ IMPORT_C void SetXY(TInt aX,TInt aY);
+ IMPORT_C TSize AsSize() const;
+#endif
+public:
+ /**
+ The x co-ordinate.
+ */
+ TInt iX;
+ /**
+ The y co-ordinate.
+ */
+ TInt iY;
+ };
+
+
+
+
+/**
+@publishedAll
+@prototype
+
+Stores a three-dimensional point in Cartesian or polar co-ordinates.
+Its data members (iX, iY and iZ) are public and can be manipulated directly.
+
+*/
+class TPoint3D
+ {
+public:
+#ifndef __KERNEL_MODE__
+ enum TUninitialized { EUninitialized };
+
+ /**
+ TUninitialized Constructor
+ */
+ TPoint3D(TUninitialized) {}
+ /**
+ Constructs default TPoint3D, initialising its iX , iY and iZ members to zero.
+ */
+ inline TPoint3D();
+ /**
+ Constructs TPoint3D with the specified x,y and z co-ordinates.
+ */
+ inline TPoint3D(TInt aX,TInt aY,TInt aZ);
+ /**
+ Copy Construct from TPoint , initialises Z co-ordinate to Zero
+ */
+ inline TPoint3D(const TPoint& aPoint);
+
+ IMPORT_C TBool operator==(const TPoint3D& aPoint3D) const;
+ IMPORT_C TBool operator!=(const TPoint3D& aPoint3D) const;
+
+ IMPORT_C TPoint3D& operator-=(const TPoint3D& aPoint3D);
+ IMPORT_C TPoint3D& operator-=(const TPoint& aPoint);
+
+ IMPORT_C TPoint3D& operator+=(const TPoint3D& aPoint3D);
+ IMPORT_C TPoint3D& operator+=(const TPoint& aPoint);
+
+ IMPORT_C TPoint3D operator-(const TPoint3D& aPoint3D) const;
+ IMPORT_C TPoint3D operator-(const TPoint& aPoint) const;
+
+ IMPORT_C TPoint3D operator+(const TPoint3D& aPoint3D) const;
+ IMPORT_C TPoint3D operator+(const TPoint& aPoint) const;
+ /**
+ Unary minus operator. The operator returns the negation of this Point3D
+ */
+ IMPORT_C TPoint3D operator-() const;
+
+ /**
+ Set Method to set the xyz co-ordinates of TPoint3D
+ */
+ IMPORT_C void SetXYZ(TInt aX,TInt aY,TInt aZ);
+
+ /**
+ TPoint3D from TPoint, sets the Z co-ordinate to Zero
+ */
+ IMPORT_C void SetPoint(const TPoint& aPoint);
+
+ /**
+ Returns TPoint from TPoint3D
+ */
+ IMPORT_C TPoint AsPoint() const;
+#endif
+public:
+ /**
+ The x co-ordinate.
+ */
+ TInt iX;
+ /**
+ The y co-ordinate.
+ */
+ TInt iY;
+ /**
+ The z co-ordinate.
+ */
+ TInt iZ;
+ };
+
+
+
+/**
+@internalTechnology
+@prototype For now, only intended to be used by TRwEvent and the Windows Server
+
+Stores the angular spherical coordinates (Phi,Theta) of a three-dimensional point.
+
+Its data members (iPhi, iTheta) are public and can be manipulated directly.
+*/
+class TAngle3D
+ {
+public:
+ /**
+ The Phi co-ordinate (angle between X-axis and the line that links the projection of the point on the X-Y plane and the origin).
+ */
+ TInt iPhi;
+ /**
+ The Theta co-ordinate (angle between the Z-axis and the line that links the point and the origin).
+ */
+ TInt iTheta;
+ };
+
+
+/**
+@publishedAll
+@released
+
+Stores a two-dimensional size as a width and a height value.
+
+Its data members are public and can be manipulated directly, or by means of
+the functions provided.
+*/
+class TSize
+ {
+public:
+#ifndef __KERNEL_MODE__
+ enum TUninitialized { EUninitialized };
+ /**
+ Constructs the size object with its iWidth and iHeight members set to zero.
+ */
+ TSize(TUninitialized) {}
+ inline TSize();
+ inline TSize(TInt aWidth,TInt aHeight);
+ IMPORT_C TBool operator==(const TSize& aSize) const;
+ IMPORT_C TBool operator!=(const TSize& aSize) const;
+ IMPORT_C TSize& operator-=(const TSize& aSize);
+ IMPORT_C TSize& operator-=(const TPoint& aPoint);
+ IMPORT_C TSize& operator+=(const TSize& aSize);
+ IMPORT_C TSize& operator+=(const TPoint& aPoint);
+ IMPORT_C TSize operator-(const TSize& aSize) const;
+ IMPORT_C TSize operator-(const TPoint& aPoint) const;
+ IMPORT_C TSize operator+(const TSize& aSize) const;
+ IMPORT_C TSize operator+(const TPoint& aPoint) const;
+ IMPORT_C TSize operator-() const;
+ IMPORT_C void SetSize(TInt aWidth,TInt aHeight);
+ IMPORT_C TPoint AsPoint() const;
+#endif
+public:
+ /**
+ The width of this TSize object.
+ */
+ TInt iWidth;
+ /**
+ The height of this TSize object.
+ */
+ TInt iHeight;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Information about a kernel object.
+
+This type of object is passed to RHandleBase::HandleInfo(). The function
+fetches information on the usage of the kernel object associated with that
+handle and stores the information in the THandleInfo object.
+
+The class contains four data members and no explicitly defined function
+members.
+*/
+class THandleInfo
+ {
+public:
+ /**
+ The number of times that the kernel object is open in the current process.
+ */
+ TInt iNumOpenInProcess;
+
+ /**
+ The number of times that the kernel object is open in the current thread.
+ */
+ TInt iNumOpenInThread;
+
+ /**
+ The number of processes which have a handle on the kernel object.
+ */
+ TInt iNumProcesses;
+
+ /**
+ The number of threads which have a handle on the kernel object.
+ */
+ TInt iNumThreads;
+ };
+
+
+
+
+/**
+@internalComponent
+*/
+class TFindHandle
+ {
+public:
+ inline TFindHandle();
+ inline TInt Handle() const;
+#ifdef __KERNEL_MODE__
+ inline TInt Index() const;
+ inline TInt UniqueID() const;
+ inline TUint64 ObjectID() const;
+ inline void Set(TInt aIndex, TInt aUniqueId, TUint64 aObjectId);
+#else
+protected:
+ inline void Reset();
+#endif
+private:
+ TInt iHandle;
+ TInt iSpare1;
+ TInt iObjectIdLow;
+ TInt iObjectIdHigh;
+ };
+
+
+
+class RThread;
+class TFindHandleBase;
+class TFindSemaphore;
+/**
+@publishedAll
+@released
+
+A handle to an object.
+
+The class encapsulates the basic behaviour of a handle, hiding the
+handle-number which identifies the object which the handle represents.
+
+The class is abstract in the sense that a RHandleBase object is never
+explicitly instantiated. It is always a base class to a concrete handle class;
+for example, RSemaphore, RThread, RProcess, RCriticalSection etc.
+*/
+class RHandleBase
+ {
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+public:
+ /**
+ @internalComponent
+ */
+#else
+protected:
+#endif
+ enum
+ {
+ EReadAccess=0x1,
+ EWriteAccess=0x2,
+ EDirectReadAccess=0x4,
+ EDirectWriteAccess=0x8,
+ };
+public:
+ inline RHandleBase();
+ inline TInt Handle() const;
+ inline void SetHandle(TInt aHandle);
+ inline TInt SetReturnedHandle(TInt aHandleOrError);
+ static void DoExtendedClose();
+#ifndef __KERNEL_MODE__
+ IMPORT_C void Close();
+ IMPORT_C TName Name() const;
+ IMPORT_C TFullName FullName() const;
+ IMPORT_C void FullName(TDes& aName) const;
+ IMPORT_C void SetHandleNC(TInt aHandle);
+ IMPORT_C TInt Duplicate(const RThread& aSrc,TOwnerType aType=EOwnerProcess);
+ IMPORT_C void HandleInfo(THandleInfo* anInfo);
+ IMPORT_C TUint Attributes() const;
+ IMPORT_C TInt BTraceId() const;
+ IMPORT_C void NotifyDestruction(TRequestStatus& aStatus); /**< @internalTechnology */
+protected:
+ inline RHandleBase(TInt aHandle);
+ IMPORT_C TInt Open(const TFindHandleBase& aHandle,TOwnerType aType);
+ static TInt SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle);
+ TInt OpenByName(const TDesC &aName,TOwnerType aOwnerType,TInt aObjectType);
+#endif
+private:
+ static void DoExtendedCloseL();
+protected:
+ TInt iHandle;
+ };
+
+
+
+
+class RMessagePtr2;
+/**
+@publishedAll
+@released
+
+A handle to a semaphore.
+
+The semaphore itself is a Kernel side object.
+
+As with all handles, they should be closed after use. RHandleBase provides
+the necessary Close() function, which should be called when the handle is
+no longer required.
+
+@see RHandleBase::Close
+*/
+class RSemaphore : public RHandleBase
+ {
+public:
+#ifndef __KERNEL_MODE__
+ inline TInt Open(const TFindSemaphore& aFind,TOwnerType aType=EOwnerProcess);
+ IMPORT_C TInt CreateLocal(TInt aCount,TOwnerType aType=EOwnerProcess);
+ IMPORT_C TInt CreateGlobal(const TDesC& aName,TInt aCount,TOwnerType aType=EOwnerProcess);
+ IMPORT_C TInt OpenGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
+ IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
+ IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+ IMPORT_C void Wait();
+ IMPORT_C TInt Wait(TInt aTimeout); // timeout in microseconds
+ IMPORT_C void Signal();
+ IMPORT_C void Signal(TInt aCount);
+#endif
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+A fast semaphore.
+
+This is a layer over a standard semaphore, and only calls into the kernel side
+if there is contention.
+*/
+class RFastLock : public RSemaphore
+ {
+public:
+ inline RFastLock();
+ IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
+ IMPORT_C void Wait();
+ IMPORT_C void Signal();
+private:
+ TInt iCount;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+A read-write lock.
+
+This is a lock for co-ordinating readers and writers to shared resources.
+It is designed to allow multiple concurrent readers.
+It is not a kernel side object and so does not inherit from RHandleBase.
+*/
+class RReadWriteLock
+ {
+public:
+ enum TReadWriteLockPriority
+ {
+ /** Pending writers always get the lock before pending readers */
+ EWriterPriority,
+ /** Lock is given alternately to pending readers and writers */
+ EAlternatePriority,
+ /** Pending readers always get the lock before pending writers - beware writer starvation! */
+ EReaderPriority,
+ };
+ enum TReadWriteLockClientCategoryLimit
+ {
+ /** Maximum number of clients in each category: read locked, read lock pending, write lock pending */
+ EReadWriteLockClientCategoryLimit = KMaxTUint16
+ };
+
+public:
+ inline RReadWriteLock();
+ IMPORT_C TInt CreateLocal(TReadWriteLockPriority aPriority = EWriterPriority);
+ IMPORT_C void Close();
+
+ IMPORT_C void ReadLock();
+ IMPORT_C void WriteLock();
+ IMPORT_C TBool TryReadLock();
+ IMPORT_C TBool TryWriteLock();
+ IMPORT_C TBool TryUpgradeReadLock();
+ IMPORT_C void DowngradeWriteLock();
+ IMPORT_C void Unlock();
+
+private:
+ RReadWriteLock(const RReadWriteLock& aLock);
+ RReadWriteLock& operator=(const RReadWriteLock& aLock);
+
+ TInt UnlockWriter();
+ TInt UnlockAlternate();
+ TInt UnlockReader();
+
+private:
+ volatile TUint64 iValues; // Bits 0-15: readers; bit 16: writer; bits 32-47: readersPending; bits 48-63: writersPending
+ TReadWriteLockPriority iPriority;
+ RSemaphore iReaderSem;
+ RSemaphore iWriterSem;
+ TUint32 iSpare[4]; // Reserved for future development
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+The user-side handle to a logical channel.
+
+The class provides functions that are used to open a channel
+to a device driver, and to make requests. A device driver provides
+a derived class to give the user-side a tailored interface to the driver.
+*/
+class RBusLogicalChannel : public RHandleBase
+ {
+public:
+ IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
+ IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
+protected:
+ inline TInt DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* anInfo, TOwnerType aType=EOwnerProcess, TBool aProtected=EFalse);
+ IMPORT_C void DoCancel(TUint aReqMask);
+ IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus);
+ IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TAny* a1);
+ IMPORT_C void DoRequest(TInt aReqNo,TRequestStatus& aStatus,TAny* a1,TAny* a2);
+ IMPORT_C TInt DoControl(TInt aFunction);
+ IMPORT_C TInt DoControl(TInt aFunction,TAny* a1);
+ IMPORT_C TInt DoControl(TInt aFunction,TAny* a1,TAny* a2);
+ inline TInt DoSvControl(TInt aFunction) { return DoControl(aFunction); }
+ inline TInt DoSvControl(TInt aFunction,TAny* a1) { return DoControl(aFunction, a1); }
+ inline TInt DoSvControl(TInt aFunction,TAny* a1,TAny* a2) { return DoControl(aFunction, a1, a2); }
+private:
+ IMPORT_C TInt DoCreate(const TDesC& aDevice, const TVersion& aVer, TInt aUnit, const TDesC* aDriver, const TDesC8* aInfo, TInt aType);
+private:
+ // Padding for Binary Compatibility purposes
+ TInt iPadding1;
+ TInt iPadding2;
+ };
+
+
+
+
+/**
+@internalComponent
+
+Base class for memory allocators.
+*/
+// Put pure virtual functions into a separate base class so that vptr is at same
+// place in both GCC98r2 and EABI builds.
+class MAllocator
+ {
+public:
+ virtual TAny* Alloc(TInt aSize)=0;
+ virtual void Free(TAny* aPtr)=0;
+ virtual TAny* ReAlloc(TAny* aPtr, TInt aSize, TInt aMode=0)=0;
+ virtual TInt AllocLen(const TAny* aCell) const =0;
+ virtual TInt Compress()=0;
+ virtual void Reset()=0;
+ virtual TInt AllocSize(TInt& aTotalAllocSize) const =0;
+ virtual TInt Available(TInt& aBiggestBlock) const =0;
+ virtual TInt DebugFunction(TInt aFunc, TAny* a1=NULL, TAny* a2=NULL)=0;
+ virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1)=0;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Base class for heaps.
+*/
+class RAllocator : public MAllocator
+ {
+public:
+
+
+ /**
+ A set of heap allocation failure flags.
+
+ This enumeration indicates how to simulate heap allocation failure.
+
+ @see RAllocator::__DbgSetAllocFail()
+ */
+ enum TAllocFail {
+ /**
+ Attempts to allocate from this heap fail at a random rate;
+ however, the interval pattern between failures is the same
+ every time simulation is started.
+ */
+ ERandom,
+
+
+ /**
+ Attempts to allocate from this heap fail at a random rate.
+ The interval pattern between failures may be different every
+ time the simulation is started.
+ */
+ ETrueRandom,
+
+
+ /**
+ Attempts to allocate from this heap fail at a rate aRate;
+ for example, if aRate is 3, allocation fails at every
+ third attempt.
+ */
+ EDeterministic,
+
+
+ /**
+ Cancels simulated heap allocation failure.
+ */
+ ENone,
+
+
+ /**
+ An allocation from this heap will fail after the next aRate - 1
+ allocation attempts. For example, if aRate = 1 then the next
+ attempt to allocate from this heap will fail.
+ */
+ EFailNext,
+
+ /**
+ Cancels simulated heap allocation failure, and sets
+ the nesting level for all allocated cells to zero.
+ */
+ EReset,
+
+ /**
+ aBurst allocations from this heap fail at a random rate;
+ however, the interval pattern between failures is the same
+ every time the simulation is started.
+ */
+ EBurstRandom,
+
+
+ /**
+ aBurst allocations from this heap fail at a random rate.
+ The interval pattern between failures may be different every
+ time the simulation is started.
+ */
+ EBurstTrueRandom,
+
+
+ /**
+ aBurst allocations from this heap fail at a rate aRate.
+ For example, if aRate is 10 and aBurst is 2, then 2 allocations
+ will fail at every tenth attempt.
+ */
+ EBurstDeterministic,
+
+ /**
+ aBurst allocations from this heap will fail after the next aRate - 1
+ allocation attempts have occurred. For example, if aRate = 1 and
+ aBurst = 3 then the next 3 attempts to allocate from this heap will fail.
+ */
+ EBurstFailNext,
+
+ /**
+ Use this to determine how many times the current debug
+ failure mode has failed so far.
+ @see RAllocator::__DbgCheckFailure()
+ */
+ ECheckFailure,
+ };
+
+
+ /**
+ Heap debug checking type flag.
+ */
+ enum TDbgHeapType {
+ /**
+ The heap is a user heap.
+ */
+ EUser,
+
+ /**
+ The heap is the Kernel heap.
+ */
+ EKernel
+ };
+
+
+ enum TAllocDebugOp {ECount, EMarkStart, EMarkEnd, ECheck, ESetFail, ECopyDebugInfo, ESetBurstFail};
+
+
+ /**
+ Flags controlling reallocation.
+ */
+ enum TReAllocMode {
+ /**
+ A reallocation of a cell must not change
+ the start address of the cell.
+ */
+ ENeverMove=1,
+
+ /**
+ Allows the start address of the cell to change
+ if the cell shrinks in size.
+ */
+ EAllowMoveOnShrink=2
+ };
+
+
+ enum TFlags {ESingleThreaded=1, EFixedSize=2, ETraceAllocs=4, EMonitorMemory=8,};
+ struct SCheckInfo {TBool iAll; TInt iCount; const TDesC8* iFileName; TInt iLineNum;};
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+ struct SRAllocatorBurstFail {TInt iBurst; TInt iRate; TInt iUnused[2];};
+#endif
+ enum {EMaxHandles=32};
+
+public:
+ inline RAllocator();
+#ifndef __KERNEL_MODE__
+ IMPORT_C TInt Open();
+ IMPORT_C void Close();
+ IMPORT_C TAny* AllocZ(TInt aSize);
+ IMPORT_C TAny* AllocZL(TInt aSize);
+ IMPORT_C TAny* AllocL(TInt aSize);
+ IMPORT_C TAny* AllocLC(TInt aSize);
+ IMPORT_C void FreeZ(TAny*& aCell);
+ IMPORT_C TAny* ReAllocL(TAny* aCell, TInt aSize, TInt aMode=0);
+ IMPORT_C TInt Count() const;
+ IMPORT_C TInt Count(TInt& aFreeCount) const;
+#endif
+ UIMPORT_C void Check() const;
+ UIMPORT_C void __DbgMarkStart();
+ UIMPORT_C TUint32 __DbgMarkEnd(TInt aCount);
+ UIMPORT_C TInt __DbgMarkCheck(TBool aCountAll, TInt aCount, const TDesC8& aFileName, TInt aLineNum);
+ inline void __DbgMarkCheck(TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum);
+ UIMPORT_C void __DbgSetAllocFail(TAllocFail aType, TInt aRate);
+ UIMPORT_C void __DbgSetBurstAllocFail(TAllocFail aType, TUint aRate, TUint aBurst);
+ UIMPORT_C TUint __DbgCheckFailure();
+protected:
+ UIMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+#ifndef __KERNEL_MODE__
+ IMPORT_C virtual void DoClose();
+#endif
+protected:
+ TInt iAccessCount;
+ TInt iHandleCount;
+ TInt* iHandles;
+ TUint32 iFlags;
+ TInt iCellCount;
+ TInt iTotalAllocSize;
+ };
+
+
+
+
+class UserHeap;
+/**
+@publishedAll
+@released
+
+Represents the default implementation for a heap.
+
+The default implementation uses an address-ordered first fit type algorithm.
+
+The heap itself is contained in a chunk and may be the only occupant of the
+chunk or may share the chunk with the program stack.
+
+The class contains member functions for allocating, adjusting, freeing individual
+cells and generally managing the heap.
+
+The class is not a handle in the same sense that RChunk is a handle; i.e.
+there is no Kernel object which corresponds to the heap.
+*/
+class RHeap : public RAllocator
+ {
+public:
+ /**
+ The structure of a heap cell header for a heap cell on the free list.
+ */
+ struct SCell {
+ /**
+ The length of the cell, which includes the length of
+ this header.
+ */
+ TInt len;
+
+
+ /**
+ A pointer to the next cell in the free list.
+ */
+ SCell* next;
+ };
+
+
+ /**
+ The structure of a heap cell header for an allocated heap cell in a debug build.
+ */
+ struct SDebugCell {
+ /**
+ The length of the cell, which includes the length of
+ this header.
+ */
+ TInt len;
+
+
+ /**
+ The nested level.
+ */
+ TInt nestingLevel;
+
+
+ /**
+ The cumulative number of allocated cells
+ */
+ TInt allocCount;
+ };
+
+ /**
+ @internalComponent
+ */
+ struct SHeapCellInfo { RHeap* iHeap; TInt iTotalAlloc; TInt iTotalAllocSize; TInt iTotalFree; TInt iLevelAlloc; SDebugCell* iStranded; };
+
+ /**
+ @internalComponent
+ */
+ struct _s_align {char c; double d;};
+
+ /**
+ The default cell alignment.
+ */
+ enum {ECellAlignment = sizeof(_s_align)-sizeof(double)};
+
+ /**
+ Size of a free cell header.
+ */
+ enum {EFreeCellSize = sizeof(SCell)};
+
+
+#ifdef _DEBUG
+ /**
+ Size of an allocated cell header in a debug build.
+ */
+ enum {EAllocCellSize = sizeof(SDebugCell)};
+#else
+ /**
+ Size of an allocated cell header in a release build.
+ */
+ enum {EAllocCellSize = sizeof(SCell*)};
+#endif
+
+
+ /**
+ @internalComponent
+ */
+ enum TDebugOp {EWalk=128};
+
+
+ /**
+ @internalComponent
+ */
+ enum TCellType
+ {EGoodAllocatedCell, EGoodFreeCell, EBadAllocatedCellSize, EBadAllocatedCellAddress,
+ EBadFreeCellAddress, EBadFreeCellSize};
+
+
+ /**
+ @internalComponent
+ */
+ enum TDebugHeapId {EUser=0, EKernel=1};
+
+ /**
+ @internalComponent
+ */
+ enum TDefaultShrinkRatios {EShrinkRatio1=256, EShrinkRatioDflt=512};
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+ /**
+ @internalComponent
+ */
+#else
+private:
+#endif
+ typedef void (*TWalkFunc)(TAny*, TCellType, TAny*, TInt);
+
+public:
+ UIMPORT_C virtual TAny* Alloc(TInt aSize);
+ UIMPORT_C virtual void Free(TAny* aPtr);
+ UIMPORT_C virtual TAny* ReAlloc(TAny* aPtr, TInt aSize, TInt aMode=0);
+ UIMPORT_C virtual TInt AllocLen(const TAny* aCell) const;
+#ifndef __KERNEL_MODE__
+ UIMPORT_C virtual TInt Compress();
+ UIMPORT_C virtual void Reset();
+ UIMPORT_C virtual TInt AllocSize(TInt& aTotalAllocSize) const;
+ UIMPORT_C virtual TInt Available(TInt& aBiggestBlock) const;
+#endif
+ UIMPORT_C virtual TInt DebugFunction(TInt aFunc, TAny* a1=NULL, TAny* a2=NULL);
+protected:
+ UIMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
+public:
+ UIMPORT_C RHeap(TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue);
+ UIMPORT_C RHeap(TInt aChunkHandle, TInt aOffset, TInt aMinLength, TInt aMaxLength, TInt aGrowBy, TInt aAlign=0, TBool aSingleThread=EFalse);
+ UIMPORT_C TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
+ inline void operator delete(TAny* aPtr, TAny* aBase);
+ inline TUint8* Base() const;
+ inline TInt Size() const;
+ inline TInt MaxLength() const;
+ inline TInt Align(TInt a) const;
+ inline const TAny* Align(const TAny* a) const;
+ inline TBool IsLastCell(const SCell* aCell) const;
+ inline void Lock() const;
+ inline void Unlock() const;
+ inline TInt ChunkHandle() const;
+protected:
+ inline RHeap();
+ void Initialise();
+ SCell* DoAlloc(TInt aSize, SCell*& aLastFree);
+ void DoFree(SCell* pC);
+ TInt TryToGrowHeap(TInt aSize, SCell* aLastFree);
+ inline void FindFollowingFreeCell(SCell* aCell, SCell*& pPrev, SCell*& aNext);
+ TInt TryToGrowCell(SCell* pC, SCell* pP, SCell* pE, TInt aSize);
+ TInt Reduce(SCell* aCell);
+ UIMPORT_C SCell* GetAddress(const TAny* aCell) const;
+ void CheckCell(const SCell* aCell) const;
+ void Walk(TWalkFunc aFunc, TAny* aPtr);
+ static void WalkCheckCell(TAny* aPtr, TCellType aType, TAny* aCell, TInt aLen);
+ TInt DoCountAllocFree(TInt& aFree);
+ TInt DoCheckHeap(SCheckInfo* aInfo);
+ void DoMarkStart();
+ TUint32 DoMarkEnd(TInt aExpected);
+ void DoSetAllocFail(TAllocFail aType, TInt aRate);
+ TBool CheckForSimulatedAllocFail();
+ inline TInt SetBrk(TInt aBrk);
+ inline TAny* ReAllocImpl(TAny* aPtr, TInt aSize, TInt aMode);
+ void DoSetAllocFail(TAllocFail aType, TInt aRate, TUint aBurst);
+protected:
+ TInt iMinLength;
+ TInt iMaxLength;
+ TInt iOffset;
+ TInt iGrowBy;
+ TInt iChunkHandle;
+ RFastLock iLock;
+ TUint8* iBase;
+ TUint8* iTop;
+ TInt iAlign;
+ TInt iMinCell;
+ TInt iPageSize;
+ SCell iFree;
+protected:
+ TInt iNestingLevel;
+ TInt iAllocCount;
+ TAllocFail iFailType;
+ TInt iFailRate;
+ TBool iFailed;
+ TInt iFailAllocCount;
+ TInt iRand;
+ TAny* iTestData;
+
+ friend class UserHeap;
+ };
+
+
+
+
+
+class OnlyCreateWithNull;
+
+/** @internalTechnology */
+typedef void (OnlyCreateWithNull::* __NullPMF)();
+
+/** @internalTechnology */
+class OnlyCreateWithNull
+ {
+public:
+ inline OnlyCreateWithNull(__NullPMF /*aPointerToNull*/) {}
+ };
+
+/**
+@publishedAll
+@released
+
+A handle to a message sent by the client to the server.
+
+A server's interaction with its clients is channelled through an RMessagePtr2
+object, which acts as a handle to a message sent by the client.
+The details of the original message are kept by the kernel allowing it enforce
+correct usage of the member functions of this class.
+
+@see RMessage2
+*/
+class RMessagePtr2
+ {
+public:
+ inline RMessagePtr2();
+ inline TBool IsNull() const;
+ inline TInt Handle() const;
+#ifndef __KERNEL_MODE__
+ IMPORT_C void Complete(TInt aReason) const;
+ IMPORT_C void Complete(RHandleBase aHandle) const;
+ IMPORT_C TInt GetDesLength(TInt aParam) const;
+ IMPORT_C TInt GetDesLengthL(TInt aParam) const;
+ IMPORT_C TInt GetDesMaxLength(TInt aParam) const;
+ IMPORT_C TInt GetDesMaxLengthL(TInt aParam) const;
+ IMPORT_C void ReadL(TInt aParam,TDes8& aDes,TInt aOffset=0) const;
+ IMPORT_C void ReadL(TInt aParam,TDes16 &aDes,TInt aOffset=0) const;
+ IMPORT_C void WriteL(TInt aParam,const TDesC8& aDes,TInt aOffset=0) const;
+ IMPORT_C void WriteL(TInt aParam,const TDesC16& aDes,TInt aOffset=0) const;
+ IMPORT_C TInt Read(TInt aParam,TDes8& aDes,TInt aOffset=0) const;
+ IMPORT_C TInt Read(TInt aParam,TDes16 &aDes,TInt aOffset=0) const;
+ IMPORT_C TInt Write(TInt aParam,const TDesC8& aDes,TInt aOffset=0) const;
+ IMPORT_C TInt Write(TInt aParam,const TDesC16& aDes,TInt aOffset=0) const;
+ IMPORT_C void Panic(const TDesC& aCategory,TInt aReason) const;
+ IMPORT_C void Kill(TInt aReason) const;
+ IMPORT_C void Terminate(TInt aReason) const;
+ IMPORT_C TInt SetProcessPriority(TProcessPriority aPriority) const;
+ inline void SetProcessPriorityL(TProcessPriority aPriority) const;
+ IMPORT_C TInt Client(RThread& aClient, TOwnerType aOwnerType=EOwnerProcess) const;
+ inline void ClientL(RThread& aClient, TOwnerType aOwnerType=EOwnerProcess) const;
+ IMPORT_C TUint ClientProcessFlags() const;
+ IMPORT_C const TRequestStatus* ClientStatus() const;
+ IMPORT_C TBool ClientIsRealtime() const;
+
+ /**
+ Return the Secure ID of the process which sent this message.
+
+ If an intended use of this method is to check that the Secure ID is
+ a given value, then the use of a TSecurityPolicy object should be
+ considered. E.g. Instead of something like:
+
+ @code
+ RMessagePtr2& message;
+ TInt error = message.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
+ @endcode
+
+ this could be used;
+
+ @code
+ RMessagePtr2& message;
+ static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
+ TBool pass = mySidPolicy().CheckPolicy(message);
+ @endcode
+
+ This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+ configured by the system wide Platform Security configuration. I.e. are
+ capable of emitting diagnostic messages when a check fails and/or the
+ check can be forced to always pass.
+
+ @see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const
+ @see _LIT_SECURITY_POLICY_S0
+
+ @return The Secure ID.
+
+ @publishedAll
+ @released
+ */
+ IMPORT_C TSecureId SecureId() const;
+
+ /**
+ Return the Vendor ID of the process which sent this message.
+
+ If an intended use of this method is to check that the Vendor ID is
+ a given value, then the use of a TSecurityPolicy object should be
+ considered. E.g. Instead of something like:
+
+ @code
+ RMessagePtr2& message;
+ TInt error = message.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
+ @endcode
+
+ this could be used;
+
+ @code
+ RMessagePtr2& message;
+ static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
+ TBool pass = myVidPolicy().CheckPolicy(message);
+ @endcode
+
+ This has the benefit that the TSecurityPolicy::CheckPolicy methods are
+ configured by the system wide Platform Security configuration. I.e. are
+ capable of emitting diagnostic messages when a check fails and/or the
+ check can be forced to always pass.
+
+ @see TSecurityPolicy::CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const
+ @see _LIT_SECURITY_POLICY_V0
+
+ @return The Vendor ID.
+ @publishedAll
+ @released
+ */
+ IMPORT_C TVendorId VendorId() const;
+
+ /**
+ Check if the process which sent this message has a given capability.
+
+ When a check fails the action taken is determined by the system wide Platform Security
+ configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+ If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+ check failed.
+
+ @param aCapability The capability to test.
+ @param aDiagnostic A string that will be emitted along with any diagnostic message
+ that may be issued if the test finds the capability is not present.
+ This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+ which enables it to be easily removed from the system.
+ @return ETrue if process which sent this message has the capability, EFalse otherwise.
+ @publishedAll
+ @released
+ */
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ // Only available to NULL arguments
+ inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+ // For things using KSuppressPlatSecDiagnostic
+ inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+ /**
+ Check if the process which sent this message has a given capability.
+
+ When a check fails the action taken is determined by the system wide Platform Security
+ configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+ If PlatSecEnforcement is OFF, then this function will not leave even though the
+ check failed.
+
+ @param aCapability The capability to test.
+ @param aDiagnosticMessage A string that will be emitted along with any diagnostic message
+ that may be issued if the test finds the capability is not present.
+ This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+ which enables it to be easily removed from the system.
+ @leave KErrPermissionDenied, if the process does not have the capability.
+ @publishedAll
+ @released
+ */
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ inline void HasCapabilityL(TCapability aCapability, const char* aDiagnosticMessage=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ // Only available to NULL arguments
+ inline void HasCapabilityL(TCapability aCapability, OnlyCreateWithNull aDiagnosticMessage=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+ // For things using KSuppressPlatSecDiagnostic
+ inline void HasCapabilityL(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+ /**
+ Check if the process which sent this message has both of the given capabilities.
+
+ When a check fails the action taken is determined by the system wide Platform Security
+ configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+ If PlatSecEnforcement is OFF, then this function will return ETrue even though the
+ check failed.
+
+ @param aCapability1 The first capability to test.
+ @param aCapability2 The second capability to test.
+ @param aDiagnostic A string that will be emitted along with any diagnostic message
+ that may be issued if the test finds a capability is not present.
+ This string should be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+ which enables it to be easily removed from the system.
+ @return ETrue if the process which sent this message has both the capabilities, EFalse otherwise.
+ @publishedAll
+ @released
+ */
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ // Only available to NULL arguments
+ inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+ // For things using KSuppressPlatSecDiagnostic
+ inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+ /**
+ Check if the process which sent this message has both of the given capabilities.
+
+ When a check fails the action taken is determined by the system wide Platform Security
+ configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
+ If PlatSecEnforcement is OFF, then this function will not leave even though the
+ check failed.
+
+ @param aCapability1 The first capability to test.
+ @param aCapability2 The second capability to test.
+ @param aDiagnosticMessage A string that will be emitted along with any diagnostic message
+ that may be issued if the test finds a capability is not present.
+ This string should be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
+ which enables it to be easily removed from the system.
+ @leave KErrPermissionDenied, if the process does not have the capabilities.
+ @publishedAll
+ @released
+ */
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, const char* aDiagnosticMessage=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ // Only available to NULL arguments
+ inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnosticMessage=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+ // For things using KSuppressPlatSecDiagnostic
+ inline void HasCapabilityL(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+ /**
+ @deprecated Use SecureId()
+ */
+ inline TUid Identity() const { return SecureId(); }
+#endif
+
+private:
+ // Implementations of functions with diagnostics
+ IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
+ IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
+ IMPORT_C TBool DoHasCapability(TCapability aCapability, TCapability aCapability2, const char* aDiagnostic) const;
+ IMPORT_C TBool DoHasCapability(TCapability aCapability, TCapability aCapability2) const;
+
+protected:
+ TInt iHandle;
+ };
+inline TBool operator==(RMessagePtr2 aLeft,RMessagePtr2 aRight);
+inline TBool operator!=(RMessagePtr2 aLeft,RMessagePtr2 aRight);
+
+class CSession2;
+
+#define __IPC_V2_PRESENT__
+
+/**
+@publishedAll
+@released
+
+An object that encapsulates the details of a client request.
+*/
+class RMessage2 : public RMessagePtr2
+ {
+ friend class CServer2;
+public:
+
+ /**
+ Defines internal message types.
+ */
+ enum TSessionMessages {
+ /**
+ A message type used internally that means connect.
+ */
+ EConnect=-1,
+
+ /**
+ A message type used internally that means disconnect.
+ */
+ EDisConnect=-2
+ };
+public:
+ inline RMessage2();
+#ifndef __KERNEL_MODE__
+ IMPORT_C explicit RMessage2(const RMessagePtr2& aPtr);
+ void SetAuthorised() const;
+ void ClearAuthorised() const;
+ TBool Authorised() const;
+#endif
+ inline TInt Function() const;
+ inline TInt Int0() const;
+ inline TInt Int1() const;
+ inline TInt Int2() const;
+ inline TInt Int3() const;
+ inline const TAny* Ptr0() const;
+ inline const TAny* Ptr1() const;
+ inline const TAny* Ptr2() const;
+ inline const TAny* Ptr3() const;
+ inline CSession2* Session() const;
+protected:
+
+ /**
+ The request type.
+ */
+ TInt iFunction;
+
+ /**
+ A copy of the message arguments.
+ */
+ TInt iArgs[KMaxMessageArguments];
+private:
+ TInt iSpare1;
+protected:
+ /**
+ @internalComponent
+ */
+ const TAny* iSessionPtr;
+private:
+ mutable TInt iFlags;// Currently only used for *Authorised above
+ TInt iSpare3; // Reserved for future use
+
+ friend class RMessage;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines an 8-bit modifiable buffer descriptor to contain passwords when dealing
+with password security support in a file server session.
+
+The descriptor takes a maximum length of KMaxMediaPassword.
+
+@see KMaxMediaPassword
+*/
+typedef TBuf8<KMaxMediaPassword> TMediaPassword; // 128 bit
+
+
+
+/**
+@publishedPartner
+@prototype
+A configuration flag for the shared chunk buffer configuration class (used by the multimedia device drivers). This being
+set signifies that a buffer offset list follows the buffer configuration class. This list holds the offset of each buffer.
+*/
+const TUint KScFlagBufOffsetListInUse=0x00000001;
+
+/**
+@publishedPartner
+@prototype
+A configuration flag for the shared chunk buffer configuration class (used by the multimedia device drivers). This being
+set is a suggestion that the shared chunk should be configured leaving guard pages around each buffers.
+*/
+const TUint KScFlagUseGuardPages=0x00000002;
+
+/**
+@publishedPartner
+@prototype
+The shared chunk buffer configuration class (used by the multimedia device drivers). This is used to hold information
+on the current buffer configuration within a shared chunk.
+*/
+class TSharedChunkBufConfigBase
+ {
+public:
+ inline TSharedChunkBufConfigBase();
+public:
+ /** The number of buffers. */
+ TInt iNumBuffers;
+ /** The size of each buffer in bytes. */
+ TInt iBufferSizeInBytes;
+ /** Reserved field. */
+ TInt iReserved1;
+ /** Shared chunk buffer flag settings. */
+ TUint iFlags;
+ };
+
+
+/** Maximum size of capability set
+
+@internalTechnology
+*/
+const TInt KCapabilitySetMaxSize = (((TInt)ECapability_HardLimit + 7)>>3);
+
+/** Maximum size of any future extension to TSecurityPolicy
+
+@internalTechnology
+*/
+const TInt KMaxSecurityPolicySize = KCapabilitySetMaxSize + 3*sizeof(TUint32);
+
+
+/** Class representing an arbitrary set of capabilities.
+
+This class can only contain capabilities supported by the current OS version.
+
+@publishedAll
+@released
+*/
+class TCapabilitySet
+ {
+public:
+ inline TCapabilitySet();
+ inline TCapabilitySet(TCapability aCapability);
+ IMPORT_C TCapabilitySet(TCapability aCapability1, TCapability aCapability2);
+ IMPORT_C void SetEmpty();
+ inline void Set(TCapability aCapability);
+ inline void Set(TCapability aCapability1, TCapability aCapability2);
+ IMPORT_C void SetAllSupported();
+ IMPORT_C void AddCapability(TCapability aCapability);
+ IMPORT_C void RemoveCapability(TCapability aCapability);
+ IMPORT_C void Union(const TCapabilitySet& aCapabilities);
+ IMPORT_C void Intersection(const TCapabilitySet& aCapabilities);
+ IMPORT_C void Remove(const TCapabilitySet& aCapabilities);
+ IMPORT_C TBool HasCapability(TCapability aCapability) const;
+ IMPORT_C TBool HasCapabilities(const TCapabilitySet& aCapabilities) const;
+
+ /**
+ Make this set consist of the capabilities which are disabled on this platform.
+ @internalTechnology
+ */
+ IMPORT_C void SetDisabled();
+ /**
+ @internalComponent
+ */
+ TBool NotEmpty() const;
+
+private:
+ TUint32 iCaps[KCapabilitySetMaxSize / sizeof(TUint32)];
+ };
+
+#ifndef __SECURITY_INFO_DEFINED__
+#define __SECURITY_INFO_DEFINED__
+/**
+@internalTechnology
+ */
+struct SCapabilitySet
+ {
+ enum {ENCapW=2};
+
+ inline void AddCapability(TCapability aCap1) {((TCapabilitySet*)this)->AddCapability(aCap1);}
+ inline void Remove(const SCapabilitySet& aCaps) {((TCapabilitySet*)this)->Remove(*((TCapabilitySet*)&aCaps));}
+ inline TBool NotEmpty() const {return ((TCapabilitySet*)this)->NotEmpty();}
+
+ inline const TUint32& operator[] (TInt aIndex) const { return iCaps[aIndex]; }
+ inline TUint32& operator[] (TInt aIndex) { return iCaps[aIndex]; }
+
+ TUint32 iCaps[ENCapW];
+ };
+
+/**
+@internalTechnology
+ */
+struct SSecurityInfo
+ {
+ TUint32 iSecureId;
+ TUint32 iVendorId;
+ SCapabilitySet iCaps; // Capabilities re. platform security
+ };
+
+#endif
+
+/** Define this macro to reference the set of all capabilities.
+ @internalTechnology
+*/
+#ifdef __REFERENCE_ALL_SUPPORTED_CAPABILITIES__
+
+extern const SCapabilitySet AllSupportedCapabilities;
+
+#endif //__REFERENCE_ALL_SUPPORTED_CAPABILITIES__
+
+/** Define this macro to include the set of all capabilities.
+ @internalTechnology
+*/
+#ifdef __INCLUDE_ALL_SUPPORTED_CAPABILITIES__
+
+/** The set of all capabilities.
+ @internalTechnology
+*/
+const SCapabilitySet AllSupportedCapabilities = {
+ {
+ ECapability_Limit<32 ? (TUint32)((1u<<(ECapability_Limit&31))-1u) : 0xffffffffu
+ ,
+ ECapability_Limit>=32 ? (TUint32)((1u<<(ECapability_Limit&31))-1u) : 0u
+ }
+ };
+
+#endif // __INCLUDE_ALL_SUPPORTED_CAPABILITIES__
+
+#ifndef __KERNEL_MODE__
+class RProcess;
+class RThread;
+class RMessagePtr2;
+class RSessionBase;
+#else
+class DProcess;
+class DThread;
+#endif
+
+/** Class representing all security attributes of a process or DLL.
+ These comprise a set of capabilities, a Secure ID and a Vendor ID.
+
+@publishedAll
+@released
+*/
+class TSecurityInfo
+ {
+public:
+ inline TSecurityInfo();
+#ifdef __KERNEL_MODE__
+ IMPORT_C TSecurityInfo(DProcess* aProcess);
+ IMPORT_C TSecurityInfo(DThread* aThread);
+#else
+ IMPORT_C TSecurityInfo(RProcess aProcess);
+ IMPORT_C TSecurityInfo(RThread aThread);
+ IMPORT_C TSecurityInfo(RMessagePtr2 aMesPtr);
+ inline void Set(RProcess aProcess);
+ inline void Set(RThread aThread);
+ inline void Set(RMessagePtr2 aMsgPtr);
+ TInt Set(RSessionBase aSession); /**< @internalComponent */
+ inline void SetToCurrentInfo();
+ IMPORT_C void SetToCreatorInfo();
+#endif //__KERNEL_MODE__
+public:
+ TSecureId iSecureId; /**< Secure ID */
+ TVendorId iVendorId; /**< Vendor ID */
+ TCapabilitySet iCaps; /**< Capability Set */
+ };
+
+
+/** Class representing a generic security policy
+
+This class can specify a security policy consisting of either:
+
+-# A check for between 0 and 7 capabilities
+-# A check for a given Secure ID along with 0-3 capabilities
+-# A check for a given Vendor ID along with 0-3 capabilities
+
+If multiple capabilities are specified, all of them must be present for the
+security check to succeed ('AND' relation).
+
+The envisaged use case for this class is to specify access rights to an object
+managed either by the kernel or by a server but in principle owned by a client
+and usable in a limited way by other clients. For example
+- Publish and Subscribe properties
+- DBMS databases
+
+In these cases the owning client would pass one (or more) of these objects to
+the server to specify which security checks should be done on other clients
+before allowing access to the object.
+
+To pass a TSecurityPolicy object via IPC, a client should obtain a descriptor
+for the object using Package() and send this. When a server receives this descriptor
+it should read the descriptor contents into a TSecurityPolicyBuf and then
+Set() should be used to create a policy object from this.
+
+Because this class has non-default constructors, compilers will not initialise
+this object at compile time, instead code will be generated to construct the object
+at run-time. This is wasteful - and Symbian OS DLLs are not permitted to have
+such uninitialised data. To overcome these problems a set of macros are provided to
+construct a const object which behaves like a TSecurityPolicy. These are:
+
+_LIT_SECURITY_POLICY_C1 through _LIT_SECURITY_POLICY_C7,
+_LIT_SECURITY_POLICY_S0 through _LIT_SECURITY_POLICY_S3 and
+_LIT_SECURITY_POLICY_V0 through _LIT_SECURITY_POLICY_V3.
+
+Also, the macros _LIT_SECURITY_POLICY_PASS and _LIT_SECURITY_POLICY_FAIL are provided
+in order to allow easy construction of a const object which can be used as a
+TSecuityPolicy which always passes or always fails, respectively.
+
+If a security policy object is needed to be embedded in another class then the
+TStaticSecurityPolicy structure can be used. This behaves in the same way as a
+TSecurityPolicy object but may be initialised at compile time.
+
+@see TStaticSecurityPolicy
+@see TSecurityPolicyBuf
+@see _LIT_SECURITY_POLICY_PASS
+@see _LIT_SECURITY_POLICY_FAIL
+@see _LIT_SECURITY_POLICY_C1
+@see _LIT_SECURITY_POLICY_C2
+@see _LIT_SECURITY_POLICY_C3
+@see _LIT_SECURITY_POLICY_C4
+@see _LIT_SECURITY_POLICY_C5
+@see _LIT_SECURITY_POLICY_C6
+@see _LIT_SECURITY_POLICY_C7
+@see _LIT_SECURITY_POLICY_S0
+@see _LIT_SECURITY_POLICY_S1
+@see _LIT_SECURITY_POLICY_S2
+@see _LIT_SECURITY_POLICY_S3
+@see _LIT_SECURITY_POLICY_V0
+@see _LIT_SECURITY_POLICY_V1
+@see _LIT_SECURITY_POLICY_V2
+@see _LIT_SECURITY_POLICY_V3
+
+@publishedAll
+@released
+*/
+class TSecurityPolicy
+ {
+public:
+ enum TSecPolicyType
+ {
+ EAlwaysFail=0,
+ EAlwaysPass=1,
+ };
+
+public:
+ inline TSecurityPolicy();
+ IMPORT_C TSecurityPolicy(TSecPolicyType aType);
+ IMPORT_C TSecurityPolicy(TCapability aCap1, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None);
+ IMPORT_C TSecurityPolicy(TCapability aCap1, TCapability aCap2, TCapability aCap3, TCapability aCap4, TCapability aCap5 = ECapability_None, TCapability aCap6 = ECapability_None, TCapability aCap7 = ECapability_None);
+ IMPORT_C TSecurityPolicy(TSecureId aSecureId, TCapability aCap1 = ECapability_None, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None);
+ IMPORT_C TSecurityPolicy(TVendorId aVendorId, TCapability aCap1 = ECapability_None, TCapability aCap2 = ECapability_None, TCapability aCap3 = ECapability_None);
+ IMPORT_C TInt Set(const TDesC8& aDes);
+ IMPORT_C TPtrC8 Package() const;
+
+#ifdef __KERNEL_MODE__
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ inline TBool CheckPolicy(DProcess* aProcess, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicy(DThread* aThread, const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ // Only available to NULL arguments
+ inline TBool CheckPolicy(DProcess* aProcess, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicy(DThread* aThread, OnlyCreateWithNull aDiagnostic=NULL) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+#else // !__KERNEL_MODE__
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ inline TBool CheckPolicy(RProcess aProcess, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicy(RThread aThread, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicyCreator(const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ // Only available to NULL arguments
+ inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+ // For things using KSuppressPlatSecDiagnostic
+ inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ TInt CheckPolicy(RSessionBase aSession) const; /**< @internalComponent */
+
+#endif //__KERNEL_MODE__
+
+ TBool Validate() const;
+
+private:
+#ifdef __KERNEL_MODE__
+ IMPORT_C TBool DoCheckPolicy(DProcess* aProcess, const char* aDiagnostic) const;
+ IMPORT_C TBool DoCheckPolicy(DProcess* aProcess) const;
+ IMPORT_C TBool DoCheckPolicy(DThread* aThread, const char* aDiagnostic) const;
+ IMPORT_C TBool DoCheckPolicy(DThread* aThread) const;
+#else // !__KERNEL_MODE__
+ IMPORT_C TBool DoCheckPolicy(RProcess aProcess, const char* aDiagnostic) const;
+ IMPORT_C TBool DoCheckPolicy(RProcess aProcess) const;
+ IMPORT_C TBool DoCheckPolicy(RThread aThread, const char* aDiagnostic) const;
+ IMPORT_C TBool DoCheckPolicy(RThread aThread) const;
+ IMPORT_C TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic) const;
+ IMPORT_C TBool DoCheckPolicy(RMessagePtr2 aMsgPtr) const;
+ IMPORT_C TBool DoCheckPolicyCreator(const char* aDiagnostic) const;
+ IMPORT_C TBool DoCheckPolicyCreator() const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+ TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic) const;
+#endif //__REMOVE_PLATSEC_DIAGNOSTICS__
+ TBool DoCheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing) const;
+#endif //__KERNEL_MODE__
+
+public:
+ /** Constants to specify the type of TSecurityPolicy objects.
+ */
+ enum TType
+ {
+ ETypeFail=0, /**< Always fail*/
+ ETypePass=1, /**< Always pass*/
+ ETypeC3=2, /**< Up to 3 capabilities*/
+ ETypeC7=3, /**< Up to 7 capabilities*/
+ ETypeS3=4, /**< Secure ID and up to 3 capabilities*/
+ ETypeV3=5, /**< Vendor ID and up to 3 capabilities*/
+
+ /** The number of possible TSecurityPolicy types
+ This is intended for internal Symbian use only.
+ @internalTechnology
+ */
+ ETypeLimit
+
+ // other values may be added to indicate expanded policy objects (future extensions)
+ };
+protected:
+ TBool CheckPolicy(const SSecurityInfo& aSecInfo, SSecurityInfo& aMissing) const;
+private:
+ void ConstructAndCheck3(TCapability aCap1, TCapability aCap2, TCapability aCap3);
+private:
+ TUint8 iType;
+ TUint8 iCaps[3]; // missing capabilities are set to 0xff
+ union
+ {
+ TUint32 iSecureId;
+ TUint32 iVendorId;
+ TUint8 iExtraCaps[4]; // missing capabilities are set to 0xff
+ };
+ friend class TCompiledSecurityPolicy;
+ };
+
+/** Provides a TPkcgBuf wrapper for a descriptorised TSecurityPolicy. This a
+suitable container for passing a security policy across IPC.
+@publishedAll
+@released
+*/
+typedef TPckgBuf<TSecurityPolicy> TSecurityPolicyBuf;
+
+
+/** Structure for compile-time initialisation of a security policy.
+
+This structure behaves in the same way as a TSecurityPolicy object but has
+the advantage that it may be initialised at compile time. E.g.
+the following line defines a security policy 'KSecurityPolictReadUserData'
+which checks ReadUserData capability.
+
+@code
+_LIT_SECURITY_POLICY_C1(KSecurityPolictReadUserData,ECapabilityReadUserData)
+@endcode
+
+Or, an array of security policies may be created like this:
+@code
+static const TStaticSecurityPolicy MyPolicies[] =
+ {
+ _INIT_SECURITY_POLICY_C1(ECapabilityReadUserData),
+ _INIT_SECURITY_POLICY_PASS(),
+ _INIT_SECURITY_POLICY_S0(0x1234567)
+ }
+@endcode
+
+This class should not be initialised directly, instead one of the following
+macros should be used:
+
+- _INIT_SECURITY_POLICY_PASS
+- _INIT_SECURITY_POLICY_FAIL
+- _INIT_SECURITY_POLICY_C1
+- _INIT_SECURITY_POLICY_C2
+- _INIT_SECURITY_POLICY_C3
+- _INIT_SECURITY_POLICY_C4
+- _INIT_SECURITY_POLICY_C5
+- _INIT_SECURITY_POLICY_C6
+- _INIT_SECURITY_POLICY_C7
+- _INIT_SECURITY_POLICY_S0
+- _INIT_SECURITY_POLICY_S1
+- _INIT_SECURITY_POLICY_S2
+- _INIT_SECURITY_POLICY_S3
+- _INIT_SECURITY_POLICY_V0
+- _INIT_SECURITY_POLICY_V1
+- _INIT_SECURITY_POLICY_V2
+- _INIT_SECURITY_POLICY_V3
+- _LIT_SECURITY_POLICY_PASS
+- _LIT_SECURITY_POLICY_FAIL
+- _LIT_SECURITY_POLICY_C1
+- _LIT_SECURITY_POLICY_C2
+- _LIT_SECURITY_POLICY_C3
+- _LIT_SECURITY_POLICY_C4
+- _LIT_SECURITY_POLICY_C5
+- _LIT_SECURITY_POLICY_C6
+- _LIT_SECURITY_POLICY_C7
+- _LIT_SECURITY_POLICY_S0
+- _LIT_SECURITY_POLICY_S1
+- _LIT_SECURITY_POLICY_S2
+- _LIT_SECURITY_POLICY_S3
+- _LIT_SECURITY_POLICY_V0
+- _LIT_SECURITY_POLICY_V1
+- _LIT_SECURITY_POLICY_V2
+- _LIT_SECURITY_POLICY_V3
+
+@see TSecurityPolicy
+@publishedAll
+@released
+*/
+struct TStaticSecurityPolicy
+ {
+ inline const TSecurityPolicy* operator&() const;
+ inline operator const TSecurityPolicy&() const;
+ inline const TSecurityPolicy& operator()() const;
+
+#ifndef __KERNEL_MODE__
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ inline TBool CheckPolicy(RProcess aProcess, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicy(RThread aThread, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, const char* aDiagnostic=0) const;
+ inline TBool CheckPolicyCreator(const char* aDiagnostic=0) const;
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ // Only available to NULL arguments
+ inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic=NULL) const;
+ inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic=NULL) const;
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+ // For things using KSuppressPlatSecDiagnostic
+ inline TBool CheckPolicy(RProcess aProcess, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicy(RThread aThread, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicy(RMessagePtr2 aMsgPtr, TSecurityInfo& aMissing, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+ inline TBool CheckPolicyCreator(OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+#endif // !__KERNEL_MODE__
+
+ TUint32 iA; /**< @internalComponent */
+ TUint32 iB; /**< @internalComponent */
+ };
+
+
+/**
+A dummy enum for use by the CAPABILITY_AS_TUINT8 macro
+@internalComponent
+*/
+enum __invalid_capability_value {};
+
+/**
+A macro to cast a TCapability to a TUint8.
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param cap The capability value
+@internalComponent
+*/
+#define CAPABILITY_AS_TUINT8(cap) \
+ ((TUint8)(int)( \
+ (cap)==ECapability_None \
+ ? (__invalid_capability_value(*)[1])(ECapability_None) \
+ : (__invalid_capability_value(*)[((TUint)(cap+1)<=(TUint)ECapability_Limit)?1:2])(cap) \
+ ))
+
+
+/**
+A macro to construct a TUint32 from four TUint8s. The TUint32 is in BigEndian
+ordering useful for class layout rather than number generation.
+
+@param i1 The first TUint8
+@param i2 The second TUint8
+@param i3 The third TUint8
+@param i4 The fourth TUint8
+@internalComponent
+*/
+#define FOUR_TUINT8(i1,i2,i3,i4) \
+ (TUint32)( \
+ (TUint8)i1 | \
+ (TUint8)i2 << 8 | \
+ (TUint8)i3 << 16 | \
+ (TUint8)i4 << 24 \
+ )
+
+
+/** Macro for compile-time initialisation of a security policy object that
+always fails. That is, checks against this policy will always fail,
+irrespective of the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_FAIL \
+ { \
+ FOUR_TUINT8( \
+ (TUint8)TSecurityPolicy::ETypeFail, \
+ (TUint8)0xff, \
+ (TUint8)0xff, \
+ (TUint8)0xff \
+ ), \
+ (TUint32)0xffffffff \
+ }
+
+
+/** Macro for compile-time definition of a security policy object that always
+fails. That is, checks against this policy will always fail, irrespective of
+the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@param n Name to use for policy object
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_FAIL(n) const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_FAIL
+
+
+/** Macro for compile-time initialisation of a security policy object that
+always passes. That is, checks against this policy will always pass,
+irrespective of the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_PASS \
+ { \
+ FOUR_TUINT8( \
+ (TUint8)TSecurityPolicy::ETypePass, \
+ (TUint8)0xff, \
+ (TUint8)0xff, \
+ (TUint8)0xff \
+ ), \
+ (TUint32)0xffffffff \
+ }
+
+
+/** Macro for compile-time definition of a security policy object that always
+passes. That is, checks against this policy will always pass, irrespective of
+the security attributes of the item being checked.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+@param n Name to use for policy object
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_PASS(n) const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_PASS
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for seven capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+@param c5 The fifth capability to check (enumerator of TCapability)
+@param c6 The sixth capability to check (enumerator of TCapability)
+@param c7 The seventh capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,c7) \
+ { \
+ FOUR_TUINT8( \
+ (TUint8)TSecurityPolicy::ETypeC7, \
+ CAPABILITY_AS_TUINT8(c1), \
+ CAPABILITY_AS_TUINT8(c2), \
+ CAPABILITY_AS_TUINT8(c3) \
+ ), \
+ FOUR_TUINT8( \
+ CAPABILITY_AS_TUINT8(c4), \
+ CAPABILITY_AS_TUINT8(c5), \
+ CAPABILITY_AS_TUINT8(c6), \
+ CAPABILITY_AS_TUINT8(c7) \
+ ) \
+ }
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for seven capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+@param c5 The fifth capability to check (enumerator of TCapability)
+@param c6 The sixth capability to check (enumerator of TCapability)
+@param c7 The seventh capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,c6,c7) \
+ const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,c7)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for six capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+@param c5 The fifth capability to check (enumerator of TCapability)
+@param c6 The sixth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C6(c1,c2,c3,c4,c5,c6) \
+ _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,c6,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for six capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+@param c5 The fifth capability to check (enumerator of TCapability)
+@param c6 The sixth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_C6(n,c1,c2,c3,c4,c5,c6) \
+ _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,c6,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for five capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+@param c5 The fifth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C5(c1,c2,c3,c4,c5) \
+ _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,c5,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for five capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+@param c5 The fifth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_C5(n,c1,c2,c3,c4,c5) \
+ _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,c5,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for four capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C4(c1,c2,c3,c4) \
+ _INIT_SECURITY_POLICY_C7(c1,c2,c3,c4,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for four capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+@param c4 The fourth capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_C4(n,c1,c2,c3,c4) \
+ _LIT_SECURITY_POLICY_C7(n,c1,c2,c3,c4,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C3(c1,c2,c3) \
+ { \
+ FOUR_TUINT8( \
+ (TUint8)TSecurityPolicy::ETypeC3, \
+ CAPABILITY_AS_TUINT8(c1), \
+ CAPABILITY_AS_TUINT8(c2), \
+ CAPABILITY_AS_TUINT8(c3) \
+ ), \
+ (TUint32)0xffffffff \
+ }
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_C3(n,c1,c2,c3) \
+ const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_C3(c1,c2,c3)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C2(c1,c2) \
+ _INIT_SECURITY_POLICY_C3(c1,c2,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_C2(n,c1,c2) \
+ _LIT_SECURITY_POLICY_C3(n,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param c1 The first capability to check (enumerator of TCapability)
+
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_C1(c1) \
+ _INIT_SECURITY_POLICY_C3(c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning will be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param c1 The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_C1(n,c1) \
+ _LIT_SECURITY_POLICY_C3(n,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param sid The SID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S3(sid,c1,c2,c3) \
+ { \
+ FOUR_TUINT8( \
+ (TUint8)TSecurityPolicy::ETypeS3, \
+ CAPABILITY_AS_TUINT8(c1), \
+ CAPABILITY_AS_TUINT8(c2), \
+ CAPABILITY_AS_TUINT8(c3) \
+ ), \
+ (TUint32)(sid) \
+ }
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param sid The SID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_S3(n,sid,c1,c2,c3) \
+ const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_S3(sid,c1,c2,c3)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param sid The SID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S2(sid,c1,c2) \
+ _INIT_SECURITY_POLICY_S3(sid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param sid The SID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_S2(n,sid,c1,c2) \
+ _LIT_SECURITY_POLICY_S3(n,sid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param sid The SID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S1(sid,c1) \
+ _INIT_SECURITY_POLICY_S3(sid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param sid The SID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_S1(n,sid,c1) \
+ _LIT_SECURITY_POLICY_S3(n,sid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a secure ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param sid The SID value to check for
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_S0(sid) \
+ _INIT_SECURITY_POLICY_S3(sid,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a secure ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param n Name to use for policy object
+@param sid The SID value to check for
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_S0(n,sid) \
+ _LIT_SECURITY_POLICY_S3(n,sid,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param vid The VID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V3(vid,c1,c2,c3) \
+ { \
+ FOUR_TUINT8( \
+ (TUint8)TSecurityPolicy::ETypeV3, \
+ CAPABILITY_AS_TUINT8(c1), \
+ CAPABILITY_AS_TUINT8(c2), \
+ CAPABILITY_AS_TUINT8(c3) \
+ ), \
+ (TUint32)(vid) \
+ }
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID and three capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param vid The VID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+@param c3 The third capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_V3(n,vid,c1,c2,c3) \
+ const TStaticSecurityPolicy n = _INIT_SECURITY_POLICY_V3(vid,c1,c2,c3)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param vid The VID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V2(vid,c1,c2) \
+ _INIT_SECURITY_POLICY_V3(vid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID and two capabilities.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param vid The VID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+@param c2 The second capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_V2(n,vid,c1,c2) \
+ _LIT_SECURITY_POLICY_V3(n,vid,c1,c2,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param vid The VID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V1(vid,c1) \
+ _INIT_SECURITY_POLICY_V3(vid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID and one capability.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+If an invlid capability value is specified then, dependant on the compiler,
+a compile time error or warning be produced which includes the label
+"__invalid_capability_value"
+
+@param n Name to use for policy object
+@param vid The VID value to check for
+@param c1 The first capability to check (enumerator of TCapability)
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_V1(n,vid,c1) \
+ _LIT_SECURITY_POLICY_V3(n,vid,c1,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time initialisation of a security policy object
+The policy will check for a vendor ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param vid The VID value to check for
+
+@publishedAll
+@released
+*/
+#define _INIT_SECURITY_POLICY_V0(vid) \
+ _INIT_SECURITY_POLICY_V3(vid,ECapability_None,ECapability_None,ECapability_None)
+
+
+/** Macro for compile-time definition of a security policy object
+The policy will check for a vendor ID.
+
+The object declared has an implicit conversion to const TSecurityPolicy&.
+Taking the address of the object will return a const TSecurityPolicy*.
+Explicit conversion to const TSecurityPolicy& may be effected by using the
+function call operator n().
+
+@param n Name to use for policy object
+@param vid The VID value to check for
+
+@publishedAll
+@released
+*/
+#define _LIT_SECURITY_POLICY_V0(n,vid) \
+ _LIT_SECURITY_POLICY_V3(n,vid,ECapability_None,ECapability_None,ECapability_None)
+
+
+
+#ifdef __KERNEL_MODE__
+class DThread;
+class RMessageK;
+#endif
+class TPlatSecDiagnostic;
+
+/**
+Class containing Platform Security related methods
+@internalTechnology
+*/
+class PlatSec
+ {
+#ifndef __KERNEL_MODE__
+public:
+ /**
+ Tests whether a given Platform Security capability is enforced by the system.
+
+ Capabilities may not be enforced for several reasons:
+ -# The capability has been explicitly disabled on this system
+ by use of the PlatSecDisabledCaps configuration parameter
+ -# Platform Security checks have been globally disabled
+ by use of the EPlatSecEnforcement configuration parameter
+ -# The capability value is unknown. I.e. Is not part of the set of supported
+ capabilities. See TCapabilitySet::SetAllSupported().
+
+ @param aCapability The capability to test
+ @return A non-zero value if the capability is enforced, zero if it is not.
+
+ @publishedAll
+ @released
+ */
+ IMPORT_C static TBool IsCapabilityEnforced(TCapability aCapability);
+
+ /**
+ An enumeration used with PlatSecSetting()
+ @see PlatSecSetting()
+ @publishedAll
+ @test
+ */
+ enum TConfigSetting
+ {
+ EPlatSecEnforcement, /**< Used to request the value of the PlatSecEnforcement setting */
+ EPlatSecDiagnotics, /**< Used to request the value of the PlatSecDiagnotics setting */
+ EPlatSecProcessIsolation, /**< Used to request the value of the PlatSecProcessIsolation setting */
+ EPlatSecEnforceSysBin, /**< Used to request the value of the PlatSecEnforceSysBin setting */
+ EPlatSecLocked, /**< Used to request the value of the PlatSecLocked setting */
+ };
+
+ /**
+ A test function to return the state of a given Platform Security configuration setting.
+ @param aSetting An enumerated value representing the required setting
+ @return A value representing the setting. 0 represents 'OFF', 1 represents 'ON'
+ Other values may be returned for some settings, these exceptions are documented
+ in the description for individual enumerations of TConfigSetting.
+ @see TConfigSetting
+ @publishedAll
+ @test
+ */
+ IMPORT_C static TInt ConfigSetting(TConfigSetting aSetting);
+
+#endif // Not __KERNEL_MODE__
+
+ //
+ // All methods below here are internalTechnology
+ //
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
+public:
+ /** @internalTechnology */
+ static inline TInt LoaderCapabilityViolation(const TDesC8& aImporterName, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps);
+#ifdef __KERNEL_MODE__
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(const DProcess* aViolatingProcess, TCapability aCapability, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(const DThread* aViolatingThread, TCapability aCapability, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt SecureIdCheckFail(const DProcess* aViolatingProcess, TSecureId aSid, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt PolicyCheckFail(const DProcess* aProcess, const SSecurityInfo& aMissing, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt PolicyCheckFail(const DThread* aProcess, const SSecurityInfo& aMissing, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt ProcessIsolationFail(const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt ProcessIsolationIPCFail(RMessageK* aMessage, const char* aContextText);
+#else // !__KERNEL_MODE__
+ /** @internalTechnology */
+ static inline TInt LoaderCapabilityViolation(RProcess aLoadingProcess, const TDesC8& aFileName, const SCapabilitySet& aMissingCaps);
+ /** @internalTechnology */
+ static inline TInt CreatorCapabilityCheckFail(TCapability aCapability, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(TInt aHandle, TCapability aCapability, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissing, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissingCaps, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt PolicyCheckFail(RSessionBase aSession, const SSecurityInfo& aMissingCaps, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CreatorPolicyCheckFail(const SSecurityInfo& aMissingCaps, const char* aContextText);
+ /** @internalTechnology */
+ static inline TInt CreatorCapabilityCheckFail(TCapability aCapability);
+ /** @internalTechnology */
+ static inline TInt CreatorCapabilityCheckFail(const TCapabilitySet& aMissingCaps);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(TInt aHandle, TCapability aCapability);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(TInt aHandle, const TCapabilitySet& aMissingCaps);
+ /** @internalTechnology */
+ static inline TInt PolicyCheckFail(TInt aHandle, const SSecurityInfo& aMissing);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, TCapability aCapability);
+ /** @internalTechnology */
+ static inline TInt CapabilityCheckFail(RMessagePtr2 aMessage, const TCapabilitySet& aMissingCaps);
+ /** @internalTechnology */
+ static inline TInt PolicyCheckFail(RMessagePtr2 aMessage, const SSecurityInfo& aMissingCaps);
+ /** @internalTechnology */
+ static inline TInt CreatorPolicyCheckFail(const SSecurityInfo& aMissingCaps);
+#endif //__KERNEL_MODE__
+
+private:
+ UIMPORT_C static TInt EmitDiagnostic(TPlatSecDiagnostic& aDiagnostic, const char* aContextText);
+#else //__REMOVE_PLATSEC_DIAGNOSTICS__
+#ifndef __KERNEL_MODE__
+private:
+ IMPORT_C static TInt EmitDiagnostic(TPlatSecDiagnostic& aDiagnostic, const char* aContextText);
+#endif // !__KERNEL_MODE__
+#endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
+
+public:
+ /** @internalTechnology */
+ UIMPORT_C static TInt EmitDiagnostic();
+ };
+
+
+
+/**
+@publishedAll
+@released
+
+Contains information about the code and data sections belonging to a process.
+
+@see RProcess::GetMemoryInfo
+*/
+class TProcessMemoryInfo
+ {
+public:
+ /**
+ The code base address (.text).
+ */
+ TUint32 iCodeBase;
+
+
+ /**
+ The size of the code section (.text).
+ */
+ TUint32 iCodeSize;
+
+
+ /**
+ The base address of the constant data section (.radata).
+ */
+ TUint32 iConstDataBase;
+
+
+ /**
+ The size of the constant data section (.radata).
+ */
+
+ TUint32 iConstDataSize;
+
+
+ /**
+ The base address of the initialised data section (.data).
+ */
+ TUint32 iInitialisedDataBase;
+
+
+ /**
+ The size of the initialised data section (.data).
+ */
+ TUint32 iInitialisedDataSize;
+
+
+ /**
+ The base address of the uninitialised data section (.bss).
+ */
+ TUint32 iUninitialisedDataBase;
+
+
+ /**
+ The size of the uninitialised data section (.bss).
+ */
+ TUint32 iUninitialisedDataSize;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a more useful synonym for TProcessMemoryInfo.
+*/
+typedef TProcessMemoryInfo TModuleMemoryInfo; // more accurate name - remove old one later
+
+
+
+
+#ifndef __KERNEL_MODE__
+class CBase;
+/**
+@publishedAll
+@released
+
+Generic array.
+
+This class defines a generic array which can be constructed by any of the
+following templated concrete arrays:
+
+1. CArrayFixFlat<class T>
+
+2. CArrayFixSeg<class T>
+
+3. CArrayVarFlat<class T>
+
+4. CArrayVarSeg<class T>
+
+5. CArrayPakFlat<class T>
+
+6. RArray<class T>
+
+7. RPointerArray<class T>
+
+and also by the following template specialisation classes:
+
+1. RArray<TInt>
+
+2. RArray<TUint>
+
+It allows a degree of polymorphism amongst the array classes. It permits the
+operator[] and the Count() member functions of an array to be invoked without
+knowing which array class has been used to construct that array.
+
+TArray allows access to elements of an array but does not permit changes to
+those elements.
+
+Use the Array() member function of an array to construct and return
+a TArray<class T> object for that array.
+
+A TArray<class T> type object is not intended to be constructed explicitly
+by user code.
+
+@see CArrayFixFlat
+@see CArrayFixSeg
+@see CArrayVarFlat
+@see CArrayVarSeg
+@see CArrayPakFlat
+@see RArray
+@see RPointerArray
+@see RArray<TInt>
+@see RArray<TUint>
+*/
+template <class T>
+class TArray
+ {
+public:
+ inline TArray(TInt (*aCount)(const CBase* aPtr),const TAny*(*anAt)(const CBase* aPtr,TInt anIndex),const CBase* aPtr);
+ inline TInt Count() const;
+ inline const T& operator[](TInt anIndex) const;
+private:
+ const CBase* iPtr;
+ TInt (*iCount)(const CBase* aPtr);
+ const TAny*(*iAt)(const CBase* aPtr,TInt anIndex);
+ };
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a function type used by a TIdentityRelation object.
+
+A function of this type implements an algorithm for determining whether
+two objects match.
+
+@see TIdentityRelation
+*/
+typedef TBool (*TGeneralIdentityRelation)(const TAny*, const TAny*);
+
+
+
+
+/**
+@publishedAll
+@released
+
+Defines a function type used by a TLinearOrder object
+
+A function of this type implements an algorithm that determines
+the order of two objects.
+
+@see TLinearOrder
+*/
+typedef TInt (*TGeneralLinearOrder)(const TAny*, const TAny*);
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class which packages a function that determines whether two
+objects of a given class type match. During linear search operations the search
+term is always passed as the first argument and the second argument is an
+element of the array being searched.
+
+A TIdentityRelation<T> object is constructed and passed as a parameter to
+member functions of the array classes RArray<T> and RPointerArray<T>.
+
+@see RArray
+@see RPointerArray
+*/
+template <class T>
+class TIdentityRelation
+ {
+public:
+ inline TIdentityRelation();
+ inline TIdentityRelation( TBool (*anIdentity)(const T&, const T&) );
+ inline operator TGeneralIdentityRelation() const;
+private:
+ inline static TBool EqualityOperatorCompare(const T& aLeft, const T& aRight);
+private:
+ TGeneralIdentityRelation iIdentity;
+ };
+
+
+
+/**
+@publishedAll
+@released
+
+A set of common identity relations for frequently occurring types.
+
+@see RArray
+@see RPointerArray
+@see RHashSet
+@see RPtrHashSet
+@see RHashMap
+@see RPtrHashMap
+*/
+class DefaultIdentity
+ {
+public:
+ IMPORT_C static TBool Integer(const TInt&, const TInt&);
+ IMPORT_C static TBool Des8(const TDesC8&, const TDesC8&);
+ IMPORT_C static TBool Des16(const TDesC16&, const TDesC16&);
+ IMPORT_C static TBool IntegerPtr(TInt* const&, TInt* const&);
+ IMPORT_C static TBool Des8Ptr(TDesC8* const&, TDesC8* const&);
+ IMPORT_C static TBool Des16Ptr(TDesC16* const&, TDesC16* const&);
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+A templated class which packages a function that determines the order of two
+objects of a given class type. During binary search operations the search term
+is always passed as the first argument and the second argument is an element
+of the array being searched.
+
+A TLinearOrder<T> object is constructed and passed as a parameter to member
+functions of the array classes RArray<T> and RPointerArray<T>.
+
+@see RArray
+@see RPointerArray
+*/
+template <class T>
+class TLinearOrder
+ {
+public:
+ inline TLinearOrder( TInt(*anOrder)(const T&, const T&) );
+ inline operator TGeneralLinearOrder() const;
+private:
+ TGeneralLinearOrder iOrder;
+ };
+
+
+/*
+@publishedAll
+@released
+
+A set of values that tell array search functions which array element is to be
+returned when there are duplicate elements in the array.
+
+These values are used by RArray, RPointerArray, RArray<TInt>,
+and RArray<TUint> search functions.
+
+Examples of functions that take
+these enum values are: RPointerArray::SpecificFindInOrderL(),
+and RArray::SpecificFindInSignedKeyOrder().
+
+@see RArray
+@see RPointerArray
+@see RArray<TInt>
+@see RArray<TUint>
+*/
+enum TArrayFindMode
+ {
+ /**
+ Indicates that any element in a block of duplicate elements can be
+ returned by a search function.
+
+ Note that using this mode, there can be no guarantee that the element
+ returned by the search functions will be the same if the size of the array
+ changes between successive calls to those functions.
+ */
+ EArrayFindMode_Any = 0,
+
+ /**
+ Indicates that the first element in a block of duplicate elements
+ is returned.
+ */
+ EArrayFindMode_First = 1,
+
+ /**
+ Indicates that the first element after the last element in a block
+ of duplicate elements is returned.
+ */
+ EArrayFindMode_Last = 2,
+
+ /**
+ @internalTechnology
+ */
+ EArrayFindMode_Limit = 3
+ };
+
+
+/**
+@internalComponent
+
+Base class used in the derivation of RPointerArray, RArray<TInt>,
+and RArray<TUint>.
+
+The base class is inherited privately.
+
+The class is internal and is not intended for use.
+*/
+class RPointerArrayBase
+ {
+protected:
+ IMPORT_C RPointerArrayBase();
+ IMPORT_C RPointerArrayBase(TInt aGranularity);
+ IMPORT_C RPointerArrayBase(TInt aMinGrowBy, TInt aFactor);
+ IMPORT_C void Close();
+ IMPORT_C TInt Count() const;
+ inline void ZeroCount() {iCount=0;}
+ inline TAny** Entries() {return iEntries;}
+ IMPORT_C TAny*& At(TInt anIndex) const;
+ IMPORT_C TInt Append(const TAny* anEntry);
+ IMPORT_C TInt Insert(const TAny* anEntry, TInt aPos);
+ IMPORT_C void Remove(TInt anIndex);
+ IMPORT_C void Compress();
+ IMPORT_C void Reset();
+ IMPORT_C TInt Find(const TAny* anEntry) const;
+ IMPORT_C TInt Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const;
+ IMPORT_C TInt FindReverse(const TAny* aEntry) const;
+ IMPORT_C TInt FindReverse(const TAny* aEntry, TGeneralIdentityRelation aIdentity) const;
+ IMPORT_C TInt FindIsqSigned(TInt anEntry) const;
+ IMPORT_C TInt FindIsqUnsigned(TUint anEntry) const;
+ IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const;
+ IMPORT_C TInt FindIsqSigned(TInt anEntry, TInt aMode) const;
+ IMPORT_C TInt FindIsqUnsigned(TUint anEntry, TInt aMode) const;
+ IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const;
+ IMPORT_C TInt InsertIsqSigned(TInt anEntry, TBool aAllowRepeats);
+ IMPORT_C TInt InsertIsqUnsigned(TUint anEntry, TBool aAllowRepeats);
+ IMPORT_C TInt InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats);
+ IMPORT_C TInt BinarySearchSigned(TInt anEntry, TInt& anIndex) const;
+ IMPORT_C TInt BinarySearchUnsigned(TUint anEntry, TInt& anIndex) const;
+ IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const;
+ IMPORT_C TInt BinarySearchSigned(TInt anEntry, TInt& anIndex, TInt aMode) const;
+ IMPORT_C TInt BinarySearchUnsigned(TUint anEntry, TInt& anIndex, TInt aMode) const;
+ IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const;
+#ifndef __KERNEL_MODE__
+ IMPORT_C RPointerArrayBase(TAny** aEntries, TInt aCount);
+ IMPORT_C void GranularCompress();
+ IMPORT_C TInt DoReserve(TInt aCount);
+ IMPORT_C void HeapSortSigned();
+ IMPORT_C void HeapSortUnsigned();
+ IMPORT_C void HeapSort(TGeneralLinearOrder anOrder);
+ IMPORT_C static TInt GetCount(const CBase* aPtr);
+ IMPORT_C static const TAny* GetElementPtr(const CBase* aPtr, TInt aIndex);
+#endif
+private:
+ TInt Grow();
+private:
+ TInt iCount;
+ TAny** iEntries;
+ TInt iAllocated;
+ TInt iGranularity; // positive means linear, negative means exponential growth
+ TInt iSpare1;
+ TInt iSpare2;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+A simple and efficient array of pointers to objects.
+
+The elements of the array are pointers to instances of a class; this class
+is specified as the template parameter T.
+
+The class offers standard array behaviour which includes insertion, appending
+and sorting of pointers.
+
+Derivation from RPointerArrayBase is private.
+*/
+template <class T>
+class RPointerArray : private RPointerArrayBase
+ {
+public:
+ inline RPointerArray();
+ inline explicit RPointerArray(TInt aGranularity);
+ inline RPointerArray(TInt aMinGrowBy, TInt aFactor);
+ inline void Close();
+ inline TInt Count() const;
+ inline T* const& operator[](TInt anIndex) const;
+ inline T*& operator[](TInt anIndex);
+ inline TInt Append(const T* anEntry);
+ inline TInt Insert(const T* anEntry, TInt aPos);
+ inline void Remove(TInt anIndex);
+ inline void Compress();
+ inline void Reset();
+ void ResetAndDestroy();
+ inline TInt Find(const T* anEntry) const;
+ inline TInt Find(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+ template <class K>
+ inline TInt Find(const K& aKey, TBool (*apfnCompare)(const K* k, const T& t)) const
+ /**
+ Finds the first object pointer in the array which matches aKey using
+ the comparison algorithm provided by apfnCompare.
+
+ The find operation always starts at the low index end of the array. There
+ is no assumption about the order of objects in the array.
+
+ @param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+ @param apfnCompare A function defining the identity relation between the
+ object pointers in the array, and their keys of type K. The
+ function returns true if k and t match based on this relationship.
+
+ @return The index of the first matching object pointer within the array.
+ KErrNotFound, if no suitable object pointer can be found.
+ */
+ { return RPointerArrayBase::Find((T*)&aKey,*(TIdentityRelation<T>*)&apfnCompare); }
+ inline TInt FindReverse(const T* anEntry) const;
+ inline TInt FindReverse(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+ template <class K>
+ inline TInt FindReverse(const K& aKey, TInt (*apfnMatch)(const K* k, const T& t)) const
+ /**
+ Finds the first object pointer in the array which matches aKey using
+ the comparison algorithm provided by apfnCompare.
+
+ The find operation always starts at the high index end of the array. There
+ is no assumption about the order of objects in the array.
+
+ @param aKey The key of type K to be compared with the elements of the array using apfnMatch.
+ @param apfnMatch A function defining the identity relation between the
+ object pointers in the array, and their keys of type K. The
+ function returns true if k and t match based on this relationship.
+
+ @return The index of the first matching object pointer within the array.
+ KErrNotFound, if no suitable object pointer can be found.
+ */
+
+ { return RPointerArrayBase::FindReverse((T*)&aKey,*(TIdentityRelation<T>*)&apfnMatch); }
+ inline TInt FindInAddressOrder(const T* anEntry) const;
+ inline TInt FindInOrder(const T* anEntry, TLinearOrder<T> anOrder) const;
+ inline TInt FindInAddressOrder(const T* anEntry, TInt& anIndex) const;
+ inline TInt FindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+ template <class K>
+ inline TInt FindInOrder(const K& aKey, TInt (*apfnCompare)(const K* k, const T& t)) const
+ /**
+ Finds the object pointer in the array whose object matches the specified
+ key, (Using the relationship defined within apfnCompare) using a binary search
+ technique and an ordering algorithm.
+
+ The function assumes that existing object pointers in the array are ordered
+ so that the objects themselves are in object order as determined by an algorithm
+ supplied by the caller and packaged as a TLinearOrder<T>.
+
+ @param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+ @param apfnCompare A function which defines the order that the array was sorted,
+ where in it aKey (via the defined relationship) should fit, and if the key is present.
+
+ @return The index of the matching object pointer within the array.
+ KErrNotFound, if no suitable object pointer can be found.
+ */
+ { return RPointerArrayBase::FindIsq((T*)&aKey,*(TLinearOrder<T>*)&apfnCompare); }
+ inline TInt SpecificFindInAddressOrder(const T* anEntry, TInt aMode) const;
+ inline TInt SpecificFindInOrder(const T* anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline TInt SpecificFindInAddressOrder(const T* anEntry, TInt& anIndex, TInt aMode) const;
+ inline TInt SpecificFindInOrder(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline TInt InsertInAddressOrder(const T* anEntry);
+ inline TInt InsertInOrder(const T* anEntry, TLinearOrder<T> anOrder);
+ inline TInt InsertInAddressOrderAllowRepeats(const T* anEntry);
+ inline TInt InsertInOrderAllowRepeats(const T* anEntry, TLinearOrder<T> anOrder);
+#ifndef __KERNEL_MODE__
+ inline void AppendL(const T* anEntry);
+ inline void InsertL(const T* anEntry, TInt aPos);
+ inline TInt FindL(const T* anEntry) const;
+ inline TInt FindL(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+ inline TInt FindReverseL(const T* anEntry) const;
+ inline TInt FindReverseL(const T* anEntry, TIdentityRelation<T> anIdentity) const;
+ inline TInt FindInAddressOrderL(const T* anEntry) const;
+ inline TInt FindInOrderL(const T* anEntry, TLinearOrder<T> anOrder) const;
+ inline void FindInAddressOrderL(const T* anEntry, TInt& anIndex) const;
+ inline void FindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+ inline TInt SpecificFindInAddressOrderL(const T* anEntry, TInt aMode) const;
+ inline TInt SpecificFindInOrderL(const T* anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline void SpecificFindInAddressOrderL(const T* anEntry, TInt& anIndex, TInt aMode) const;
+ inline void SpecificFindInOrderL(const T* anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline void InsertInAddressOrderL(const T* anEntry);
+ inline void InsertInOrderL(const T* anEntry, TLinearOrder<T> anOrder);
+ inline void InsertInAddressOrderAllowRepeatsL(const T* anEntry);
+ inline void InsertInOrderAllowRepeatsL(const T* anEntry, TLinearOrder<T> anOrder);
+
+ inline RPointerArray(T** aEntries, TInt aCount);
+ inline void GranularCompress();
+ inline TInt Reserve(TInt aCount);
+ inline void ReserveL(TInt aCount);
+ inline void SortIntoAddressOrder();
+ inline void Sort(TLinearOrder<T> anOrder);
+ inline TArray<T*> Array() const;
+#endif
+ };
+
+
+
+/**
+@publishedAll
+@released
+
+Array of raw pointers.
+
+The array is a simple and efficient specialized array of TAny pointers offering
+standard array behaviour.
+
+The derivation from RPointerArrayBase is private.
+*/
+TEMPLATE_SPECIALIZATION class RPointerArray<TAny> : private RPointerArrayBase
+ {
+public:
+ inline RPointerArray();
+ inline explicit RPointerArray(TInt aGranularity);
+ inline RPointerArray(TInt aMinGrowBy, TInt aFactor);
+ inline void Close();
+ inline TInt Count() const;
+ inline TAny* const& operator[](TInt anIndex) const;
+ inline TAny*& operator[](TInt anIndex);
+ inline TInt Append(const TAny* anEntry);
+ inline TInt Insert(const TAny* anEntry, TInt aPos);
+ inline void Remove(TInt anIndex);
+ inline void Compress();
+ inline void Reset();
+ inline TInt Find(const TAny* anEntry) const;
+ inline TInt FindReverse(const TAny* anEntry) const;
+ inline TInt FindInAddressOrder(const TAny* anEntry) const;
+ inline TInt FindInAddressOrder(const TAny* anEntry, TInt& anIndex) const;
+ inline TInt SpecificFindInAddressOrder(const TAny* anEntry, TInt aMode) const;
+ inline TInt SpecificFindInAddressOrder(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+ inline TInt InsertInAddressOrder(const TAny* anEntry);
+ inline TInt InsertInAddressOrderAllowRepeats(const TAny* anEntry);
+#ifndef __KERNEL_MODE__
+ inline void AppendL(const TAny* anEntry);
+ inline void InsertL(const TAny* anEntry, TInt aPos);
+ inline TInt FindL(const TAny* anEntry) const;
+ inline TInt FindReverseL(const TAny* anEntry) const;
+ inline TInt FindInAddressOrderL(const TAny* anEntry) const;
+ inline void FindInAddressOrderL(const TAny* anEntry, TInt& anIndex) const;
+ inline TInt SpecificFindInAddressOrderL(const TAny* anEntry, TInt aMode) const;
+ inline void SpecificFindInAddressOrderL(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+ inline void InsertInAddressOrderL(const TAny* anEntry);
+ inline void InsertInAddressOrderAllowRepeatsL(const TAny* anEntry);
+
+ inline RPointerArray(TAny** aEntries, TInt aCount);
+ inline void GranularCompress();
+ inline void SortIntoAddressOrder();
+ inline TArray<TAny*> Array() const;
+#endif
+ };
+
+
+
+/**
+@internalComponent
+
+Base class used in the derivation of RArray.
+
+The base class is inherited privately.
+
+The class is internal and is not intended for use.
+*/
+class RArrayBase
+ {
+protected:
+ IMPORT_C RArrayBase(TInt anEntrySize);
+ IMPORT_C RArrayBase(TInt anEntrySize, TInt aGranularity);
+ IMPORT_C RArrayBase(TInt anEntrySize, TInt aGranularity, TInt aKeyOffset);
+ IMPORT_C RArrayBase(TInt anEntrySize, TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor);
+ IMPORT_C RArrayBase(TInt aEntrySize,TAny* aEntries, TInt aCount);
+ IMPORT_C void Close();
+ IMPORT_C TInt Count() const;
+ IMPORT_C TAny* At(TInt anIndex) const;
+ IMPORT_C TInt Append(const TAny* anEntry);
+ IMPORT_C TInt Insert(const TAny* anEntry, TInt aPos);
+ IMPORT_C void Remove(TInt anIndex);
+ IMPORT_C void Compress();
+ IMPORT_C void Reset();
+ IMPORT_C TInt Find(const TAny* anEntry) const;
+ IMPORT_C TInt Find(const TAny* anEntry, TGeneralIdentityRelation anIdentity) const;
+ IMPORT_C TInt FindReverse(const TAny* aEntry) const;
+ IMPORT_C TInt FindReverse(const TAny* aEntry, TGeneralIdentityRelation aIdentity) const;
+ IMPORT_C TInt FindIsqSigned(const TAny* anEntry) const;
+ IMPORT_C TInt FindIsqUnsigned(const TAny* anEntry) const;
+ IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder) const;
+ IMPORT_C TInt FindIsqSigned(const TAny* anEntry, TInt aMode) const;
+ IMPORT_C TInt FindIsqUnsigned(const TAny* anEntry, TInt aMode) const;
+ IMPORT_C TInt FindIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TInt aMode) const;
+ IMPORT_C TInt InsertIsqSigned(const TAny* anEntry, TBool aAllowRepeats);
+ IMPORT_C TInt InsertIsqUnsigned(const TAny* anEntry, TBool aAllowRepeats);
+ IMPORT_C TInt InsertIsq(const TAny* anEntry, TGeneralLinearOrder anOrder, TBool aAllowRepeats);
+ IMPORT_C TInt BinarySearchSigned(const TAny* anEntry, TInt& anIndex) const;
+ IMPORT_C TInt BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex) const;
+ IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder) const;
+ IMPORT_C TInt BinarySearchSigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+ IMPORT_C TInt BinarySearchUnsigned(const TAny* anEntry, TInt& anIndex, TInt aMode) const;
+ IMPORT_C TInt BinarySearch(const TAny* anEntry, TInt& anIndex, TGeneralLinearOrder anOrder, TInt aMode) const;
+#ifndef __KERNEL_MODE__
+ IMPORT_C void GranularCompress();
+ IMPORT_C TInt DoReserve(TInt aCount);
+ IMPORT_C void HeapSortSigned();
+ IMPORT_C void HeapSortUnsigned();
+ IMPORT_C void HeapSort(TGeneralLinearOrder anOrder);
+ IMPORT_C static TInt GetCount(const CBase* aPtr);
+ IMPORT_C static const TAny* GetElementPtr(const CBase* aPtr, TInt aIndex);
+#endif
+private:
+ TInt Grow();
+private:
+ TInt iCount;
+ TAny* iEntries;
+ TInt iEntrySize;
+ TInt iKeyOffset;
+ TInt iAllocated;
+ TInt iGranularity; // positive means linear, negative means exponential growth
+ TInt iSpare1;
+ TInt iSpare2;
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+A simple and efficient array of fixed length objects.
+
+The elements of the array are instances of a class; this class is specified
+as the template parameter T.
+
+The array offers standard array behaviour which includes insertion, appending
+and sorting of elements.
+
+Note:
+
+1. where possible, this class should be used in preference to
+ CArrayFixFlat<classT>.
+
+2. the derivation from RArrayBase is private.
+
+3. for performance reasons, RArray stores objects in the array as
+ word (4 byte) aligned quantities. This means that some member functions
+ do not work when RArray is instantiated for classes of less than 4 bytes
+ in size, or when the class's alignment requirement is not 4.
+ Be aware that it is possible to get an unhandled exception on hardware
+ that enforces strict alignment.
+
+ The affected functions are:
+
+ 3.1 the constructor: RArray(TInt, T*, TInt)
+
+ 3.2 Append(const T&)
+
+ 3.3 Insert(const T&, TInt)
+
+ 3.4 the [] operator, and then using the pointer to iterate through
+ the array as you would with a C array.
+*/
+template <class T>
+class RArray : private RArrayBase
+ {
+public:
+ inline RArray();
+ inline explicit RArray(TInt aGranularity);
+ inline RArray(TInt aGranularity, TInt aKeyOffset);
+ inline RArray(TInt aMinGrowBy, TInt aKeyOffset, TInt aFactor);
+ inline RArray(TInt aEntrySize,T* aEntries, TInt aCount);
+ inline void Close();
+ inline TInt Count() const;
+ inline const T& operator[](TInt anIndex) const;
+ inline T& operator[](TInt anIndex);
+ inline TInt Append(const T& anEntry);
+ inline TInt Insert(const T& anEntry, TInt aPos);
+ inline void Remove(TInt anIndex);
+ inline void Compress();
+ inline void Reset();
+ inline TInt Find(const T& anEntry) const;
+ inline TInt Find(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+ template <class K>
+ inline TInt Find(const K& aKey, TBool (*apfnCompare)(const K* k, const T& t)) const
+ /**
+ Finds the first object in the array which matches aKey using
+ the comparison algorithm provided by apfnCompare.
+
+ The find operation always starts at the low index end of the array. There
+ is no assumption about the order of objects in the array.
+
+ @param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+ @param apfnCompare A function defining the identity relation between the
+ object in the array, and their keys of type K. The function
+ returns true if k and t match based on this relationship.
+
+ @return The index of the first matching object within the array.
+ KErrNotFound, if no suitable object can be found.
+ */
+ { return RArrayBase::Find((T*)&aKey,*(TIdentityRelation<T>*)&apfnCompare); }
+ inline TInt FindReverse(const T& anEntry) const;
+ inline TInt FindReverse(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+ template <class K>
+ inline TInt FindReverse(const K& aKey, TInt (*apfnMatch)(const K* k, const T& t)) const
+ /**
+ Finds the first object in the array which matches aKey using the comparison
+ algorithm provided by apfnCompare.
+
+ The find operation always starts at the high index end of the array. There
+ is no assumption about the order of objects in the array.
+
+ @param aKey The key of type K to be compared with the elements of the array using apfnMatch.
+ @param apfnMatch A function defining the identity relation between the
+ object in the array, and their keys of type K. The function
+ returns true if k and t match based on this relationship.
+
+ @return The index of the first matching object within the array.
+ KErrNotFound, if no suitable object can be found.
+ */
+ { return RArrayBase::FindReverse((T*)&aKey,*(TIdentityRelation<T>*)&apfnMatch); }
+ inline TInt FindInSignedKeyOrder(const T& anEntry) const;
+ inline TInt FindInUnsignedKeyOrder(const T& anEntry) const;
+ inline TInt FindInOrder(const T& anEntry, TLinearOrder<T> anOrder) const;
+ inline TInt FindInSignedKeyOrder(const T& anEntry, TInt& anIndex) const;
+ inline TInt FindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex) const;
+ inline TInt FindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+ template <class K>
+ inline TInt FindInOrder(const K& aKey, TInt (*apfnCompare)(const K* k, const T& t)) const
+ /**
+ Finds the object in the array whose object matches the specified
+ key, (Using the relationship defined within apfnCompare) using a binary search
+ technique and an ordering algorithm.
+
+ The function assumes that existing objects in the array are ordered so
+ that the objects themselves are in object order as determined by an algorithm
+ supplied by the caller and packaged as a TLinearOrder<T>.
+
+ @param aKey The key of type K to be compared with the elements of the array using apfnCompare.
+ @param apfnCompare A function which defines the order that the array was sorted,
+ where in it aKey (via the defined relationship) should fit, and if the key is present.
+
+ @return The index of the matching object within the array.
+ KErrNotFound, if no suitable object can be found.
+ */
+
+ { return RArrayBase::FindIsq((T*)&aKey,*(TLinearOrder<T>*)&apfnCompare); }
+ inline TInt SpecificFindInSignedKeyOrder(const T& anEntry, TInt aMode) const;
+ inline TInt SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt aMode) const;
+ inline TInt SpecificFindInOrder(const T& anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline TInt SpecificFindInSignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const;
+ inline TInt SpecificFindInUnsignedKeyOrder(const T& anEntry, TInt& anIndex, TInt aMode) const;
+ inline TInt SpecificFindInOrder(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline TInt InsertInSignedKeyOrder(const T& anEntry);
+ inline TInt InsertInUnsignedKeyOrder(const T& anEntry);
+ inline TInt InsertInOrder(const T& anEntry, TLinearOrder<T> anOrder);
+ inline TInt InsertInSignedKeyOrderAllowRepeats(const T& anEntry);
+ inline TInt InsertInUnsignedKeyOrderAllowRepeats(const T& anEntry);
+ inline TInt InsertInOrderAllowRepeats(const T& anEntry, TLinearOrder<T> anOrder);
+#ifndef __KERNEL_MODE__
+ inline void AppendL(const T& anEntry);
+ inline void InsertL(const T& anEntry, TInt aPos);
+ inline TInt FindL(const T& anEntry) const;
+ inline TInt FindL(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+ inline TInt FindReverseL(const T& anEntry) const;
+ inline TInt FindReverseL(const T& anEntry, TIdentityRelation<T> anIdentity) const;
+ inline TInt FindInSignedKeyOrderL(const T& anEntry) const;
+ inline TInt FindInUnsignedKeyOrderL(const T& anEntry) const;
+ inline TInt FindInOrderL(const T& anEntry, TLinearOrder<T> anOrder) const;
+ inline void FindInSignedKeyOrderL(const T& anEntry, TInt& anIndex) const;
+ inline void FindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex) const;
+ inline void FindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder) const;
+ inline TInt SpecificFindInSignedKeyOrderL(const T& anEntry, TInt aMode) const;
+ inline TInt SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt aMode) const;
+ inline TInt SpecificFindInOrderL(const T& anEntry, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline void SpecificFindInSignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const;
+ inline void SpecificFindInUnsignedKeyOrderL(const T& anEntry, TInt& anIndex, TInt aMode) const;
+ inline void SpecificFindInOrderL(const T& anEntry, TInt& anIndex, TLinearOrder<T> anOrder, TInt aMode) const;
+ inline void InsertInSignedKeyOrderL(const T& anEntry);
+ inline void InsertInUnsignedKeyOrderL(const T& anEntry);
+ inline void InsertInOrderL(const T& anEntry, TLinearOrder<T> anOrder);
+ inline void InsertInSignedKeyOrderAllowRepeatsL(const T& anEntry);
+ inline void InsertInUnsignedKeyOrderAllowRepeatsL(const T& anEntry);
+ inline void InsertInOrderAllowRepeatsL(const T& anEntry, TLinearOrder<T> anOrder);
+
+ inline void GranularCompress();
+ inline TInt Reserve(TInt aCount);
+ inline void ReserveL(TInt aCount);
+ inline void SortSigned();
+ inline void SortUnsigned();
+ inline void Sort(TLinearOrder<T> anOrder);
+ inline TArray<T> Array() const;
+#endif
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+A simple and efficient specialized array of signed integers offering standard
+array behaviour.
+
+Note that derivation from RPointerArrayBase is private.
+*/
+TEMPLATE_SPECIALIZATION class RArray<TInt> : private RPointerArrayBase
+ {
+public:
+ inline RArray();
+ inline explicit RArray(TInt aGranularity);
+ inline RArray(TInt aMinGrowBy, TInt aFactor);
+ inline void Close();
+ inline TInt Count() const;
+ inline const TInt& operator[](TInt anIndex) const;
+ inline TInt& operator[](TInt anIndex);
+ inline TInt Append(TInt anEntry);
+ inline TInt Insert(TInt anEntry, TInt aPos);
+ inline void Remove(TInt anIndex);
+ inline void Compress();
+ inline void Reset();
+ inline TInt Find(TInt anEntry) const;
+ inline TInt FindReverse(TInt anEntry) const;
+ inline TInt FindInOrder(TInt anEntry) const;
+ inline TInt FindInOrder(TInt anEntry, TInt& anIndex) const;
+ inline TInt SpecificFindInOrder(TInt anEntry, TInt aMode) const;
+ inline TInt SpecificFindInOrder(TInt anEntry, TInt& anIndex, TInt aMode) const;
+ inline TInt InsertInOrder(TInt anEntry);
+ inline TInt InsertInOrderAllowRepeats(TInt anEntry);
+#ifndef __KERNEL_MODE__
+ inline void AppendL(TInt anEntry);
+ inline void InsertL(TInt anEntry, TInt aPos);
+ inline TInt FindL(TInt anEntry) const;
+ inline TInt FindReverseL(TInt anEntry) const;
+ inline TInt FindInOrderL(TInt anEntry) const;
+ inline void FindInOrderL(TInt anEntry, TInt& anIndex) const;
+ inline TInt SpecificFindInOrderL(TInt anEntry, TInt aMode) const;
+ inline void SpecificFindInOrderL(TInt anEntry, TInt& anIndex, TInt aMode) const;
+ inline void InsertInOrderL(TInt anEntry);
+ inline void InsertInOrderAllowRepeatsL(TInt anEntry);
+
+ inline RArray(TInt* aEntries, TInt aCount);
+ inline void GranularCompress();
+ inline TInt Reserve(TInt aCount);
+ inline void ReserveL(TInt aCount);
+ inline void Sort();
+ inline TArray<TInt> Array() const;
+#endif
+ };
+
+
+
+
+/**
+@publishedAll
+@released
+
+Array of unsigned integers.
+
+The array is a simple and efficient specialized array of unsigned integers
+offering standard array behaviour.
+
+The derivation from RPointerArrayBase is private.
+*/
+TEMPLATE_SPECIALIZATION class RArray<TUint> : private RPointerArrayBase
+ {
+public:
+ inline RArray();
+ inline explicit RArray(TInt aGranularity);
+ inline RArray(TInt aMinGrowBy, TInt aFactor);
+ inline void Close();
+ inline TInt Count() const;
+ inline const TUint& operator[](TInt anIndex) const;
+ inline TUint& operator[](TInt anIndex);
+ inline TInt Append(TUint anEntry);
+ inline TInt Insert(TUint anEntry, TInt aPos);
+ inline void Remove(TInt anIndex);
+ inline void Compress();
+ inline void Reset();
+ inline TInt Find(TUint anEntry) const;
+ inline TInt FindReverse(TUint anEntry) const;
+ inline TInt FindInOrder(TUint anEntry) const;
+ inline TInt FindInOrder(TUint anEntry, TInt& anIndex) const;
+ inline TInt SpecificFindInOrder(TUint anEntry, TInt aMode) const;
+ inline TInt SpecificFindInOrder(TUint anEntry, TInt& anIndex, TInt aMode) const;
+ inline TInt InsertInOrder(TUint anEntry);
+ inline TInt InsertInOrderAllowRepeats(TUint anEntry);
+#ifndef __KERNEL_MODE__
+ inline void AppendL(TUint anEntry);
+ inline void InsertL(TUint anEntry, TInt aPos);
+ inline TInt FindL(TUint anEntry) const;
+ inline TInt FindReverseL(TUint anEntry) const;
+ inline TInt FindInOrderL(TUint anEntry) const;
+ inline void FindInOrderL(TUint anEntry, TInt& anIndex) const;
+ inline TInt SpecificFindInOrderL(TUint anEntry, TInt aMode) const;
+ inline void SpecificFindInOrderL(TUint anEntry, TInt& anIndex, TInt aMode) const;
+ inline void InsertInOrderL(TUint anEntry);
+ inline void InsertInOrderAllowRepeatsL(TUint anEntry);
+
+ inline RArray(TUint* aEntries, TInt aCount);
+ inline void GranularCompress();
+ inline TInt Reserve(TInt aCount);
+ inline void ReserveL(TInt aCount);
+ inline void Sort();
+ inline TArray<TUint> Array() const;
+#endif
+ };
+
+#ifndef __LEAVE_EQUALS_THROW__
+
+class TTrapHandler;
+
+/**
+@internalComponent
+*/
+class TTrap
+ {
+public:
+#ifndef __KERNEL_MODE__
+ IMPORT_C TInt Trap(TInt& aResult);
+ IMPORT_C static void UnTrap();
+#endif
+public:
+ enum {EMaxState=0x10};
+public:
+ TInt iState[EMaxState];
+ TTrap* iNext;
+ TInt* iResult;
+ TTrapHandler* iHandler;
+ };
+
+
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro as a C++ statement.
+
+_r must be a TInt which has already been declared; if any of the
+C++ statements _s leaves, then the leave code is returned in _r,
+otherwise _r is set to KErrNone.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _r An lvalue, convertible to TInt&, which will receive the result of
+ any User::Leave() executed within _s or, if no leave occurred,
+ it will be set to KErrNone. The value of _r on entry is not used.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+*/
+#define TRAP(_r,_s) {TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}}
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro in the same way as you would TRAP, except that the
+variable _r is defined as part of the macro (and is therefore valid for the
+rest of the block in which the macro occurs). Often, this saves a line of code.
+
+@param _r A name, which will be declared as a TInt, and will receive the result
+ of any User::Leave() executed within _s or, if no leave occurred, it
+ will be set to KErrNone. After the macro, _r remains in scope until
+ the end of its enclosing block.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAP
+*/
+#define TRAPD(_r,_s) TInt _r;{TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}}
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+Any leave code generated is ignored.
+
+Use this macro as a C++ statement.
+
+This macro is functionally equivalent to:
+@code
+ TInt x;
+ TRAP(x,_s)
+@endcode
+or
+@code
+ TRAPD(x,_s)
+@endcode
+where the value in 'x' is not used by any subsequent code.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+@see TRAP
+*/
+#define TRAP_IGNORE(_s) {TInt _ignore;TTrap __t;if (__t.Trap(_ignore)==0){_s;TTrap::UnTrap();}}
+
+
+#else //__LEAVE_EQUALS_THROW__
+
+#ifdef __WINS__
+/** @internalComponent */
+#define __WIN32SEHTRAP TWin32SEHTrap __trap; __trap.Trap();
+/** @internalComponent */
+#define __WIN32SEHUNTRAP __trap.UnTrap();
+IMPORT_C void EmptyFunction();
+#define __CALL_EMPTY_FUNCTION EmptyFunction();
+#else // !__WINS__
+#define __WIN32SEHTRAP
+#define __WIN32SEHUNTRAP
+#define __CALL_EMPTY_FUNCTION
+#endif //__WINS__
+
+/**
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked before any 'trapped' code is called, and it should be
+redefined to do whatever task is required. E.g. this code:
+
+@code
+ #undef TRAP_INSTRUMENTATION_START
+ #define TRAP_INSTRUMENTATION_START DoMyLoging(__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+ DoMyLoging(__LINE__)
+ TRAP(r,SomeCodeL());
+@endcode
+
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_START
+
+
+
+/**
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked if the 'trapped' code did not Leave.
+E.g. this code:
+
+@code
+ #undef TRAP_INSTRUMENTATION_NOLEAVE
+ #define TRAP_INSTRUMENTATION_NOLEAVE DoMyLoging(__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+ TRAP(r,SomeCodeL());
+ if(r==KErrNone) DoMyLoging(__LINE__);
+@endcode
+
+
+@param aLine The line number in the C++ source file where the TRAP or TRAPD
+ macro was used.
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_NOLEAVE
+
+
+/**
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked if the 'trapped' code did Leave. E.g. this code:
+
+@code
+ #undef TRAP_INSTRUMENTATION_LEAVE
+ #define TRAP_INSTRUMENTATION_LEAVE(aResult) DoMyLoging(aResult,__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+ TRAP(r,SomeCodeL());
+ if(r!=KErrNone) DoMyLoging(r,__LINE__);
+@endcode
+
+
+@param aResult A reference to the result value used in the TRAP macro.
+
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_LEAVE(aResult)
+
+
+
+/**
+This macro is used by the TRAP and TRAPD macros and provides a means
+of inserting code into uses of these.
+
+This macro is invoked after the 'trapped' code is called, regardless of whether
+or not it did Leave. It should be redefined to do whatever task is
+required. E.g. this code:
+
+@code
+ #undef TRAP_INSTRUMENTATION_END
+ #define TRAP_INSTRUMENTATION_END DoMyLoging(__LINE__)
+@endcode
+
+Will cause all subsequent uses of the TRAP macros to behave in an
+equivalent way to:
+
+@code
+ TRAP(r,SomeCodeL());
+ DoMyLoging(__LINE__)
+@endcode
+
+
+@publishedPartner
+@released
+
+@see TRAP
+@see TRAPD
+*/
+#define TRAP_INSTRUMENTATION_END
+
+
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro as a C++ statement.
+
+_r must be a TInt which has already been declared; if any of the
+C++ statements _s leaves, then the leave code is returned in _r,
+otherwise _r is set to KErrNone.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _r An lvalue, convertible to TInt&, which will receive the result of
+ any User::Leave() executed within _s or, if no leave occurred,
+ it will be set to KErrNone. The value of _r on entry is not used.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+*/
+
+/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a
+workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect
+trap handler to be invoked when multiple nested TRAP's were present and
+User::Leave(..) was called. */
+
+#define TRAP(_r, _s) \
+ { \
+ TInt& __rref = _r; \
+ __rref = 0; \
+ { TRAP_INSTRUMENTATION_START; } \
+ try { \
+ __WIN32SEHTRAP \
+ TTrapHandler* ____t = User::MarkCleanupStack(); \
+ _s; \
+ User::UnMarkCleanupStack(____t); \
+ { TRAP_INSTRUMENTATION_NOLEAVE; } \
+ __WIN32SEHUNTRAP \
+ } \
+ catch (XLeaveException& l) \
+ { \
+ __rref = l.GetReason(); \
+ { TRAP_INSTRUMENTATION_LEAVE(__rref); } \
+ } \
+ catch (...) \
+ { \
+ User::Invariant(); \
+ } \
+ __CALL_EMPTY_FUNCTION \
+ { TRAP_INSTRUMENTATION_END; } \
+ }
+
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+
+Use this macro in the same way as you would TRAP, except that the
+variable _r is defined as part of the macro (and is therefore valid for the
+rest of the block in which the macro occurs). Often, this saves a line of code.
+
+@param _r A name, which will be declared as a TInt, and will receive the result
+ of any User::Leave() executed within _s or, if no leave occurred, it
+ will be set to KErrNone. After the macro, _r remains in scope until
+ the end of its enclosing block.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAP
+*/
+
+/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a
+workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect
+trap handler to be invoked when multiple nested TRAP's were present and
+User::Leave(..) was called. */
+
+
+#define TRAPD(_r, _s) \
+ TInt _r; \
+ { \
+ _r = 0; \
+ { TRAP_INSTRUMENTATION_START; } \
+ try { \
+ __WIN32SEHTRAP \
+ TTrapHandler* ____t = User::MarkCleanupStack(); \
+ _s; \
+ User::UnMarkCleanupStack(____t); \
+ { TRAP_INSTRUMENTATION_NOLEAVE; } \
+ __WIN32SEHUNTRAP \
+ } \
+ catch (XLeaveException& l) \
+ { \
+ _r = l.GetReason(); \
+ { TRAP_INSTRUMENTATION_LEAVE(_r); } \
+ } \
+ catch (...) \
+ { \
+ User::Invariant(); \
+ } \
+ __CALL_EMPTY_FUNCTION \
+ { TRAP_INSTRUMENTATION_END; } \
+ }
+
+/**
+@publishedAll
+@released
+
+Executes the set of C++ statements _s under a trap harness.
+Any leave code generated is ignored.
+
+Use this macro as a C++ statement.
+
+This macro is functionally equivalent to:
+@code
+ TInt x;
+ TRAP(x,_s)
+@endcode
+or
+@code
+ TRAPD(x,_s)
+@endcode
+where the value in 'x' is not used by any subsequent code.
+
+Use this macro as a C++ statement.
+
+_s can consist of multiple C++ statements; in theory, _s can consist
+of any legal C++ code but in practice, such statements consist of simple
+function calls, e.g. Foo() or an assignment of some value to the result of
+a function call, e.g. functionValue=GetFoo().
+
+A cleanup stack is constructed for the set of C++ statements _s.
+If any function in _s leaves, objects pushed to the cleanup stack are
+cleaned-up. In addition, if any of the C++ statements in _s leaves,
+then remaining C++ code in _s is not executed and any variables which
+are assigned within that remaining code are not defined.
+
+@param _s C++ statements which will be executed under a trap harness.
+
+@see TRAPD
+@see TRAP
+*/
+
+/*__CALL_EMPTY_FUNCTION(call to a function with an empty body) was added as a
+workaround to a compiler bug (mwccsym2 - winscw ) which caused an incorrect
+trap handler to be invoked when multiple nested TRAP's were present and
+User::Leave(..) was called. */
+
+#define TRAP_IGNORE(_s) \
+ { \
+ { TRAP_INSTRUMENTATION_START; } \
+ try { \
+ __WIN32SEHTRAP \
+ TTrapHandler* ____t = User::MarkCleanupStack(); \
+ _s; \
+ User::UnMarkCleanupStack(____t); \
+ { TRAP_INSTRUMENTATION_NOLEAVE; } \
+ __WIN32SEHUNTRAP \
+ } \
+ catch (XLeaveException& l) \
+ { \
+ l.GetReason(); \
+ { TRAP_INSTRUMENTATION_LEAVE(l.Reason()); } \
+ } \
+ catch (...) \
+ { \
+ User::Invariant(); \
+ } \
+ __CALL_EMPTY_FUNCTION \
+ { TRAP_INSTRUMENTATION_END; } \
+ }
+
+
+#endif //__LEAVE_EQUALS_THROW__
+
+/* The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target.
+ * In this case, operator new and operator delete below should not be declared
+ * to avoid clashing with StdC++ declarations.
+ */
+
+#ifndef __SYMBIAN_STDCPP_SUPPORT__
+
+#ifndef __OPERATOR_NEW_DECLARED__
+
+/* Some operator new and operator delete overloads may be declared in compiler
+ * pre-include files.
+ *
+ * __OPERATOR_NEW_DECLARED__ is #defined if they are, so that we can avoid
+ * re-declaring them here.
+ */
+
+#define __OPERATOR_NEW_DECLARED__
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C TAny* operator new(TUint aSize) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C TAny* operator new(TUint aSize,TUint anExtraSize) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C void operator delete(TAny* aPtr) __NO_THROW;
+
+#ifndef __OMIT_VEC_OPERATOR_NEW_DECL__
+/**
+@publishedAll
+@released
+*/
+GLREF_C TAny* operator new[](TUint aSize) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+GLREF_C void operator delete[](TAny* aPtr) __NO_THROW;
+#endif // !__OMIT_VEC_OPERATOR_NEW_DECL__
+
+#endif // !__OPERATOR_NEW_DECLARED__
+
+#endif // !__SYMBIAN_STDCPP_SUPPORT__
+
+/**
+@publishedAll
+@released
+*/
+inline TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+inline void operator delete(TAny* aPtr, TAny* aBase) __NO_THROW;
+
+#ifndef __PLACEMENT_VEC_NEW_INLINE
+/**
+@publishedAll
+@released
+*/
+inline TAny* operator new[](TUint aSize, TAny* aBase) __NO_THROW;
+
+/**
+@publishedAll
+@released
+*/
+inline void operator delete[](TAny* aPtr, TAny* aBase) __NO_THROW;
+
+#endif // !__PLACEMENT_VEC_NEW_INLINE
+
+#if !defined(__BOOL_NO_TRUE_TRAP__)
+
+/**
+@publishedAll
+@released
+*/
+TBool operator==(TTrue,volatile const TBool);
+
+/**
+@publishedAll
+@released
+*/
+TBool operator==(volatile const TBool,TTrue);
+
+/**
+@publishedAll
+@released
+*/
+TBool operator!=(TTrue,volatile const TBool);
+
+/**
+@publishedAll
+@released
+*/
+TBool operator!=(volatile const TBool,TTrue);
+#endif
+
+
+
+
+/**
+@publishedAll
+@released
+
+A Version 2 client/server class that clients use to package
+the arguments to be sent to a server.
+
+The object can package up to 4 arguments together with information about each
+argument's type, width and accessibility; it is also possible for
+the package to contain zero arguments. In addition to the default constructor,
+the class has four templated constructors, allowing an object of this type to
+be constructed for 0, 1, 2, 3 or 4 arguments.
+
+Internally, the arguments are stored in a simple TInt array.
+Consecutive arguments in a constructor's parameter list are put into
+consecutive slots in the array. The Set() overloaded functions can be used
+to set argument values into specific slots within this array.
+*/
+class TIpcArgs
+ {
+public:
+ /**
+ @internalComponent
+
+ Argument types; some of these may be ORed together to specify
+ type, accessibility, and width.
+ */
+ enum TArgType
+ {
+ EUnspecified = 0, /**< Type not specified.*/
+ EHandle = 1, /**< Handle type.*/
+ EFlagDes = 4, /**< Descriptor type.*/
+ EFlagConst = 2, /**< Read only type.*/
+ EFlag16Bit = 1, /**< 16 bit rather than 8 bit.*/
+ EDes8 = EFlagDes, /**< 8 bit read/write descriptor.*/
+ EDes16 = EFlagDes|EFlag16Bit, /**< 16 bit read/write descriptor.*/
+ EDesC8 = EFlagDes|EFlagConst, /**< 8 bit read only descriptor.*/
+ EDesC16 = EFlagDes|EFlagConst|EFlag16Bit, /**< 16 bit read only descriptor.*/
+ };
+
+
+ /**
+ @internalComponent
+ */
+ enum
+ {
+ KBitsPerType = 3, /**< Number of bits of type information used for each of the 4 arguments.*/
+ KPinArgShift = KBitsPerType*KMaxMessageArguments, /**< Bit number of the start of the pin flags. */
+ KPinArg0 = 1<<(KPinArgShift+0), /**< Set to pin argument at index 0.*/
+ KPinArg1 = 1<<(KPinArgShift+1), /**< Set to pin argument at index 1.*/
+ KPinArg2 = 1<<(KPinArgShift+2), /**< Set to pin argument at index 2.*/
+ KPinArg3 = 1<<(KPinArgShift+3), /**< Set to pin argument at index 3.*/
+ KPinMask = 0xf<<KPinArgShift, /**< The bits used for the pinning attributes of each argument.*/
+ };
+
+
+ /**
+ Indicates a Null argument.
+ */
+ enum TNothing {
+ /**
+ An enum value that can be used to indicate an empty or
+ unused argument to a server. For example:
+
+ @code
+ TIpcArgs args(arg1, TIpcArgs::ENothing, arg2);
+ @endcode
+
+ This argument will have an undefined value when the server
+ receives the message.
+ */
+ ENothing
+ };
+public:
+ /**
+ Default constructor.
+
+ An argument package constructed using this constructor has no arguments;
+ however, arguments can subsequently be set into this argument package object
+ using the Set() member functions.
+ */
+ inline TIpcArgs()
+ :iFlags(0)
+ {}
+
+
+ /**
+ A templated constructor that constructs the argument package; it takes
+ 1 argument.
+
+ @param a0 An argument of general class type T0 to be contained by
+ this object.
+ */
+ template <class T0>
+ inline explicit TIpcArgs(T0 a0)
+ {
+ Assign(iArgs[0],a0);
+ iFlags=(Type(a0)<<(0*KBitsPerType));
+ }
+
+
+ /**
+ A templated constructor that constructs the argument package; it takes
+ 2 arguments.
+
+ @param a0 An argument of general class type T0 to be contained by
+ this object.
+ @param a1 An argument of general class type T1 to be contained by
+ this object.
+ */
+ template <class T0,class T1>
+ inline TIpcArgs(T0 a0,T1 a1)
+ {
+ Assign(iArgs[0],a0);
+ Assign(iArgs[1],a1);
+ iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType));
+ }
+
+
+ /**
+ A templated constructor that constructs the argument package; it takes
+ 3 arguments.
+
+ @param a0 An argument of general class type T0 to be contained by
+ this object.
+ @param a1 An argument of general class type T1 to be contained by
+ this object.
+ @param a2 An argument of general class type T2 to be contained by
+ this object.
+ */
+ template <class T0,class T1,class T2>
+ inline TIpcArgs(T0 a0,T1 a1,T2 a2)
+ {
+ Assign(iArgs[0],a0);
+ Assign(iArgs[1],a1);
+ Assign(iArgs[2],a2);
+ iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType))|(Type(a2)<<(2*KBitsPerType));
+ }
+
+
+ /**
+ A templated constructor that constructs the argument package; it takes
+ 4 arguments.
+
+ @param a0 An argument of general class type T0 to be contained by
+ this object.
+ @param a1 An argument of general class type T1 to be contained by
+ this object.
+ @param a2 An argument of general class type T2 to be contained by
+ this object.
+ @param a3 An argument of general class type T3 to be contained by
+ this object.
+ */
+ template <class T0,class T1,class T2,class T3>
+ inline TIpcArgs(T0 a0,T1 a1,T2 a2,T3 a3)
+ {
+ Assign(iArgs[0],a0);
+ Assign(iArgs[1],a1);
+ Assign(iArgs[2],a2);
+ Assign(iArgs[3],a3);
+ iFlags=(Type(a0)<<(0*KBitsPerType))|(Type(a1)<<(1*KBitsPerType))|(Type(a2)<<(2*KBitsPerType))|(Type(a3)<<(3*KBitsPerType));
+ }
+ //
+ inline void Set(TInt aIndex,TNothing);
+ inline void Set(TInt aIndex,TInt aValue);
+ inline void Set(TInt aIndex,const TAny* aValue);
+ inline void Set(TInt aIndex,RHandleBase aValue);
+ inline void Set(TInt aIndex,const TDesC8* aValue);
+#ifndef __KERNEL_MODE__
+ inline void Set(TInt aIndex,const TDesC16* aValue);
+#endif
+ inline void Set(TInt aIndex,TDes8* aValue);
+#ifndef __KERNEL_MODE__
+ inline void Set(TInt aIndex,TDes16* aValue);
+#endif
+
+ inline TIpcArgs& PinArgs(TBool aPinArg0=ETrue, TBool aPinArg1=ETrue, TBool aPinArg2=ETrue, TBool aPinArg3=ETrue);
+private:
+ inline static TArgType Type(TNothing);
+ inline static TArgType Type(TInt);
+ inline static TArgType Type(const TAny*);
+ inline static TArgType Type(RHandleBase aValue);
+ inline static TArgType Type(const TDesC8*);
+#ifndef __KERNEL_MODE__
+ inline static TArgType Type(const TDesC16*);
+#endif
+ inline static TArgType Type(TDes8*);
+#ifndef __KERNEL_MODE__
+ inline static TArgType Type(TDes16*);
+#endif
+ //
+ inline static void Assign(TInt&,TNothing);
+ inline static void Assign(TInt& aArg,TInt aValue);
+ inline static void Assign(TInt& aArg,const TAny* aValue);
+ inline static void Assign(TInt& aArg,RHandleBase aValue);
+ inline static void Assign(TInt& aArg,const TDesC8* aValue);
+#ifndef __KERNEL_MODE__
+ inline static void Assign(TInt& aArg,const TDesC16* aValue);
+#endif
+ inline static void Assign(TInt& aArg,TDes8* aValue);
+#ifndef __KERNEL_MODE__
+ inline static void Assign(TInt& aArg,TDes16* aValue);
+#endif
+public:
+
+ /**
+ The location where the message arguments are stored.
+
+ There is no reason to access this data member directly and it should be
+ considered as internal.
+ */
+ TInt iArgs[KMaxMessageArguments];
+
+ /**
+ The location where the flag bits describing the argument types are stored.
+
+ The symbolic values describing the argument types are internal to Symbian,
+ and there is therefore no reason to access this data member directly.
+ It should be considered as internal.
+ */
+ TInt iFlags;
+ };
+
+// Structures for passing 64 bit integers and doubles across GCC/EABI boundaries
+
+/**
+@internalComponent
+*/
+struct SInt64
+ {
+public:
+ inline SInt64();
+ inline SInt64(Int64 a);
+ inline SInt64& operator=(Int64 a);
+ inline operator Int64() const;
+public:
+ TUint32 iData[2]; // little endian
+ };
+
+/**
+@internalComponent
+*/
+struct SUint64
+ {
+public:
+ inline SUint64();
+ inline SUint64(Uint64 a);
+ inline SUint64& operator=(Uint64 a);
+ inline operator Uint64() const;
+public:
+ TUint32 iData[2]; // little endian
+ };
+
+/**
+@internalComponent
+*/
+struct SDouble
+ {
+public:
+ inline SDouble();
+ inline SDouble(TReal a);
+ inline SDouble& operator=(TReal a);
+ inline operator TReal() const;
+public:
+ TUint32 iData[2]; // always little endian
+ };
+
+/**
+@publishedAll
+@released
+
+Stores information about a thread's stack.
+
+Note, on the emulator, the memory between iLimit and the thread's current stack pointer
+may not actually be committed.
+
+@see RThread::StackInfo()
+*/
+class TThreadStackInfo
+ {
+public:
+ /**
+ The address which the stack pointer would contain if the stack were empty.
+ */
+ TLinAddr iBase;
+
+ /**
+ The address which the stack pointer would contain if the stack were full,
+ (The lowest valid address).
+ */
+ TLinAddr iLimit;
+
+ /**
+ The limit value for the stack if it were expanded to its maximum size.
+
+ Currently expanding stacks is not supported so iExpandLimit==iLimit
+ */
+ TLinAddr iExpandLimit;
+ };
+
+
+
+
+#ifdef __SUPPORT_CPP_EXCEPTIONS__
+/**
+@internalComponent
+@released
+
+The class used to implement User::Leave in term of throw and TRAP in terms of catch.
+
+*/
+class XLeaveException
+ {
+public:
+ inline XLeaveException() {}
+ inline XLeaveException(TInt aReason) {iR = aReason;}
+ inline TInt Reason() const {return iR;}
+ IMPORT_C TInt GetReason() const;
+private:
+#if __ARMCC_VERSION >= 220000
+ // From rvct 2.2 onwards we want the class impedimenta to be shared, so create a key function.
+ // Unfortunately we can't make this the key function the dtor since this would make it impossible for existing 2.1
+ // derived binaries to be 'BC' with 2.2 binaries (in the general case (which I wont attempt to describe coz its
+ // too complex) so its best to be safe). As a clue: if 2.1 is used to compile with a key function its not possible
+ // for catch handlers to work :-( (see the old code).
+ virtual void ForceKeyFunction();
+#endif
+private:
+#if __ARMCC_VERSION < 220000
+ TAny* iVtable; // reserve space for vtable
+#endif
+ TInt iR;
+ };
+
+// The standard header file <exception> defines the following guard macro for EDG and CW, VC++, GCC respectively.
+// The guard below is ugly. It will surely come back and bite us unless we resolve the whole issue of standard headers
+// when we move to supporting Standard C++.
+
+// The macro __SYMBIAN_STDCPP_SUPPORT__ is defined when building a StdC++ target.
+// In this case, we include the StdC++ specification <exception> rather than declaring uncaught_exception.
+
+#ifdef __SYMBIAN_STDCPP_SUPPORT__
+ #include <stdapis/stlportv5/exception>
+#elif !defined(_EXCEPTION) && !defined(_EXCEPTION_) && !defined(__EXCEPTION__)
+// Declare standard C++ functions relating to exceptions here
+namespace std {
+#if defined(__VC32__) || defined(__CW32__)
+ bool uncaught_exception();
+#else
+ IMPORT_C bool uncaught_exception();
+#endif
+ void terminate(void);
+ void unexpected(void);
+ typedef void (*terminate_handler)();
+ terminate_handler set_terminate(terminate_handler h) throw();
+ typedef void (*unexpected_handler)();
+ unexpected_handler set_unexpected(unexpected_handler h) throw();
+}
+
+#endif
+#endif //__SUPPORT_CPP_EXCEPTIONS__
+
+#ifdef __WINS__
+
+#ifndef __WIN32_SEH_TYPES_KNOWN__
+class __UnknownWindowsType1;
+class __UnknownWindowsType2;
+#endif
+
+class TWin32SEHTrap;
+
+/**
+ * Typedef for the SEH handler function
+ * @internalComponent
+ */
+typedef TUint32 (TWin32SEHExceptionHandler)(__UnknownWindowsType1* aExceptionRecord, TWin32SEHTrap* aRegistrationRecord, __UnknownWindowsType2* aContext);
+
+/**
+ * @internalComponent
+ */
+class TWin32SEHTrap
+ {
+private:
+ // Prevent copy/assign
+ TWin32SEHTrap(TWin32SEHTrap const &);
+ TWin32SEHTrap& operator=(TWin32SEHTrap const &);
+
+#ifdef __KERNEL_MODE__
+//
+// Kernel-side functions for nkern exception handler
+//
+public:
+ /** Find final exception handler in SEH chain */
+ static TWin32SEHTrap* IterateForFinal();
+
+ /** Access exception handler */
+ TWin32SEHExceptionHandler* ExceptionHandler();
+
+private:
+
+#else // !__KERNEL_MODE__
+//
+// User-side functions for use in TRAP(...)
+//
+public:
+ UIMPORT_C TWin32SEHTrap();
+
+public:
+ /** Add object to SEH chain */
+ UIMPORT_C void Trap();
+
+ /** Remove object from SEH chain */
+ UIMPORT_C void UnTrap();
+
+#ifndef __IN_SEH_CPP__
+private:
+#endif
+ /** Handle Win32 exceptions */
+ static TUint32 ExceptionHandler(__UnknownWindowsType1* aException, TWin32SEHTrap* aRegistrationRecord, __UnknownWindowsType2* aContext);
+
+#endif //__KERNEL_MODE__
+
+ //
+ // NB: This is really an _EXCEPTION_REGISTRATION_RECORD
+ //
+ TWin32SEHTrap* iPrevExceptionRegistrationRecord; /** Link to previous SEH record */
+ TWin32SEHExceptionHandler* iExceptionHandler; /** SEH handler function */
+
+private:
+ TUint32 iPadding[254]; // discourage the compiler from putting this in reused function parameter space
+ };
+
+#else // !__WINS__
+
+#ifdef __X86__
+/**
+ * @internalComponent
+ */
+class TWin32SEHTrap
+ {
+public:
+ UIMPORT_C TWin32SEHTrap();
+ UIMPORT_C void Trap();
+ UIMPORT_C void UnTrap();
+ };
+#endif //__X86__
+#endif //__WINS__
+
+/**
+@internalTechnology
+ */
+struct TEmulatorImageHeader
+ {
+ TUid iUids[KMaxCheckedUid];
+ TProcessPriority iPriority;
+ SSecurityInfo iS;
+ TUint32 iSpare1;
+ TUint32 iSpare2;
+ TUint32 iModuleVersion;
+ TUint32 iFlags;
+ };
+
+// forward declaration of shareable data buffers pool infomation
+class TShPoolInfo;
+
+#include <e32cmn.inl>
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32cmn_private.h>
+#endif
+
+#endif //__E32CMN_H__