diff -r 000000000000 -r ff3b6d0fd310 cbs/CbsServer/ServerInc/CCbsRecCollector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbs/CbsServer/ServerInc/CCbsRecCollector.h Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,207 @@ +/* +* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: This file contains the header file of the CCbsRecCollector class. +* +*/ + + +#ifndef CCBSRECCOLLECTOR_H +#define CCBSRECCOLLECTOR_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class TCbsMessageCompletion; +class CCbsRecMessage; +class CCbsMessage; +class CCbsMessageFactory; +class CCbsMessageCleanupTimer; + +// DATA TYPES +// Dynamic array that contains collected message pages +typedef CArrayPtrFlat CMessageBuffer; + + +// CLASS DECLARATION + +/** +* This class represents a collector, which stores pages of multipaged +* messages. Complete messages are assembled and returned back to +* the caller of CollectL() method. +* +* CCbsRecCollector stores message pages in a number of dynamic arrays. +* If all but one page of a message are present in collector, and +* the remaining page is received, the pages will be assembled and +* the corresponding message chain deleted. +* +* The maximum number of incomplete messages stored in collector at once +* is fixed and determined by KMaxCollectorMessages in CCbsRecCollector.cpp. +* +* CCbsRecCollector implements a circular list to contain message. +* Each incomplete message occupies a slot in this list. If the list already +* contains KMaxCollectorMessages messages, the next received multipaged +* message will delete all received pages of the oldest message in list. +* +* On receival of a message page, the collector compares network information +* (PLMN, LAC, CellId) of both messages to decide whether pages are of +* the same message. In short, for pages to be of the same message +* their network information have to meet the requirements set by the +* geographical scope of the already collected page. +* See ETSI GSM 03.41 for a detailed description. +* +*/ +class CCbsRecCollector : public CBase + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * + * @param aFactory Message factory instance + * @return New CCbsRecCollector instance + */ + static CCbsRecCollector* NewL( CCbsMessageFactory& aFactory ); + + /** + * Destructor. + */ + virtual ~CCbsRecCollector(); + + public: // New functions + + /** + * Called by the Receiver when a multipaged message is received. + * This method checks for other pages of this message to be + * present in the collector. If all pages are present the + * collector returns a pointer to completed message. + * + * If some pages are still missing, function stores + * the message page and returns NULL. + * + * @param aMessage Multipaged message page + * @return NULL or completed CB message + */ + CCbsMessage* CollectL( CCbsMessage* aMessage, TInt aMessageType ); + + /** + * Deletes all message pages contained in aArray. + * + * @param aArray Message chain. + */ + void DeleteChainL( CMessageBuffer& aArray ) const; + + private: // new functions + + /** + * C++ default constructor. + * + * @param aListener Message factory instance + */ + CCbsRecCollector( CCbsMessageFactory& aFactory ); + + /** + * By default constructor is private. + */ + void ConstructL(); + + /** + * Counts pages in message chain aArray and compares the result + * against the total number of pages in the message. + + * @param aArray Message chain. + * @return ETrue, if the chain contains all pages + * of the message and is ready to be + * merged. + */ + TBool AllPagesPresent( const CMessageBuffer& aArray ) const; + + /** + * Merges all pages in message chain aArray and returns + * a pointer to the resulting assembled message. The pointer + * is also left on the cleanup stack. + * + * @param aArray Message chain + * @return Completed CB message + */ + CCbsMessage* MergePagesLC( CMessageBuffer& aArray ) const; + + /** + * Finds and returns a message chain which already contains pages + * of aMessage's message. If none is found, NULL is returned. + * + * @param aMessage Message page for which a correct chain + * is sought. + * @return NULL or message chain that contains + * aMessage's pages. + */ + CMessageBuffer* FindChainContainingPage( const CCbsMessage& aMessage ) const; + + /** + * Adds message page aMessage to the correct position in message chain + * aArray. Message chains are ordered in ascending page number order. + * Duplicate pages are not accepted. + * + * Ownership of aMessage is transferred to aArray, if the given page + * hasn't been already collected. The given page will be deleted, + * if it already exists in the chain. + * + * @param aMessage Message page, which is inserted into + * the chain. + * @param aArray Message chain. + */ + void AddMessageToChainL( CCbsMessage* aMessage, + CMessageBuffer& aArray ) const; + + /** + * Checks if these pages can be merged. Returns ETrue, if merging is + * acceptable. + * + * Decision is based network information and geographical scope of + * pages. Network information consists of cell id, location area code + * and operator id. + * + * @param aPage1 Message page. + * @param aPage2 Message page. + */ + TBool CheckPageAreaInfoMatch( const CCbsMessage& aPage1, + const CCbsMessage& aPage2 ) const; + + private: // prohibited functions + // Prohibited copy constructor + CCbsRecCollector( const CCbsRecCollector& ); + + // Prohibited assignment operator + CCbsRecCollector& operator=( const CCbsRecCollector& ); + + private: // data + // Contains pointers to buffers, each containing a single partial + // message with 1 or more pages. + CArrayPtrFlat< CMessageBuffer >* iRootNodeArray; + + // An iterator which points to a location in iRootNodeArray next used + // to store a page of a message, which is "new" to the collector. + // Being "new" here means that the collector doesn't contain any + // pages of this message. + TInt iRootNodeIterator; + + // Message factory + CCbsMessageFactory& iFactory; + CArrayPtrFlat< CCbsMessageCleanupTimer >* iMessageCleanupTimerArray; + + }; + +#endif // CCBSRECCOLLECTOR_H + +// End of File