cbs/cbsserver/ServerInc/CCbsRecCollector.h
author hgs
Fri, 06 Aug 2010 13:08:23 +0300
changeset 36 7c428525956b
parent 33 8d5d7fcf9b59
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  This file contains the header file of the CCbsRecCollector class.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#ifndef CCBSRECCOLLECTOR_H
hgs
parents:
diff changeset
    20
#define CCBSRECCOLLECTOR_H
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
// INCLUDES
hgs
parents:
diff changeset
    23
#include <e32base.h>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// FORWARD DECLARATIONS
hgs
parents:
diff changeset
    26
class TCbsMessageCompletion;
hgs
parents:
diff changeset
    27
class CCbsRecMessage;
hgs
parents:
diff changeset
    28
class CCbsMessage;
hgs
parents:
diff changeset
    29
class CCbsMessageFactory;
hgs
parents:
diff changeset
    30
class CCbsMessageCleanupTimer;
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// DATA TYPES
hgs
parents:
diff changeset
    33
// Dynamic array that contains collected message pages
hgs
parents:
diff changeset
    34
typedef CArrayPtrFlat<CCbsMessage> CMessageBuffer;
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
// CLASS DECLARATION
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
/**
hgs
parents:
diff changeset
    40
*   This class represents a collector, which stores pages of multipaged 
hgs
parents:
diff changeset
    41
*   messages. Complete messages are assembled and returned back to 
hgs
parents:
diff changeset
    42
*   the caller of CollectL() method.
hgs
parents:
diff changeset
    43
*  
hgs
parents:
diff changeset
    44
*   CCbsRecCollector stores message pages in a number of dynamic arrays.
hgs
parents:
diff changeset
    45
*   If all but one page of a message are present in collector, and
hgs
parents:
diff changeset
    46
*   the remaining page is received, the pages will be assembled and
hgs
parents:
diff changeset
    47
*   the corresponding message chain deleted.
hgs
parents:
diff changeset
    48
*
hgs
parents:
diff changeset
    49
*   The maximum number of incomplete messages stored in collector at once
hgs
parents:
diff changeset
    50
*   is fixed and determined by KMaxCollectorMessages in CCbsRecCollector.cpp.
hgs
parents:
diff changeset
    51
*
hgs
parents:
diff changeset
    52
*   CCbsRecCollector implements a circular list to contain message.
hgs
parents:
diff changeset
    53
*   Each incomplete message occupies a slot in this list. If the list already
hgs
parents:
diff changeset
    54
*   contains KMaxCollectorMessages messages, the next received multipaged
hgs
parents:
diff changeset
    55
*   message will delete all received pages of the oldest message in list.
hgs
parents:
diff changeset
    56
*
hgs
parents:
diff changeset
    57
*   On receival of a message page, the collector compares network information
hgs
parents:
diff changeset
    58
*   (PLMN, LAC, CellId) of both messages to decide whether pages are of
hgs
parents:
diff changeset
    59
*   the same message. In short, for pages to be of the same message
hgs
parents:
diff changeset
    60
*   their network information have to meet the requirements set by the 
hgs
parents:
diff changeset
    61
*   geographical scope of the already collected page.
hgs
parents:
diff changeset
    62
*   See ETSI GSM 03.41 for a detailed description. 
hgs
parents:
diff changeset
    63
*   
hgs
parents:
diff changeset
    64
*/
hgs
parents:
diff changeset
    65
class CCbsRecCollector : public CBase
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
    public:  // Constructors and destructor
hgs
parents:
diff changeset
    68
        
hgs
parents:
diff changeset
    69
        /**
hgs
parents:
diff changeset
    70
        *   Two-phased constructor.
hgs
parents:
diff changeset
    71
        *
hgs
parents:
diff changeset
    72
        *   @param  aFactory            Message factory instance
hgs
parents:
diff changeset
    73
        *   @return                     New CCbsRecCollector instance
hgs
parents:
diff changeset
    74
        */
hgs
parents:
diff changeset
    75
         static CCbsRecCollector* NewL( CCbsMessageFactory& aFactory );
hgs
parents:
diff changeset
    76
        
hgs
parents:
diff changeset
    77
        /**
hgs
parents:
diff changeset
    78
        *   Destructor.
hgs
parents:
diff changeset
    79
        */
hgs
parents:
diff changeset
    80
        virtual ~CCbsRecCollector();
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    public: // New functions
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
        /**
hgs
parents:
diff changeset
    85
        *   Called by the Receiver when a multipaged message is received.
hgs
parents:
diff changeset
    86
        *   This method checks for other pages of this message to be
hgs
parents:
diff changeset
    87
        *   present in the collector. If all pages are present the
hgs
parents:
diff changeset
    88
        *   collector returns a pointer to completed message.
hgs
parents:
diff changeset
    89
        *
hgs
parents:
diff changeset
    90
        *   If some pages are still missing, function stores 
hgs
parents:
diff changeset
    91
        *   the message page and returns NULL.
hgs
parents:
diff changeset
    92
        *
hgs
parents:
diff changeset
    93
        *   @param aMessage             Multipaged message page
hgs
parents:
diff changeset
    94
        *   @return                     NULL or completed CB message
hgs
parents:
diff changeset
    95
        */
hgs
parents:
diff changeset
    96
        CCbsMessage* CollectL( CCbsMessage* aMessage, TInt aMessageType );
hgs
parents:
diff changeset
    97
 
hgs
parents:
diff changeset
    98
        /**
hgs
parents:
diff changeset
    99
        *   Deletes all message pages contained in aArray.
hgs
parents:
diff changeset
   100
        *
hgs
parents:
diff changeset
   101
        *   @param aArray               Message chain.
hgs
parents:
diff changeset
   102
        */
hgs
parents:
diff changeset
   103
        void DeleteChainL( CMessageBuffer& aArray ) const; 
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
    private:    // new functions
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
        /**
hgs
parents:
diff changeset
   108
        *   C++ default constructor.
hgs
parents:
diff changeset
   109
        *
hgs
parents:
diff changeset
   110
        *   @param aListener            Message factory instance
hgs
parents:
diff changeset
   111
        */
hgs
parents:
diff changeset
   112
        CCbsRecCollector( CCbsMessageFactory& aFactory  );
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
        /**
hgs
parents:
diff changeset
   115
        *   By default constructor is private.
hgs
parents:
diff changeset
   116
        */
hgs
parents:
diff changeset
   117
        void ConstructL();
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
        /**
hgs
parents:
diff changeset
   120
        *   Counts pages in message chain aArray and compares the result
hgs
parents:
diff changeset
   121
        *   against the total number of pages in the message.
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
        *   @param  aArray              Message chain.
hgs
parents:
diff changeset
   124
        *   @return                     ETrue, if the chain contains all pages
hgs
parents:
diff changeset
   125
        *                               of the message and is ready to be 
hgs
parents:
diff changeset
   126
        *                               merged.
hgs
parents:
diff changeset
   127
        */
hgs
parents:
diff changeset
   128
        TBool AllPagesPresent( const CMessageBuffer& aArray ) const;
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
        /**
hgs
parents:
diff changeset
   131
        *   Merges all pages in message chain aArray and returns
hgs
parents:
diff changeset
   132
        *   a pointer to the resulting assembled message. The pointer
hgs
parents:
diff changeset
   133
        *   is also left on the cleanup stack.
hgs
parents:
diff changeset
   134
        *
hgs
parents:
diff changeset
   135
        *   @param aArray               Message chain
hgs
parents:
diff changeset
   136
        *   @return                     Completed CB message
hgs
parents:
diff changeset
   137
        */
hgs
parents:
diff changeset
   138
        CCbsMessage* MergePagesLC( CMessageBuffer& aArray ) const;
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
        /**
hgs
parents:
diff changeset
   141
        *   Finds and returns a message chain which already contains pages
hgs
parents:
diff changeset
   142
        *   of aMessage's message. If none is found, NULL is returned.
hgs
parents:
diff changeset
   143
        *
hgs
parents:
diff changeset
   144
        *   @param aMessage             Message page for which a correct chain
hgs
parents:
diff changeset
   145
        *                               is sought.
hgs
parents:
diff changeset
   146
        *   @return                     NULL or message chain that contains
hgs
parents:
diff changeset
   147
        *                               aMessage's pages.
hgs
parents:
diff changeset
   148
        */
hgs
parents:
diff changeset
   149
        CMessageBuffer* FindChainContainingPage( const CCbsMessage& aMessage ) const;
hgs
parents:
diff changeset
   150
        
hgs
parents:
diff changeset
   151
        /**
hgs
parents:
diff changeset
   152
        *   Adds message page aMessage to the correct position in message chain
hgs
parents:
diff changeset
   153
        *   aArray. Message chains are ordered in ascending page number order.
hgs
parents:
diff changeset
   154
        *   Duplicate pages are not accepted.
hgs
parents:
diff changeset
   155
        *
hgs
parents:
diff changeset
   156
        *   Ownership of aMessage is transferred to aArray, if the given page
hgs
parents:
diff changeset
   157
        *   hasn't been already collected. The given page will be deleted,
hgs
parents:
diff changeset
   158
        *   if it already exists in the chain.
hgs
parents:
diff changeset
   159
        *
hgs
parents:
diff changeset
   160
        *   @param aMessage             Message page, which is inserted into 
hgs
parents:
diff changeset
   161
        *                               the chain.
hgs
parents:
diff changeset
   162
        *   @param aArray               Message chain.
hgs
parents:
diff changeset
   163
        */
hgs
parents:
diff changeset
   164
        void AddMessageToChainL( CCbsMessage* aMessage, 
hgs
parents:
diff changeset
   165
            CMessageBuffer& aArray ) const;
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
        /**
hgs
parents:
diff changeset
   168
        *   Checks if these pages can be merged. Returns ETrue, if merging is
hgs
parents:
diff changeset
   169
        *   acceptable.
hgs
parents:
diff changeset
   170
        *
hgs
parents:
diff changeset
   171
        *   Decision is based network information and geographical scope of 
hgs
parents:
diff changeset
   172
        *   pages. Network information consists of cell id, location area code
hgs
parents:
diff changeset
   173
        *   and operator id.
hgs
parents:
diff changeset
   174
        *
hgs
parents:
diff changeset
   175
        *   @param aPage1               Message page.
hgs
parents:
diff changeset
   176
        *   @param aPage2               Message page.
hgs
parents:
diff changeset
   177
        */
hgs
parents:
diff changeset
   178
        TBool CheckPageAreaInfoMatch( const CCbsMessage& aPage1, 
hgs
parents:
diff changeset
   179
            const CCbsMessage& aPage2 ) const;
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
    private:    // prohibited functions
hgs
parents:
diff changeset
   182
        // Prohibited copy constructor
hgs
parents:
diff changeset
   183
        CCbsRecCollector( const CCbsRecCollector& );
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
        // Prohibited assignment operator
hgs
parents:
diff changeset
   186
        CCbsRecCollector& operator=( const CCbsRecCollector& );
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
    private:    // data
hgs
parents:
diff changeset
   189
        // Contains pointers to buffers, each containing a single partial
hgs
parents:
diff changeset
   190
        // message with 1 or more pages. 
hgs
parents:
diff changeset
   191
        CArrayPtrFlat< CMessageBuffer >* iRootNodeArray;
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
        // An iterator which points to a location in iRootNodeArray next used
hgs
parents:
diff changeset
   194
        // to store a page of a message, which is "new" to the collector.
hgs
parents:
diff changeset
   195
        // Being "new" here means that the collector doesn't contain any
hgs
parents:
diff changeset
   196
        // pages of this message.
hgs
parents:
diff changeset
   197
        TInt iRootNodeIterator;
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
        // Message factory
hgs
parents:
diff changeset
   200
        CCbsMessageFactory& iFactory;
hgs
parents:
diff changeset
   201
		CArrayPtrFlat< CCbsMessageCleanupTimer >*	iMessageCleanupTimerArray;
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    };
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
#endif      // CCBSRECCOLLECTOR_H
hgs
parents:
diff changeset
   206
            
hgs
parents:
diff changeset
   207
// End of File