cbs/CbsServer/ServerSrc/CCbsReceiverHelper.cpp
changeset 46 2fa1fa551b0b
parent 42 35488577e233
child 48 78df25012fda
--- a/cbs/CbsServer/ServerSrc/CCbsReceiverHelper.cpp	Mon Aug 23 15:50:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,905 +0,0 @@
-/*
-* Copyright (c) 2003-2009 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 module contains the implementation of CCbsReceiverHelper class
-*                member functions.
-*
-*                CCbsReceiverHelper gets the messages from the receiver and
-*                sends them to the database. All received messages are
-*                sent to CCbsReceiverHelper instance by CCbsRecEtel.
-*                This class makes subscription and existence checks
-*                to these messages and also implements topic detection feature.
-*
-*/
-
-
-// INCLUDE FILES
-#include <barsc.h>              // Resource access
-#include <barsread.h>           // Resource access
-
-#include <CbsServer.rsg>
-
-#include "CbsCommon.h"
-#include "CbsUtils.h"
-#include "CbsServerPanic.h"
-#include "CCbsServer.h"
-#include "CCbsReceiverHelper.h"
-#include "CCbsDbImp.H"
-#include "CCbsDbImpSettings.H"
-#include "CCbsDbImpTopicList.h"
-#include "CCbsDbImpTopicMessages.h"
-#include "CCbsDbImpTopicCollection.h"
-#include "CCbsRecMessage.h"
-#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
-#include <viewcli.h>            // View server access
-#else
-#include <viewclipartner.h>
-#endif
-#include <AknNotifyStd.h>       // ECellBroadcastNotification
-#include <AknSoftNotifier.h>    // Soft Notification API
-#include <e32property.h>
-#include <coreapplicationuisdomainpskeys.h>
-// <-- QT PHONE START -->
-//#include <NcnListDomainPSKeys.h> 
-// <-- QT PHONE END -->
-
-#include <data_caging_path_literals.hrh>
-#include "CbsLogger.h"
-
-#include <centralrepository.h>  // for local variation
-#include "cbsinternalcrkeys.h"  // for local variation
-#include "cbsvariant.hrh"       // for local variation
-
-// CONSTANTS
-
-// UID of CBS UI application
-#define KUidCbsUiappDef 0x101F4CD3
-const TUid KUidCbsUiappApp = { KUidCbsUiappDef };
-
-const TInt KCbsImmediateMessageIdInt = 313;
-const TUid KCbsImmediateMessageId = { KCbsImmediateMessageIdInt };
-// <-- QT PHONE START -->
-//const TInt KCbsMessageTone  = 2; // See SharedDataKeysVariant.h or NcnListInternalPSKeys.h
-// <-- QT PHONE END -->
-// DATA TYPES
-// CbsUi application view ID's
-enum TCbsUiViewIds
-    {
-    ECbsUiTopicViewId = 1,
-    ECbsUiTopicListViewId,
-    ECbsUiListAppColumnViewId,
-    ECbsUiMsgViewId,            //message view id
-    ECbsUiAddFromIndexViewId,
-    ECbsUiSettingsViewId
-    };
-
-// These values specify a range of accepted topic number values (inclusive).
-const TUint KMinTopicNumber = 1;     // 000 is not accepted.
-const TUint KMaxTopicNumber = 999;
-
-// LOCAL FUNCTION PROTOTYPES
-LOCAL_C void ParseMessageFormatL(
-    TLex& aLex, CCbsDbImpTopicCollection& aCollection );
-LOCAL_C void ParseIndexElementIntroL(
-    TLex& aLex, CCbsDbImpTopicCollection& aCollection );
-LOCAL_C void ParseServiceIntroL(
-    TLex& aLex, CCbsDbImpTopicCollection& aCollection );
-LOCAL_C void ParseMessageIdL(
-    TLex& aLex, TUint& aMessageId );
-LOCAL_C void ParseSubIndexIntroL(
-    TLex& aLex );
-LOCAL_C void ParseSubIndexIdL(
-    TLex& aLex );
-LOCAL_C void ParseNameCharactersCrLfL(
-    TLex& aLex, TPtrC& aName );
-
-// ==================== LOCAL FUNCTIONS ====================
-
-// -----------------------------------------------------------------------------
-// ParseMessageFormatL
-// Parses an index message.
-// Returns: None
-// -----------------------------------------------------------------------------
-//
-LOCAL_C void ParseMessageFormatL(
-    TLex& aLex,
-    CCbsDbImpTopicCollection& aCollection )
-    {
-    TInt identitiesCount( 0 );
-    while ( !aLex.Eos() )
-        {
-        ParseIndexElementIntroL( aLex, aCollection );
-        identitiesCount++;
-        }
-
-    if ( identitiesCount == 0 )
-        {
-        User::Leave( KErrCorrupt );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// ParseIndexElementIntroL
-// Parses part of an index message.
-// Returns: None
-// -----------------------------------------------------------------------------
-//
-LOCAL_C void ParseIndexElementIntroL(
-    TLex& aLex,
-    CCbsDbImpTopicCollection& aCollection )
-    {
-    TBool hasSubIndexId( EFalse );
-
-    // subindex-id (optional for service-intro)
-    if ( aLex.Peek().IsAlpha() )
-        {
-        hasSubIndexId = ETrue;
-        ParseSubIndexIdL( aLex );
-        }
-
-    // subindex-intro | service-intro
-    // We'll take a peek to discover, which one
-    if ( hasSubIndexId && aLex.Peek() == EKeySpace )
-        {
-        ParseSubIndexIntroL( aLex );
-        }
-    else
-        {
-        ParseServiceIntroL( aLex, aCollection );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// ParseServiceIntroL
-// Parses part of an index message.
-// Returns: None
-// -----------------------------------------------------------------------------
-//
-LOCAL_C void ParseServiceIntroL(
-    TLex& aLex,
-    CCbsDbImpTopicCollection& aCollection )
-    {
-    // We'll store the results here
-    TCbsDbTopicIdentity identity;
-
-    // message-id
-    TUint messageId;
-    ParseMessageIdL( aLex, messageId );
-    identity.iNumber = TUint16( messageId );
-
-    // delimeter
-    TChar delimeter( aLex.Get() );
-    if ( delimeter != ' ' && delimeter != '.' )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    // service-name
-    TPtrC serviceName;
-    ParseNameCharactersCrLfL( aLex, serviceName );
-    // drop crlf
-    serviceName.Set( serviceName.Left( serviceName.Length()-2 ) );
-
-    // If the delimeter is ' ', store the identity. Otherwise
-    // it only refers to a subindex page, so we skip it
-    if ( delimeter == ' ' )
-        {
-        // Copy max. KCbsDbTopicNameLength characters
-        identity.iName = serviceName.Left( KCbsDbTopicNameLength );
-        // Store the topic identity into the database
-        aCollection.AddTopicIdentityL( identity );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// ParseMessageIdL
-// Parses part of an index message.
-// Returns: None
-// -----------------------------------------------------------------------------
-//
-LOCAL_C void ParseMessageIdL(
-    TLex& aLex,
-    TUint& aMessageId )
-    {
-    if ( aLex.Val( aMessageId ) != KErrNone
-        || aMessageId < KMinTopicNumber
-        || aMessageId > KMaxTopicNumber )
-        {
-        User::Leave( KErrCorrupt );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// ParseSubIndexIntroL
-// Parses part of an index message.
-// subindex-intro = " " subindex-name crlf
-// subindex-name  = name-character+
-// Returns: None
-// -----------------------------------------------------------------------------
-//
-LOCAL_C void ParseSubIndexIntroL(
-    TLex& aLex )
-    {
-    if ( aLex.Get() != EKeySpace )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    // subindex-name crlf
-    TPtrC subIndexName;
-    ParseNameCharactersCrLfL( aLex, subIndexName );
-    }
-
-// -----------------------------------------------------------------------------
-// ParseSubIndexIdL
-// Parses part of an index message.
-// subindex-id = subindex-character+
-// Returns: None
-// -----------------------------------------------------------------------------
-//
-LOCAL_C void ParseSubIndexIdL(
-    TLex& aLex )
-    {
-    // check that there is at least one subindex-character
-    if ( !aLex.Peek().IsAlpha() )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    // subindex-id
-    while ( aLex.Peek().IsAlpha() )
-        {
-        aLex.Inc();
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// ParseNameCharactersCrLfL
-// Parses part of an index message.
-// name-character+ crlf
-// Returns: None
-// -----------------------------------------------------------------------------
-//
-LOCAL_C void ParseNameCharactersCrLfL(
-    TLex& aLex,
-    TPtrC& aName )
-    {
-    aLex.Mark();
-
-    // check that we have at least one name-character
-    TChar currCharacter( aLex.Get() );
-    if( currCharacter == EKeyLineFeed
-        || currCharacter == EKeyEnter
-        || currCharacter == 0 )
-        {
-        User::Leave( KErrCorrupt );
-        }
-
-    // scan until LF or EOS
-    while( currCharacter != EKeyLineFeed && currCharacter != 0 )
-        {
-        currCharacter = aLex.Get();
-        }
-
-    // CR-LF is ok, EOS is not
-    if( currCharacter == EKeyLineFeed )
-        {
-        aName.Set( aLex.MarkedToken() );
-        }
-    else
-        {
-        User::Leave( KErrCorrupt );
-        }
-    }
-
-// ================= MEMBER FUNCTIONS =======================
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::CCbsReceiverHelper
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CCbsReceiverHelper::CCbsReceiverHelper(
-    CCbsDbImp& aDatabase )
-    : iDatabase( aDatabase )
-    {
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::ConstructL()
-    {
-    CBSLOGSTRING("CBSSERVER: >>> CCbsReceiverHelper::ConstructL()");
-
-    iVwsSession = CVwsSessionWrapper::NewL();
-
-    // Array for SIM Topic numbers. This way we know which topics
-    // to delete also from the SIM card (when deleting all topics).
-    iSimTopics = new ( ELeave ) CArrayFixFlat<TInt>( 1 );
-    
-    // Fetch local variation bits from CenRep    
-    CRepository* repository = CRepository::NewL( KCRUidCbsVariation );    
-    TInt err = repository->Get( KCbsVariationFlags, iLVBits );
-    if ( err )
-        {
-        iLVBits = 0;
-        }  
-    CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::ConstructL(): CenRep error: %d", err );
-    delete repository;
-
-    CBSLOGSTRING("CBSSERVER: <<< CCbsReceiverHelper::ConstructL()");
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CCbsReceiverHelper* CCbsReceiverHelper::NewL(
-    CCbsDbImp& aDatabase )
-    {
-    // Normal two phase construction.
-    CCbsReceiverHelper* self = new ( ELeave ) CCbsReceiverHelper( aDatabase );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    return self;
-    }
-
-// Destructor
-CCbsReceiverHelper::~CCbsReceiverHelper()
-    {
-    CBSLOGSTRING("CBSSERVER: >>> CCbsReceiverHelper::~CCbsReceiverHelper()");
-
-    delete iSimTopics;
-    delete iVwsSession;
-
-    CBSLOGSTRING("CBSSERVER: <<< CCbsReceiverHelper::~CCbsReceiverHelper()");
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::CCbsReceiverHelper
-// Processes a message received by the receiver.
-//
-// This function is called when a message is received.
-//
-// Assumptions;
-// 1.  The message doesn't have it's permanent or read
-//     flags raised - method leaves with KErrNotSupported
-//     if this is the case.
-// 2.  If an index message (root or subindex) is passed as
-//     a parameter, the language indication prefix, if any,
-//     has been removed before HandleReceivedMessageL() is called.
-//
-// Assumption (2) holds because language indications are removed
-// by Receiver module in an instance of CCbsRecDecoder.
-// Message may not be accepted if it is somehow invalid
-// or the reception has been disabled.
-// This function also handles the detection of new topics
-// and the processing of an index message.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::HandleReceivedMessageL(
-    CCbsMessage& aMessage )
-    {
-    CBSLOGSTRING("CBSSERVER: >>> CCbsReceiverHelper::HandleReceivedMessageL()");
-
-    if ( aMessage.IsIndexMessage() )
-        {
-        CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): Index msg.");
-
-        // It is assumed that a language indication prefix,
-        // if any, has already been removed from the message.
-        aMessage.RemoveIndexHeaderL();
-
-        TBool isChildSubindex( aMessage.IsChildSubindex() );
-
-        // Parse the index message
-        HandleIndexMessageL( aMessage.Contents(), isChildSubindex );
-
-        // Child subindex messages won't be displayed to the user.
-        if ( isChildSubindex )
-            {
-            return;
-            }
-        }
-
-    TUint16 topicNumber( aMessage.TopicNumber() );
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): topic number: %d.", topicNumber );
-
-    TCbsDbTopic topic;
-    iDatabase.TopicListL().FindTopicByNumberL( topicNumber, topic );
-    CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): iDatabase.TopicListL().FindTopicByNumberL(..) called OK." );
-
-    // If subscribed, handle the message
-    if ( topic.iSubscribed )
-        {
-        CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): Topic subscribed, processing." );
-
-        // Create and initialize message
-        TCbsDbMessage message;
-
-        TTime now;
-        now.UniversalTime();
-        message.iDateTime = now.Int64();
-        message.iKey = aMessage.Key();
-        message.iLanguage = aMessage.Language();
-        message.iLength = aMessage.Contents().Length();
-        message.iPermanent = EFalse;
-        message.iRead = EFalse;
-        TPtrC ptr( aMessage.Contents() );
-
-        iDatabase.TopicMessagesL().AddMessageL( topicNumber, message, ptr );
-        CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): Msg added OK." );
-
-        if ( aMessage.RequiresImmediateDisplay() )
-            {
-            CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): Calling LaunchMessageImmediateDisplay()... " );
-
-            // If the operator indicates that this message must be displayed
-            // immediately, request a view switch of CBS UI application.
-            LaunchMessageImmediateDisplay( message );
-
-            CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): LaunchMessageImmediateDisplay() called OK." );
-            }
-        else if ( topic.iHotmarked )
-            {
-            // The message is of a hotmarked topic => Show a soft notification.
-            CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): Calling LaunchMessageSoftNotification()... " );
-            LaunchMessageSoftNotificationL( ETrue );
-            CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): LaunchMessageSoftNotification() called OK." );
-            }
-        } // if ( topic.iSubscribed )
-    else
-        {
-        CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::HandleReceivedMessageL(): Topic NOT subscribed, msg not processed." );
-        }
-
-    CBSLOGSTRING("CBSSERVER: <<< CCbsReceiverHelper::HandleReceivedMessageL()");
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::CheckForNewTopicL
-// Checks if aMessage's topic is in the topic list.
-//
-// If the topic detection is enabled and the topic of this
-// message is not in the topic list, the topic is added
-// to the list. The method will then return ETrue.
-// Otherwise EFalse is returned.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CCbsReceiverHelper::CheckForNewTopicL(
-    const CCbsMessage& aMessage )
-    {
-    // Check if the topic detection is on and if so, add topic if the topic
-    // is a new topic.
-    TBool detection;
-    TBool result( EFalse );
-
-    iDatabase.SettingsL().GetTopicDetectionStatus( detection );
-
-    if ( detection && HandleTopicDetectedL( aMessage.TopicNumber() ) )
-        {
-        // If a new topic added, we do not send the message to
-        // the database so return ETrue.
-        result = ETrue;
-        }
-    else
-        {
-        // Topic detection disabled or topic already in the database
-        result = EFalse;
-        }
-
-    return result;
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::CheckForSubscriptionAndExistenceL
-// Checks if the topic of this message is listed and subscribed.
-// Returns ETrue only if the message does not exist in the
-// database and the message's topic is subscribed.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CCbsReceiverHelper::CheckForSubscriptionAndExistenceL(
-    const CCbsMessage& aMessage )
-    {
-    // Check if the message belongs to some subscribed topic.
-    TCbsDbTopic topic;
-    TUint16 topicNumber( 0 );
-
-    // Index messages are stored in topic 0.
-    if ( !aMessage.IsIndexMessage() )
-        {
-        topicNumber = aMessage.TopicNumber();
-        }
-
-    TRAPD( errorCode, iDatabase.TopicListL().FindTopicByNumberL( topicNumber, topic ) );
-
-    if ( errorCode == KErrNotFound )
-        {
-        return EFalse;
-        }
-    User::LeaveIfError( errorCode );
-
-    return topic.iSubscribed;
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::LanguageOfMessageSubscribedL
-// Checks if aMessage's language has been subscribed by the user.
-// ETrue is returned either if the language specified has been
-// subscribed, message language is "Other" or the user has
-// prefers to receive messages of all languages.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CCbsReceiverHelper::LanguageOfMessageSubscribedL(
-    const CCbsMessage& aMessage )
-    {
-    CBSLOGSTRING("CBSSERVER: >>> CCbsReceiverHelper::LanguageOfMessageSubscribedL" );
-
-    TCbsDbLanguages languages;
-    iDatabase.SettingsL().GetLanguages( languages );
-
-    if ( aMessage.Language() < 0 || aMessage.Language() >= ECbsCount )
-        {
-        return EFalse;
-        }
-
-    TCbsDbLanguage language( aMessage.Language() );
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::LanguageOfMessageSubscribedL: language: %d.", language );
-
-    TBool subscribed( languages.iLanguages[ECbsAll] ||
-        languages.iLanguages[ECbsOther] && language == ECbsOther ||
-        !languages.iLanguages[ECbsOther] && languages.iLanguages[language] );
-
-    CBSLOGSTRING2("CBSSERVER: <<< CCbsReceiverHelper::LanguageOfMessageSubscribedL, returning %d.", subscribed );
-    return subscribed;
-    }
-
-// ---------------------------------------------------------
-// AddSimTopicL()
-//
-// Adds the given topic (aNumber, aName) into the DB.
-// ---------------------------------------------------------
-void CCbsReceiverHelper::AddSimTopicL( 
-    const TUint aNumber,
-    const TDesC& aName )
-    {
-    CBSLOGSTRING("CBSSERVER: >>> CCbsReceiverHelper::AddSimTopicL()");
-
-    TCbsDbTopic topic;
-    if ( aName == KNullDesC )       // Topic name not given, use "SIM topics".
-        {
-        // Establish file server session.
-        RFs fs;
-        User::LeaveIfError( fs.Connect() );
-        CleanupClosePushL( fs );
-
-        // Open localized resource file.
-        RResourceFile resourceFile;
-        CbsUtils::FindAndOpenDefaultResourceFileLC(
-            fs, resourceFile ); // on CS
-
-        // Read "SIM topic"-string.
-        TResourceReader reader;
-        reader.SetBuffer( resourceFile.AllocReadLC(
-            R_TEXT_SIM_TOPIC ) ); // on CS
-
-        HBufC* text = reader.ReadHBufCL();
-        topic.iName = *text;
-        CleanupStack::PopAndDestroy(3);  // fs, resourceFile, readerBuf
-
-        CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::AddSimTopicL(): Topic name read from resources.");
-        }
-    else // Use the given topic name.
-        {
-        topic.iName = aName;
-        }
-
-    topic.iNumber = TUint16( aNumber );
-    topic.iHotmarked = EFalse;
-    topic.iProtected = EFalse;
-    
-    // Variated feature    
-    if ( iLVBits & KCbsLVFlagTopicSubscription )
-        {
-        topic.iSubscribed = ETrue;
-        }
-    else
-        {
-        topic.iSubscribed = EFalse;
-        }
-
-    // Leaves, if the topic already exists, so we trap that
-    // error. All other errors are passed as a normal leave.
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::AddSimTopicL(): Topic %d from SIM to topic list...", topic.iNumber );
-    // Try to add topic to topic list, topic not detected automatically
-    TRAPD( err, iDatabase.TopicListL().AddTopicL( topic, EFalse ) );
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::AddSimTopicL(): AddTopicL() TRAPped error: %d.", err );
-
-    if( err != KErrAlreadyExists && err != KErrArgument )
-        {
-        CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::AddSimTopicL(): Leave if error != -11 || -6");
-        User::LeaveIfError( err );
-        }
-
-    // Append to SIM Topic array
-    iSimTopics->AppendL( topic.iNumber );
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::AddSimTopicL(): Topic %d appended to array.", topic.iNumber ); 
-    
-    // Leave so that caller is informed e.g. if topic already exists
-    User::LeaveIfError( err );
-    CBSLOGSTRING("CBSSERVER: <<< CCbsReceiverHelper::AddSimTopicL()" );
-    
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::SimTopics
-// Returns topics currently added from the SIM card.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-CArrayFixFlat<TInt>& CCbsReceiverHelper::SimTopics() const
-    {
-    return *iSimTopics;
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::DeleteFromSimTopicCache
-// Deletes the topic number from local SIM Topic array.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::DeleteFromSimTopicCache( const TUint16 aNumber )
-    {
-    CBSLOGSTRING("CBSSERVER: >>> CCbsReceiverHelper::DeleteFromSimTopicCache()");
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): Topic number: %d", aNumber );
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): Topic count in cache (1): %d", iSimTopics->Count() );
-
-    // Check if this topic is a SIM Topic (can be found in the array)
-    TKeyArrayFix key( 0, ECmpTUint16 );
-    TInt index;
-    TUint16 topicNumber( aNumber );
-    TInt result( iSimTopics->FindIsq( topicNumber, key, index ) );
-
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): FindIsq() result: %d", result );
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): FindIsq() result, position: %d", index );
-
-    // Delete the topic from the array
-    if ( result == KErrNone )
-        {
-        CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): Topic no. %d found from cache.", aNumber );
-        iSimTopics->Delete( index );
-        CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): Topic deleted from cache, index: %d", index );
-        iSimTopics->Compress();
-        CBSLOGSTRING("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): SIM Topic array compressed.");
-        }
-
-    CBSLOGSTRING2("CBSSERVER: CCbsReceiverHelper::DeleteFromSimTopicCache(): Topic count in cache (2): %d", iSimTopics->Count() );
-    CBSLOGSTRING("CBSSERVER: <<< CCbsReceiverHelper::DeleteFromSimTopicCache()");
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::Database
-// Returns a reference to the CCbsDbImp instance.
-// If a topic of the same number already exists
-// in DB, does nothing.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-CCbsDbImp& CCbsReceiverHelper::Database() const
-    {
-    return iDatabase;
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::TopicsDetected
-// Returns the number of detected topics.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TUint CCbsReceiverHelper::TopicsDetected() const
-    {
-    return iTopicsDetected;
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::ClearTopicsDetectedCounter
-// Sets the counter for detected topics to zero.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::ClearTopicsDetectedCounter()
-    {
-    // Clear the variable indicating the amount of detected topics.
-    iTopicsDetected = 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::HandleTopicDetectedL
-// Handles detected topic.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-TBool CCbsReceiverHelper::HandleTopicDetectedL(
-    const TCbsDbTopicNumber& iTopicNumber )
-    {
-    // Create new topic and initialise it.
-    TCbsDbTopic topic;
-    topic.iNumber = iTopicNumber;
-    topic.iName = KNullDesC;
-    topic.iProtected = EFalse;
-    topic.iSubscribed = EFalse;
-    topic.iHotmarked = EFalse;
-
-    TBool result( ETrue );
-
-    // Try to add the topic. If succeeded,
-    // increase counter iTopicsDetected.
-    TRAPD( error, iDatabase.TopicListL().AddTopicL( topic, ETrue ) );
-
-    if ( error == KErrAlreadyExists )
-        {
-        result = EFalse;
-        }
-    else if ( error != KErrNone && error != KErrAlreadyExists )
-        {
-        User::Leave( error );
-        }
-    else
-        {
-        // Update the detected topics counter
-        iTopicsDetected++;
-        }
-    return result;
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::HandleIndexMessageL
-// Processes an index message and builds a new topic collection
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::HandleIndexMessageL(
-    const TDesC& aContents,
-    const TBool aIsChildSubIndex )
-    {
-    // Previous topic identities are cleared if a root index message
-    // is received.
-    if ( !aIsChildSubIndex )
-        {
-        iDatabase.TopicCollectionL().Clear();
-        }
-    // Parses topic identities from the index message.
-    // The identities are stored in the current topic collection.
-    // If the index message is corrupt, it should still be stored,
-    // so trap the error.
-    TLex lex( aContents );
-    TRAPD( error, ParseMessageFormatL( lex, iDatabase.TopicCollectionL() ) );
-    switch ( error )
-        {
-        case KErrNone:
-            // If the message all went fine, apply.
-            // The topic identities are written into persistent memory.
-            iDatabase.TopicCollectionL().Apply();
-            break;
-
-        case KErrCorrupt:
-            // Do not react on corrupt messages.
-            break;
-
-        default:
-            // All other errors will prevent saving the message.
-            User::Leave( error );
-            break;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::ParseTopicIdentitiesL
-// Parses all topic identities from aText which is assumed to be
-// an index message's content.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::ParseTopicIdentitiesL(
-        const TDesC& aText )
-    {
-    // Create a lexer and pass it to the parser
-    TLex lex( aText );
-
-    ParseMessageFormatL( lex, iDatabase.TopicCollectionL() );
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::LaunchMessageSoftNotificationL
-// Requests to launch a soft notification.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::LaunchMessageSoftNotificationL( const TBool aPlayTone )
-    {
-    TInt numberOfHotMsgs( 0 );
-    numberOfHotMsgs = iDatabase.TopicListL().UnreadHotmarkedMessageCount();
-
-    CAknSoftNotifier* notifier = CAknSoftNotifier::NewLC(); // on CS
-
-    TurnLightsOn();
-
-    if ( aPlayTone )
-        {
-        PlayCbsTone();
-        }
-
-    notifier->SetNotificationCountL( ECellBroadcastNotification, numberOfHotMsgs );
-    CleanupStack::PopAndDestroy( notifier );
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::LaunchMessageImmediateDisplay
-// Requests to show the message immediately.
-// (other items were commented in a header).
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::LaunchMessageImmediateDisplay(
-    const TCbsDbMessage& aMessage )
-    {
-    TUid uiViewUid( TUid::Uid( ECbsUiMsgViewId ) );
-    TVwsViewId id( KUidCbsUiappApp, uiViewUid );
-    TPckgBuf<TCbsMessageHandle> pckg( aMessage.iHandle );
-
-    // Ignore result value.
-    iVwsSession->CreateActivateViewEvent( id, KCbsImmediateMessageId, pckg );
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::TurnLightsOn
-// Turns lights on
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::TurnLightsOn()
-    {
-     // Change the bit on and off. SysAp will detect that
-     // the lights should be switched on for the specified time.
-     RProperty::Set(KPSUidCoreApplicationUIs, KLightsControl, ELightsOn);
-     RProperty::Set(KPSUidCoreApplicationUIs, KLightsControl, ELightsOff);
-    }
-
-// -----------------------------------------------------------------------------
-// CCbsReceiverHelper::PlayCbsTone
-// Plays a tone
-// -----------------------------------------------------------------------------
-//
-void CCbsReceiverHelper::PlayCbsTone()
-    {
-    // <-- QT PHONE START -->
-    /*
-    RProperty::Define( KPSUidNcnList, KNcnPlayAlertTone, RProperty::EInt,
-        ECapability_None , ECapabilityWriteDeviceData );
-    RProperty::Set( KPSUidNcnList, KNcnPlayAlertTone, KCbsMessageTone );
-    */
-    // <-- QT PHONE END-->
-    }
-
-// ================= OTHER EXPORTED FUNCTIONS ==============
-
-//  End of File
-