--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/CbsServer/ServerSrc/CCbsServer.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,519 @@
+/*
+* 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 <e32svr.h>
+#include <barsc.h>
+
+#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 <e32property.h>
+#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