diff -r 000000000000 -r f0cf47e981f9 mmsharing/mmshavailability/src/musavaregisteravailability.cpp --- /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 +#include +#include +#include +#include + + +// ----------------------------------------------------------------------------- +// 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; + } + } +