mmsharing/mmshavailability/src/musavasip.cpp
changeset 0 f0cf47e981f9
child 32 73a1feb507fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshavailability/src/musavasip.cpp	Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,492 @@
+/*
+* Copyright (c) 2005-2006 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:  30.1.4 % << Don't touch! Updated by Synergy at check-out.
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   This is main SIP class for MusAvailability Plug-in
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "musavasip.h"
+#include "musavasharedobject.h"
+#include "musavasipobserver.h"
+#include "musavasipconnectionobserver.h"
+#include "musavailabilityplugin.hrh"
+#include "musavasipprofileregistryobserver.h"
+#include "muslogger.h"
+#include "mussettingskeys.h"
+#include "mussettings.h"
+#include "musavaclientresolverutil.h"
+
+#include <charconv.h>
+#include <sip.h>
+#include <sipobserver.h>
+#include <sipconnectionobserver.h>
+#include <sipprofile.h>
+#include <sipprofileregistry.h>
+#include <utf.h>
+#include <siperr.h>
+
+const TInt KMaxUriLength = 512;
+
+// -----------------------------------------------------------------------------
+// C++ destructor.
+// -----------------------------------------------------------------------------
+//
+CMusAvaSip::~CMusAvaSip()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::~CMusAvaSip()" )
+    // Try to remove client information from CenRep of client resolver.
+    // This functionality is needed in __VOIP enabled builds.
+    // In normal build 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.
+    MUS_LOG( "mus: [MUSAVA]     Deleting CSIPProfile instance" )
+    if ( iSipProfile && iClientResolverUtil )
+        {
+        TRAP_IGNORE( 
+            iClientResolverUtil->UnRegisterClientWithUserL( *iSipProfile ) )
+        }
+    delete iSipProfile;    
+    delete iClientResolverUtil;
+        
+    MUS_LOG( "mus: [MUSAVA]     Deleting CSIPProfileRegistry instance" )
+    delete iSipProfileRegistry;
+    MUS_LOG( "mus: [MUSAVA]     Deleting SIP registry observer" )
+    delete iSipProfileRegistryObserver;
+    MUS_LOG( "mus: [MUSAVA]     Deleting CSIPConnection instance" )
+    delete iSipConnection;
+    MUS_LOG( "mus: [MUSAVA]     Deleting SIP connection observer" )
+    delete iSipConnectionObserver;
+    MUS_LOG( "mus: [MUSAVA]     Deleting CSIP instance" )
+    delete iSip;
+    delete iSipObserver;
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::~CMusAvaSip()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMusAvaSip* CMusAvaSip::NewL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::NewL()" )
+    CMusAvaSip* self = new (ELeave) CMusAvaSip();
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::NewL()" )
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// C++ Constructor
+// -----------------------------------------------------------------------------
+//
+CMusAvaSip::CMusAvaSip()
+    {
+    iSipProfileRegistry = NULL;
+    iSipProfile = NULL;
+    iSipConnection = NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// Symbian second-phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CMusAvaSip::ConstructL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::ConstructL()" )
+    // create observer classes (that are not dependant on actual instances)
+    iSipObserver = CMusAvaSipObserver::NewL();
+    iSipConnectionObserver = CMusAvaSipConnectionObserver::NewL();
+    iSipProfileRegistryObserver = CMusAvaSipProfileRegistryObserver::NewL();
+
+    TUid KUidMusAva = { 0x1028238D };
+    // create sip instance
+    iSip = CSIP::NewL( KUidMusAva, *iSipObserver );
+    
+    /**
+     * Try to instantiate utility object that handles special client resolving 
+     * in __VOIP enabled terminals. In __VOIP disabled terminals creation of
+     * this object will fail because of missing UID in CenRep and thus this 
+     * pointer can be NULL. If this object does not exist, standard client
+     * resolving will be used.
+     */
+    TRAP_IGNORE( iClientResolverUtil = CMusAvaClientResolverUtil::NewL() )
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::ConstructL()" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::AddAdapterL( MMusAvaSipConnectionAdapter& aAdapter, TInt aIndex )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::\
+             AddAdapterL( MMusAvaSipConnectionAdapter& aAdapter )" )
+    iSipConnectionObserver->AddObserverL( aAdapter, aIndex );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::\
+             AddAdapterL( MMusAvaSipConnectionAdapter& aAdapter )" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::RemoveAdapter( MMusAvaSipConnectionAdapter& aAdapter )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::\
+             RemoceAdapter( MMusAvaSipConnectionAdapter& aAdapter )" )
+    iSipConnectionObserver->RemoveObserver( aAdapter );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::\
+             RemoceAdapter( MMusAvaSipConnectionAdapter& aAdapter )" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::AddAdapterL( MMusAvaSipAdapter& aAdapter, TInt aIndex  )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::\
+             AddAdapterL( MMusAvaSipAdapter& aAdapter )" )
+    iSipObserver->AddObserverL( aAdapter, aIndex );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::\
+             AddAdapterL( MMusAvaSipAdapter& aAdapter )" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::RemoveAdapter( MMusAvaSipAdapter& aAdapter )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::RemoveAdapter( MMusAvaSipAdapter& aAdapter )" )
+    iSipObserver->RemoveObserver( aAdapter );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::RemoveAdapter( MMusAvaSipAdapter& aAdapter )" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::AddAdapterL( MMusAvaSipProfileRegistryAdapter& aAdapter )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::\
+             AddAdapterL( MMusAvaSipProfileRegistryAdapter& aAdapter )" )
+    iSipProfileRegistryObserver->AddAdapterL( aAdapter );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::\
+             AddAdapterL( MMusAvaSipProfileRegistryAdapter& aAdapter )" )
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::RemoveAdapter( MMusAvaSipProfileRegistryAdapter& aAdapter )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::\
+             RemoveAdapter( MMusAvaSipProfileRegistryAdapter& aAdapter )" )
+    iSipProfileRegistryObserver->RemoveAdapter( aAdapter );
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::\
+             RemoveAdapter( MMusAvaSipProfileRegistryAdapter& aAdapter )" )
+    }
+  
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+CSIPConnection* CMusAvaSip::ConnectionL( TBool aForceCreation )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::Connection()" )
+    if ( aForceCreation )
+        {
+        CreateSIPConnectionL();
+        }
+    __ASSERT_ALWAYS( iSipConnection, User::Leave( KErrSIPInvalidRegistrationState ) );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::Connection()" )
+    return iSipConnection;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+MSIPConnectionObserver& CMusAvaSip::ConnectionObserver()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::ConnectionObserver()" )
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::ConnectionObserver()" )
+    return *iSipConnectionObserver;
+    }
+    
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TBool CMusAvaSip::CreateProfileL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::CreateProfileL()" )
+
+  	TBool retVal = ETrue;
+  	if ( CreateSipProfile() )
+  		{
+        TInt err = iSipProfile->GetParameter( KSIPAccessPointId, iIapId );
+        if ( err != KErrNone )
+  		    {
+  		    MUS_LOG1( "SIP Access Point not found = %d", err )   
+        	retVal = EFalse;
+  		    }
+  		}
+  	else
+  		{
+  		retVal = EFalse;
+  		}        
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::CreateProfileL()" )
+    return retVal;
+    }
+
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TBool CMusAvaSip::CreateSipProfile()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::CreateSipProfile()" )
+    if ( iSipProfile )
+        {
+        MUS_LOG( "mus: [MUSAVA]  Profile is already created" )
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::CreateSipProfile()" )
+        return ETrue;
+        }
+    
+    CSIPProfileRegistry* registry = NULL;
+
+    //get profile registry
+    MUS_LOG( "mus: [MUSAVA]   Fetch profile registry" )
+    TRAPD( error_registry, registry = &ProfileRegistryL() );
+    if( error_registry )
+        {
+        MUS_LOG( "mus: [MUSAVA]    ProfileRegistry is not created" )
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::CreateSipProfile()" )
+        return EFalse;
+        }
+    // try to resolve the profile
+    MUS_LOG( "mus: [MUSAVA]   Fetch  SIP Profile" )
+    TRAPD( error_profile, iSipProfile = GetMusProfileL( *registry ) );
+    if( error_profile )
+        {
+        MUS_LOG( "mus: [MUSAVA]    Profile is not found" )
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::CreateSipProfile()" )
+        return EFalse;
+        }
+    else
+        {
+        MUS_LOG( "mus: [MUSAVA]  Profile is  created" )
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::CreateSipProfile()" )
+        return ETrue;
+        }
+    }
+
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+CSIPProfile* CMusAvaSip::Profile()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::Profile()" )
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::Profile()" )
+    return iSipProfile;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+CSIPProfileRegistry& CMusAvaSip::ProfileRegistryL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::ProfileRegistry()" )
+    if ( !iSipProfileRegistry )
+        {
+        MUS_LOG( "mus: [MUSAVA]  create sip profile registry" )
+        // create sip profile registry
+        iSipProfileRegistry = CSIPProfileRegistry::NewL(
+                                    *iSip,
+                                    *iSipProfileRegistryObserver );
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::ProfileRegistry()" )
+    return *iSipProfileRegistry;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+HBufC* CMusAvaSip::OwnDomainLC()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::OwnDomainLC()" )
+    
+    HBufC* domain = KNullDesC().AllocLC();
+    if( iSipProfile )
+        {
+        const MDesC8Array* domainNameArray( NULL );
+        iSipProfile->GetParameter( KSIPRegisteredAors, domainNameArray );
+
+        if( domainNameArray )
+            {
+            if( domainNameArray->MdcaCount() > 0 )
+                {
+                TBuf<KMaxUriLength> domain16;
+                const TDesC8& domain8 = domainNameArray->MdcaPoint( 0 );
+
+                _LIT8( KAt, "@" );
+
+                TInt index = domain8.Find( KAt() );
+
+                User::LeaveIfError(
+                        CnvUtfConverter::ConvertToUnicodeFromUtf8(
+                                domain16,
+                                domain8.Mid( index + KAt().Length() ) ) );
+                CleanupStack::PopAndDestroy( domain );
+                domain = domain16.AllocLC();
+                }
+            }
+        }
+        
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::OwnDomainLC()" )
+    return domain;
+    }
+
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+CSIP& CMusAvaSip::Sip()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::Sip()" )
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::Sip()" )
+    return *iSip;
+    }
+    
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TInt CMusAvaSip::SipProfileId( TUint32& aSipProfileId )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::SipProfile()" )
+    //SIP Profile ID 
+    TInt profile_id_err = iSipProfile->GetParameter( KSIPProfileId, aSipProfileId );
+   	MUS_LOG1( "Profile id = %d", profile_id_err )
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::SipProfile()" )	
+    return profile_id_err;
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+CMusAvaClientResolverUtil* CMusAvaSip::ClientResolverUtil() const
+    {
+    return iClientResolverUtil;
+    }
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::DeleteSIPConnection()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::DeleteSIPConnection()" )
+        delete iSipConnection; iSipConnection = NULL;
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::DeleteSIPConnection()" )
+    }
+
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSip::CreateSIPConnectionL()
+    {
+    MUS_LOG1( "mus: [MUSAVA]  -> CMusAvaSip::CreateSIPConnectionL(), iapid:%d", 
+              iIapId )
+    
+   	if ( !iSipConnection )
+   	    {
+   	    iSipConnection = CSIPConnection::NewL( *iSip,
+                                               iIapId,
+                                               *iSipConnectionObserver );
+        }
+   	                                           
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::CreateSIPConnectionL()" )
+    }
+
+
+// ---------------------------------------------------------------------------------
+// Gets profile to be used with Mus.
+// ---------------------------------------------------------------------------------
+//
+CSIPProfile* CMusAvaSip::GetMusProfileL( CSIPProfileRegistryBase& aRegistry )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaSip::GetMusProfileL" )
+    CSIPProfile* profile = NULL;
+    TUint32 profileId = KErrNone;
+
+    // Try to fetch profileId for profile meant to be used with Mus
+    TRAPD( err, profileId =
+            MultimediaSharingSettings::SipProfileSettingL() );
+
+    if( err != KErrNone || profileId == KErrNone )
+        {
+        MUS_LOG( "mus: [MUSAVA]     Using default profile" )
+        profile = aRegistry.DefaultProfileL();
+        }
+    else if ( (TInt )profileId == KErrNotFound )
+        {
+        MUS_LOG( "mus: [MUSAVA]     Setting: Mus is not allowed to use any \
+            SIP profiles" )
+        MUS_LOG1( "mus: [MUSAVA]     User::Leave( %d )",
+                  KErrNotSupported )
+        User::Leave( KErrNotSupported );
+        }
+    else 
+        {
+        MUS_LOG( "mus: [MUSAVA]     Try to fetch profile meant to be used with Mus" )
+        profile = aRegistry.ProfileL( profileId );
+        err = profile->GetParameter( KSIPProfileId,profileId );
+        if( err != KErrNone)
+            {
+            MUS_LOG1("mus: [MUSAVA]    SIP Profile ID %d",profileId )
+            }  
+        } 
+
+    // If not possible, use default profile. If not able, leave.
+    if ( !profile )
+        {
+        MUS_LOG( "mus: [MUSAVA]     Not found" )
+        MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::GetMusProfileL" )
+        User::Leave( KErrNotFound );
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::GetMusProfileL" )
+    return profile;
+    };
+        
+
+
+
+
+