diff -r 35488577e233 -r 2fa1fa551b0b cbs/CbsServer/ServerSrc/CCbsServer.cpp --- a/cbs/CbsServer/ServerSrc/CCbsServer.cpp Mon Aug 23 15:50:31 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,519 +0,0 @@ -/* -* Copyright (c) 2003-2008 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 CCbsServer class -* member functions. -* -* This file contains the entry point for CbsServer.exe/dll. -* -*/ - - -// INCLUDE FILES - -#include -#include - -#include "CbsCommon.h" -#include "CCbsScheduler.h" -#include "CbsServerConstants.h" -#include "CbsServerPanic.h" -#include "CCbsServer.h" -#include "CCbsSession.h" -#include "CbsUtils.h" - -#include "CCbsRecEtel.h" -#include "CCbsDbImp.H" - -#include "CCbsDbImp.H" -#include "CCbsRecEtel.h" - -#include "CCbsDbImpSettings.H" -#include "CCbsDbImpTopicList.h" -#include "CCbsReceiverHelper.h" -#include "CCbsSatRefresh.h" - -#include -#include "CbsServerInternalPSKeys.h" -#include "CCbsShutdownMonitor.h" -#include "CbsLogger.h" -#include "CbsServerUid.h" - - -// LOCAL FUNCTION PROTOTYPES -LOCAL_C void InitServerL(); - -// ==================== LOCAL FUNCTIONS ==================== - -// ----------------------------------------------------------------------------- -// InitServerL -// Initializes and starts CBS Server. -// Creates the active scheduler and an instance of the server. -// Returns: None -// ----------------------------------------------------------------------------- -// -LOCAL_C void InitServerL() - { - CBSLOGSTRING("CBSSERVER: >>> InitServerL()"); - // perform init code under the cleanup stack - User::RenameThread( KCbsServerName ); - - // create server - if one of this name does not already exist - TFindServer findCbsServer( KCbsServerName ); - TFullName pathName; - - RMutex serverStartMutex; - TInt createErr( serverStartMutex.CreateGlobal( _L("CBSSERVERMTX") ) ); - if ( createErr ) - { - TInt openErr( serverStartMutex.OpenGlobal( _L("CBSSERVERMTX") ) ); - User::LeaveIfError( openErr ); - } - serverStartMutex.Wait(); - - if ( findCbsServer.Next( pathName ) != KErrNone ) - { - // start scheduler and server - CCbsScheduler* scheduler = new (ELeave) CCbsScheduler; - CleanupStack::PushL( scheduler ); - CActiveScheduler::Install( scheduler ); - - CCbsServer* server = CCbsServer::NewL(); - CleanupStack::PushL( server ); - - // The scheduler needs access to the server instance. - scheduler->SetServer( server ); - - // Set the key using Publish & Subscribe - RProperty property; - _LIT_SECURITY_POLICY_PASS( KCbsServerReadPolicy ); - _LIT_SECURITY_POLICY_S0( KCbsServerWritePolicy, KCbsServerUid3 ); - - property.Define( KPSUidCellBroadcast, KCbsServerStarted, RProperty::EInt, KCbsServerReadPolicy, KCbsServerWritePolicy ); - CBSLOGSTRING("CBSSERVER: InitServerL(): Property defined."); - - property.Set( KPSUidCellBroadcast, KCbsServerStarted, 1 ); - CBSLOGSTRING("CBSSERVER: InitServerL(): Property set."); - - property.Close(); - - serverStartMutex.Signal(); - serverStartMutex.Close(); - - CBSLOGSTRING("CBSSERVER: InitServerL(): CbsServer created ok, starting active schduler."); - - RProcess::Rendezvous( KErrNone ); - - // start fielding requests from clients - CActiveScheduler::Start(); - CBSLOGSTRING("CBSSERVER: InitServerL(): CbsServer shutting down, destroying scheduler & server instances."); - - // finished when the scheduler stops - CleanupStack::PopAndDestroy(2); // server, scheduler - } - else - { - serverStartMutex.Signal(); - serverStartMutex.Close(); - } - CBSLOGSTRING("CBSSERVER: <<< InitServerL()"); - } - - -// ================= MEMBER FUNCTIONS ======================= - -// ----------------------------------------------------------------------------- -// CCbsServer::CCbsServer -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CCbsServer::CCbsServer( - TInt aPriority ) - : CServer2( aPriority ) - { - } - -// ----------------------------------------------------------------------------- -// CCbsServer::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CCbsServer::ConstructL() - { - CBSLOGSTRING( "CBSSERVER: >>> CCbsServer::ConstructL()" ); - // Use PubSub to monitor shutdown event - iShutdownMonitor = CCbsShutdownMonitor::NewL( *this ); - - iReceiver = CCbsRecEtel::NewL(); - - iDatabase = CCbsDbImp::NewL(); - - iHelper = CCbsReceiverHelper::NewL( *iDatabase ); - - iReceiver->SetInterface( iHelper ); - InitReceiverL(); - - // Create the container index. - iContainerIx = CObjectConIx::NewL(); - iContainer = NewContainerL(); - iIndex = CObjectIx::NewL(); - - // Create SAT refresh listener - TInt error( KErrNone ); - TRAP( error, iSatRefresh = CCbsSatRefresh::NewL( *this )); - CBSLOGSTRING2( "CBSSERVER: CCbsServer::ConstructL(): CCbsSatRefresh::NewL error: %d", error ); - - // Start the server - if ( Start( KCbsServerName ) != KErrNone ) - { - CbsServerPanic( ECbsServerStartFailed ); - } - - CBSLOGSTRING( "CBSSERVER: <<< CCbsServer::ConstructL()" ); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CCbsServer* CCbsServer::NewL() - { - CBSLOGSTRING("CBSSERVER: >>> CCbsServer::NewL()"); - CCbsServer* self = new ( ELeave ) CCbsServer( KCbsServerPriority ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - CBSLOGSTRING("CBSSERVER: <<< CCbsServer::NewL()"); - return self; - } - - -// Destructor -CCbsServer::~CCbsServer() - { - CBSLOGSTRING("CBSSERVER: >>> CCbsServer::~CCbsServer()"); - // Note: it is important to delete in correct order - - // The correct order is: - // 1st: sessions, subsessions and other server related objects - // 2nd: receiver - // 3rd: database - - if ( iIndex ) - { - delete iIndex; - iIndex = NULL; - } - - if ( iContainer ) - { - if ( iContainerIx ) - { - iContainerIx->Remove( iContainer ); - iContainer = NULL; - } - } - - // Delete subsessions - if ( iContainerIx ) - { - delete iContainerIx; - iContainerIx = NULL; - } - - if ( iSatRefresh ) - { - delete iSatRefresh; - iSatRefresh = NULL; - } - - if ( iReceiver ) - { - delete iReceiver; - iReceiver = NULL; - } - - if ( iDatabase ) - { - delete iDatabase; - iDatabase = NULL; - } - - if ( iHelper ) - { - delete iHelper; - iHelper = NULL; - } - - if ( iShutdownMonitor ) - { - delete iShutdownMonitor; - iShutdownMonitor = NULL; - } - - CBSLOGSTRING("CBSSERVER: <<< CCbsServer::~CCbsServer()"); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::NewSessionL -// Creates a new session (an instance of CCbsSession). -// -// The method is meant to be called by the Symbian OS server framework and -// so it should not be used in any other case. -// -// The method leaves if the version given as parameter and the server -// version differ. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CSession2* CCbsServer::NewSessionL( - const TVersion& aVersion, - const RMessage2& /*aMessage*/ ) const - { - TVersion currentVersion( KCbsServerVersionMajor, - KCbsServerVersionMinor, - KCbsServerVersionBuild ); - - // Check the client version - if ( !User::QueryVersionSupported( currentVersion, aVersion ) ) - { - User::Leave( KErrNotSupported ); - } - - // Create and return a new session - return CCbsSession::NewL( *( CCbsServer* ) this ); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::NewContainerL -// Creates a new session object container. -// -// It is the responsibility of the caller to delete the object -// container, when it is no longer used. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CObjectCon* CCbsServer::NewContainerL() - { - // Create the new container. - return iContainerIx->CreateL(); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::Database -// Returns a reference to the database. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CCbsDbImp& CCbsServer::Database() - { - return *iDatabase; - } - -// ----------------------------------------------------------------------------- -// CCbsServer::Receiver -// Returns a reference to the receiver. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CCbsRecEtel& CCbsServer::Receiver() - { - return *iReceiver; - } - -// ----------------------------------------------------------------------------- -// CCbsServer::TotalTopicsDetected -// Returns the total number of detected (via topic detection feature) -// topics and then clears the counter. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CCbsServer::TotalTopicsDetected() - { - TInt count( iHelper->TopicsDetected() ); - iHelper->ClearTopicsDetectedCounter(); - return count; - } - -// ----------------------------------------------------------------------------- -// CCbsServer::PanicClient -// Panics the client. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsServer::PanicClient( - TInt aPanic ) const - { - __DEBUGGER(); // Debugger breakpoint in server's context. - Message().Panic( KCbsServerName, aPanic ); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::Shutdown -// Shuts down the server. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsServer::Shutdown() - { - CBSLOGSTRING("CBSSERVER: >>> CCbsServer::Shutdown()"); - Cancel(); - CActiveScheduler::Stop(); - CBSLOGSTRING("CBSSERVER: <<< CCbsServer::Shutdown()"); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::ContainerIndex -// Returns the container index. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CObjectConIx& CCbsServer::ContainerIndex() - { - return *iContainerIx; - } - -// ----------------------------------------------------------------------------- -// CCbsServer::ServerMessage -// Returns the current IPC message. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -const RMessage2 CCbsServer::ServerMessage() const - { - return Message(); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::ReturnObjectByHandle -// Returns a subsession object matching the given handle. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CCbsObject* CCbsServer::ReturnObjectByHandle( - TUint aHandle ) - { - return ( CCbsObject* )iIndex->At( aHandle ); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::DeleteObjectByHandle -// Deletes a subsession -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsServer::DeleteObjectByHandle( - TUint aHandle ) - { - // Find object and then delete it - CCbsObject* object = ReturnObjectByHandle( aHandle ); - - if ( object ) - { - // Remove from index (and it will delete the object) - iIndex->Remove( aHandle ); - } - else - { - CbsServerPanic( EInvalidSessionObject ); - } - } - -// ----------------------------------------------------------------------------- -// CCbsServer::Container -// Returns the object container -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CObjectCon& CCbsServer::Container() - { - return *iContainer; - } - -// ----------------------------------------------------------------------------- -// CCbsServer::ObjectIx -// Returns the object index -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -CObjectIx& CCbsServer::ObjectIx() - { - return *iIndex; - } - -// ----------------------------------------------------------------------------- -// CCbsServer::InitReceiverL -// Initializes the receiver with values retrieved from the database. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsServer::InitReceiverL() - { - CBSLOGSTRING("CBSSERVER: >>> CCbsServer::InitReceiverL()"); - - // DB leave trapped. - TInt ignore( KErrNone ); - TRAP( ignore, iReceiver->LoadSimTopicsL() ); - CBSLOGSTRING2("CBSSERVER: CCbsServer::InitReceiverL(): LoadSimTopicsL() TRAPped error: %d", ignore); - - iReceiver->ApplyStateChangesL(); - - CBSLOGSTRING("CBSSERVER: <<< CCbsServer::InitReceiverL()"); - } - -// ----------------------------------------------------------------------------- -// CCbsServer::ReLoadSimTopicsL -// Initializes the receiver with values retrieved from the database. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCbsServer::ReLoadSimTopicsL() - { - CBSLOGSTRING("CBSSERVER: >>> CCbsServer::ReLoadSimTopicsL()"); - - TInt ignore( KErrNone ); - - TRAP( ignore, iReceiver->LoadSimTopicsL() ); - CBSLOGSTRING2("CBSSERVER: CCbsServer::ReLoadSimTopicsL(): LoadSimTopicsL() TRAPped error: %d", ignore); - - iReceiver->ApplyStateChangesL(); - - CBSLOGSTRING("CBSSERVER: <<< CCbsServer::ReLoadSimTopicsL()"); - } - -// ================= OTHER EXPORTED FUNCTIONS ============== - -// ----------------------------------------------------------------------------- -// E32Main -// E32Main implements the executable entry function. -// Creates a cleanup stack and runs the server. -// Returns: Zero -// ----------------------------------------------------------------------------- -// -GLDEF_C TInt E32Main() - { - __UHEAP_MARK; - CTrapCleanup* cleanup = CTrapCleanup::New(); - - TRAPD( error, InitServerL() ); - - __ASSERT_ALWAYS( !error, User::Panic( KCbsServerName, error) ); - delete cleanup; - __UHEAP_MARKEND; - return 0; - } - -// ========================== OTHER EXPORTED FUNCTIONS ========================= -// End of File