cbs/CbsServer/ServerInc/CCbsRecEtel.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 19 7d48bed6ce0c
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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 CCbsRecEtel class
*
*/


#ifndef     CCBSRECETEL_H
#define     CCBSRECETEL_H


//  INCLUDES
#include "CMcn.h"
#include "MCbsEtelMessaging.h"

		/*****************************************************
		*	Series 60 Customer / ETel
		*	Series 60  ETel API
		*****************************************************/
#include <rmmcustomapi.h>       // SIM topics

// CONSTANTS
		/*****************************************************
		*	Series 60 Customer / TSY
		*	Needs customer TSY implementation
		*****************************************************/

// FORWARD DECLARATIONS
class CCbsEtelFactory;
class CCbsRecEtelMonitor;
class CCbsRecCollector;
class CCbsRecDecoder;
class CCbsRecNetworkListener;
class CCbsRecMessage;
class CCbsReceiverHelper;
class MCbsMcnSubscriptionsProvider;
class CCbsSetFilterSettingHandler;
class CCbsRecWcdmaMessage;
class CCbsMessage;
class CCbsMessageFactory;
class CCbsLivecastHandler;


//  CLASS DECLARATION 

/**
*   CCbsRecEtel sets up the receiver subsystem for receiving CBS messages 
*   from the ETEL server.
*
*   This class creates instances of CCbsRecEtelMonitor to communicate with 
*   ETel server, CCbsRecDecoder to decode message pages and 
*   CCbsRecCollector to combine partial messages together. CCbsRecEtel 
*   sends completed messages to the database via an interface 
*   class CCbsReceiverHelper.
*
*   An instance of CCbsRecNetworkListener is created to monitor network
*   state changes and report them to CCbsRecEtel instance.
*
*   CCbsRecEtel is also responsible for controlling the CBMI list entries 
*   in ME defining Message Identifiers and DCSes that are to be received. 
*
*   CCbsRecEtel instance does not store information on what topics and
*   languages to subscribe. Instead, on call to ApplyStateChangesL(), 
*   subscriptions and other CB settings are retrieved from the database 
*   and passed to EPOC Telephony server.
*
*   Thus, after topic subscriptions, languages or reception status have
*   been modified, a call to ApplyStateChangesL() has to be made in order
*   to actually bring the changes into effect.
*
*   ON SUBSCRIPTION OF TOPICS AND LANGUAGES
*
*   Although EPOC Telephony server can be requested to relay messages of certain topics and
*   languages, there is a couple of things to note.
*
*   1. In order to detect topics broadcasted within the current region, all
*   CB messages have to be received. This is done by subscribing all topics
*   and languages.
*
*   2. Since MCN clients may subscribe any number of topics, topic filtering 
*   has to be made to remove messages not requested by the UI client.
*
*   3. All languages have to be subscribed at all times. This is because
*   TSY limits the number of languages and a single language (e.g., English),
*   may be represented by multiple DCS values. In addition, CBS specification
*   tells that any message in unspecified language has to be received.
*   Thus the only possibility here is to ignore EPOC Telephony server provided facilities
*   to filter languages, and implement filtering in CbsServer. 
*   This is done in CCbsReceiverHelper.
*/
class CCbsRecEtel : public CBase
    {
    public:     // New functions
        
        /**
        *   Creates an instance of the class.
        *
        *   @return A new instance of CCbsRecEtel.
        */
        static CCbsRecEtel* NewL();

        /**
        *   Destructor.
        */
        ~CCbsRecEtel();

        /**
        *   Called by the network listener (instance of CCbsRecEtelMonitor)
        *   to indicate that a new message has been received and must be 
        *   handled.
        *
        *   The message page is decoded, cell information (if present) is 
        *   extracted and routed to MCN clients. Pages of multipaged messages 
        *   are then given to the collector. If the message is completed
        *   (all pages collected) or the message is singlepaged, it is
        *   given onwards to CCbsReceiverHelper.
        *
        *   Note that a multipaged message page is routed to MCN clients 
        *   before it is assembled. This is acceptable because maximum
        *   length of a MCN message is specified to be 20 characters.
        *
        *   Ownership of aMessage transferred to CCbsRecEtel.
        *
        *   @param aMessage A pointer to the message page received.
        */
        void HandleMessageReceivedL( CCbsMessage* aMessage );

        /**
        *   Augments aMessage with current network information (i.e., PLMN, LAC
        *   and Cell ID). Does nothing if the network listener iListener
        *   is unavailable.        
        *
        *   @param aMessage Message page.
        */
        TInt AddNetworkInfo( CCbsMessage& aMessage ) const;
            
        /**
        *   Sets the interface to which all accepted messages are given. 
        *   
        *   @param aInterface A pointer to the receiver interface.
        */
        void SetInterface( CCbsReceiverHelper* aInterface );

        /**
        *   Returns the current and maximum number of subscribed topics.
        *
        *   Topic restrictions are imposed by the TSY in use.
        *
        *   @param aTotal               Total amount of subscribed topics.
        *   @param aMax                 Maximum amount of subscribed topics.
        */
        void GetSubscriptionsLimitsL( TInt& aTotal, TInt& aMax );
        
        /**
        *   MCN client sessions register to CCbsRecEtel using this function.
        *
        *   When topic subscriptions are gathered during execution of
        *   ApplyStateChangesL(), subscriptions of each registered subscription
        *   provider are added to the CBMI list that determines which
        *   topics are received.
        *
        *   @param aProvider            Topic subscription providing instance
        */
        void AddSubscriptionProviderL( 
            MCbsMcnSubscriptionsProvider* aProvider );

        /**
        *   Removes a topic subscription provider.
        *
        *   @param aProvider            Topic subscription providing instance
        */
        void RemoveSubscriptionProviderL( 
            const MCbsMcnSubscriptionsProvider* aProvider );

        /**
        *   Retrieves current subscriptions, languages and settings
        *   from DB. This data is augmented by topic subscription
        *   information retrieved from MCN client(s). Resulting
        *   topic subscriptions, languages and settings will then
        *   be requested from EPOC Telephony server.
        *
        */    
        void ApplyStateChangesL();

        /**
        *   Returns the current cell information.
        *
        *   The information is retrieved from the last cell information
        *   message received.
        *
        *   Result codes:
        *   KErrNone                    Operation successful, aCellInfo 
        *                               contains a valid cell info message
        *   KErrNotFound                Cell information hasn't been received
        *                               yet - aCellInfo is invalid.
        *
        *   @param  aInfoMessage        Current info message
        *   @param  aTopicNumber        Number of the topic that 
        *                               the msg belongs to
        *   @return                     Result code
        */
        TInt GetCurrentMessage( TDes& aInfoMessage, TInt aTopicNumber );

        /**
        *   Loads CB topics from SIM and adds them on the topic list.
        *   A topic is not added on the list if the same topic
        *   already exists on the list. This identification is done
        *   by the number of the topic only. 
        *
        *   The name of an added topic will be taken from SIM.
        *   If no name has been associated with the topic, the string
        *   <qtn_cb_litext_sim_topic> will be given to the topic.
        *
        *   Result codes:
        *   KErrNotSupported            TSY does not support SIM topics.
        *
        *   @return                     Result code.
        */
        TInt LoadSimTopicsL();

        /**
        *   Deletes a CB topic matching the given topic number from SIM.
        *
        *   Leaves if the operation is unsuccessful.
        *   
        *   @param aNumber              Number of topic to be deleted from SIM.
        *   @param aDeleteAll           Are we deleting all SIM topics, ETrue/EFalse
        */
        void DeleteSimTopicL( const TUint16 aNumber, const TBool aDeleteAll );
        
        /**
        *   Deletes all topics from the SIM card.
        *
        *   Leaves if the operation is unsuccessful.
        *           
        */
        void DeleteAllSimTopicsL();

        /**
        *   Passes the given CB message to each registered subscriptions
        *   provider (a subscription provider is a MCN client wishing
        *   CB message routing service).
        *
        *   @param  aMessage                CB message
        */
        void RouteMessageL( const CCbsMessage& aMessage );

        /**
        *   Returns the message collector reference.
        *
        *   @return                     Collector reference
        */
        CCbsRecCollector& Collector();
        
        /**
        *   Returns the receiver helper reference.
        *
        *   @return                     Receiver helper reference
        */
        CCbsReceiverHelper& Interface() const;

   private:
        
        /**
        *   Constructor.
        */
        CCbsRecEtel();

        /**
        *   Finalizes the construction.
        */
        void ConstructL();

        /**
        *   Establishes a connection with the EPOC Telephony server.
        *
        *   Also opens the necessary EPOC Telephony server resources such as RMobilePhone and
        *   RMobileBroadcastMessaging sessions.
        */
        void ConnectToEtelL();
        
        /**
        *   Sets the given CB reception mode on ME.
        *
        *   @param aSetting         CB receive mode
        */
        void SetReceptionStatusL( 
            RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter aSetting );

        /**
        *   Returns the total number of topic subscriptions made by
        *   MCN clients registered to the server.
        *
        *   @return                     Number of subscriptions by
        *                               MCN clients.
        */
        TUint NumberOfMcnSubscriptions() const;

        /**
        *   Copies cell information message body into an internal
        *   cache. This way MCN clients can be provided the current
        *   cell information message even without message routing service.
        *
        *   The given message is assumed to be a valid cell information
        *   message (CB message of topic 050).
        *
        *   @param  aMessage                Cell information message
        */
        void ExtractCellInformation( const CCbsMessage& aMessage );

        /**
        *   Copies cell information message body into an internal
        *   cache. This way MCN clients can be provided the current
        *   HomeZone message even without message routing service.
        *
        *   The given message is assumed to be a valid HomeZone
        *   message (CB message of topic 221).
        *
        *   @param  aMessage                Cell information message
        */
        void ExtractHomeZoneInformation( const CCbsMessage& aMessage );

        /**
        *   Checks if the time of the day is such that the user does
        *   not want to receive any messages.
        *
        *   @param  aMessage                CB message
        *   @return                         ETrue if the message should
        *                                   be recived, otherwise EFalse.
        */
        TBool CheckTimeL( const CCbsMessage* aMessage );
                
    private:    // Data

        // Own: Collector, which is responsible for combining multipaged
        // messages.        
        CCbsRecCollector* iCollector;
        
        // Own: responsible for converting 7-bit and 8-bit representations 
        // into UCS-2.
        CCbsRecDecoder* iDecoder;

        // Current reception status. This is a cached version of 
        // a variable stored in ME/SIM.
        RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter iReception;

        // Ref: interface to the server. 
        CCbsReceiverHelper* iInterface;
        
        // Own: SMS messaging object for receiving CBS message pages 
        // from the EPOC Telephony server.
        MCbsEtelMessaging* iMessaging;

        // Own: ETel monitor receives the message pages and forwards them to
        // CCbsRecEtel.
        CCbsRecEtelMonitor* iEtelMonitor;

        // Own: Filter setting handler processes asynchronous 
        // Set Filter Setting command.
        CCbsSetFilterSettingHandler* iFilterSettingHandler;   

        // EPOC Telephony server session.
        RTelServer iEtelServer;

        // Represents the GSM phone used for messaging and network information
        // retrieving.

		/*****************************************************
		*	Series 60 Customer / ETel
		*	Series 60  ETel API
		*****************************************************/
        RMobilePhone iGsmPhone;

        // Custom API is used for SIM Topic handling.

		/*****************************************************
		*	Series 60 Customer / ETel
		*	Series 60  ETel API
		*****************************************************/
        RMmCustomAPI iCustomPhone;

        // Own: active object which listens to changes in network state
        // and reports them to CCbsRecEtel instance.
        CCbsRecNetworkListener* iNetworkListener;

        // Own: set of MCN sessions that provide their topic subscriptions and
        // get cell information routing services
        CArrayFixFlat< MCbsMcnSubscriptionsProvider* >* iSubscriptionProviders;

        // ETrue if a cell information message has been received.
        TBool iCellInfoReceived;
        
        // Current reception status. This is a cached version of 
        // a variable stored in ME.       
        TBool iReceptionEnabled;

        // Current cell information message.
        TMcnMessage iCurrentCellInfoMessage;

        // Has the user set a time to limit the reception
        TBool iLimitedReception;

        // The current time
        TTime iNow;
        TDateTime iDateTimeNow;

        // Start and end times of limited reception
        TTime iStartTime;
        TTime iEndTime;

        // Cell info cache variables
        RMobilePhone::TMobilePhoneNetworkInfoV1 iCellInfoPLMN;
        TUint iCellInfoLAC;
        TUint iCellInfoCellId;

        // ETrue if HomeZone message has been received
        TBool iHomeZoneReceived;

        // HomeZone cache variables
        RMobilePhone::TMobilePhoneNetworkInfoV1 iHomeZonePLMN;
        TUint iHomeZoneLAC;
        TUint iHomeZoneCellId;

        // Current HomeZone message
        TMcnMessage iCurrentHomeZoneMessage;

        // Message factory
        CCbsMessageFactory* iFactory;

        // LC message handler
        CCbsLivecastHandler* iLivecastHandler;

        // Local variation bits, fetched from CenRep
        TInt iLVBits;
                
        // Indication of new SIM Topics
        TBool iNewSimTopicsAdded;
        
        __DECLARE_TEST;
    };

#endif      //  CCBSRECETEL_H   
            
// End of File