--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshengine/src/mussipprofilehandler.cpp Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,503 @@
+/*
+* 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".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Utilities to get and set profile used with SWIS.
+*
+*/
+
+
+// USER
+#include "mussipprofilehandler.h"
+#include "musuid.hrh"
+#include "muslogger.h"
+#include "mussipprofileuser.h"
+
+// SYSTEM
+#include <sip.h>
+#include <sipservertransaction.h>
+#include <sipinvitedialogassoc.h>
+#include <sipprofile.h>
+#include <sipprofileregistry.h>
+#include <sipprofilealrcontroller.h>
+#include <uri8.h>
+
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMusSipProfileHandler* CMusSipProfileHandler::NewL( MMusSipProfileUser& aUser )
+ {
+ CMusSipProfileHandler* self =
+ new (ELeave) CMusSipProfileHandler( aUser );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self);
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMusSipProfileHandler::CMusSipProfileHandler( MMusSipProfileUser& aUser )
+ : iUser( aUser )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ConstructL()
+ {
+ MUS_LOG( "mus: [ENGINE] -> CMusSipProfileHandler::ConstructL()" )
+
+ // Use NULL Uid since we do not want to receive any requests.
+ // All requests should be handled by MCE.
+ iSip = CSIP::NewL( TUid::Null(), *this );
+ iProfileRegistry = CSIPProfileRegistry::NewL( *iSip, *this );
+ iProfileAlrController =
+ CSipProfileAlrController::NewL( *iProfileRegistry , *this );
+
+ MUS_LOG( "mus: [ENGINE] <- CMusSipProfileHandler::ConstructL()" )
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMusSipProfileHandler::~CMusSipProfileHandler()
+ {
+ delete iProfileAlrController;
+ delete iSipProfile;
+ delete iProfileRegistry;
+ delete iSip;
+ MUS_LOG( "mus: [ENGINE] CMusSipProfileHandler::~CMusSipProfileHandler()" )
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::CreateProfileL( TUint32 aSipProfileId )
+ {
+ CSIPProfile* profile( NULL );
+ if ( aSipProfileId != 0 )
+ {
+ profile = iProfileRegistry->ProfileL( aSipProfileId );
+ }
+ else
+ {
+ profile = iProfileRegistry->DefaultProfileL();
+ }
+ CleanupStack::PushL( profile );
+ TBool profileRegistered = EFalse;
+ User::LeaveIfError( profile->GetParameter( KSIPProfileRegistered,
+ profileRegistered ) );
+ CleanupStack::Pop( profile );
+ delete iSipProfile;
+ iSipProfile = profile;
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CSIPProfile* CMusSipProfileHandler::Profile()
+ {
+ return iSipProfile;
+ }
+
+#if 0 //TODO: should this be removed?
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CSIPProfile& CMusSipProfileHandler::SipProfileL( TInt aSipProfileId )
+ {
+ MUS_LOG1( "mus: [ENGINE] -> CMusSipProfileHandler::SipProfileL(),\
+ od #%d", aSipProfileId )
+
+ if ( !iSipProfile )
+ {
+ if ( aSipProfileId != 0 )
+ {
+ iSipProfile = iProfileRegistry->ProfileL( aSipProfileId );
+ }
+ else
+ {
+ iSipProfile = iProfileRegistry->DefaultProfileL();
+ }
+ }
+
+ // The parameter val indicates if the profile can be immediately
+ // used for creating a session, or if the client must wait for
+ // the profile to be registered.
+ TBool profileRegistered = EFalse;
+
+ User::LeaveIfError( iSipProfile->GetParameter( KSIPProfileRegistered,
+ profileRegistered ) );
+
+ if ( !profileRegistered )
+ {
+
+ #if (defined (__WINS__) || defined(__WINSCW__))
+
+ iProfileRegistry->EnableL( *iSipProfile, *this );
+
+ User::LeaveIfError( iSipProfile->GetParameter( KSIPProfileRegistered,
+ profileRegistered ) );
+
+ if( !profileRegistered )
+ {
+ CActiveScheduler::Start();
+
+ User::LeaveIfError( iSipProfile->GetParameter(
+ KSIPProfileRegistered,
+ profileRegistered ) );
+
+ if ( !profileRegistered )
+ {
+ User::Leave( KErrNotReady );
+ }
+ }
+
+ #else
+
+ User::Leave( KErrNotReady );
+
+ #endif
+
+ }
+
+
+ MUS_LOG( "mus: [ENGINE] <- CMusSipProfileHandler::SipProfileL()" )
+
+ return *iSipProfile;
+ }
+#endif
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CUri8* CMusSipProfileHandler::UserFromProfileLC()
+ {
+ MUS_LOG( "mus: [ENGINE] -> CMusSipProfileHandler::UserFromProfileLC()" );
+
+ __ASSERT_ALWAYS( iSipProfile != NULL, User::Leave( KErrNotReady ) );
+
+ const MDesC8Array* aors = NULL;
+ User::LeaveIfError( iSipProfile->GetParameter( KSIPRegisteredAors, aors ) );
+ if( !aors || aors->MdcaCount() <= 0 )
+ {
+ User::Leave( KErrArgument );
+ }
+ TUriParser8 parser;
+ User::LeaveIfError( parser.Parse( aors->MdcaPoint( 0 ) ) );
+ MUS_LOG( "mus: [ENGINE] <- CMusSipProfileHandler::UserFromProfileLC()" )
+
+ return CUri8::NewLC( parser );
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::RefreshIapAvailabilities()
+ {
+ TRAP_IGNORE( iProfileAlrController->RefreshIapAvailabilityL( ProfileId() ) )
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ProfileRegistryEventOccurred(
+ TUint32 /*aProfileId*/,
+ MSIPProfileRegistryObserver::TEvent /*aEvent*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ProfileRegistryErrorOccurred(
+ TUint32 /*aProfileId*/,
+ TInt /*aError*/)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::IncomingRequest(
+ TUint32 /*aIapId*/,
+ CSIPServerTransaction* aTransaction )
+ {
+ // Ownership transferred, should not ever be called by SIP though
+ delete aTransaction;
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::TimedOut(
+ CSIPServerTransaction& /*aTransaction*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::IncomingRequest(
+ CSIPServerTransaction* aTransaction )
+ {
+ // Ownership transferred, should not ever be called by SIP though
+ delete aTransaction;
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::IncomingRequest(
+ CSIPServerTransaction* aTransaction,
+ CSIPDialog& /*aDialog*/)
+ {
+ // Ownership transferred, should not ever be called by SIP though
+ delete aTransaction;
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::IncomingResponse(
+ CSIPClientTransaction& /*aTransaction*/)
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::IncomingResponse(
+ CSIPClientTransaction& /*aTransaction*/,
+ CSIPDialogAssocBase& /*aDialogAssoc*/)
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::IncomingResponse(
+ CSIPClientTransaction& /*aTransaction*/,
+ CSIPInviteDialogAssoc* aDialogAssoc)
+ {
+ // Ownership transferred, should not ever be called by SIP though
+ delete aDialogAssoc;
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::IncomingResponse(
+ CSIPClientTransaction& /*aTransaction*/,
+ CSIPRegistrationBinding& /*aRegistration*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ErrorOccured(
+ TInt /*aError*/,
+ CSIPTransactionBase& /*aTransaction*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ErrorOccured(
+ TInt /*aError*/,
+ CSIPClientTransaction& /*aTransaction*/,
+ CSIPRegistrationBinding& /*aRegistration*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ErrorOccured(
+ TInt /*aError*/,
+ CSIPTransactionBase& /*aTransaction*/,
+ CSIPDialogAssocBase& /*aDialogAssoc*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ErrorOccured(
+ TInt /*aError*/,
+ CSIPRefresh& /*aSIPRefresh*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ErrorOccured(
+ TInt /*aError*/,
+ CSIPRegistrationBinding& /*aRegistration*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ErrorOccured(
+ TInt /*aError*/,
+ CSIPDialogAssocBase& /*aDialogAssoc*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::InviteCompleted(
+ CSIPClientTransaction& /*aTransaction*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::InviteCanceled(
+ CSIPServerTransaction& /*aTransaction*/ )
+ {
+ MUS_LOG( "mus: [ENGINE] CMusSipProfileHandler::CSIPServerTransaction")
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::ConnectionStateChanged(
+ CSIPConnection::TState /*aState*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CMusSipProfileHandler::AlrEvent
+// From MSipProfileAlrObserver
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::AlrEvent(
+ MSipProfileAlrObserver::TEvent aEvent,
+ TUint32 aProfileId,
+ TUint32 /*aSnapId*/,
+ TUint32 aIapId )
+ {
+ if ( aEvent == MSipProfileAlrObserver::EIapAvailable )
+ {
+ if ( iSipProfile &&
+ aProfileId == ProfileId() &&
+ !iUser.IsRoamingBetweenAPsAllowed() )
+ {
+ // Disallow roaming only if the profile is used by MuS and
+ // the MuS has an ongoing session
+ TRAP_IGNORE(
+ iProfileAlrController->DisallowMigrationL( aProfileId, aIapId ) )
+ }
+ else
+ {
+ // In all other cases allow roaming
+ TRAP_IGNORE(
+ iProfileAlrController->AllowMigrationL( aProfileId, aIapId ) )
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMusSipProfileHandler::AlrError
+// From MSipProfileAlrObserver
+// -----------------------------------------------------------------------------
+//
+void CMusSipProfileHandler::AlrError(
+ TInt /*aError*/,
+ TUint32 /*aProfileId*/,
+ TUint32 /*aSnapId*/,
+ TUint32 /*aIapId*/ )
+ {
+ // Ignore ALR related errors as they should not happen
+ // as migration is not allowed when
+ // the instance of CMusSipProfileHandler exists
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TUint32 CMusSipProfileHandler::ProfileId() const
+ {
+ TUint32 sipProfileId( 0 );
+ if ( iSipProfile )
+ {
+ iSipProfile->GetParameter( KSIPProfileId, sipProfileId );
+ }
+ return sipProfileId;
+ }