diff -r 000000000000 -r c8caa15ef882 simpleengine/siputils/src/simplesipprofileobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpleengine/siputils/src/simplesipprofileobserver.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,310 @@ +/* +* Copyright (c) 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: sip connection +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include "simplesipprofileobserver.h" + +#ifdef _DEBUG +#include "simpledebugutils.h" +#endif + + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::CSimpleSipProfileObserver +// ---------------------------------------------------------- +// +CSimpleSipProfileObserver::CSimpleSipProfileObserver( CSimpleSipConnectionObserver& aObs ) +: iObs(aObs) + { + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::~CSimpleSipProfileObserver +// ---------------------------------------------------------- +// +CSimpleSipProfileObserver::~CSimpleSipProfileObserver() + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: DESTRUCTOR start" )); +#endif + if ( iProfile && iRegistry ) + { + iRegistry->Disable( *iProfile ); + } + delete iProfile; + delete iRegistry; +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: DESTRUCTOR end" )); +#endif + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::NewL +// ---------------------------------------------------------- +// +CSimpleSipProfileObserver* CSimpleSipProfileObserver::NewL( + CSIP* aSIP, + CSimpleSipConnectionObserver& aObs ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: NewL" )); +#endif + CSimpleSipProfileObserver* self = new (ELeave) CSimpleSipProfileObserver( aObs ); + CleanupStack::PushL( self ); + self->ConstructL( aSIP ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::ConstructL +// ---------------------------------------------------------- +// +void CSimpleSipProfileObserver::ConstructL( CSIP* aSIP ) + { + iRegistry = CSIPProfileRegistry::NewL( *aSIP, *this ); + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::RegisterDefaultProfileL +// ---------------------------------------------------------- +// +void CSimpleSipProfileObserver::RegisterDefaultProfileL( ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: RegisterDefaultProfileL" )); +#endif + if ( iProfile ) + { + User::Leave( KErrAlreadyExists ); + } + + // Get the default profile. + iProfile = iRegistry->DefaultProfileL(); + + // Safety check that DefaultProfileL() didn't return NULL pointer. + if ( !iProfile ) + { + User::Leave( KErrNotFound ); + } + if ( !iRegistry->IsEnabled( *iProfile )) + { + // Ask Profile API to enable the retrieved profile for our use. + iRegistry->EnableL( *iProfile, iObs ); + } + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::RegisterGivenProfileL +// ---------------------------------------------------------- +// +void CSimpleSipProfileObserver::RegisterGivenProfileL( TUint32 aID ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: RegisterGivenProfileL id=%d" ), aID); +#endif + + RPointerArray profiles; + + if ( iProfile ) + { + User::Leave( KErrAlreadyExists ); + } + + // Search the profiles until the proper one is found. + iRegistry->ProfilesL( profiles ); + + TInt count = profiles.Count(); + TUint32 val = 0; + CSIPProfile* sippro = NULL; + for ( TInt i = 0; i < count; i++ ) + { + sippro = profiles[i]; + TInt err = sippro->GetParameter( KSIPProfileId, val ); +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: Profile id=%d" ), val); +#endif + if ( !err && val == aID) + { + // The profile matches for the given search criteria + iProfile = sippro; + } + else + { + // delete unnecessary profile entity, + // the ownership was transferred to us. + delete sippro; + } + } + + // reset array, unnecessary profiles are already deleted + profiles.Reset(); + + // Safety check that DefaultProfileL() didn't return NULL pointer. + if ( !iProfile ) + { + User::Leave( KErrNotFound ); + } + if ( !iRegistry->IsEnabled( *iProfile )) + { + // Ask Profile API to enable the retrieved profile for our use. + iRegistry->EnableL( *iProfile, iObs ); + } + + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::GiveConnectionL +// ---------------------------------------------------------- +// +CSIPConnection* CSimpleSipProfileObserver::GiveConnectionL() + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: GiveConnectionL" )); +#endif + // Check if the SIP connection is already enabled or should we + // wait it for. + TBool val( EFalse ); + TInt err = iProfile->GetParameter( KSIPProfileRegistered, val ); + User::LeaveIfError( err ); + // The pameter val indicates if the profile can be immediately used + if ( val ) + { + // get the SIP connection used by the profile + return iRegistry->ConnectionL( *iProfile ); + } + else + { + User::Leave( KErrNotReady ); + } + return (CSIPConnection*) NULL; + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::IsProfileActive +// ---------------------------------------------------------- +// +TBool CSimpleSipProfileObserver::IsProfileActive() + { + // Check if the SIP profile is active + // wait it for. + TBool val( EFalse ); + // Profile is created in ConstructL, so it exists. + if ( iProfile ) + { + iProfile->GetParameter( KSIPProfileRegistered, val ); + } + return val; + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::GiveUserAorL +// ---------------------------------------------------------- +// +TPtrC8 CSimpleSipProfileObserver::GiveUserAorL() + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: GiveUserAorL" )); +#endif + // Check first if registered + TBool val( EFalse ); + TInt err = iProfile->GetParameter( KSIPProfileRegistered, val ); + User::LeaveIfError( err ); + if ( !val) + { + User::Leave( KErrNotReady ); + } + // Get the first element in the array + const MDesC8Array* aors = 0; + err= iProfile->GetParameter( KSIPRegisteredAors, aors ); + User::LeaveIfError(err); + if ( !aors || aors->MdcaCount() == 0 ) + { + User::Leave( KErrNotReady ); + } + return aors->MdcaPoint(0); + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::ProfileRegistryEventOccurred +// ---------------------------------------------------------- +// +void CSimpleSipProfileObserver::ProfileRegistryEventOccurred( + TUint32 /*aProfileId*/, TEvent aEvent) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: ProfileRegistryEventOccurred event=%d" ), aEvent ); +#endif + if ( aEvent == EProfileRegistered ) + { + iObs.ProfileStateChanged( CSIPConnection::EActive, KErrNone ); + } + else if ( aEvent == EProfileDeregistered ) + { + iObs.ProfileStateChanged( CSIPConnection::EInactive, KErrNone ); + } + else if ( aEvent == EProfileUpdated ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - ProfileEnabled : %d" ), iRegistry->IsEnabled( *iProfile ) ); + TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - Profile reg er : %d" ), iRegistry->LastRegistrationError( *iProfile ) ); + TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - IsContextActive : %d" ), iProfile->IsContextActive() ); +#endif + + // Notify observer to refresh SIP connection. + iObs.ProfileUpdated(); + } + else if ( aEvent == EProfileDestroyed ) + { + iObs.ProfileStateChanged( CSIPConnection::EUnavailable, KErrNone ); + } + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::ProfileRegistryErrorOccurred +// ---------------------------------------------------------- +// +void CSimpleSipProfileObserver::ProfileRegistryErrorOccurred( + TUint32 /*aProfileId*/, TInt aError) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: ProfileRegistryErrorOccurred" )); +#endif + iObs.ProfileStateChanged( CSIPConnection::EUnavailable, aError ); + } + +// ---------------------------------------------------------- +// CSimpleSipProfileObserver::ProfileContext +// ---------------------------------------------------------- +// +MSIPRegistrationContext* CSimpleSipProfileObserver::ProfileContext() + { + return iProfile; + }