mmsharing/mmshavailability/src/musavaregisteravailability.cpp
changeset 0 f0cf47e981f9
child 31 33a5d2bbf6fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshavailability/src/musavaregisteravailability.cpp	Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,599 @@
+/*
+* Copyright (c) 2005-2007 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".
+*  Version     : %version: 42.1.4.1.3 % << Don't touch! Updated by Synergy at check-out.
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Provide interface for the client requestin availability class.
+*
+*/
+
+
+
+#include "musavaregisteravailability.h"
+#include "musavaavailabilityobserver.h"
+#include "musunittesting.h"
+#include "musavaobserver.h"
+#include "musavaavailability.h"
+#include "musavasharedobject.h"
+#include "muslogger.h"
+#include "musavasettingsimp.h"
+#include "musavasip.h"
+#include "musavaconnectionmonitor.h"
+#include "mussettings.h"
+#include "musavaclientresolverutil.h"
+
+#include <e32base.h>
+#include <sipprofile.h>
+#include <sipprofileregistry.h>
+#include <sipprofileregistryobserver.h>
+#include <escapeutils.h>
+
+
+// -----------------------------------------------------------------------------
+// Symbian two-phase constructor
+// -----------------------------------------------------------------------------
+//
+CMusAvaRegisterAvailability* CMusAvaRegisterAvailability::NewL(
+    MMusAvaAvailabilityObserver& aObserver,
+    CMusAvaSettingsImp& aSettings )
+    {
+    CMusAvaRegisterAvailability* self =
+        CMusAvaRegisterAvailability::NewLC(
+            aObserver,
+            aSettings );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+//  Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CMusAvaRegisterAvailability* CMusAvaRegisterAvailability::NewLC(
+    MMusAvaAvailabilityObserver& aObserver,
+    CMusAvaSettingsImp& aSettings )
+    {
+    CMusAvaRegisterAvailability* self =
+        new (ELeave) CMusAvaRegisterAvailability(
+            aObserver,
+            aSettings );
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    return self;
+    }
+
+
+// ------------------------------------------------------------------------------
+//  Destructor.
+// ------------------------------------------------------------------------------
+//
+CMusAvaRegisterAvailability::~CMusAvaRegisterAvailability()
+    {
+    if ( iSharedObj )
+        {
+        iSharedObj->MusAvaSip().RemoveAdapter( *this );
+        iSharedObj->DeleteSingleton();
+        }
+    }
+
+
+// ------------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ------------------------------------------------------------------------------
+//
+void CMusAvaRegisterAvailability::ConstructL()
+    {
+    iSharedObj = CMusAvaSharedObject::GetSingletonL();
+    iSharedObj->MusAvaSip().AddAdapterL( *this );
+    iOperatorVariant = MultimediaSharingSettings::OperatorVariantSettingL();
+    }
+
+
+// -----------------------------------------------------------------------------
+//  Constructor.
+// -----------------------------------------------------------------------------
+//
+CMusAvaRegisterAvailability::CMusAvaRegisterAvailability(
+    MMusAvaAvailabilityObserver& aObserver,
+    CMusAvaSettingsImp& aSettings )
+    :CMusAvaAvailability( aObserver ),
+    iSettings( aSettings )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// Executes for the master - salve pattern.
+// -----------------------------------------------------------------------------
+//
+void CMusAvaRegisterAvailability::DoExecuteL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::DoExecuteL " )
+    SetState( MMusAvaObserver::EMusAvaStatusInProgress );
+    RegisterL();
+    // TBD: SetState( MMusAvaObserver::EMusAvaNameRegistration );
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::DoExecuteL " )
+    }
+
+
+// -----------------------------------------------------------------------------
+// Stop the execution.
+// -----------------------------------------------------------------------------
+//
+void CMusAvaRegisterAvailability::Stop()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::Stop" )
+    CSIPProfile* profile = iSharedObj->MusAvaSip().Profile();
+    if ( profile )
+        {
+        CSIPProfileRegistry* registry = NULL; // not own, so not deleted
+        TRAPD( error_register, registry = 
+        	&iSharedObj->MusAvaSip().ProfileRegistryL() );
+        if ( error_register == KErrNone )
+            {
+            MUS_LOG( "mus: [MUSAVA]    Sip profile registry found" )
+            TInt error = registry->Disable( *profile );
+            MUS_LOG1( "mus: [MUSAVA]	Disable Sip profile ( %d )", error )
+            }
+        }
+    
+    SetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::Stop" )
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMusAvaRegisterAvailability::Name
+//
+// -----------------------------------------------------------------------------
+//
+MMusAvaObserver::TAvailabilityName CMusAvaRegisterAvailability::Name()
+    {
+    return MMusAvaObserver::EMusAvaNameRegistration;
+    }
+
+
+// -----------------------------------------------------------------------------
+// An event related to SIP Profile has accorred
+// -----------------------------------------------------------------------------
+//
+void CMusAvaRegisterAvailability::ProfileRegistryEventOccurred(
+                        TUint32 aProfileId,
+                        MSIPProfileRegistryObserver::TEvent aEvent)
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::\
+             ProfileRegistryEventOccurred " )
+
+    CSIPProfile* profile = iSharedObj->MusAvaSip().Profile();
+    if ( !profile )
+        {
+        MUS_LOG( "mus: [MUSAVA]    no sip profile found, returning!" )
+        return;
+        }
+
+
+    TUint32 profileId = 0;
+    TUint connectionId = 0;
+
+    profile->GetParameter( KSIPProfileId, profileId );
+
+    if ( aProfileId == profileId )
+        {
+        switch (aEvent)
+            {
+            case MSIPProfileRegistryObserver::EProfileCreated:
+                {
+                MUS_LOG( "mus: [MUSAVA]     Profile is created" )
+                MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability\
+                        ::ProfileRegistryEventOccurred" )
+                }
+                break;
+
+            case MSIPProfileRegistryObserver::EProfileUpdated:
+                {
+                MUS_LOG( "mus: [MUSAVA]     Profile is updated" )
+                }
+                break;
+
+            case MSIPProfileRegistryObserver::EProfileRegistered:
+                {
+                MUS_LOG( "mus: [MUSAVA]     Profile is registred" )
+                
+                // Make sure that valid connection exists when registered
+                CSIPConnection* sipConnection = NULL;
+                TRAPD( err, sipConnection = iSharedObj->MusAvaSip().ConnectionL() );
+                if ( err != KErrNone || 
+                    !sipConnection || 
+                     sipConnection->State() == CSIPConnection::EUnavailable ||
+                     sipConnection->State() == CSIPConnection::ESuspended ||
+                     sipConnection->State() == CSIPConnection::EInactive )
+                    {
+                    MUS_LOG1( "mus: [MUSAVA]    CreateSIPConnectionL \
+                            leave #%d", err )
+                    SetState( MMusAvaObserver::MMusAvaObserver::EMusAvaConnectionErr );
+                    }
+                else
+                    {
+    				TRAP( err, connectionId =
+    					iSharedObj->ConnectionMonitor().ConnectionIDL() );
+    	            if ( err == KErrNotFound )
+    	            	{
+    	            	SetState( MMusAvaObserver::EMusAvaConnectionErr );
+    	            	}
+    	           	else
+    	           		{
+    	           		iSharedObj->ConnectionMonitor().SetConnectionID(
+    	           										connectionId );
+    	           		if( err != KErrNone )
+                            {
+                            MUS_LOG1( "mus: [MUSAVA]     ConnectionIdL \
+                            leave #%d", err )
+                            }
+                        }
+                    }
+                
+                MUS_LOG( "mus: [MUSAVA]     Enable profile." )
+                TRAP( err, EnableRegisterL() );
+                if( err != KErrNone )
+                    {
+                    MUS_LOG1( "mus: [MUSAVA]     EnableRegisterL leave #%d",
+                    err )
+                    }
+                                
+                TRAP( err, CreateSipAddressProposalL(); );
+                if( err != KErrNone )
+                    {
+                    MUS_LOG1( "mus: [MUSAVA]     CreateSipAddressProposalL \
+                    err #%d", err )
+                    }
+                
+                SetState( MMusAvaObserver::EMusAvaStatusAvailable );
+
+                // update sipprofile in settings
+                if ( profileId != iSettings.SipProfileId() )
+                    {
+                    MUS_LOG1( "mus: [MUSAVA]     Profile id in settings before\
+                    update:%d", iSettings.SipProfileId() )
+                    iSettings.SetSipProfileId( profileId );
+                    MUS_LOG1( "mus: [MUSAVA]     Profile id in settings after\
+                    update:%d", iSettings.SipProfileId() )
+                    }
+                else
+                    {
+                    MUS_LOG( "Profile is not needed to update!!!!!" )
+                    }
+                }
+                break;
+
+            case MSIPProfileRegistryObserver::EProfileDeregistered:
+                {
+                MUS_LOG( "mus: [MUSAVA]     Profile is deregistered" )
+                SetState( MMusAvaObserver::EMusAvaStatusNotRegistered );
+                iSharedObj->MusAvaSip().DeleteSIPConnection();
+                }
+                break;
+
+            case MSIPProfileRegistryObserver::EProfileDestroyed:
+                {
+                MUS_LOG( "mus: [MUSAVA]     Profile is destroyed " )
+                SetState( MMusAvaObserver::EMusAvaStatusNotRegistered );
+                }
+                break;
+
+            default:
+                MUS_LOG( "mus: [MUSAVA]     Unknown Profile Id" )
+                break;
+            }
+        }
+    else
+        {
+        MUS_LOG( "mus: [MUSAVA]    aProfileId != profileId" )
+        }
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::\
+             ProfileRegistryEventOccurred" )
+    }
+
+// -----------------------------------------------------------------------------
+// An asynchronous error has occurred related to SIP profile
+// Event is send to those observers, who have the
+// corresponding profile instantiated.
+// -----------------------------------------------------------------------------
+//
+void CMusAvaRegisterAvailability::ProfileRegistryErrorOccurred(
+    TUint32 aProfileId,
+    TInt aError )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::\
+             ProfileRegistryErrorOccurred" )
+
+    CSIPProfile* profile = iSharedObj->MusAvaSip().Profile();
+    if ( !profile )
+        {
+        return;
+        }
+
+    TUint32 profileId;
+
+    profile->GetParameter( KSIPProfileId, profileId );
+
+    if( profileId == aProfileId )
+        {
+        if ( iOperatorVariant == MusSettingsKeys::EOperatorSpecific &&
+                aError == KErrGeneral )
+            {
+            MUS_LOG( "SIP profile is disabled by the user" )
+            SetState( MMusAvaObserver::EMusActivationError );
+            }
+        else
+            {
+            MUS_LOG1("Error %d",aError )
+            SetState( MMusAvaObserver::EMusAvaStatusNotRegistered );
+            }
+        }
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::\
+             ProfileRegistryErrorOccurred" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusAvaRegisterAvailability::CreateSipAddressProposalL()
+    {
+    MUS_LOG( "mus: [MUSAVA] -> CMusAvaRegisterAvailability::\
+        CreateSipAddressProposalL() " )
+
+    HBufC* domain = iSharedObj->MusAvaSip().OwnDomainLC();
+
+    const TDesC& telNumber = iSettings.TelNumber();
+
+    iSettings.SetSipAddressProposalL( telNumber, *domain );
+
+    CleanupStack::PopAndDestroy( domain );
+
+    MUS_LOG( "mus: [MUSAVA] <- CMusAvaRegisterAvailability::\
+        CreateSipAddressProposalL() " )
+    }
+
+
+// -----------------------------------------------------------------------------
+// Connection state has changed.
+// iSipConnection has to be instantiated for us to get these callbacks.
+// from base class MSIPConnectionObserver
+// -----------------------------------------------------------------------------
+//
+TInt CMusAvaRegisterAvailability::ConnectionStateChanged(
+    CSIPConnection::TState aState )
+    {
+    MUS_LOG( "mus: [MUSAVA] -> CMusAvaRegisterAvailability::\
+    ConnectionStateChanged" )
+    TInt err = 0;
+    switch ( aState )
+        {
+        case CSIPConnection::EInit:
+            {
+            MUS_LOG( "mus: [MUSAVA] aState == CSIPConnection::EInit" )
+            break;
+            }
+        case CSIPConnection::EActive:
+            {
+            MUS_LOG( "mus: [MUSAVA] aState == CSIPConnection::EActive" )
+            break;
+            }
+        case CSIPConnection::ESuspended:
+            {
+            MUS_LOG( "mus: [MUSAVA] aState == CSIPConnection::ESuspended" )
+            SetState( MMusAvaObserver::EMusAvaConnectionErr );
+            break;
+            }
+        case CSIPConnection::EInactive:
+            {
+            MUS_LOG( "mus: [MUSAVA] aState == CSIPConnection::EInactive" )
+            // If we get here, then PDP context is probably
+            // unavailable => close an existing PDP context.
+            MUS_LOG( "mus: [MUSAVA] now calling CloseExistingConnectionL" )
+            iSharedObj->ConnectionMonitor().KillPdpContext();
+            TRAPD( leaveCode, err = RegisterL() )
+            if ( !leaveCode || err )
+                {
+                SetState( MMusAvaObserver::EMusAvaConnectionErr );
+                }
+            else
+                {
+                SetState( MMusAvaObserver::EMusAvaStatusAvailable );
+                }
+            break;
+            }
+        case CSIPConnection::EUnavailable:
+            {
+            MUS_LOG( "mus: [MUSAVA] aState == CSIPConnection::EUnavailable" )
+            SetState( MMusAvaObserver::EMusAvaConnectionErr );
+            break;
+            }
+        default:
+            {
+            MUS_LOG( "mus: [MUSAVA] in default branch => ESipConnUnknown" )
+            break;
+            }
+        }
+
+    MUS_LOG( "mus: [MUSAVA]: <- CMusAvaRegisterAvailability::ConnectionStateChanged" )
+
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// Initialize SIP Registration.
+// -----------------------------------------------------------------------------
+//
+TBool CMusAvaRegisterAvailability::InitializeRegister()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::\
+              InitializeRegister " )
+
+    MUS_LOG( "mus: [MUSAVA] Create SIP Profile " )
+    TBool profileCreated = EFalse;
+    TRAPD( err, profileCreated = iSharedObj->MusAvaSip().CreateProfileL() );
+    if ( err || !profileCreated )
+        {
+        MUS_LOG( "mus: [MUSAVA] Profile is not created " )
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::\
+                  InitializeRegister " )
+        SetState( MMusAvaObserver::EMusAvaStatusNoSipProfile );
+        return EFalse;
+        }
+        
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::\
+              InitializeRegister " )
+
+    return ETrue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// SIP Registration.
+// -----------------------------------------------------------------------------
+//
+TBool CMusAvaRegisterAvailability::RegisterL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::RegisterL " )
+
+    MUS_LOG( "mus: [MUSAVA]     Checks if the profile is not enabled - \
+                 Enable" )
+    if ( !InitializeRegister())
+        {
+        MUS_LOG( "mus: [MUSAVA]  SIP register initilisation fails " )
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::\
+        Register " )
+        return EFalse;
+        }
+        
+    EnableRegisterL();
+   	if ( !UpdateSIPProfile()  )
+   		{
+   		return EFalse;	
+   		}
+    return RegistrationStatusL();
+    }
+
+// -----------------------------------------------------------------------------
+// Enable SIP Registration.
+// -----------------------------------------------------------------------------
+//
+void CMusAvaRegisterAvailability::EnableRegisterL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::EnableRegisterL " )		
+ 	MUS_LOG( "mus: [MUSAVA]   Fetch SIP ProfileRegistry" )
+ 	
+   CSIPProfileRegistry& registry = iSharedObj->MusAvaSip().ProfileRegistryL();
+    MUS_LOG( "mus: [MUSAVA]   Profile status" )
+    if ( !registry.IsEnabled( *iSharedObj->MusAvaSip().Profile() ) )
+       {
+       MUS_LOG("mus: [MUSAVA]     Calling EnableL()" )
+       registry.EnableL( *iSharedObj->MusAvaSip().Profile(), 
+                       iSharedObj->MusAvaSip().ConnectionObserver() );
+       }
+      
+    // Try to write client information to CenRep of client resolver.
+    // This functionality is needed in __VOIP enabled terminals.
+    // In __VOIP disabled builds this will fail because of a lack of needed 
+    // CenRep UID. To avoid branching, we just try to do this and let it fail 
+    // in normal build.
+    CMusAvaClientResolverUtil* resolver = 
+                               iSharedObj->MusAvaSip().ClientResolverUtil();
+    if ( resolver )
+       {
+       TRAP_IGNORE( resolver->RegisterClientWithUserL( 
+               *iSharedObj->MusAvaSip().Profile() ) )
+       }
+                   
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::EnableRegisterL " )         
+    }
+
+
+// -----------------------------------------------------------------------------
+// Update SIP Registration.
+// -----------------------------------------------------------------------------
+//
+TBool CMusAvaRegisterAvailability::UpdateSIPProfile()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::UpdateSIPProfile " )
+    TUint32 profileId = 0; // Initial value doesn't matter. 
+                           // but better to set it to default profile
+    TInt err = iSharedObj->MusAvaSip().Profile()->GetParameter( 
+        KSIPProfileId, profileId );
+    if( err == KErrNone)
+        {
+        MUS_LOG1("mus: [MUSAVA]    Set SIP Profile ID in Central Repositary \
+            to %d",profileId )
+        iSettings.SetSipProfileId( profileId );
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::UpdateSIPProfile " )
+        return ETrue;
+        }
+    else
+    	{
+    	MUS_LOG1("mus: [MUSAVA]   SIP Profile ID is not found. \
+    	remove Id away from Central Repositary %d",err )
+    	iSettings.SetSipProfileId( err );
+    	MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::UpdateSIPProfile " )
+    	return EFalse;	
+    	}
+    }
+    
+// -----------------------------------------------------------------------------
+// SIP profile Registration status.
+// -----------------------------------------------------------------------------
+//
+TBool CMusAvaRegisterAvailability::RegistrationStatusL()
+	{
+	MUS_LOG( "mus: [MUSAVA]  -> CMusAvaRegisterAvailability::RegistrationStatusL " )	
+	MUS_LOG("mus: [MUSAVA]     Checking profile registration" )
+	
+	TBool registered;
+
+    TInt err = iSharedObj->MusAvaSip().Profile()->GetParameter( 
+        KSIPProfileRegistered, registered );
+
+    if( err != KErrNone || !registered )
+        {
+        MUS_LOG2( "mus: [MUSAVA]     Profile not registered, get error=%d, \
+            register value=%d", err, registered )
+
+        SetState( MMusAvaObserver::EMusAvaStatusInProgress );
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::RegistrationStatusL " )
+        return EFalse;
+        }
+    else
+        {
+        MUS_LOG("mus: [MUSAVA]     profile is registred " )
+        
+        iSharedObj->MusAvaSip().ConnectionL();
+        
+        MUS_LOG("mus: [MUSAVA]     connection created " )
+
+        HBufC* domain = iSharedObj->MusAvaSip().OwnDomainLC();
+        const TDesC& telNumber = iSettings.TelNumber();
+
+        iSettings.SetSipAddressProposalL( telNumber, *domain );
+
+        CleanupStack::PopAndDestroy( domain );
+        SetState( MMusAvaObserver::EMusAvaStatusAvailable );
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaRegisterAvailability::RegistrationStatusL " )	
+        return ETrue;
+        }
+    }
+