--- /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;
+ };
+
+
+
+
+
+