--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/cbsserver/ServerSrc/Ccbsrecetel.cpp Wed Jul 21 18:26:52 2010 +0300
@@ -0,0 +1,942 @@
+/*
+* 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 class creates the ETEL receiver package subcomponents, handles
+* incoming CBS messages and communicates with the server interface.
+*
+*
+*/
+
+
+// INCLUDE FILES
+
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+#include <etelmm.h>
+#include <mmlist.h> // CMobilePhoneBroadcastIdList
+#include <mmtsy_names.h>
+
+#include "CbsServerConstants.h"
+#include "CbsServerPanic.h"
+#include "CCbsDbImp.H"
+#include "CCbsDbImpTopicList.h"
+#include "CCbsDbImpSettings.H"
+#include "CCbsRecCollector.h"
+#include "CCbsRecDecoder.h"
+#include "CCbsRecEtel.h"
+#include "CCbsRecEtelMonitor.h"
+#include "CCbsRecNetworkListener.h"
+#include "CCbsRecMessage.h"
+#include "CCbsReceiverHelper.h"
+#include "CbsUtils.h"
+
+#include "CCbsEtelMessaging.h"
+#include "MCbsEtelMessaging.h"
+#include "MCbsMcnSubscriptionsProvider.h"
+#include "CCbsSetFilterSettingHandler.h"
+
+#include "CCbsRecWcdmaMessage.h"
+#include "CCbsMessageFactory.h"
+#include "CCbsLivecastHandler.h"
+#include "CbsLogger.h"
+
+#include <centralrepository.h> // for local variation
+#include "cbsinternalcrkeys.h" // for local variation
+#include "cbsvariant.hrh" // for local variation
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::CCbsRecEtel
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+CCbsRecEtel::CCbsRecEtel()
+ : iReception( RMobileBroadcastMessaging::EBroadcastAcceptAll ),
+ iCellInfoReceived( EFalse ),
+ iReceptionEnabled( EFalse ),
+ iLimitedReception( EFalse ),
+ iStartTime( 0 ),
+ iEndTime( 0 ),
+ iHomeZoneReceived( EFalse ),
+ iNewSimTopicsAdded( EFalse )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::ConstructL()
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::ConstructL()");
+
+ iSubscriptionProviders = new ( ELeave )
+ CArrayFixFlat< MCbsMcnSubscriptionsProvider* >( 1 );
+
+ iDecoder = CCbsRecDecoder::NewL();
+
+ // Establish a session with the ETel server.
+ ConnectToEtelL();
+
+ // Create a listener to monitor network state changes,
+ iNetworkListener = CCbsRecNetworkListener::NewL( iGsmPhone );
+
+ // Construct the command handlers
+ iFilterSettingHandler = CCbsSetFilterSettingHandler::NewL( *this, *iMessaging );
+
+ // Create the message factory
+ iFactory = CCbsMessageFactory::NewL( *this );
+
+ // Message page collector
+ iCollector = CCbsRecCollector::NewL( *iFactory );
+
+ // LC message handler
+ iLivecastHandler = CCbsLivecastHandler::NewL( *this );
+
+ // Message monitor
+ iEtelMonitor = CCbsRecEtelMonitor::NewL( *this, *iMessaging, *iFactory, *iLivecastHandler );
+
+ // 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: <<< CCbsRecEtel::ConstructL()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCbsRecEtel* CCbsRecEtel::NewL()
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::NewL()");
+
+ CCbsRecEtel* self = new ( ELeave ) CCbsRecEtel;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::NewL()");
+ return self;
+ }
+
+// Destructor
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+CCbsRecEtel::~CCbsRecEtel()
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::~CCbsRecEtel()");
+
+ // Disable CB reception, ignore result
+ TRAP_IGNORE( SetReceptionStatusL(
+ RMobileBroadcastMessaging::EBroadcastAcceptNone ) );
+
+ delete iNetworkListener;
+ delete iEtelMonitor;
+ delete iFilterSettingHandler;
+ delete iLivecastHandler;
+
+ if ( iMessaging )
+ {
+ iMessaging->Close(); // owned by CCbsEtelFactory
+ }
+ delete iMessaging;
+
+ delete iCollector;
+ delete iDecoder;
+ delete iFactory;
+ delete iSubscriptionProviders;
+
+ iCustomPhone.Close();
+ iGsmPhone.Close();
+ iEtelServer.Close();
+
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::~CCbsRecEtel()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::HandleMessageReceivedL
+// Handles a received CBS message page.
+//
+// The message have
+// to be decoded, uncompressed and collected only if
+// certain conditions hold. These are checked first.
+//
+// The handling sequence is as follows:
+// 1. If the reception is off, reject this message.
+// 2. If the user has set a time limit for receiving messages,
+// check if the current time is such that the message
+// should not be received.
+// 3. Check whether message's language has been subscribed.
+// Reject the message if not. If message id a Class 0 message,
+// do not reject, since the msg should be shown.
+// 4. If the topic detection is enabled and this message
+// is of an unknown topic, add the new topic and
+// reject this message (since the new topic cannot
+// be subscribed at this point).
+// 5. If the same message exists in the database, this
+// message is ignored.
+// 6. The decoder decodes the page.
+// 7. If the message is multipaged, it is given to
+// the message collector.
+// 8. A complete message is forwarded to CCbsReceiverHelper,
+// which either stores the message into the database
+// or handles it as an index message.
+//
+// This function is called from CCbsRecEtelMonitor::RunL().
+//
+// Note: Message reception status check may be unnecessary,
+// if the ETel Monitor instance handles the check.
+//
+// Note: Message subscription check is necessary here.
+// UI client's subscriptions might differ from MCN client's
+// subscriptions.
+//
+// Note: Language cannot be read from the header if the
+// language information is stored in the content of
+// the message. This is particulary troublesome, if
+// the message is compressed.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::HandleMessageReceivedL(
+ CCbsMessage* aMessage )
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::HandleMessageReceivedL()");
+
+ CleanupStack::PushL( aMessage ); // take ownership
+
+ // Decode a message. Language indication prefix, if any, is also
+ // removed here. A leave occurs if the message is compressed.
+ iDecoder->DecodeL( *aMessage );
+
+ // Add network information to message.
+ TInt error = AddNetworkInfo( *aMessage );
+
+ // If the message is a cell info, extract the information.
+ if ( aMessage->TopicNumber() == KCellInfoTopic )
+ {
+ if ( KErrNone == error )
+ {
+ ExtractCellInformation( *aMessage );
+ }
+ else
+ {
+ iCellInfoReceived = EFalse;
+ }
+ }
+ else if ( aMessage->TopicNumber() == KHomeZoneTopic )
+ {
+ if ( KErrNone == error )
+ {
+ ExtractHomeZoneInformation( *aMessage );
+ }
+ else
+ {
+ iHomeZoneReceived = EFalse;
+ }
+ }
+
+ // Route the message to all MCN client session-objects.
+ RouteMessageL( *aMessage );
+
+ // 1. If the reception is off, reject this message.
+ // 2. If the time of the day is such that the user has decided
+ // not to receive any messages, reject this message.
+ // 3. Check whether message's language has been subscribed
+ // 4. Check if the topic of this message is not in the topic list
+ // and the topic detection is enabled.
+ // 5. Check if the topic of this message has been subscribed.
+ // 6. Check if this message already exists in the database.
+
+ // This variable must be local, since if the common reception status
+ // is used, this check can mess it up.
+ TBool uiReceptionEnabled( EFalse );
+ iInterface->Database().SettingsL().GetReceptionStatus( uiReceptionEnabled );
+
+ if ( !uiReceptionEnabled ||
+ ( iInterface->LanguageOfMessageSubscribedL( *aMessage ) == EFalse &&
+ aMessage->RequiresImmediateDisplay() == EFalse ) ||
+ iInterface->CheckForNewTopicL( *aMessage ) ||
+ iInterface->CheckForSubscriptionAndExistenceL( *aMessage ) == EFalse )
+ {
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): Rejecting msg, PopAndDestroy().");
+ CleanupStack::PopAndDestroy( aMessage );
+ }
+ else
+ {
+ // Check if this message is multipaged and if it is,
+ // give it to the message collector. If it isn't,
+ // forward the message to the receiver helper
+ if ( aMessage->TotalPages() > 1 )
+ {
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): Multipaged msg, total pages: %d.", aMessage->TotalPages() );
+
+ // Ensure that the network info is available.
+ // If not, reject the message, because info is required to collect
+ // pages of a multipaged message.
+ if ( KErrNone != error )
+ {
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): AddNetworkInfo error: %d, PopAndDestroy().", error );
+ CleanupStack::PopAndDestroy( aMessage );
+ }
+ else
+ {
+ // Ownership of aMessage transferred to iCollector with
+ // aMessage left on the cleanup stack.
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): Calling iCollector->CollectL()...");
+ CCbsMessage* completedMsg = iCollector->CollectL( aMessage, ECbsMessageTypeUnspecified );
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): iCollector->CollectL() finished OK.");
+
+ if ( completedMsg )
+ {
+ // Message pages combined => Handle like a single-paged msg.
+ // Result code ignored.
+ CleanupStack::PushL( completedMsg );
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): MULTIPAGED: Calling iInterface->HandleReceivedMessageL()...");
+ iInterface->HandleReceivedMessageL( *completedMsg );
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): MULTIPAGED: iInterface->HandleReceivedMessageL() finished OK.");
+ CleanupStack::PopAndDestroy( completedMsg );
+ }
+ }
+ }
+ else
+ {
+ // single page
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): SINGLEPAGED: Calling iInterface->HandleReceivedMessageL()...");
+ iInterface->HandleReceivedMessageL( *aMessage );
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::HandleMessageReceivedL(): SINGLEPAGED: iInterface->HandleReceivedMessageL() finished OK.");
+ CleanupStack::PopAndDestroy( aMessage );
+ }
+ }
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::HandleMessageReceivedL()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::AddNetworkInfo
+// This method blocks if no current network info is
+// available and the call to retrieve information blocks.
+//
+// Augments aMessage with current network information (i.e., PLMN, LAC
+// and Cell ID). Does nothing if the network listener iListener
+// is unavailable.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+TInt CCbsRecEtel::AddNetworkInfo(
+ CCbsMessage& aMessage ) const
+ {
+ TInt result( KErrNone );
+
+ RMobilePhone::TMobilePhoneNetworkInfoV1 info;
+ RMobilePhone::TMobilePhoneLocationAreaV1 area;
+
+ result = iNetworkListener->GetCurrentNetworkInfo( info, area );
+
+ if ( result == KErrNone )
+ {
+ aMessage.SetNetworkInfo( info, area );
+ }
+
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::SetInterface
+// Sets the interface to which all accepted messages are given.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::SetInterface(
+ CCbsReceiverHelper* aInterface )
+ {
+ __ASSERT_DEBUG( aInterface != 0, User::Panic( _L( "InterfaceNull" ), 0 ) );
+ iInterface = aInterface;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::AddSubscriptionProviderL
+// 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.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::AddSubscriptionProviderL(
+ MCbsMcnSubscriptionsProvider* aProvider )
+ {
+ __TEST_INVARIANT;
+ if ( !aProvider )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ iSubscriptionProviders->AppendL( aProvider );
+
+ __TEST_INVARIANT;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::RemoveSubscriptionProviderL
+// Removes a MCN topic subscription provider.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::RemoveSubscriptionProviderL(
+ const MCbsMcnSubscriptionsProvider* aProvider )
+ {
+ __TEST_INVARIANT;
+ if ( !aProvider )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ TInt count( iSubscriptionProviders->Count() );
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ if ( iSubscriptionProviders->At( i ) == aProvider )
+ {
+ iSubscriptionProviders->Delete( i );
+ ApplyStateChangesL();
+ __TEST_INVARIANT;
+ return;
+ }
+ }
+
+#ifdef _DEBUG
+ CbsServerPanic( EMcnProviderNotFound );
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::ApplyStateChangesL
+// Retrieves current subscriptions and settings from DB.
+//
+// Reception should be enabled if:
+// 1) User has enabled it or
+// 2) There are MCN clients with outstanding message routing
+// requests or
+// 3) New topics were found from SIM card and they were added to Topic list
+//
+// If the reception is enabled, all topics and languages
+// are subscribed from ETel. Filtering is done in CbsServer
+// on receival of a CB message (see HandleMessageReceivedL()).
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+void CCbsRecEtel::ApplyStateChangesL()
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::ApplyStateChangesL()");
+
+ // Determine reception status: If any MCN client requests messages or new
+ // SIM Topics have just been addded, then reception should be enabled.
+ // Otherwise UI client reception setting is used.
+ TUint numberOfMcnSubscriptions( NumberOfMcnSubscriptions() );
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::ApplyStateChangesL(): numberOfMcnSubscriptions: %d", numberOfMcnSubscriptions );
+
+ TBool receptionStatus( EFalse );
+ TInt errorCode( KErrNone );
+ TRAP( errorCode, iInterface->Database().SettingsL().GetReceptionStatus( receptionStatus ) );
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::ApplyStateChangesL(): Database reception status: %d", receptionStatus );
+
+ TBool receptionEnabled( EFalse );
+
+ // Variated feature
+ if ( iLVBits & KCbsLVFlagTopicSubscription )
+ {
+ receptionEnabled = ( receptionStatus || numberOfMcnSubscriptions > 0 || iNewSimTopicsAdded );
+ }
+ else
+ {
+ receptionEnabled = ( receptionStatus || numberOfMcnSubscriptions > 0 );
+ }
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::ApplyStateChangesL(): Should reception be enabled: %d", receptionEnabled );
+
+ // Check if the reception status should be changed
+ if ( receptionEnabled != iReceptionEnabled )
+ {
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::ApplyStateChangesL(): Changing reception status.");
+
+ if ( !receptionEnabled )
+ {
+ // Set reception off
+ SetReceptionStatusL( RMobileBroadcastMessaging::EBroadcastAcceptNone );
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::ApplyStateChangesL(): Changing reception status, status set OFF.");
+ }
+ else
+ {
+ // Set reception on
+ SetReceptionStatusL( RMobileBroadcastMessaging::EBroadcastAcceptAll );
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::ApplyStateChangesL(): Changing reception status, status set ON.");
+ }
+ }
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::ApplyStateChangesL()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::GetCurrentMessage
+// Returns the current information message.
+// The information is retrieved from the last cell information or HomeZone
+// message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCbsRecEtel::GetCurrentMessage(
+ TDes& aInfoMessage,
+ TInt aTopicNumber )
+ {
+ // Handle the cell info message (topic 50)
+ if ( aTopicNumber == KCellInfoTopic && iCellInfoReceived )
+ {
+ RMobilePhone::TMobilePhoneNetworkInfoV1 networkInfo;
+ RMobilePhone::TMobilePhoneLocationAreaV1 area;
+
+ iNetworkListener->GetCurrentNetworkInfo( networkInfo, area );
+
+ if ( iCellInfoLAC == area.iLocationAreaCode &&
+ iCellInfoCellId == area.iCellId &&
+ iCellInfoPLMN.iCountryCode == networkInfo.iCountryCode &&
+ iCellInfoPLMN.iNetworkId == networkInfo.iNetworkId )
+ {
+ aInfoMessage.Copy( iCurrentCellInfoMessage );
+ return KErrNone;
+ }
+ iCellInfoReceived = EFalse;
+ }
+ // Handle the HomeZone message (topic 221)
+ else if ( aTopicNumber == KHomeZoneTopic && iHomeZoneReceived )
+ {
+ RMobilePhone::TMobilePhoneNetworkInfoV1 networkInfo;
+ RMobilePhone::TMobilePhoneLocationAreaV1 area;
+
+ iNetworkListener->GetCurrentNetworkInfo( networkInfo, area );
+
+ if ( iHomeZoneLAC == area.iLocationAreaCode &&
+ iHomeZoneCellId == area.iCellId &&
+ iHomeZonePLMN.iCountryCode == networkInfo.iCountryCode &&
+ iHomeZonePLMN.iNetworkId == networkInfo.iNetworkId )
+ {
+ aInfoMessage.Copy( iCurrentHomeZoneMessage );
+ return KErrNone;
+ }
+ iHomeZoneReceived = EFalse;
+ }
+
+ return KErrNotFound;
+ }
+
+// ---------------------------------------------------------
+// LoadSimTopicsL()
+// Loads topics from SIM, if any exists. Saves them into DB.
+// ---------------------------------------------------------
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+TInt CCbsRecEtel::LoadSimTopicsL()
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::LoadSimTopicsL()");
+
+ TInt result( iCustomPhone.StartSimCbTopicBrowsing() );
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::LoadSimTopicsL(): StartSimCbTopicBrowsing() returned: %d.", result);
+
+ if ( result != KErrNone )
+ {
+ CBSLOGSTRING2("CBSSERVER: <<< CCbsRecEtel::LoadSimTopicsL(), returning %d.", result);
+ return result;
+ }
+
+ // Retrieve topics one at time from SIM and store them into DB.
+ RMmCustomAPI::TSimCbTopic topic;
+ TInt error( KErrNone );
+ while ( ( error = iCustomPhone.GetNextSimCbTopic( topic ) ) == KErrNone )
+ {
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::LoadSimTopicsL(): GetNextSimCbTopic() returned KErrNone. (%d)", error );
+ TRAPD( result, iInterface->AddSimTopicL( topic.iNumber, topic.iName ) );
+
+ // Indicate that at least one new SIM Topic was added to Topic list
+ if ( !result )
+ {
+ // Variated feature
+ if ( iLVBits & KCbsLVFlagTopicSubscription )
+ {
+ iNewSimTopicsAdded = ETrue;
+ CBSLOGSTRING("CBSSERVER: CCbsRecEtel::LoadSimTopicsL(), iNewSimTopicsAdded = ETRUE" );
+ }
+ }
+ }
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::LoadSimTopicsL(), GetNextSimCbTopic error: %d.", error);
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::LoadSimTopicsL(), AddSimTopicL result: %d.", result);
+
+ // To prevent ARMV5 compiler warning
+ if ( error )
+ {
+ error = KErrNone;
+ }
+
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::LoadSimTopicsL(), returning KErrNone.");
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// DeleteSimTopicL
+// Delete the SIM topic. If the SIM topic does not exist,
+// ignore, because that's what we actually want.
+// ---------------------------------------------------------
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+void CCbsRecEtel::DeleteSimTopicL( const TUint16 aNumber, const TBool aDeleteAll )
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::DeleteSimTopicL()");
+
+ TInt number( aNumber );
+
+ // All other errors than KErrNotFound are thrown.
+ TInt ret( iCustomPhone.DeleteSimCbTopic( number ) );
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::DeleteSimTopicL(): DeleteSimCbTopic() returned: %d.", ret);
+
+#ifdef __WINS__
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::DeleteSimTopicL(): DeleteSimCbTopic() returned: %d", ret );
+#else
+ if ( ret != KErrNotFound )
+ {
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::DeleteSimTopicL(): DeleteSimCbTopic() returned: %d", ret );
+ User::LeaveIfError( ret );
+ }
+
+#endif
+ // Delete one by one from cache only if we are deleting just one topic from the SIM card
+ if ( !aDeleteAll )
+ {
+ // Delete from local array
+ iInterface->DeleteFromSimTopicCache( aNumber );
+ }
+
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::DeleteSimTopicL()");
+ }
+
+// ---------------------------------------------------------
+// CCbsRecEtel::DeleteAllSimTopicsL
+// Deletes all topics from the SIM card.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+
+void CCbsRecEtel::DeleteAllSimTopicsL()
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::DeleteAllSimTopicsL()");
+
+ TInt count = iInterface->SimTopics().Count();
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::DeleteAllSimTopicsL(): SIM Topic count: %d", count );
+
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ TInt topicNum = iInterface->SimTopics().At( i );
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::DeleteAllSimTopicsL(): SIM Topic number: %d", topicNum );
+ DeleteSimTopicL( topicNum, ETrue );
+ }
+
+ // Delete all topics from the cache
+ iInterface->SimTopics().Reset();
+
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::DeleteAllSimTopicsL()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::ConnectToEtelL
+// Establishes a connection with the EPOC Telephony Server server.
+// Also opens the necessary EPOC Telephony Server resources such as RPhone and
+// RAdvGsmSmsMessaging sessions.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+
+ /*****************************************************
+ * Series 60 Customer / TSY
+ * Needs customer TSY implementation
+ *****************************************************/
+void CCbsRecEtel::ConnectToEtelL()
+ {
+ TInt result( KErrNone );
+
+ // Connect to ETel
+ User::LeaveIfError( iEtelServer.Connect() );
+
+ // Load Phone TSY module
+ result = iEtelServer.LoadPhoneModule( KMmTsyModuleName );
+ if ( result != KErrNone )
+ {
+ User::Leave( result );
+ }
+
+ // This function retrieves the total number of phones supported by all
+ // the currently loaded EPOC Telephony Server (TSY) modules.
+ TInt phoneCount( 0 );
+ User::LeaveIfError( iEtelServer.EnumeratePhones( phoneCount ) );
+
+ // This function retrieves information associated with the specified phone
+ RTelServer::TPhoneInfo phoneInfo;
+ while ( phoneCount-- )
+ {
+ User::LeaveIfError( iEtelServer.GetPhoneInfo( phoneCount,
+ phoneInfo ) );
+
+ if ( phoneInfo.iName == KMmTsyPhoneName )
+ {
+ phoneCount = 0;
+ }
+ }
+
+ // Open GSM phone
+ result = iGsmPhone.Open( iEtelServer, phoneInfo.iName );
+ if ( result != KErrNone )
+ {
+ User::Leave( result );
+ }
+
+ // Create an EPOC Telephony Server messaging instance
+ iMessaging = CCbsEtelMessaging::NewL();
+
+ // Open SMS Messaging
+ result = iMessaging->Open( iGsmPhone );
+ if ( result != KErrNone )
+ {
+ User::Leave( result );
+ }
+
+ // Opens a custom phone subsession by name
+ result = iCustomPhone.Open( iGsmPhone );
+ if ( result != KErrNone )
+ {
+ User::Leave( result );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::SetReceptionStatusL
+// Sets the requested CB reception status aStatus to ME.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+ /*****************************************************
+ * Series 60 Customer / ETel
+ * Series 60 ETel API
+ *****************************************************/
+void CCbsRecEtel::SetReceptionStatusL(
+ RMobileBroadcastMessaging::TMobilePhoneBroadcastFilter aSetting )
+ {
+ if ( iEtelMonitor )
+ {
+ if ( aSetting == RMobileBroadcastMessaging::EBroadcastAcceptNone )
+ {
+ iEtelMonitor->Cancel();
+ }
+ else
+ {
+ iEtelMonitor->IssueRequest();
+ }
+ }
+
+ if ( iMessaging )
+ {
+ iFilterSettingHandler->SetFilterSetting( aSetting );
+ }
+
+ iReceptionEnabled = ( aSetting == RMobileBroadcastMessaging::EBroadcastAcceptAll );
+
+ // Variated feature
+ if ( iLVBits & KCbsLVFlagTopicSubscription )
+ {
+ // Set reception setting on also for UI,
+ // if new topics were added from the SIM card
+ if ( iNewSimTopicsAdded )
+ {
+ iInterface->Database().SettingsL().SetReceptionStatusL( ETrue );
+ iNewSimTopicsAdded = EFalse;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::NumberOfMcnSubscriptions
+// Returns the total number of topic subscriptions made by
+// MCN clients registered to the server.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint CCbsRecEtel::NumberOfMcnSubscriptions() const
+ {
+ TUint count( 0 );
+ TInt mcnClientCount( iSubscriptionProviders->Count() );
+ for ( TInt i( 0 ); i < mcnClientCount; i++ )
+ {
+ count += iSubscriptionProviders->At( i )->NumberOfSubscriptions();
+ }
+ return count;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::RouteMessageL
+// Passes the given CB message to each registered subscriptions
+// provider
+// a subscription provider is a MCN client wishing
+// CB message routing service
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::RouteMessageL(
+ const CCbsMessage& aMessage )
+ {
+ CBSLOGSTRING("CBSSERVER: >>> CCbsRecEtel::RouteMessageL()");
+
+ TInt count( iSubscriptionProviders->Count() );
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::RouteMessageL(): Provider count: %d", count);
+
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ CBSLOGSTRING2("CBSSERVER: CCbsRecEtel::RouteMessageL(): Routing to provider: %d", i );
+ iSubscriptionProviders->At( i )->RouteMessageL( aMessage );
+ }
+
+ CBSLOGSTRING("CBSSERVER: <<< CCbsRecEtel::RouteMessageL()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::ExtractCellInformation
+// Copies Current cell information (district info, MCN)
+// into receiver's 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).
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::ExtractCellInformation(
+ const CCbsMessage& aMessage )
+ {
+
+ iCurrentCellInfoMessage.Copy( aMessage.Contents() );
+ aMessage.GetPLMN( iCellInfoPLMN );
+ iCellInfoLAC = aMessage.LAC();
+ iCellInfoCellId = aMessage.CellId();
+
+ iCellInfoReceived = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::ExtractHomeZoneInformation
+// Copies Current HomeZone information into receiver's 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).
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::ExtractHomeZoneInformation(
+ const CCbsMessage& aMessage )
+ {
+ iCurrentHomeZoneMessage.Copy( aMessage.Contents() );
+ aMessage.GetPLMN( iHomeZonePLMN );
+ iHomeZoneLAC = aMessage.LAC();
+ iHomeZoneCellId = aMessage.CellId();
+
+ iHomeZoneReceived = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::Collector
+// Returns the message collector reference.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CCbsRecCollector& CCbsRecEtel::Collector()
+ {
+ return *iCollector;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::Interface
+// Returns the receiver helper reference.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CCbsReceiverHelper& CCbsRecEtel::Interface() const
+ {
+ return *iInterface;
+ }
+
+// -----------------------------------------------------------------------------
+// CCbsRecEtel::__DbgTestInvariant
+// Checks that the object is in a valid state, and panics if it is not.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsRecEtel::__DbgTestInvariant() const
+ {
+#if defined (_DEBUG)
+ if ( iSubscriptionProviders == NULL ||
+ iEtelMonitor == NULL || iMessaging == NULL || iInterface == NULL ||
+ iDecoder == NULL || iCollector ==NULL || iNetworkListener == NULL )
+ {
+ User::Invariant();
+ }
+#endif // _DEBUG
+ }
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+// End of File