First public contribution.
1 // Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // e32\include\e32base.h
23 * Container Base Class
30 Base class for all classes to be instantiated on the heap.
32 By convention, all classes derived from CBase have a name beginning with the
35 The class has two important features:
37 1. A virtual destructor that allows instances of derived classes to be destroyed
38 and properly cleaned up through a CBase* pointer. All CBase derived objects
39 can be pushed, as CBase* pointers, onto the cleanup stack, and destroyed through
40 a call to CleanupStack::PopAndDestroy().
42 2. Initialisation of the CBase derived object to binary zeroes through a specific
43 CBase::operator new() - this means that members, whose initial value should
44 be zero, do not have to be initialised in the constructor. This allows safe
45 destruction of a partially-constructed object.
47 Note that using C++ arrays of CBase-derived types is not recommended, as objects
48 in the array will not be zero-initialised (as there is no operator new[] member).
49 You should use an array class such as RPointerArray instead for arrays of
60 IMPORT_C virtual ~CBase();
61 inline TAny* operator new(TUint aSize, TAny* aBase) __NO_THROW;
62 inline TAny* operator new(TUint aSize) __NO_THROW;
63 inline TAny* operator new(TUint aSize, TLeave);
64 inline TAny* operator new(TUint aSize, TUint aExtraSize) __NO_THROW;
65 inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize);
66 IMPORT_C static void Delete(CBase* aPtr);
68 IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
71 CBase& operator=(const CBase&);
78 class CBufBase : public CBase
83 Defines the interface for dynamic buffers.
85 The basic functions, InsertL(), Read(), Write(), Delete(), Reset() and Size(),
86 transfer data between the buffer and other places, and allow that data to
89 The ExpandL() and Resize() functions allow some operations to be carried out
90 with greater efficiency
92 A Compress() function frees (back to the heap) any space which may have been
93 allocated, but not used
95 Ptr() and BackPtr() allow look-up of contiguous data from any given position,
100 IMPORT_C ~CBufBase();
101 inline TInt Size() const;
102 IMPORT_C void Reset();
103 IMPORT_C void Read(TInt aPos,TDes8& aDes) const;
104 IMPORT_C void Read(TInt aPos,TDes8& aDes,TInt aLength) const;
105 IMPORT_C void Read(TInt aPos,TAny* aPtr,TInt aLength) const;
106 IMPORT_C void Write(TInt aPos,const TDesC8& aDes);
107 IMPORT_C void Write(TInt aPos,const TDesC8& aDes,TInt aLength);
108 IMPORT_C void Write(TInt aPos,const TAny* aPtr,TInt aLength);
109 IMPORT_C void InsertL(TInt aPos,const TDesC8& aDes);
110 IMPORT_C void InsertL(TInt aPos,const TDesC8& aDes,TInt aLength);
111 IMPORT_C void InsertL(TInt aPos,const TAny* aPtr,TInt aLength);
112 IMPORT_C void ExpandL(TInt aPos,TInt aLength);
113 IMPORT_C void ResizeL(TInt aSize);
116 Compresses the buffer so as to occupy minimal space.
118 Normally, you would call this when a buffer has reached its final size,
119 or when you know it will not expand again for a while, or when an
120 out-of-memory error has occurred and your program is taking measures to
121 save space. Compression in these circumstances releases memory for other
122 programs to use, but has no adverse effect on performance.
124 Derived classes provide the implementation.
126 @see CBufFlat::Compress
127 @see CBufSeg::Compress
129 virtual void Compress()=0;
131 Deletes data from the buffer.
133 Derived classes provide the implementation.
135 @param aPos Buffer position where the deletion will begin; must be in the
136 range zero to (Size() minus the length of the data
138 @param aLength The number of bytes to be deleted; must be non-negative.
140 @see CBufFlat::Delete
143 virtual void Delete(TInt aPos,TInt aLength)=0;
145 Gets a pointer descriptor to represent the data from the specified position to
146 the end of the contiguous region containing that byte.
148 Derived classes provide the implementation.
150 @param aPos Buffer position: must be in range zero to Size().
152 @return Descriptor representing the data starting at aPos, and whose length
153 indicates the number of contiguous bytes stored in the buffer,
154 forward from that point. The length will be non-zero unless aPos==Size().
159 virtual TPtr8 Ptr(TInt aPos)=0;
161 Gets a pointer descriptor to represent data from just before the specified
162 data byte backward to the beginning of the contiguous region containing
165 Derived classes provide the implementation.
167 @param aPos Buffer position: must be in range zero to Size().
169 @return Descriptor representing the back contiguous region.
170 The address in the descriptor is the pointer to the bytes at the
171 buffer position, unless the buffer position was at the beginning of
172 a non-first segment in the buffer: in this case, the address is a
173 pointer just beyond the last data byte in the previous segment.
174 The length is the number of contiguous bytes from the address
175 backwards to the beginning of the segment.
177 @see CBufFlat::BackPtr
178 @see CBufSeg::BackPtr
180 virtual TPtr8 BackPtr(TInt aPos)=0;
182 virtual void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength)=0;
184 IMPORT_C CBufBase(TInt anExpandSize);
193 class CBufFlat : public CBufBase
198 Provides a flat storage dynamic buffer.
200 This class should be used when high-speed pointer lookup is an important
201 consideration, and you are reasonably confident that the insertion of
204 This class is an implementation of the abstract buffer interface provided
205 by CBufBase and uses a single heap cell to contain the data.
209 IMPORT_C ~CBufFlat();
210 IMPORT_C static CBufFlat* NewL(TInt anExpandSize);
211 inline TInt Capacity() const;
212 IMPORT_C void SetReserveL(TInt aSize);
213 IMPORT_C void Compress();
214 IMPORT_C void Delete(TInt aPos,TInt aLength);
215 IMPORT_C TPtr8 Ptr(TInt aPos);
216 IMPORT_C TPtr8 BackPtr(TInt aPos);
218 IMPORT_C CBufFlat(TInt anExpandSize);
220 IMPORT_C void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength);
230 class CBufSeg : public CBufBase
235 Provides a segmented dynamic buffer.
237 This class should be used when the object has a long life-time and an
238 unpredictable number of insertions, or there is concern about the performance
239 of insertion and deletion operations into large buffers.
241 This class is an implementation of the abstract buffer interface provided
242 by CBufBase and uses doubly-linked list of heap cells to contain the data;
243 each cell containing a segment of the buffer.
245 Its (private) data members include an anchor for the doubly-linked list, and also a
246 reference to the buffer position used by the last operation. This reference
247 acts as a cache; if the next operation uses a similar buffer position, then
248 calculation of the pointer corresponding to its buffer position is much faster.
253 IMPORT_C static CBufSeg* NewL(TInt anExpandSize);
254 IMPORT_C void Compress();
255 IMPORT_C void Delete(TInt aPos,TInt aLength);
256 IMPORT_C TPtr8 Ptr(TInt aPos);
257 IMPORT_C TPtr8 BackPtr(TInt aPos);
259 IMPORT_C CBufSeg(TInt anExpandSize);
260 void InsertIntoSegment(TBufSegLink* aSeg,TInt anOffset,const TAny* aPtr,TInt aLength);
261 void DeleteFromSegment(TBufSegLink* aSeg,TInt anOffset,TInt aLength);
262 void FreeSegment(TBufSegLink* aSeg);
263 void SetSBO(TInt aPos);
264 void AllocSegL(TBufSegLink* aSeg,TInt aNumber);
266 IMPORT_C void DoInsertL(TInt aPos,const TAny* aPtr,TInt aLength);
268 TDblQue<TBufSegLink> iQue;
277 class TKeyArrayFix : public TKey
282 Defines the characteristics of a key used to access the elements of arrays
283 of fixed length objects.
285 An object of this type can represent three categories of key, depending on
286 the constructor used:
294 The Sort(), InsertIsqL(), Find() and FindIsqL() member functions of the CArrayFixFlat
295 and CArrayFixSeg class hierarchies need a TKeyArrayFix object as an argument
296 to define the location and type of key within an array element.
303 IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpText aType);
304 IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpText aType,TInt aLength);
305 IMPORT_C TKeyArrayFix(TInt anOffset,TKeyCmpNumeric aType);
307 IMPORT_C virtual void Set(CBufBase* aBase,TInt aRecordLength);
308 IMPORT_C TAny* At(TInt anIndex) const;
312 friend class CArrayFixBase;
318 typedef CBufBase*(*TBufRep)(TInt anExpandSize);
319 class CArrayFixBase : public CBase
324 Base class for arrays of fixed length objects.
326 It provides implementation and public functions which are common to all arrays
329 The class is always derived from and is never instantiated explicitly.
333 IMPORT_C ~CArrayFixBase();
334 inline TInt Count() const;
335 inline TInt Length() const;
336 IMPORT_C void Compress();
337 IMPORT_C void Reset();
338 IMPORT_C TInt Sort(TKeyArrayFix& aKey);
339 IMPORT_C TAny* At(TInt anIndex) const;
340 IMPORT_C TAny* End(TInt anIndex) const;
341 IMPORT_C TAny* Back(TInt anIndex) const;
342 IMPORT_C void Delete(TInt anIndex);
343 IMPORT_C void Delete(TInt anIndex,TInt aCount);
344 IMPORT_C TAny* ExpandL(TInt anIndex);
345 IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayFix& aKey,TInt& anIndex) const;
346 IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayFix& aKey,TInt& anIndex) const;
347 IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr);
348 IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aCount);
349 IMPORT_C TInt InsertIsqL(const TAny* aPtr,TKeyArrayFix& aKey);
350 IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TKeyArrayFix& aKey);
351 IMPORT_C void ResizeL(TInt aCount,const TAny* aPtr);
353 IMPORT_C CArrayFixBase(TBufRep aRep,TInt aRecordLength,TInt aGranularity);
354 IMPORT_C void InsertRepL(TInt anIndex,const TAny* aPtr,TInt aReplicas);
355 IMPORT_C void SetKey(TKeyArrayFix& aKey) const;
356 IMPORT_C void SetReserveFlatL(TInt aCount);
357 IMPORT_C static TInt CountR(const CBase* aPtr);
358 IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex);
371 class CArrayFix : public CArrayFixBase
376 A thin templated base class for arrays of fixed length objects.
378 The public functions provide standard array behaviour.
380 The class is always derived from and is never instantiated explicitly.
384 inline CArrayFix(TBufRep aRep,TInt aGranularity);
385 inline const T& operator[](TInt anIndex) const;
386 inline T& operator[](TInt anIndex);
387 inline const T& At(TInt anIndex) const;
388 inline const T* End(TInt anIndex) const;
389 inline const T* Back(TInt anIndex) const;
390 inline T& At(TInt anIndex);
391 inline T* End(TInt anIndex);
392 inline T* Back(TInt anIndex);
393 inline void AppendL(const T& aRef);
394 inline void AppendL(const T* aPtr,TInt aCount);
395 inline void AppendL(const T& aRef,TInt aReplicas);
396 inline T& ExpandL(TInt anIndex);
398 inline TInt Find(const T& aRef,TKeyArrayFix& aKey,TInt& anIndex) const;
399 inline TInt FindIsq(const T& aRef,TKeyArrayFix& aKey,TInt& anIndex) const;
400 inline void InsertL(TInt anIndex,const T& aRef);
401 inline void InsertL(TInt anIndex,const T* aPtr,TInt aCount);
402 inline void InsertL(TInt anIndex,const T& aRef,TInt aReplicas);
403 inline TInt InsertIsqL(const T& aRef,TKeyArrayFix& aKey);
404 inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TKeyArrayFix& aKey);
405 inline void ResizeL(TInt aCount);
406 inline void ResizeL(TInt aCount,const T& aRef);
407 inline const TArray<T> Array() const;
413 TEMPLATE_SPECIALIZATION class CArrayFix<TAny> : public CArrayFixBase
418 A template specialisation base class for arrays of fixed length
421 The public functions provide standard array behaviour.
423 The class is always derived from and is never instantiated explicitly.
427 inline CArrayFix(TBufRep aRep,TInt aRecordLength,TInt aGranularity);
428 inline const TAny* At(TInt anIndex) const;
429 inline const TAny* End(TInt anIndex) const;
430 inline const TAny* Back(TInt anIndex) const;
431 inline TAny* At(TInt anIndex);
432 inline TAny* End(TInt anIndex);
433 inline TAny* Back(TInt anIndex);
434 inline void AppendL(const TAny* aPtr);
435 inline void AppendL(const TAny* aPtr,TInt aCount);
436 inline TAny* ExtendL();
444 class CArrayFixFlat : public CArrayFix<T>
449 Array of fixed length objects contained within a flat dynamic buffer.
451 The elements of the array are instances of the template class T.
453 The flat dynamic buffer is an instance of a CBufFlat.
455 The elements can be T or R type objects and must have an accessible default
458 Note that, where possible, use the RArray<class T> class as this is more
466 inline explicit CArrayFixFlat(TInt aGranularity);
467 inline void SetReserveL(TInt aCount);
473 TEMPLATE_SPECIALIZATION class CArrayFixFlat<TAny> : public CArrayFix<TAny>
478 An array of fixed length untyped objects using a flat dynamic buffer.
480 The array elements are contained within a CBufFlat.
482 The class is useful for constructing an array of fixed length buffers, where
483 the length is decided at run time.
485 This class is also useful as a data member of a base class in a thin template
486 class/base class pair where the type of the array element is not known until
487 the owning thin template class is instantiated.
493 inline CArrayFixFlat(TInt aRecordLength,TInt aGranularity);
494 inline void SetReserveL(TInt aCount);
500 TEMPLATE_SPECIALIZATION class CArrayFixFlat<TInt> : public CArrayFix<TInt>
505 Template specialisation base class for arrays of TInt types implemented in a
512 IMPORT_C explicit CArrayFixFlat(TInt aGranularity);
513 IMPORT_C ~CArrayFixFlat();
514 inline void SetReserveL(TInt aCount);
520 TEMPLATE_SPECIALIZATION class CArrayFixFlat<TUid> : public CArrayFix<TUid>
525 Template specialisation base class for arrays of TUid types implemented in a
532 IMPORT_C explicit CArrayFixFlat(TInt aGranularity);
533 IMPORT_C ~CArrayFixFlat();
534 inline void SetReserveL(TInt aCount);
541 class CArrayFixSeg : public CArrayFix<T>
546 Array of fixed length objects contained within a segmented buffer.
548 The elements of the array are instances of the template class T.
550 The segmented buffer is an instance of a CBufSeg.
552 The elements can be T or R type objects and must have an accessible default
559 inline explicit CArrayFixSeg(TInt aGranularity);
565 TEMPLATE_SPECIALIZATION class CArrayFixSeg<TAny> : public CArrayFix<TAny>
570 An array of fixed length untyped objects using a segmented dynamic buffer.
572 The array elements are contained within a CBufSeg.
574 The class is useful for constructing an array of fixed length buffers, where
575 the length is decided at run time.
577 This class is also useful as a data member of a base class in a thin template
578 class/base class pair where the type of the array element is not known until
579 the owning thin template class is instantiated.
585 inline CArrayFixSeg(TInt aRecordLength,TInt aGranularity);
592 class CArrayPtr : public CArrayFix<T*>
597 A thin templated base class for arrays of pointers to objects.
599 The public functions contribute to standard array behaviour.
601 The class is always derived from and is never instantiated explicitly.
605 inline CArrayPtr(TBufRep aRep,TInt aGranularity);
606 void ResetAndDestroy();
614 class CArrayPtrFlat : public CArrayPtr<T>
619 Array of pointers to objects implemented using a flat dynamic buffer.
621 The elements of the array are pointers to instances of the template class T
622 and are contained within a CBufFlat.
624 This type of array has the full behaviour of flat arrays but, in addition,
625 the CArrayPtr<class T>::ResetAndDestroy() function offers a way of destroying
626 all of the objects whose pointers form the elements of the array, before
629 Note that where possible, use the RPointerArray<class T> class as this is
633 @see CArrayPtr::ResetAndDestroy
638 inline explicit CArrayPtrFlat(TInt aGranularity);
639 inline void SetReserveL(TInt aCount);
646 class CArrayPtrSeg : public CArrayPtr<T>
651 Array of pointers to objects implemented using a segmented dynamic buffer.
653 The elements of the array are pointers to instances of the template class T
654 and are contained within a CBufSeg.
656 This type of array has the full behaviour of segmented arrays but, in addition,
657 the CArrayPtr<class T>::ResetAndDestroy() function offers a way of destroying
658 all of the objects whose pointers form the elements of the array before
662 @see CArrayPtr::ResetAndDestroy
666 inline explicit CArrayPtrSeg(TInt aGranularity);
672 class TKeyArrayVar : public TKey
677 Defines the characteristics of a key used to access the elements of arrays
678 of variable length objects.
680 An object of this type can represent three categories of key, depending on
681 the constructor used:
689 The Sort(), InsertIsqL(), Find() and FindIsqL() member functions of the CArrayVarFlat
690 and CArrayVarSeg class hierarchies need a TKeyArrayVar object as an argument
691 to define the location and type of key within an array element.
693 A TKeyArrayVar object is also required for sorting a packed array. The implementation
694 of the SortL() member function of the CArrayPakFlat class constructs a temporary
695 CArrayVarFlat object which requires the TKeyArrayVar object.
703 IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpText aType);
704 IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpText aType,TInt aLength);
705 IMPORT_C TKeyArrayVar(TInt anOffset,TKeyCmpNumeric aType);
707 IMPORT_C virtual void Set(CBufBase* aBase);
708 IMPORT_C TAny* At(TInt anIndex) const;
711 friend class CArrayVarBase;
718 class CArrayVarBase : public CBase
723 An implementation base class for variable length arrays.
725 It provides implementation and public functions which are common to all
726 variable length type arrays.
728 The class is always derived from and is never instantiated explicitly.
732 IMPORT_C ~CArrayVarBase();
733 inline TInt Count() const;
734 IMPORT_C TInt Length(TInt anIndex) const;
735 IMPORT_C void Compress();
736 IMPORT_C void Reset();
737 IMPORT_C TInt Sort(TKeyArrayVar& aKey);
738 IMPORT_C TAny* At(TInt anIndex) const;
739 IMPORT_C void Delete(TInt anIndex);
740 IMPORT_C void Delete(TInt anIndex,TInt aCount);
741 IMPORT_C TAny* ExpandL(TInt anIndex,TInt aLength);
742 IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayVar& aKey,TInt& anIndex) const;
743 IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayVar& aKey,TInt& anIndex) const;
744 IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aLength);
745 IMPORT_C TInt InsertIsqL(const TAny* aPtr,TInt aLength,TKeyArrayVar& aKey);
746 IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TInt aLength,TKeyArrayVar& aKey);
748 IMPORT_C CArrayVarBase(TBufRep aRep,TInt aGranularity);
749 IMPORT_C void SetKey(TKeyArrayVar& aKey) const;
750 IMPORT_C static TInt CountR(const CBase* aPtr);
751 IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex);
763 class CArrayVar : public CArrayVarBase
768 A thin templated base class for variable length arrays.
770 The public functions provide standard array behaviour.
772 The class is always derived from and is never instantiated explicitly.
776 inline CArrayVar(TBufRep aRep,TInt aGranularity);
777 inline const T& operator[](TInt anIndex) const;
778 inline T& operator[](TInt anIndex);
779 inline const T& At(TInt anIndex) const;
780 inline T& At(TInt anIndex);
781 inline void AppendL(const T& aRef,TInt aLength);
782 inline T& ExpandL(TInt anIndex,TInt aLength);
783 inline T& ExtendL(TInt aLength);
784 inline TInt Find(const T& aRef,TKeyArrayVar& aKey,TInt& anIndex) const;
785 inline TInt FindIsq(const T& aRef,TKeyArrayVar& aKey,TInt& anIndex) const;
786 inline void InsertL(TInt anIndex,const T& aRef,TInt aLength);
787 inline TInt InsertIsqL(const T& aRef,TInt aLength,TKeyArrayVar& aKey);
788 inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TInt aLength,TKeyArrayVar& aKey);
789 inline const TArray<T> Array() const;
795 TEMPLATE_SPECIALIZATION class CArrayVar<TAny> : public CArrayVarBase
800 A template specialisation base class for variable length arrays.
802 The array buffer organisation is defined at construction.
804 The class is useful for constructing an array of variable length buffers,
805 where the length is decided at run time.
807 This class is also useful as a data member of a base class in a thin template
808 class/base class pair, where the type of the array element is not known until
809 the owning thin template class is instantiated.
813 inline CArrayVar(TBufRep aRep,TInt aGranularity);
814 inline const TAny* At(TInt anIndex) const;
815 inline TAny* At(TInt anIndex);
816 inline void AppendL(const TAny* aPtr,TInt aLength);
817 inline TAny* ExtendL(TInt aLength);
824 class CArrayVarFlat : public CArrayVar<T>
829 Array of variable length objects implemented using a flat dynamic buffer.
831 The elements of the array are instances of the template class T and are
832 contained within their own heap cells. Pointers to the elements are maintained
833 within the flat dynamic buffer, a CBufFlat.
835 The elements can be T or R type objects and must have an accessible default
842 inline explicit CArrayVarFlat(TInt aGranularity);
849 class CArrayVarSeg : public CArrayVar<T>
854 Array of variable length objects implemented using a segmented dynamic buffer.
856 The elements of the array are instances of the template class T and are
857 contained within their own heap cells. Pointers to the elements are maintained
858 within a segmented dynamic buffer, a CBufSeg.
860 The elements can be T or R type objects and must have an accessible default
867 inline explicit CArrayVarSeg(TInt aGranularity);
873 class TKeyArrayPak : public TKeyArrayVar
878 Defines the characteristics of a key used to access the elements of packed
881 An object of this type can represent three categories of key, depending on
882 the constructor used:
890 The InsertIsqL(), Find() and FindIsqL() member functions of the CArrayPakFlat
891 class hierarchy need a TKeyArrayPak object as an argument to define the location
892 and type of key within an array element.
894 Note that a TKeyArrayVar object is required for sorting a packed array. The
895 implementation of the SortL() member function of the CArrayPakFlat class constructs
896 a temporary CArrayVarFlat object which requires the TKeyArrayVar object.
904 IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpText aType);
905 IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpText aType,TInt aLength);
906 IMPORT_C TKeyArrayPak(TInt anOffset,TKeyCmpNumeric aType);
908 IMPORT_C virtual void Set(CBufBase* aBase);
909 IMPORT_C TAny* At(TInt anIndex) const;
913 friend class CArrayPakBase;
919 class CArrayPakBase : public CBase
924 An implementation base class for all variable length, packed arrays.
926 The class is always derived from and is never instantiated explicitly.
930 IMPORT_C ~CArrayPakBase();
931 inline TInt Count() const;
932 IMPORT_C TInt Length(TInt anIndex) const;
933 IMPORT_C void Compress();
934 IMPORT_C void Reset();
935 IMPORT_C void SortL(TKeyArrayVar& aKey);
936 IMPORT_C TAny* At(TInt anIndex) const;
937 IMPORT_C void Delete(TInt anIndex);
938 IMPORT_C void Delete(TInt anIndex,TInt aCount);
939 IMPORT_C TAny* ExpandL(TInt anIndex,TInt aLength);
940 IMPORT_C TInt Find(const TAny* aPtr,TKeyArrayPak& aKey,TInt& anIndex) const;
941 IMPORT_C TInt FindIsq(const TAny* aPtr,TKeyArrayPak& aKey,TInt& anIndex) const;
942 IMPORT_C void InsertL(TInt anIndex,const TAny* aPtr,TInt aLength);
943 IMPORT_C TInt InsertIsqL(const TAny* aPtr,TInt aLength,TKeyArrayPak& aKey);
944 IMPORT_C TInt InsertIsqAllowDuplicatesL(const TAny* aPtr,TInt aLength,TKeyArrayPak& aKey);
946 IMPORT_C CArrayPakBase(TBufRep aRep,TInt aGranularity);
947 IMPORT_C void SetKey(TKeyArrayPak& aKey) const;
948 IMPORT_C TInt GetOffset(TInt anIndex) const;
949 IMPORT_C void BuildVarArrayL(CArrayVarFlat<TAny>*& aVarFlat);
950 IMPORT_C static TInt CountR(const CBase* aPtr);
951 IMPORT_C static const TAny* AtR(const CBase* aPtr,TInt anIndex);
965 class CArrayPak : public CArrayPakBase
970 A thin templated base class for variable length, packed, arrays.
972 The public functions provide standard array behaviour.
974 The class is always derived from and is never instantiated explicitly.
978 inline CArrayPak(TBufRep aRep,TInt aGranularity);
979 inline const T& operator[](TInt anIndex) const;
980 inline T& operator[](TInt anIndex);
981 inline const T& At(TInt anIndex) const;
982 inline T& At(TInt anIndex);
983 inline void AppendL(const T& aRef,TInt aLength);
984 inline T& ExpandL(TInt anIndex,TInt aLength);
985 inline T& ExtendL(TInt aLength);
986 inline TInt Find(const T& aRef,TKeyArrayPak& aKey,TInt& anIndex) const;
987 inline TInt FindIsq(const T& aRef,TKeyArrayPak& aKey,TInt& anIndex) const;
988 inline void InsertL(TInt anIndex,const T& aRef,TInt aLength);
989 inline TInt InsertIsqL(const T& aRef,TInt aLength,TKeyArrayPak& aKey);
990 inline TInt InsertIsqAllowDuplicatesL(const T& aRef,TInt aLength,TKeyArrayPak& aKey);
991 inline const TArray<T> Array() const;
997 TEMPLATE_SPECIALIZATION class CArrayPak<TAny> : public CArrayPakBase
1002 A template specialisation base class for variable length, packed, arrays.
1004 The array buffer organisation is defined at construction.
1006 The class is useful for constructing an array of variable length buffers,
1007 where the length is decided at run time.
1009 This class is also useful as a data member of a base class in a thin template
1010 class/base class pair where the type of the array element is not known until
1011 the owning thin template class is instantiated.
1015 inline CArrayPak(TBufRep aRep,TInt aGranularity);
1016 inline const TAny* At(TInt anIndex) const;
1017 inline TAny* At(TInt anIndex);
1018 inline void AppendL(const TAny* aPtr,TInt aLength);
1019 inline TAny* ExtendL(TInt aLength);
1026 class CArrayPakFlat : public CArrayPak<T>
1031 Array of variable length objects packed into a flat buffer.
1033 The elements of the array are instances of the template class T and are
1034 contained within a flat dynamic buffer, a CBufFlat.
1036 The elements can be T or R type objects and must have an accessible default
1043 inline explicit CArrayPakFlat(TInt aGranularity);
1050 class CObject : public CBase
1055 Implements reference counting to track concurrent references to itself.
1057 An object of this type arranges automatic destruction of itself when the final
1058 reference is removed.
1060 A reference counting object is any object which has CObject as its base class.
1061 Constructing a CObject derived type or calling its Open() member function
1062 adds a reference to that object by adding one to the reference count; calling
1063 its Close() member function removes a reference by subtracting one from the
1064 reference count; when the last user of the object calls Close(), the reference
1065 count becomes zero and the object is automatically destroyed.
1070 IMPORT_C ~CObject();
1071 IMPORT_C virtual TInt Open();
1072 IMPORT_C virtual void Close();
1073 IMPORT_C virtual TName Name() const;
1074 IMPORT_C virtual TFullName FullName() const;
1075 IMPORT_C TInt SetName(const TDesC* aName);
1076 IMPORT_C void SetNameL(const TDesC* aName);
1077 inline CObject* Owner() const;
1078 inline void SetOwner(CObject* anOwner);
1079 inline TInt AccessCount() const;
1081 IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
1083 inline TInt UniqueID() const;
1089 CObjectCon* iContainer;
1093 friend class CObjectCon;
1094 friend class CObjectIx;
1098 //Forward declaration of SObjectIxRec
1099 struct SObjectIxRec;
1101 class CObjectIx : public CBase
1106 Generates handle numbers for reference counting objects.
1108 This is referred to as an object index.
1110 Adding a reference counting object to an object index is the way in which
1111 a unique handle number can be generated for that object. A handle number is
1112 the way in which an object, which is owned or managed by another thread or
1113 process can be identified.
1121 When ORd into the handle number, indicates that the reference
1122 counting object cannot be closed.
1124 ENoClose=KHandleNoClose,
1128 When ORed into the handle number, indicates that the handle
1131 ELocalHandle=KHandleFlagLocal
1134 IMPORT_C static CObjectIx* NewL();
1135 IMPORT_C ~CObjectIx();
1136 IMPORT_C TInt AddL(CObject* anObj);
1137 IMPORT_C void Remove(TInt aHandle);
1138 IMPORT_C CObject* At(TInt aHandle,TInt aUniqueID);
1139 IMPORT_C CObject* At(TInt aHandle);
1140 IMPORT_C CObject* AtL(TInt aHandle,TInt aUniqueID);
1141 IMPORT_C CObject* AtL(TInt aHandle);
1142 IMPORT_C TInt At(const CObject* anObject) const;
1143 IMPORT_C TInt Count(CObject* anObject) const;
1144 IMPORT_C CObject* operator[](TInt anIndex);
1145 inline TInt Count() const;
1146 inline TInt ActiveCount() const;
1148 IMPORT_C CObjectIx();
1152 TInt iNumEntries; // Number of actual entries in the index
1153 TInt iHighWaterMark; // points to at least 1 above the highest active index
1154 TInt iAllocated; // Max entries before realloc needed
1156 SObjectIxRec *iObjects;
1157 TInt iFree; // The index of the first free slot or -1.
1158 TInt iUpdateDisabled; // If >0, disables HWM update, reorder of the free list and memory shrinking.
1163 inline TBool IsLocalHandle(TInt aHandle)
1164 {return(aHandle&CObjectIx::ELocalHandle);}
1165 inline void SetLocalHandle(TInt &aHandle)
1166 {aHandle|=CObjectIx::ELocalHandle;}
1167 inline void UnSetLocalHandle(TInt &aHandle)
1168 {aHandle&=(~CObjectIx::ELocalHandle);}
1173 class CObjectCon : public CBase
1178 An object container.
1180 An object container acts as a home for a set of related reference counting
1183 A reference counting object, a CObject type, must be added to an object
1184 container. Only one instance of a given reference counting object can be
1185 held by an object container, i.e. each object within an object container
1188 Object containers are constructed by an object container index, a CObjectConIx
1191 Note that this class is not intended for user derivation.
1198 IMPORT_C static CObjectCon* NewL();
1199 IMPORT_C ~CObjectCon();
1200 IMPORT_C void Remove(CObject* anObj);
1201 IMPORT_C void AddL(CObject* anObj);
1202 IMPORT_C CObject* operator[](TInt anIndex);
1203 IMPORT_C CObject* At(TInt aFindHandle) const;
1204 IMPORT_C CObject* AtL(TInt aFindHandle) const;
1205 IMPORT_C TInt CheckUniqueFullName(const CObject* anOwner,const TDesC& aName) const;
1206 IMPORT_C TInt CheckUniqueFullName(const CObject* anObject) const;
1207 IMPORT_C TInt FindByName(TInt& aFindHandle,const TDesC& aMatch,TName& aName) const;
1208 IMPORT_C TInt FindByFullName(TInt& aFindHandle,const TDesC& aMatch,TFullName& aFullName) const;
1209 inline TInt UniqueID() const;
1210 inline TInt Count() const;
1212 IMPORT_C CObjectCon(TInt aUniqueID);
1213 TBool NamesMatch(const CObject* anObject, const CObject* aCurrentObject) const;
1214 TBool NamesMatch(const CObject* anObject, const TName& anObjectName, const CObject* aCurrentObject) const;
1217 The object container's unique Id value.
1226 friend class CObjectConIx;
1232 class CObjectConIx : public CBase
1237 A container for object containers
1239 This is referred to as a container index.
1241 The class provides the mechanism through which object containers, CObjectCon
1248 #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
1257 IMPORT_C static CObjectConIx* NewL();
1258 IMPORT_C ~CObjectConIx();
1259 IMPORT_C CObjectCon* Lookup(TInt aFindHandle) const;
1260 IMPORT_C CObjectCon* CreateL();
1261 IMPORT_C void Remove(CObjectCon* aCon);
1263 IMPORT_C CObjectConIx();
1264 IMPORT_C void CreateContainerL(CObjectCon*& anObject);
1266 CObjectCon* LookupByUniqueId(TInt aUniqueId) const;
1270 TUint16 iNextUniqueID;
1271 TUint16 iUniqueIDHasWrapped;
1272 CObjectCon** iContainers;
1277 // Forward Declaration of TCleanupStackItem
1278 class TCleanupStackItem;
1287 Defines a function which takes a single argument of type TAny* and returns
1290 An argument of this type is required by the constructors of a TCleanupItem
1293 typedef void (*TCleanupOperation)(TAny*);
1303 Encapsulates a cleanup operation and an object on which the operation
1306 The class allows cleanup to be more sophisticated than simply deleting objects,
1307 for example, releasing access to some shared resource.
1311 inline TCleanupItem(TCleanupOperation anOperation);
1312 inline TCleanupItem(TCleanupOperation anOperation,TAny* aPtr);
1314 TCleanupOperation iOperation;
1316 friend class TCleanupStackItem;
1322 class CCleanup : public CBase
1327 Implements the cleanup stack.
1329 An object of this type is created and used by the cleanup stack
1330 interface, CTrapCleanup.
1334 IMPORT_C static CCleanup* New();
1335 IMPORT_C static CCleanup* NewL();
1336 IMPORT_C ~CCleanup();
1337 IMPORT_C void NextLevel();
1338 IMPORT_C void PreviousLevel();
1339 IMPORT_C void PushL(TAny* aPtr);
1340 IMPORT_C void PushL(CBase* anObject);
1341 IMPORT_C void PushL(TCleanupItem anItem);
1342 IMPORT_C void Pop();
1343 IMPORT_C void Pop(TInt aCount);
1344 IMPORT_C void PopAll();
1345 IMPORT_C void PopAndDestroy();
1346 IMPORT_C void PopAndDestroy(TInt aCount);
1347 IMPORT_C void PopAndDestroyAll();
1348 IMPORT_C void Check(TAny* aExpectedItem);
1350 IMPORT_C void DoPop(TInt aCount,TBool aDestroy);
1351 IMPORT_C void DoPopAll(TBool aDestroy);
1353 IMPORT_C CCleanup();
1356 Pointer to the bottom of the cleanup stack.
1358 TCleanupStackItem* iBase;
1362 Pointer to the top of the cleanup stack.
1364 TCleanupStackItem* iTop;
1368 Pointer to the next availaible slot in the cleanup stack.
1370 TCleanupStackItem* iNext;
1376 NONSHARABLE_CLASS(TCleanupTrapHandler) : public TTrapHandler
1381 Implementation for a handler to work with the TRAP mechanism.
1383 This class does not normally need to be used or accessed directly by applications
1384 and third party code.
1388 TCleanupTrapHandler();
1389 virtual void Trap();
1390 virtual void UnTrap();
1392 virtual void Leave(TInt aValue);
1393 inline CCleanup& Cleanup();
1396 friend class CTrapCleanup;
1408 Automatically calls Close() on an object when that object goes out of scope.
1410 The behaviour takes advantage of the fact that the compiler automatically
1411 destroys objects that go out of scope.
1415 inline ~TAutoClose();
1416 inline void PushL();
1419 static void Close(TAny *aObj);
1422 An instance of the template class.
1430 class CTrapCleanup : public CBase
1435 Cleanup stack interface.
1437 The creation and destruction of a cleanup stack is done automatically by GUI
1438 applications and servers.
1442 IMPORT_C static CTrapCleanup* New();
1443 IMPORT_C ~CTrapCleanup();
1445 IMPORT_C CTrapCleanup();
1447 TCleanupTrapHandler iHandler;
1448 TTrapHandler* iOldHandler;
1454 class CCirBufBase : public CBase
1459 Base class for circular buffers.
1461 The class is part of the implementation of circular buffers and is never
1464 The class provides member functions that form part of the interface.
1468 IMPORT_C ~CCirBufBase();
1469 inline TInt Count() const;
1470 inline TInt Length() const;
1471 IMPORT_C void SetLengthL(TInt aLength);
1472 IMPORT_C void Reset();
1474 IMPORT_C CCirBufBase(TInt aSize);
1475 IMPORT_C TInt DoAdd(const TUint8* aPtr);
1476 IMPORT_C TInt DoAdd(const TUint8* aPtr,TInt aCount);
1477 IMPORT_C TInt DoRemove(TUint8* aPtr);
1478 IMPORT_C TInt DoRemove(TUint8* aPtr,TInt aCount);
1493 class CCirBuf : public CCirBufBase
1498 A circular buffer containing objects of a type defined by the
1504 #if defined(__VC32__)
1505 inline ~CCirBuf() {}
1507 inline TInt Add(const T* aPtr);
1508 inline TInt Add(const T* aPtr,TInt aCount);
1509 inline TInt Remove(T* aPtr);
1510 inline TInt Remove(T* aPtr,TInt aCount);
1516 class CCirBuffer : public CCirBuf<TUint8>
1521 Circular buffer of unsigned 8-bit integers.
1523 The integer values range from 0 to 255.
1527 IMPORT_C CCirBuffer();
1528 IMPORT_C ~CCirBuffer();
1529 IMPORT_C TInt Get();
1530 IMPORT_C TInt Put(TInt aVal);
1536 class CActive : public CBase
1541 The core class of the active object abstraction.
1543 It encapsulates both the issuing of a request to an asynchronous service provider
1544 and the handling of completed requests. An application can have one or more
1545 active objects whose processing is controlled by an active scheduler.
1551 Defines standard priorities for active objects.
1556 A low priority, useful for active objects representing
1557 background processing.
1563 A priority higher than EPriorityIdle but lower than EPriorityStandard.
1569 Most active objects will have this priority.
1571 EPriorityStandard=0,
1575 A priority higher than EPriorityStandard; useful for active objects
1576 handling user input.
1578 EPriorityUserInput=10,
1582 A priority higher than EPriorityUserInput.
1587 IMPORT_C ~CActive();
1588 IMPORT_C void Cancel();
1589 IMPORT_C void Deque();
1590 IMPORT_C void SetPriority(TInt aPriority);
1591 inline TBool IsActive() const;
1592 inline TBool IsAdded() const;
1593 inline TInt Priority() const;
1595 IMPORT_C CActive(TInt aPriority);
1596 IMPORT_C void SetActive();
1600 Implements cancellation of an outstanding request.
1602 This function is called as part of the active object's Cancel().
1604 It must call the appropriate cancel function offered by the active object's
1605 asynchronous service provider. The asynchronous service provider's cancel
1606 is expected to act immediately.
1608 DoCancel() must not wait for event completion; this is handled by Cancel().
1610 @see CActive::Cancel
1612 virtual void DoCancel() =0;
1616 Handles an active object's request completion event.
1618 A derived class must provide an implementation to handle the
1619 completed request. If appropriate, it may issue another request.
1621 The function is called by the active scheduler when a request
1622 completion event occurs, i.e. after the active scheduler's
1623 WaitForAnyRequest() function completes.
1625 Before calling this active object's RunL() function, the active scheduler
1628 1. decided that this is the highest priority active object with
1631 2. marked this active object's request as complete (i.e. the request is no
1634 RunL() runs under a trap harness in the active scheduler. If it leaves,
1635 then the active scheduler calls RunError() to handle the leave.
1637 Note that once the active scheduler's Start() function has been called,
1638 all user code is run under one of the program's active object's RunL() or
1639 RunError() functions.
1641 @see CActiveScheduler::Start
1642 @see CActiveScheduler::Error
1643 @see CActiveScheduler::WaitForAnyRequest
1646 virtual void RunL() =0;
1647 IMPORT_C virtual TInt RunError(TInt aError);
1649 IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
1653 The request status associated with an asynchronous request.
1655 This is passed as a parameter to all asynchronous service providers.
1657 The active scheduler uses this to check whether the active object's request
1660 The function can use the completion code to judge the success or otherwise
1663 TRequestStatus iStatus;
1668 friend class CActiveScheduler;
1669 friend class CServer;
1670 friend class CServer2;
1676 class CIdle : public CActive
1681 An active object that performs low-priority processing when no higher-priority
1682 active objects are ready to run.
1684 An idle time active object together with its associated callback function
1685 may be used to implement potentially long running background tasks, such as
1686 spreadsheet recalculation and word processor repagination.
1690 IMPORT_C static CIdle* New(TInt aPriority);
1691 IMPORT_C static CIdle* NewL(TInt aPriority);
1693 IMPORT_C void Start(TCallBack aCallBack);
1695 IMPORT_C CIdle(TInt aPriority);
1696 IMPORT_C void RunL();
1697 IMPORT_C void DoCancel();
1701 The callback object that encapsulates the background task.
1705 TCallBack iCallBack;
1711 class CAsyncOneShot : public CActive
1716 An active object that performs processing that is only performed once.
1718 The active object is intended to be given a low priority, so that it runs
1719 only when no higher-priority active objects are ready to run. In addition,
1720 the class ensures that the current thread cannot be closed until the active
1721 object is destroyed.
1723 The class needs to be derived from to make use of its behaviour, in particular,
1724 it needs to define and implement a RunL() function.
1726 NB: the constructor creates a process-relative handle to the current thread
1727 and this is stored within this object. If the thread subsequently dies abnormally,
1728 then this handle will not be closed, and the thread will not be destroyed
1729 until the process terminates.
1731 NB: if Call() is called from a different thread (for example, to implement
1732 a kind of inter-thread communication), a client-specific mechanism must be
1733 used to ensure that the thread that created this object is still alive.
1735 NB: if the thread that created this object has its own heap and terminates
1736 abnormally, then the handle stored within this object is lost.
1739 @see CAsyncOneShot::Call
1743 IMPORT_C CAsyncOneShot(TInt aPriority);
1744 IMPORT_C virtual void DoCancel();
1745 IMPORT_C virtual void Call();
1746 IMPORT_C virtual ~CAsyncOneShot();
1747 inline RThread& Thread();
1756 class CAsyncCallBack : public CAsyncOneShot
1761 An active object that performs its processing through an associated call back
1762 function, and which is only performed once.
1766 IMPORT_C CAsyncCallBack(TInt aPriority);
1767 IMPORT_C CAsyncCallBack(const TCallBack& aCallBack, TInt aPriority);
1768 IMPORT_C void Set(const TCallBack& aCallBack);
1769 IMPORT_C void CallBack();
1770 IMPORT_C virtual ~CAsyncCallBack();
1772 virtual void RunL();
1776 The callback object that encapsulates the callback function.
1778 TCallBack iCallBack;
1784 class TDeltaTimerEntry
1789 A timed event entry.
1791 An object of this type is added to a queue of timed events, as represented
1792 by a CDeltaTimer object. It represents a call back function that is called
1793 when the associated timed event expires.
1798 friend class CDeltaTimer;
1800 inline TDeltaTimerEntry(const TCallBack& aCallback);
1801 inline TDeltaTimerEntry();
1802 inline void Set(TCallBack& aCallback);
1804 TCallBack iCallBack;
1805 TTickCountQueLink iLink;
1811 class CDeltaTimer : public CActive
1816 A queue of timed events.
1818 A timed event is a callback function encapsulated by a TDeltaTimerEntry object,
1819 and is intended to be called when the time interval represented by the event
1822 The queue itself is a TDeltaQue list. A timed event entry is added into a
1823 position in the queue that is determined by the time interval specified for
1824 that event. Although the time interval for a timed event is specified as an
1825 interval from the present moment, when added to the queue the implementation
1826 treats each event as having an interval from the previous timed event (or now).
1828 CDeltaTimer is an active object, driven by an RTimer which is usually set to
1829 expire upon completion of the event at the head of the queue. If the time to
1830 the next event is too great or an event at the head of the queue has been
1831 removed, the timer may be set to expire prior to the event at the head of the
1834 When the timer completes, the head of the queue is inspected to see whether
1835 the timed event at the head of the queue has expired. On expiry, the callback
1836 function represented by that timed event is called, and the timed event entry
1837 is removed from the queue. The queue then inspects further events for expiry,
1838 calling and removing them as necessary until either the queue is empty or there
1839 is an event in the future to wait for.
1841 Note that the tick period is the minimum time interval for an event and the
1842 granularity of all timings using the queue. Note that in general, any event
1843 may be called back some time after it has expired and that specifically the
1844 duration of all events will at least be rounded up to a muliple of the tick
1848 @see TDeltaTimerEntry
1855 IMPORT_C virtual void Queue(TTimeIntervalMicroSeconds32 aTimeInMicroSeconds, TDeltaTimerEntry& aEntry);
1856 IMPORT_C virtual void Remove(TDeltaTimerEntry& aEntry);
1857 IMPORT_C TInt QueueLong(TTimeIntervalMicroSeconds aTimeInMicroSeconds, TDeltaTimerEntry& aEntry);
1859 // Factory functions
1860 IMPORT_C static CDeltaTimer* NewL(TInt aPriority);
1861 IMPORT_C static CDeltaTimer* NewL(TInt aPriority, TTimeIntervalMicroSeconds32 aGranularity);
1868 CDeltaTimer(TInt aPriority, TInt aTickPeriod);
1875 void Activate(TBool aRequeueTimer = EFalse);
1879 The asynchronous timer.
1884 The list of timed event entries.
1886 TTickCountQue iQueue;
1889 The period of a tick count.
1891 const TInt iTickPeriod;
1894 Pseudo-lock on the the queue to avoid reentrancy problems
1902 class CTimer : public CActive
1907 Base class for a timer active object.
1909 This is an active object that uses the asynchronous services provided by RTimer,
1910 to generate events. These events occur either at a specific time specified
1911 as a TTime, or after an interval specified in microseconds.
1913 The RunL() virtual member function is called by the active scheduler after
1916 To write a class derived from CTimer, first define and implement a constructor
1917 through which the priority of the CTimer active object can be specified. Then
1918 define and implement a suitable RunL() function to handle the completion of
1919 a timer request. This function is not defined by CTimer itself and must, therefore,
1920 be provided by the derived class.
1922 This class is ultimately implemented in terms of the nanokernel tick, and
1923 therefore the granularity of the generated events is limited to the period of
1924 this timer. This is variant specific, but is usually 1 millisecond.
1926 Note that the CPeriodic and CHeartbeat classes are derived from CTimer, and
1927 answer most timing needs.
1936 IMPORT_C void At(const TTime& aTime);
1937 IMPORT_C void AtUTC(const TTime& aTimeInUTC);
1938 IMPORT_C void After(TTimeIntervalMicroSeconds32 anInterval);
1939 IMPORT_C void Lock(TTimerLockSpec aLock);
1940 IMPORT_C void Inactivity(TTimeIntervalSeconds aSeconds);
1941 IMPORT_C void HighRes(TTimeIntervalMicroSeconds32 aInterval);
1943 IMPORT_C CTimer(TInt aPriority);
1944 IMPORT_C void ConstructL();
1945 IMPORT_C void DoCancel();
1953 class CPeriodic : public CTimer
1958 Periodic timer active object.
1960 This class generates regular timer events and handles them with a callback
1961 function. The callback is specified as a parameter to Start().
1963 The callback may not be called immediately after the signal from the timer
1964 request has been generated, for the following reasons:
1966 1. the RunL() of another active object may be running at the time of the signal
1968 2. other active objects may have a higher priority than the CPeriodic
1970 If timing accuracy is important to your application, you can minimise the
1971 first problem by ensuring all RunL()s complete quickly, and can eliminate
1972 the second by giving the CPeriodic a higher priority than any other active
1973 object. Although it is generally recommended that timer-related active objects
1974 have a high priority, this will not address the problem of CPeriodic timers
1975 running behind, because active object scheduling is not pre-emptive.
1977 After a timer signal generated by a CPeriodic, the next signal is requested
1978 just before running the callback, and this request can be delayed for the
1979 same reasons that running the callback can be delayed. Therefore, a large
1980 number N of periods may add up to somewhat more than N times the requested
1981 period time. If absolute precision is required in tracking time, do not rely
1982 on counting the number of times the callback is called: read the value of
1983 the system clock every time you need it.
1985 For many applications, such precision is not required, for example, tick
1986 counting is sufficiently accurate for controlling time-outs in a communications
1989 Note that you should be familiar with CActive in order to understand
1990 CPeriodic behaviour, but not necessarily with CTimer.
1996 IMPORT_C static CPeriodic* New(TInt aPriority);
1997 IMPORT_C static CPeriodic* NewL(TInt aPriority);
1998 IMPORT_C ~CPeriodic();
1999 IMPORT_C void Start(TTimeIntervalMicroSeconds32 aDelay,TTimeIntervalMicroSeconds32 anInterval,TCallBack aCallBack);
2001 IMPORT_C CPeriodic(TInt aPriority);
2002 IMPORT_C void RunL();
2004 TTimeIntervalMicroSeconds32 iInterval;
2005 TCallBack iCallBack;
2016 Heartbeat timer call-back handling interface.
2018 The interface provides a pair of functions to handle the beating and
2019 synchronisation of heartbeat timers.
2021 The CHeartbeat active object class uses an object implementing the MBeating
2024 @see CHeartbeat::Start
2029 Handles a regular heartbeat timer event.
2031 This type of event is one where the timer completes in synchronisation
2032 with the system clock.
2034 virtual void Beat() =0;
2037 Synchronises the heartbeat timer with system clock.
2039 This function handles a heartbeat timer event where the timer completes out
2040 of synchronisation with the system clock, (i.e. one or more heartbeats have
2043 virtual void Synchronize() =0;
2049 class CHeartbeat : public CTimer
2056 This class generates regular heartbeat events on a fixed fraction of a second.
2057 It is more accurate than a CPeriodic timer, because it provides a function
2058 to restore timer accuracy if it gets out of synchronisation with the system
2061 The protected RunL() function is called when the timer completes. The RunL()
2062 function in turn calls either the MBeating::Beat() or the MBeating::Synchronize()
2063 functions; MBeating is specified as a parameter to the Start() function
2064 used to start the heartbeat timer.
2066 The relevant MBeating function may not be called immediately after the signal
2067 from the timer request has been generated, for the following reasons:
2069 1. the RunL() of another active object may be running at the time of the signal
2071 2. other active objects may have a higher priority than the CHeartbeat
2073 If no heartbeat is missed, then the Beat() function is called.
2075 If one or more heartbeats are missed then the Synchronize() function is called.
2076 It is important to bear in mind that the machine might be switched off after
2077 a few beats of the heart, and then Synchronize() will be called several days
2078 later. It is therefore essential that synchronisation is achieved as quickly
2079 as possible, rather than trying to catch up a tick at a time. In the context
2080 of an analogue clock, for instance, the clock should just redraw itself with
2081 the current time - rather than moving the hands round in steps until the time
2084 CHeartbeat is an active object, derived from CActive (via CTimer). You should
2085 be familiar with CActive in order to understand CHeartbeat behaviour, but
2086 not necessarily with CTimer.
2092 IMPORT_C static CHeartbeat* New(TInt aPriority);
2093 IMPORT_C static CHeartbeat* NewL(TInt aPriority);
2094 IMPORT_C ~CHeartbeat();
2095 IMPORT_C void Start(TTimerLockSpec aLock,MBeating *aBeating);
2097 IMPORT_C CHeartbeat(TInt aPriority);
2098 IMPORT_C void RunL();
2100 TTimerLockSpec iLock;
2114 Represents a session (version 2) for a client thread on the server-side.
2116 A session acts as a channel of communication between the client and the server.
2117 A client thread can have multiple concurrent sessions with a server.
2120 - restricted to the creating thread
2121 - can be shared with other threads in the same process
2122 - can be shared by all threads in the system.
2124 A server must define and implement a derived class. In particular,
2125 it must provide an implementation for the ServiceL() virtual function.
2127 (Note that this class should be used instead of CSession)
2129 class CSession2 : public CBase
2131 friend class CServer2;
2133 IMPORT_C virtual ~CSession2() =0;
2135 IMPORT_C virtual void CreateL(); // Default method, does nothing
2137 inline const CServer2* Server() const;
2138 IMPORT_C void ResourceCountMarkStart();
2139 IMPORT_C void ResourceCountMarkEnd(const RMessage2& aMessage);
2140 IMPORT_C virtual TInt CountResources();
2143 Handles the servicing of a client request that has been passed
2146 This function must be implemented in a derived class. The details of
2147 the request are contained within the message.
2149 @param aMessage The message containing the details of the client request.
2151 virtual void ServiceL(const RMessage2& aMessage) =0;
2152 IMPORT_C virtual void ServiceError(const RMessage2& aMessage,TInt aError);
2154 IMPORT_C CSession2();
2155 IMPORT_C virtual void Disconnect(const RMessage2& aMessage);
2156 IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
2158 IMPORT_C void SetServer(const CServer2* aServer);
2162 enum TPanicNo {ESesCountResourcesNotImplemented=1,ESesFoundResCountHeaven};
2165 TInt iResourceCountMark;
2167 const CServer2* iServer;
2175 Abstract base class for servers (version 2).
2177 This is an active object. It accepts requests from client threads and forwards
2178 them to the relevant server-side client session. It also handles the creation
2179 of server-side client sessions as a result of requests from client threads.
2181 A server must define and implement a derived class.
2183 (Note that this class should be used instead of CServer)
2185 class CServer2 : public CActive
2190 This enumeration defines the maximum sharability of sessions opened
2191 with this server; for backwards compatibilty, these should be have
2192 the same values as the corresponding EIpcSessionType enumeration
2196 EUnsharableSessions = EIpcSession_Unsharable,
2197 ESharableSessions = EIpcSession_Sharable,
2198 EGlobalSharableSessions = EIpcSession_GlobalSharable,
2202 IMPORT_C virtual ~CServer2() =0;
2203 IMPORT_C TInt Start(const TDesC& aName);
2204 IMPORT_C void StartL(const TDesC& aName);
2205 IMPORT_C void ReStart();
2206 IMPORT_C void SetPinClientDescriptors(TBool aPin);
2209 Gets a handle to the server.
2211 Note that the RServer2 object is classified as Symbian internal, and its
2212 member functions cannot be acessed. However, the handle can be passed
2213 to the RSessionBase::CreateSession() variants that take a server handle.
2215 @return The handle to the server.
2217 inline RServer2 Server() const { return iServer; }
2219 inline const RMessage2& Message() const;
2220 IMPORT_C CServer2(TInt aPriority, TServerType aType=EUnsharableSessions);
2221 IMPORT_C void DoCancel();
2222 IMPORT_C void RunL();
2223 IMPORT_C TInt RunError(TInt aError);
2224 IMPORT_C virtual void DoConnect(const RMessage2& aMessage);
2225 IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
2229 Creates a server-side session object.
2231 The session represents a communication link between a client and a server,
2232 and its creation is initiated by the client through a call to one of
2233 the RSessionBase::CreateSession() variants.
2235 A server must provide an implementation, which as a minimum should:
2237 - check that the version of the server is compatible with the client by
2238 comparing the client supplied version number against the server's version
2239 number; it should leave if there is incompatibility.
2241 - construct and return the server side client session object.
2243 @param aVersion The version information supplied by the client.
2244 @param aMessage Represents the details of the client request that is requesting
2245 the creation of the session.
2247 @return A pointer to the newly created server-side session object.
2249 @see User::QueryVersionSupported()
2251 IMPORT_C virtual CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const =0;
2252 void Connect(const RMessage2& aMessage);
2253 void DoConnectL(const RMessage2& aMessage,CSession2* volatile& aSession);
2255 IMPORT_C void SetMaster(const CServer2* aServer);
2263 ESessionNotConnected,
2264 ESessionAlreadyConnected,
2265 EClientDoesntHaveRequiredCaps,
2269 TUint8 iSessionType;
2271 TUint16 iServerOpts;
2275 TDblQue<CSession2> iSessionQ;
2278 TDblQueIter<CSession2> iSessionIter;
2280 void Disconnect(const RMessage2& aMessage);
2281 static void BadMessage(const RMessage2& aMessage);
2282 static void NotConnected(const RMessage2& aMessage);
2283 friend class CPolicyServer;
2289 A security policy framework built on top of the normal CServer2 class.
2291 The two major functions of the Policy Server framework are to check a received
2292 message against a security policy and then to perform an action depending on
2293 the result of this check. The exact behaviour is defined by the contents of
2294 the TPolicy structure given in the constructor for CPolicyServer.
2296 The processing performed when a server receives a message are describe below.
2297 This should aid understanding of the interaction of the TPolicy structure and
2298 virtual member functions which may be implemented by classes derived from CPolicyServer.
2300 Checking the Security Policy
2302 On receipt of a message, the message function number is used to search the
2303 list of ranges pointed to by TPolicy::iRanges. This yields a range
2304 number R, which is between 0 and TPolicy::iRangeCount-1.
2305 The policy index, X, for this range is then fetched from TPolicy::iElementsIndex[R].
2306 If the message is a Connect message, then X is fetched directly from TPolicy::iOnConnect
2309 The further action taken is determined by the value of X.
2310 - If X==TSpecialCase::EAlwaysPass,
2311 the message is processed as normal; either by passing it to the ServiceL()
2312 method of a session, or, in the case of a connection message, a new session
2314 - If X==TSpecialCase::ENotSupported,
2315 the message is completed with KErrNotSupported.
2316 - If X==TSpecialCase::ECustomCheck,
2317 a call to the virtual function CustomSecurityCheckL() is made. The implementation
2318 of this method must return one of the TCustomResult enumerations which determine
2319 what further action is to be taken:
2320 - TCustomResult::EPass
2321 The message is processed as normal; either by passing it to the ServiceL()
2322 method of a session, or, in the case of a connection message, a new session
2324 - TCustomResult::EFail
2325 This causes CheckFailedL() to be called with the action specified by the
2326 aAction reference given to CustomSecurityCheckL() (This defaults to
2327 TFailureAction::EFailClient.)
2328 - TCustomResult::EAsync
2329 The derived class is responsible for further processing of the message,
2330 the Policy Server framework will do nothing more with it.
2331 - If X < TSpecialCase::ESpecialCaseHardLimit,
2332 X is taken as an index into the array of TPolicyElement objects pointed
2333 to by TPolicy::iElements. The platform security attributes of the process
2334 which sent the message being processed are checked against the security
2335 policy specified in this TPolicyElement. If the process possesses all of
2336 the attributes specified then the message processed as normal. Otherwise,
2337 CheckFailedL() is called with the action value specified in the TPolicyElement .
2339 Handling Policy Check Failure
2341 The CheckFailedL() method is called when a security check has failed. It performs
2342 an action according to the aAction value given to it:
2344 - If aAction==TFailureAction::EFailClient, the message is completed with
2345 KErrPermissionDenied.
2346 - If aAction==TFailureAction::EPanicClient, the client thread is panicked.
2347 - If aAction < 0 a call to the virtual function CustomFailureActionL() is made.
2348 The implementation of this method must return one of the TCustomResult
2349 enumerations which determine what further action is to be taken:
2350 - TCustomResult::EPass
2351 The message is processed as normal; either by passing it to the ServiceL()
2352 method of a session, or, in the case of a connection message, a new session
2354 - TCustomResult::EFail
2355 The message is completed with KErrPermissionDenied.
2356 - TCustomResult::EAsync
2357 The derived class is responsible for further processing of the message,
2358 the Policy Server framework will do nothing more with it.
2363 class CPolicyServer : public CServer2
2366 /** Enumeration specifying action to take if a security check fails.
2367 Values >= 0 are handled by CheckFailedL(). Values < 0 are specific to the
2368 derived implementation of the policy server and will result in a call to
2369 CustomFailureActionL() if a security check fails. Attempts to use undefined
2370 values >= 0 will result in a panic in CheckFailedL().
2374 EFailClient = 0, /**< Complete message with KErrPermissionDenied */
2375 EPanicClient= 1, /**< Panic client */
2378 /** Enumeration of acceptable return codes from both of
2379 CustomSecurityCheckL() and CustomFailureActionL(). Results of EPass or EFail
2380 are handled by the CPolicyServer framework. No other action is required on
2381 the part of the derived implementation. However, results of EAsync imply
2382 that the derived implementation will call the appropriate function once the
2383 result is known. See CustomSecurityCheckL() and CustomFailureActionL for
2388 EPass = 0, /**< Security check passed. */
2389 EFail = 1, /**< Security check failed. */
2390 EAsync = 2, /**< Security checking will be performed asynchronously. */
2393 /** Class specifying a security check and the action to take
2395 If iAction is >=0 it must be a member of TFailureAction
2396 If iAction is <0 it is assumed to specify a custom action specific to the
2397 derived implementation. In this case, CustomFailureActionL must be implemented
2398 by the derived class.
2400 class TPolicyElement
2403 /** Security policy to check against the client which sent a message.
2405 This class can specify a security policy consisting of either:
2407 -# A check for between 0 and 7 capabilities
2408 -# A check for a given Secure ID along with 0-3 capabilities
2409 -# A check for a given Vendor ID along with 0-3 capabilities
2411 This member should only be initialised by one of the following macros:
2413 - _INIT_SECURITY_POLICY_PASS
2414 - _INIT_SECURITY_POLICY_FAIL
2415 - _INIT_SECURITY_POLICY_C1
2416 - _INIT_SECURITY_POLICY_C2
2417 - _INIT_SECURITY_POLICY_C3
2418 - _INIT_SECURITY_POLICY_C4
2419 - _INIT_SECURITY_POLICY_C5
2420 - _INIT_SECURITY_POLICY_C6
2421 - _INIT_SECURITY_POLICY_C7
2422 - _INIT_SECURITY_POLICY_S0
2423 - _INIT_SECURITY_POLICY_S1
2424 - _INIT_SECURITY_POLICY_S2
2425 - _INIT_SECURITY_POLICY_S3
2426 - _INIT_SECURITY_POLICY_V0
2427 - _INIT_SECURITY_POLICY_V1
2428 - _INIT_SECURITY_POLICY_V2
2429 - _INIT_SECURITY_POLICY_V3
2433 TStaticSecurityPolicy iPolicy;
2435 /** Action to take on failure. Either a value from TFailureAction
2436 or a negative value which has meaning to the CustomFailureActionL()
2437 method of a derived class.
2442 /** Special case values which can be used instead of a policy element index
2443 contained in the array TPolicy::iElementsIndex
2447 /** Indicates a custom check should be made by calling CustomSecurityCheckL() */
2450 /** Indicates that message is requesting an unsupported function.
2451 The message is completed with KErrNotSupported. */
2452 ENotSupported =254u,
2454 /** Indicates that the message is requesting an unrestricted function
2455 and therefore should be processed without any further checks. */
2458 ESpecialCaseLimit =252u, /**< @internalTechnology */
2459 ESpecialCaseHardLimit =250u /**< @internalTechnology */
2462 /** Object specifying which security checks to perform on each request
2463 number and what action to take if the check fails.
2465 Explanations of each of the members of this class are detailed below.
2467 As explained in CPolicyServer::CPolicyServer, it is important that the
2468 instance of this class (CPolicyServer::TPolicy) given to the policy
2469 server constructor, exists for the lifetime of the server. For this
2470 reason, as well as code size considerations, it is recommended that
2471 the TPolicy instance is const static data.
2472 The following code segment shows the recommended way of doing this.
2473 Further detail on what each of these statements means is given below.
2476 const TUint myRangeCount = 4;
2477 const TInt myRanges[myRangeCount] =
2479 0, //range is 0-2 inclusive
2480 3, //range is 3-6 inclusive
2482 8, //range is 8-KMaxTInt inclusive
2484 const TUint8 myElementsIndex[myRangeCount] =
2486 1, //applies to 0th range (req num: 0-2)
2487 CPolicyServer::ECustomCheck, //applies to 1st range (req num: 3-6)
2488 0, //applies to 2nd range (req num: 7)
2489 CPolicyServer::ENotSupported, //applies to 3rd range (req num: 8-KMaxTInt)
2491 const CPolicyServer::TPolicyElement myElements[] =
2493 {_INIT_SECURITY_POLICY_C1(ECapabilityDiskAdmin), CPolicyServer::EFailClient},
2494 {_INIT_SECURITY_POLICY_C1(ECapabilityLocation), CMyPolicyServer::EQueryUser},
2496 const CPolicySErver::TPolicy myPolicy =
2498 CPolicyServer::EAlwaysPass, //specifies all connect attempts should pass
2509 /** The index into iElements, or an allowed value of TSpecialCase,
2510 that is used to check a connection attempt . */
2513 /** Number of ranges in the iRanges array. */
2514 TUint16 iRangeCount;
2516 /** A pointer to an array of ordered ranges of request numbers. Each
2517 element in this array refers to the starting request number of a range.
2518 The range of the previous element is up to and including the current
2519 element minus 1. Thus an array like:
2521 const TInt myRanges[4] = {0, 3, 7, 8};
2524 - the 0th range is 0-2 (inclusive).
2525 - the 1st range is 3-6 (inclusive).
2526 - the 2nd range is solely request number 7.
2527 - the 3rd range is 8-KMaxTInt (inclusive).
2529 Note that the all possible request numbers must be accounted for. This
2530 implies that the first element must be 0. It also implies that the
2531 last range goes from the that element to KMaxTint. Finally, each
2532 element must be strictly greater than the previous element. As the
2533 first element is 0, this clearly implies that iRanges must not contain
2536 const TInt* iRanges;
2538 /** A pointer to an array of TUint8 values specifying the appropriate action
2539 to take for each range in iRanges. For example, the 0th element of
2540 iElementsIndex specifies the appropriate action to take for the 0th
2541 range in iRanges. As such, iElementsIndex must have precisely the same
2542 number of elements as iRanges.
2544 The following rules apply to the value of each element in iElementsIndex:
2545 -# Each value must be a valid index into iElements (that is, less than
2546 the number of elements in iElements) OR a valid value from
2548 -# Elements' values need not follow any special ordering.
2549 -# Elements may repeat values.
2551 Continuing the example from iRanges:
2553 const TInt myRanges[4] = {0, 3, 7, 8};
2554 const TUInt8 myElementsIndex[4] = {
2556 CPolicyServer::ECustomCheck,
2558 CPolicyServer::ENotSupported
2562 -# Requests within the first range of myRanges (request numbers 0-2)
2563 will be checked against the policy specified by the 1st element of
2565 -# Requests with the the second range of myRanges (request numbers
2566 3-6) require a custom check to determine if they are allowed. This requires
2567 derived server implementations to implement CustomSecurityCheckL()
2568 -# Requests within the third range of myRanges (request number 7) will
2569 be checked against the policy specified by the 0th element of iElements.
2570 -# Requests within the fourth range of myRanges (request numbers
2571 8-KMaxTInt) will automatically be completed with KErrNotSupported by
2572 the policy server framework.
2574 const TUint8* iElementsIndex;
2576 /** A pointer to an array of distinct policy elements.
2578 Continuing with the previous examples:
2580 const TInt myRanges[4] = {0, 3, 7, 8};
2581 const TUInt8 myElementsIndex[4] = {
2583 CPolicyServer::ECustomCheck,
2585 CPolicyServer::ENotSupported
2587 const TPolicyElement iElements[] = {
2588 {_INIT_SECURITY_POLICY_C1(ECapabilityDiskAdmin), CPolicyServer::EFailClient},
2589 {_INIT_SECURITY_POLICY_C1(ECapabilityLocation), CMyPolicyServer::EQueryUser}
2593 The instantiation of iElements specifies that:
2594 -# Request numbers 0-2 require the Location capability. As the
2595 iAction member of the 1st element specifies a custom action
2596 (represented by the negative number, CMyPolicyServer::EQueryUser),
2597 requests without Location will passed to the reimplementation of
2598 CustomFailureActionL.
2599 -# Request number 7 requires the DiskAdmin capability. Requestors
2600 without DiskAdmin will have their request completed with
2601 KErrPermissionDenied.
2603 const TPolicyElement* iElements;
2607 /** Process an accepted message which has passed its policy check.
2609 The message is either passed to the ServiceL() method of a session,
2610 or, in the case of a connection message, a new session is created.
2612 This is called by RunL() to process a message which has passed its security
2613 check. If the server implementation returns EAsync from either
2614 CustomSecurityCheckL() or CustomFailureActionL(), then it is the responsibility
2615 of the derived server implementation to call ProcessL at a later point if
2616 the messages passes the asynchronous check.
2618 This function should only ever be called by derived implementations if
2619 asynchronous security checks are in use.
2621 IMPORT_C void ProcessL(const RMessage2& aMsg);
2623 /** Called when a security check has failed.
2625 The aAction parameter determines the action taken:
2626 - If aAction==TFailureAction::EFailClient, the message is completed with
2627 KErrPermissionDenied.
2628 - If aAction==TFailureAction::EPanicClient, the client thread is panicked.
2629 - If aAction < 0 a call to the virtual function CustomFailureActionL() is made.
2631 This function should only ever be called by derived implementations if
2632 asynchronous security checks are in use.
2634 @param aMsg The message which failed its check.
2635 @param aAction The action to take. (See description.)
2636 @param aMissing A list of the security attributes that were missing from
2637 the checked process.
2639 IMPORT_C void CheckFailedL(const RMessage2& aMsg, TInt aAction, const TSecurityInfo& aMissing);
2641 /** Called if a leave occurs during processing of a message. The
2642 underlying framework ensures that leaves which occur during
2643 CSession2::ServiceL are passed to CSession2::ServiceError. Leaves occuring
2644 prior to this (ie. during CustomSecurityCheckL() or CustomFailureActionL() ) are
2645 completed with the leave code.
2647 This function should only ever be called by derived implementations if
2648 asynchronous security checks are in use. In this case the RunError() of
2649 that other active object must call ProcessError().
2651 @param aMsg The message being processed when the leave occurred.
2652 @param aError The leave code.
2654 IMPORT_C void ProcessError(const RMessage2& aMsg, TInt aError);
2657 /** Construct a policy server
2659 @param aPriority Active object priority for this server
2660 @param aPolicy Reference to a policy object describing the security checks
2661 required for each message type. The server does not make a
2662 copy of policy, and therefore this object must exist for the
2663 lifetime of the server. It is recommended that aPolicy
2664 is in const static data.
2665 @param aType Type of session sharing supported by this server
2667 IMPORT_C CPolicyServer(TInt aPriority, const TPolicy& aPolicy, TServerType aType=EUnsharableSessions);
2669 /** Performs a custom security check.
2670 Derived server classes must implement this function if any element in
2671 iElementsIndex has the value CPolicyServer::ECustomCheck.
2672 Similarly, if CPolicyServer::ECustomCheck is not used, then this function
2673 can be safely ignored.
2675 If CPolicyServer::ECustomCheck is used, there are two further cases to consider:
2676 -# The custom security check can synchronously decide if the message
2677 should pass. In this case, the derived implementation must simply return
2678 either EPass or EFail depending on the result of the security check.
2679 -# The custom security check needs to use asynchronous methods in order
2680 to determine whether the message should procceed. In this case, these
2681 asysnchronous methods should be started and then the EAsync value returned.
2682 Furthermore, implmentations returning EAsync commit to the following:
2683 - If the security check eventually passes, ProcessL() must be called with
2684 the appropriate message.
2685 - If the security check eventually fails, CheckFailedL() must be called
2687 - Pending messages on a given session need to be completed and discarded
2688 if the session is closed.
2690 IMPORTANT NOTE. When processing a message asynchronously, a copy must be
2691 made of the RMessage2 object. Saving a refernece or pointer to the original
2692 message will produce unpredictable defects. This is because the object will
2693 be reused for the next message that the server receives.
2695 In both cases, synchronous and asynchronous, the derived implementation has the
2696 option of updating the aAction and/or aMissing parameters if that is
2699 @param aMsg The message to check.
2700 @param aAction A reference to the action to take if the security check
2701 fails. This is either a value from TFailureAction or a negative
2702 value which has meaning to the CustomFailureActionL() method of
2704 The policy server framework gives this value a default of
2705 EFailClient. If a derived implementation wishes a
2706 different value, then it should change this.
2707 @param aMissing A reference to the list of security attributes missing
2708 from the checked process. The policy server initialises this
2709 object to zero (that is a sid of 0, a vid of 0, and no capabilities).
2710 If derived implementations wish to take advantage of a list of
2711 missing attributes in their implementation of CustomFailureActionL(),
2712 then they should set those missing attributes here in
2713 CustomSecurityCheckL().
2714 @return A value from TCustomResult.
2715 @panic CBase 95 If the default implementation is called.
2717 IMPORT_C virtual TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing);
2719 /** Performs a custom action after the failure of a security check.
2720 Derived server classes must implement this function if the aAction value
2721 passed to CheckFailedL() is less than zero. This can happened if the policy
2722 specified a negative number in the iAction member of any of the
2723 TPolicyElements, or, if the derived CustomSecurityCheckL() modified the
2724 value of aAction prior to returning.
2726 If negative aAction values are used, there are two further cases to consider:
2727 -# The custom security check can synchronously decide if the message
2728 should pass. In this case, the derived implementation must simply return
2729 either EPass or EFail depending on the result of the security check.
2730 -# The custom security check needs to use asynchronous methods in order
2731 to determine whether the message should still proceed. In this case, these
2732 asysnchronous methods should be started and then the EAsync value returned.
2733 Furthermore, implmentations returning EAsync commit to the following:
2734 - If the security check eventually passes, ProcessL() must be called with
2735 the appropriate message.
2736 - If the security check eventually fails, or if a fatal error condition occurs,
2737 including if the previously mentioned call to ProcessL() leaves;
2738 then CPolicyServer::ProcessError() should be called passing the message and
2739 relevant error code.
2740 - Pending messages on a given session need to be completed and discarded
2741 if the session is closed.
2743 IMPORTANT NOTE. When processing a message asynchronously, a copy must be
2744 made of the RMessage2 object. Saving a refernece or pointer to the original
2745 message will produce unpredictable defects. This is because the object will
2746 be reused for the next message that the server receives.
2748 The default implementation of this function panics the server.
2750 @param aMsg The message to check
2751 @param aAction The custom failure action requested.
2752 This is either a value from TFailureAction or a negative
2753 value which has meaning to the CustomFailureActionL() method of
2755 @param aMissing A const reference to the list of security attributes missing
2756 from the checked process. There are two cases to consider:
2757 (a) If this message was checked (and failed) by a static policy
2758 applied by the policy server framework, aMissing will contain a
2759 list of the security attributes that caused the policy to fail. An
2760 completely zeroed aMissing implies that an always fail policy was
2762 (b) If this message was failed by a custom security check, then
2763 aMissing will be zeroed unless the CustomSecurityCheckL() method
2765 @return A value from TCustomResult.
2766 @panic CBase 95 If the default implementation is called.
2768 IMPORT_C virtual TCustomResult CustomFailureActionL(const RMessage2& aMsg, TInt aAction, const TSecurityInfo& aMissing);
2771 IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
2773 IMPORT_C virtual void RunL();
2774 IMPORT_C virtual TInt RunError(TInt aError);
2775 const CPolicyServer::TPolicyElement* FindPolicyElement(TInt aFn, TUint& aSpecialCase) const;
2777 const TPolicy& iPolicy;
2783 class CActiveScheduler : public CBase
2788 Controls the handling of asynchronous requests as represented by
2791 An active scheduler is used to schedule the sequence in which active object request
2792 completion events are handled by a single event-handling thread.
2794 An active scheduler can be instantiated and used directly if either:
2796 - the RunL() function of all of its active objects is guaranteed not to leave, or
2798 - each of its active objects implements a suitable RunError() function to provide suitable cleanup
2800 If any of the active scheduler's active objects does not provide a RunError()
2801 function, then a CActiveScheduler derived class must be defined and an implementation
2802 of the Error() function provided to perform the cleanup required.
2804 There is one active scheduler per thread and the static functions provided by the
2805 class always refer to the current active scheduler.
2807 @see CActiveScheduler::Error
2809 @see CActiveSchedulerWait
2812 friend class CActiveSchedulerWait;
2815 typedef TLoop* TLoopOwner;
2817 IMPORT_C CActiveScheduler();
2818 IMPORT_C ~CActiveScheduler();
2819 IMPORT_C static void Install(CActiveScheduler* aScheduler);
2820 IMPORT_C static CActiveScheduler* Current();
2821 IMPORT_C static void Add(CActive* aActive);
2822 IMPORT_C static void Start();
2823 IMPORT_C static void Stop();
2824 IMPORT_C static TBool RunIfReady(TInt& aError, TInt aMinimumPriority);
2825 IMPORT_C static CActiveScheduler* Replace(CActiveScheduler* aNewActiveScheduler);
2826 IMPORT_C virtual void WaitForAnyRequest();
2827 IMPORT_C virtual void Error(TInt aError) const;
2828 IMPORT_C void Halt(TInt aExitCode) const;
2829 IMPORT_C TInt StackDepth() const;
2831 class TCleanupBundle
2834 CCleanup* iCleanupPtr;
2838 static void Start(TLoopOwner* aOwner);
2839 IMPORT_C virtual void OnStarting();
2840 IMPORT_C virtual void OnStopping();
2841 IMPORT_C virtual void Reserved_1();
2842 IMPORT_C virtual void Reserved_2();
2843 void Run(TLoopOwner* const volatile& aLoop);
2844 void DoRunL(TLoopOwner* const volatile& aLoop, CActive* volatile & aCurrentObj, TCleanupBundle* aCleanupBundle);
2846 IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& a0, TAny* a1);
2848 inline TInt Level() const; // deprecated
2851 TPriQue<CActive> iActiveQ;
2858 class CActiveSchedulerWait : public CBase
2863 Controls a single scheduling loop in the current active scheduler.
2865 This class provides better control of nested wait loops in the active
2868 Note that a CActiveSchedulerWait object can be used as a data member
2869 inside other CBase derived classes.
2871 @see CActiveScheduler
2875 IMPORT_C CActiveSchedulerWait();
2876 IMPORT_C ~CActiveSchedulerWait();
2877 IMPORT_C void Start();
2878 IMPORT_C void AsyncStop();
2879 IMPORT_C void AsyncStop(const TCallBack& aCallMeWhenStopped);
2880 inline TBool IsStarted() const;
2881 IMPORT_C TBool CanStopNow() const;
2883 CActiveScheduler::TLoopOwner iLoop;
2894 A collection of static functions that are used to add resources to and remove
2895 resources from the cleanup stack.
2899 IMPORT_C static void PushL(TAny* aPtr);
2900 IMPORT_C static void PushL(CBase* aPtr);
2901 IMPORT_C static void PushL(TCleanupItem anItem);
2902 IMPORT_C static void Pop();
2903 IMPORT_C static void Pop(TInt aCount);
2904 IMPORT_C static void PopAndDestroy();
2905 IMPORT_C static void PopAndDestroy(TInt aCount);
2906 IMPORT_C static void Check(TAny* aExpectedItem);
2907 inline static void Pop(TAny* aExpectedItem);
2908 inline static void Pop(TInt aCount, TAny* aLastExpectedItem);
2909 inline static void PopAndDestroy(TAny* aExpectedItem);
2910 inline static void PopAndDestroy(TInt aCount, TAny* aLastExpectedItem);
2920 A utility class used by the templated function CleanupDeletePushL() to create
2921 a TCleanupItem item that will perform a delete type operation on
2922 the class T type object.
2924 @see CleanupDeletePushL()
2930 inline static void PushL(T* aPtr);
2932 static void Delete(TAny *aPtr);
2942 Constructs and pushes a TCleanupItem object onto the cleanup stack.
2944 The TCleanupItem encapsulates:
2946 - the pointer aPtr to the object of type class T which is to be cleaned up
2948 - an associated cleanup operation.
2950 The cleanup operation is the private static function Delete() of the templated
2951 class CleanupDelete, and is called as a result of a subsequent call
2952 to CleanupStack::PopAndDestroy().
2954 CleanupDelete::Delete() is passed a pointer to the class T object to be cleaned
2955 up, and the function implements cleanup by deleting the passed object.
2957 An example of its use:
2961 CTestOne* one = new (ELeave) CTestOne;
2962 CleanupDeletePushL(one);
2964 CleanupStack::PopAndDestroy(); // <--- results in "one" being deleted.
2968 @param aPtr A pointer to a templated class T type object for which the cleanup item is being created.
2972 @see CleanupStack::PopAndDestroy()
2975 inline void CleanupDeletePushL(T* aPtr);
2984 A utility class used by the templated function CleanupArrayDeletePushL() to
2985 create a TCleanupItem item that will perform a delete type operation on an
2986 array of class T type objects.
2988 @see CleanupArrayDeletePushL()
2991 class CleanupArrayDelete
2994 inline static void PushL(T* aPtr);
2996 static void ArrayDelete(TAny *aPtr);
3006 Constructs and pushes a TCleanupItem object onto the cleanup stack.
3008 The TCleanupItem encapsulates:
3010 - the pointer aPtr to an array of type class T objects to be cleaned up
3012 - an associated cleanup operation.
3014 The cleanup operation is the private static function ArrayDelete() of the
3015 templated class CleanupArrayDelete, and is called as a result of
3016 a subsequent call to CleanupStack::PopAndDestroy().
3018 CleanupArrayDelete::ArrayDelete() is passed a pointer to the array of class T
3019 objects to be cleaned up, and the function implements cleanup by deleting
3020 the passed array using the delete [] operator.
3022 An example of its use:
3026 RTestOne* one = new (ELeave) RTestOne [KSomeArraySize];
3027 CleanupArrayDeletePushL(one);
3028 ... // Do something with the object.........
3029 CleanupStack::PopAndDestroy(); // <--- results in the array "one" being deleted.
3033 @param aPtr A pointer to an array of class T type objects for which
3034 the cleanup item is being created.
3037 @see CleanupArrayDelete
3038 @see CleanupStack::PopAndDestroy()
3041 inline void CleanupArrayDeletePushL(T* aPtr);
3050 A utility class used by the templated function CleanupClosePushL() to create
3051 a TCleanupItem item that will perform a close type operation on
3052 the class T type object.
3054 @see CleanupClosePushL()
3060 inline static void PushL(T& aRef);
3062 static void Close(TAny *aPtr);
3072 Constructs and pushes a TCleanupItem object onto the cleanup stack.
3074 The TCleanupItem encapsulates:
3076 1. a reference aRef to the object of type class T which is to be cleaned up
3078 2. an associated cleanup operation.
3080 The cleanup operation is the private static function Close() of the templated
3081 class CleanupClose and is invoked as a result of a subsequent call to
3082 CleanupStack::PopAndDestroy().
3084 CleanupClose::Close() is passed a pointer to the class T object to be cleaned
3085 up, and the function implements cleanup by calling Close() on the passed object.
3086 The class T object must, therefore, define and implement (or inherit) a Close()
3089 An example of its use:
3096 IMPORT_C void Close();
3101 CleanupClosePushL(two);
3103 CleanupStack::PopAndDestroy(); // <--- results in Close() being called on "two".
3107 In practice, this type of cleanup operation is commonly applied to handles
3108 to resources; if such handles are constructed on the program stack, then it is
3109 important that such handles are closed.
3111 @param aRef A reference to a class T type object for which the cleanup item
3116 @see CleanupStack::PopAndDestroy()
3119 inline void CleanupClosePushL(T& aRef);
3128 A utility class used by the templated function CleanupReleasePushL() to create
3129 a TCleanupItem item that will perform a release type operation on
3130 the class T type object.
3132 @see CleanupReleasePushL()
3135 class CleanupRelease
3138 inline static void PushL(T& aRef);
3140 static void Release(TAny *aPtr);
3150 Constructs and pushes a TCleanupItem object onto the cleanup stack.
3152 The TCleanupItem encapsulates:
3154 1. a reference aRef to the object of type class T which is to be cleaned up
3156 2. an associated cleanup operation.
3158 The cleanup operation is the private static function Release() of the
3159 templated class CleanupRelease and is invoked as a result of
3160 a subsequent call to CleanupStack::PopAndDestroy().
3162 CleanupRelease::Release() is passed a pointer to the class T object to be cleaned
3163 up, and the function implements cleanup by calling Release() on the passed object.
3164 The class T object must, therefore, define and implement (or inherit) a Release()
3167 An example of its use:
3174 IMPORT_C void Release();
3179 CleanupReleasePushL(three);
3181 CleanupStack::PopAndDestroy(); // <--- results in Release() being called on "three".
3185 @param aRef A reference to a class T type object for which the cleanup item
3190 @see CleanupStack::PopAndDestroy()
3193 inline void CleanupReleasePushL(T& aRef);
3207 IMPORT_C static CConsoleBase* NewL(const TDesC& aTitle,TSize aSize);
3210 #include <e32base.inl>
3212 #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
3213 #include <e32base_private.h>
3216 #endif //__E32BASE_H__