phoneclientserver/phoneserver/Src/Standard/CPhSrvServer.cpp
changeset 0 ff3b6d0fd310
child 19 7d48bed6ce0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneclientserver/phoneserver/Src/Standard/CPhSrvServer.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,681 @@
+/*
+* Copyright (c) 2002-2005 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:  Server.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPhSrvServer.h"
+#include "CPhSrvSession.h"
+#include "CPhSrvScheduler.h"
+#include "CPhSrvUssdManager.h"
+#include "CPhSrvResourceManager.h"
+#include "CPhSrvPhoneController.h"
+#include "CPhSrvCallRequestManager.h"
+#include "CPhSrvEmergencyRequestManager.h"
+#include "CPhSrvEmergencyNumberManager.h"
+
+#include "PhSrvUtils.h"
+#include "KPhSrvConfigure.h"            // debugprints ON/OFF
+#include "PhSrvDebugInfo.h"
+
+#include "MPhSrvComHandNegotiators.h"
+#include "CPhSrvComHandRequestManager.h"
+#include "MPhSrvMessengerNegotiators.h"
+#include "CPhSrvMessengerRequestManager.h"
+#include <featmgr.h>
+
+
+
+// CONSTANTS
+const TInt KPhSrvServerPriority = 100;  // phone server priority
+
+
+// The create function enumerations.
+enum 
+    {
+    ECreateIdle,             // Create idle.
+    ECreateEmergencyNegotiator, // Create Emergency Call negotiator
+    ECreateCallNegotiator,   // Create Call Negotiator.
+    ECreateUssdManager,      // Create USSD Manager.
+    ECreatePhoneInterface,   // Create Phone Interface.
+    ECreateEmergencyNumber,  // Create Emergency Number Manager.
+    ECreateComHandManager,   // Create command handler manager.
+    ECreateMessengerManager  // Create Messenger manager.
+    };
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::New
+// 
+// Create and start a new server.
+// -----------------------------------------------------------------------------
+//
+CPhSrvServer* CPhSrvServer::NewL()
+    {
+    // Create
+    CPhSrvServer* self = new ( ELeave ) CPhSrvServer( KPhSrvServerPriority );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CPhSrvServer
+// 
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CPhSrvServer::CPhSrvServer( TInt  aPriority )
+    : CServer2( aPriority ),
+    iFBSConnections( 0 )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CPhSrvServer
+// 
+// C++ Destructor
+// -----------------------------------------------------------------------------
+//
+CPhSrvServer::~CPhSrvServer()
+    {
+    CompleteCreateAll( KErrCancel );
+
+    delete iCreateAll;
+    delete iObjectConIx;
+    delete iUssdManager;
+    delete iEmergencyNumberManager;
+    delete iResourceFileManager;
+    delete iCallRequestManager;
+    delete iPhoneController;
+    delete iComHandRequestManager;
+    delete iMessengerRequestManager;
+
+    iFsSession.Close();
+    DisconnectFBS( ETrue );
+
+
+    // Frees the TLS! Must be done after FeatureManager is used.
+    FeatureManager::UnInitializeLib();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::ConstructL
+// 
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPhSrvServer::ConstructL()
+    {
+    // Sets up TLS, must be done before FeatureManager is used.
+    FeatureManager::InitializeLibL();
+
+
+    // Start server
+    TInt ret = Start( PHONE_SERVER_NAME );
+    __ASSERT_ALWAYS( ret == KErrNone || ret == KErrAlreadyExists, 
+        PhoneServerUtils::Panic( EPhoneServerPanicCouldNotStartServer ) );
+    User::LeaveIfError( ret );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::NewSessionL
+// 
+// Create a new session.
+// -----------------------------------------------------------------------------
+//
+CSession2* CPhSrvServer::NewSessionL( 
+    const TVersion& aVersion,
+    const RMessage2& /*aMessage*/ ) const 
+    {
+    // Check the right version
+    TVersion v( KPhoneServerMajorVersionNumber,
+                KPhoneServerMinorVersionNumber,
+                KPhoneServerBuildVersionNumber );
+
+    if( !User::QueryVersionSupported( v, aVersion ) )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    // Create a new session
+    CSession2* session = CPhSrvSession::NewL( 
+        *const_cast< CPhSrvServer* >( this ) );
+
+    return session;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CreateAllL
+// -----------------------------------------------------------------------------
+//
+void CPhSrvServer::CreateAllL( CPhSrvSession& aSession )
+    {
+    if ( !iCreateAll )
+        {
+        iCreateAll = CIdle::NewL( CActive::EPriorityStandard );
+        }
+
+    User::LeaveIfError( iCreateAllArray.Append( &aSession ) );
+
+    if ( !iCreateAll->IsActive() )
+        {
+        iCreateAllStep = ECreateIdle;
+        iCreateAllError = KErrNone;
+
+        iCreateAll->Start( TCallBack( DoCreateAllStepL, this ) );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CancelCreateAll
+// -----------------------------------------------------------------------------
+//
+void CPhSrvServer::CancelCreateAll( CPhSrvSession& aSession )
+    {
+    TInt pos = iCreateAllArray.Find( &aSession );
+    if ( pos != KErrNotFound )
+        {
+        iCreateAllArray.Remove( pos );
+        aSession.CompleteCreateAll( KErrCancel );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::NewContainerL
+// 
+// Create a new object container for session.
+// -----------------------------------------------------------------------------
+//
+CObjectCon* CPhSrvServer::NewContainerL() const
+    {
+    if ( !iObjectConIx )
+        {
+        iObjectConIx = CObjectConIx::NewL();
+        }
+
+    return iObjectConIx->CreateL();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::RemoveContainer
+// 
+// Remove object container.
+// -----------------------------------------------------------------------------
+//
+void  CPhSrvServer::RemoveContainer( CObjectCon* aCon )
+    {
+    iObjectConIx->Remove( aCon );
+    }
+    
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CallNegotiatorL
+// 
+// Access the call negotiator
+// -----------------------------------------------------------------------------
+//
+MPhSrvNegotiatorCall& CPhSrvServer::CallNegotiatorL()
+    {
+    if ( !iCallRequestManager )
+        {
+        CPhSrvCallRequestManager* self = 
+            new (ELeave) CPhSrvCallRequestManager();
+        CleanupStack::PushL( self );
+        self->ConstructL();
+        CleanupStack::Pop( self );
+
+        iCallRequestManager = self;
+        }
+    
+    return *iCallRequestManager;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CallNegotiator
+// 
+// Access the call negotiator
+// -----------------------------------------------------------------------------
+//
+MPhSrvNegotiatorCall& CPhSrvServer::CallNegotiator() const
+    {
+    __ASSERT_DEBUG( IsCallNegotiator(), 
+        PhoneServerUtils::Panic( EPhoneServerPanicNoCallInitiatorFault ) );
+    return *iCallRequestManager;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::EmergencyCallNegotiatorL
+// 
+// Access the emergency call negotiator
+// -----------------------------------------------------------------------------
+//
+MPhSrvEmergencyNegotiatorCall& CPhSrvServer::EmergencyCallNegotiatorL()
+    {
+    if ( !iEmergencyRequestManager )
+        {
+        CPhSrvEmergencyRequestManager* self = 
+            new (ELeave) CPhSrvEmergencyRequestManager();
+        CleanupStack::PushL( self );
+        self->ConstructL();
+        CleanupStack::Pop( self );
+
+        iEmergencyRequestManager = self;
+        }
+    
+    return *iEmergencyRequestManager;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::EmergencyCallNegotiatorL
+// 
+// Access the emergency call negotiator
+// -----------------------------------------------------------------------------
+//
+MPhSrvEmergencyNegotiatorCall& CPhSrvServer::EmergencyCallNegotiator() const
+    {
+    __ASSERT_DEBUG( IsCallNegotiator(), 
+        PhoneServerUtils::Panic( EPhoneServerPanicMissingEmerNegotiator ) );
+    return *iEmergencyRequestManager;
+    }
+    
+// -----------------------------------------------------------------------------
+// CPhSrvServer::IsEmergencyCallNegotiator
+// -----------------------------------------------------------------------------
+//
+TBool CPhSrvServer::IsEmergencyCallNegotiator() const
+    {
+    return ( iEmergencyRequestManager != NULL );
+    }
+  
+// -----------------------------------------------------------------------------
+// CPhSrvServer::UssdManagerL
+// -----------------------------------------------------------------------------
+//
+CPhSrvUssdManager& CPhSrvServer::UssdManagerL()
+    {
+    if ( !iUssdManager )
+        {
+        CPhSrvUssdManager* self = 
+            new ( ELeave ) CPhSrvUssdManager( 
+                FsSessionL(), 
+                ResourceManagerL()
+               );
+
+        CleanupStack::PushL( self );
+        self->ConstructL( PhoneInterfaceL() );
+        CleanupStack::Pop( self );
+
+        iUssdManager = self;
+        }
+   
+    return *iUssdManager;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::PhoneInterfaceL
+// -----------------------------------------------------------------------------
+//
+MPhSrvPhoneInterface& CPhSrvServer::PhoneInterfaceL()
+    {
+    if ( !iPhoneController )
+        {
+        CPhSrvPhoneController* self = 
+            new( ELeave ) CPhSrvPhoneController();
+        CleanupStack::PushL( self );
+        self->ConstructL();
+        CleanupStack::Pop( self );
+
+        iPhoneController = self;
+        }
+
+    return *iPhoneController;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::EmergencyNumberManagerL
+// -----------------------------------------------------------------------------
+//
+MPhSrvEmergencyNumberManager& CPhSrvServer::EmergencyNumberManagerL()
+    {
+    if ( !iEmergencyNumberManager )
+        {
+        PhoneInterfaceL(); // if succeeds iPhoneController ok after this
+        
+        CPhSrvEmergencyNumberManager* self =
+            new ( ELeave ) CPhSrvEmergencyNumberManager( *iPhoneController );
+
+        TBool isDosEnPolicy = 
+            FeatureManager::FeatureSupported( KFeatureIdEnPolicyDos );            
+        CleanupStack::PushL( self );
+        self->ConstructL( isDosEnPolicy );
+        CleanupStack::Pop( self );
+
+        iEmergencyNumberManager = self;    
+        }
+    
+    return *iEmergencyNumberManager;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::IsCallNegotiator
+// -----------------------------------------------------------------------------
+//
+TBool CPhSrvServer::IsCallNegotiator() const
+    {
+    return ( iCallRequestManager != NULL );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::IsUssdManager
+// -----------------------------------------------------------------------------
+//
+TBool CPhSrvServer::IsUssdManager() const
+    {
+    return ( iUssdManager != NULL );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::ComHandNegotiatorL
+// 
+// Access the command handler negotiator.
+// -----------------------------------------------------------------------------
+//
+MPhSrvComHandNegotiator& CPhSrvServer::ComHandNegotiatorL()
+    {
+    if ( !iComHandRequestManager )
+        {
+        CPhSrvComHandRequestManager* self = 
+            new ( ELeave ) CPhSrvComHandRequestManager( *this );
+        CleanupStack::PushL( self );
+        self->ConstructL();
+        CleanupStack::Pop( self );
+
+        iComHandRequestManager = self;
+        }
+    
+    return *iComHandRequestManager;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::ComHandNegotiatorL
+// 
+// Access the command handler negotiator.
+// -----------------------------------------------------------------------------
+//
+MPhSrvComHandNegotiator& CPhSrvServer::ComHandNegotiator() const
+    {
+    __ASSERT_DEBUG( IsComHandNegotiator(), 
+            PhoneServerUtils::Panic( EPhoneServerPanicMissingComInitiator ) );
+    return *iComHandRequestManager;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::IsComHandNegotiator
+// -----------------------------------------------------------------------------
+//
+TBool CPhSrvServer::IsComHandNegotiator() const
+    {
+    return ( iComHandRequestManager != NULL );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::MessengerNegotiatorL
+// 
+// Access the Messenger negotiator.
+// -----------------------------------------------------------------------------
+//
+MPhSrvMessengerNegotiator& CPhSrvServer::MessengerNegotiatorL()
+    {
+    if ( !iMessengerRequestManager )
+        {
+        CPhSrvMessengerRequestManager* self = 
+            new ( ELeave ) CPhSrvMessengerRequestManager( *this );
+        CleanupStack::PushL( self );
+        self->ConstructL();
+        CleanupStack::Pop( self );
+
+        iMessengerRequestManager = self;
+        }
+    
+    return *iMessengerRequestManager;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::MessengerNegotiator
+// 
+// Access the Messenger negotiator.
+// -----------------------------------------------------------------------------
+//
+MPhSrvMessengerNegotiator& CPhSrvServer::MessengerNegotiator() const
+    {
+    __ASSERT_DEBUG( IsMessengerNegotiator(), 
+        PhoneServerUtils::Panic( EPhoneServerPanicMissingMessNegotiator ) );
+    return *iMessengerRequestManager;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::IsMessengerNegotiator
+// -----------------------------------------------------------------------------
+//
+TBool CPhSrvServer::IsMessengerNegotiator() const
+    {
+    return ( iMessengerRequestManager != NULL );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::FsSessionL
+// -----------------------------------------------------------------------------
+//
+RFs& CPhSrvServer::FsSessionL()
+    {
+    if ( !iFsSession.Handle() )
+        {
+        User::LeaveIfError( iFsSession.Connect() );
+        }
+
+    return iFsSession;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::ResourceManagerL
+// -----------------------------------------------------------------------------
+//
+CPhSrvResourceManager& CPhSrvServer::ResourceManagerL()
+    {
+    if ( !iResourceFileManager )
+        {
+        CPhSrvResourceManager* self = 
+            new ( ELeave ) CPhSrvResourceManager( FsSessionL() );
+        CleanupStack::PushL( self );
+        self->ConstructL();
+        CleanupStack::Pop( self );
+
+        iResourceFileManager = self;
+        }
+    
+    return *iResourceFileManager;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CreateAllStepL
+// -----------------------------------------------------------------------------
+//
+TInt CPhSrvServer::CreateAllStepL()
+    {
+    TInt old = iCreateAllStep;
+    TRAPD( err, PerformNextStepL() );
+    if ( old == iCreateAllStep )
+        {
+        iCreateAllStep = ECreateIdle;
+        err = KErrGeneral;
+        }
+
+    iCreateAllError = Min( iCreateAllError, err );
+    
+    if ( iCreateAllStep == ECreateIdle )
+        {
+        CompleteCreateAll( iCreateAllError );
+        return 0; // To stop idle
+        }
+    
+    return 1; // To continue idle processing
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::PerformNextStepL
+// -----------------------------------------------------------------------------
+//
+void CPhSrvServer::PerformNextStepL()
+    {
+    switch ( iCreateAllStep )
+        {
+        case  ECreateEmergencyNegotiator:
+            iCreateAllStep = ECreateCallNegotiator;
+            EmergencyCallNegotiatorL();
+            break;
+            
+        case ECreateCallNegotiator:
+            iCreateAllStep = ECreateUssdManager;
+            CallNegotiatorL();
+            break;
+
+        case ECreateUssdManager:
+            iCreateAllStep = ECreatePhoneInterface;
+            UssdManagerL();
+            break;
+
+        case ECreatePhoneInterface:
+            iCreateAllStep = ECreateEmergencyNumber;
+            PhoneInterfaceL();
+            break;
+
+        case ECreateEmergencyNumber:
+            iCreateAllStep = ECreateComHandManager;
+            EmergencyNumberManagerL();
+            break;
+
+        case ECreateComHandManager:
+            iCreateAllStep = ECreateMessengerManager;
+            ComHandNegotiatorL();
+            break;
+
+        case ECreateMessengerManager:
+            iCreateAllStep = ECreateIdle;
+            // Create messenger negotiator only if needed.
+            if ( FeatureManager::FeatureSupported( 
+                KFeatureIdCsVideoTelephony ) )
+                {
+                MessengerNegotiatorL();
+                }
+            break;
+
+        case ECreateIdle:
+        default:
+            iCreateAllStep = ECreateEmergencyNegotiator;            
+            break;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::CompleteCreateAll
+// -----------------------------------------------------------------------------
+//
+void CPhSrvServer::CompleteCreateAll( TInt aError )
+    {
+    TInt count = iCreateAllArray.Count();
+    TInt index;
+
+    for ( index = 0; index < count; index++ )
+        {
+        iCreateAllArray[ index ]->CompleteCreateAll( aError );
+        }
+
+    iCreateAllArray.Close();
+    
+    delete iCreateAll; 
+    iCreateAll = NULL;
+
+    iCreateAllError = KErrNone;
+    iCreateAllStep = ECreateIdle;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::DoCreateAllStepL
+// -----------------------------------------------------------------------------
+//
+TInt CPhSrvServer::DoCreateAllStepL( TAny* aAny )
+    {
+    return static_cast< CPhSrvServer* >( aAny )->CreateAllStepL();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::ConnectFBS
+// -----------------------------------------------------------------------------
+//
+TInt CPhSrvServer::ConnectFBS()
+    {
+    TInt err( KErrNone );
+    if ( iFBSConnections == 0 )
+        {
+        err = RFbsSession::Connect();
+        }
+
+    if ( err == KErrNone )
+        {
+        iFBSConnections++;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhSrvServer::DisconnectFBS
+// -----------------------------------------------------------------------------
+//
+void CPhSrvServer::DisconnectFBS( TBool aForce )
+    {
+    iFBSConnections--;
+    if ( iFBSConnections == 0 || aForce )
+        {
+        RFbsSession::Disconnect();
+        }
+    }
+
+// End of file