--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/SipprofileQueueHandling.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,464 @@
+// Copyright (c) 2006-2009 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:
+// Name : sipprofilequeuehandling.cpp
+// Part of : sip profile fsm
+// implementation
+// Version : 1.0
+//
+
+
+
+// INCLUDE FILES
+#include <bamdesca.h>
+#include "sipprofilequeuehandling.h"
+#include "sipprofilefsmuser.h"
+#include "sipconcreteprofile.h"
+#include "sipgendefs.h"
+#include "sipmanagedprofile.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::NewLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPProfileQueueHandling* CSIPProfileQueueHandling::NewLC(
+ MSIPProfileFSMUser& aUser )
+ {
+ CSIPProfileQueueHandling* self =
+ new(ELeave)CSIPProfileQueueHandling( aUser );
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::NewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPProfileQueueHandling* CSIPProfileQueueHandling::NewL(
+ MSIPProfileFSMUser& aUser )
+ {
+ CSIPProfileQueueHandling* self =
+ CSIPProfileQueueHandling::NewLC( aUser );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::CSIPProfileQueueHandling
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPProfileQueueHandling::CSIPProfileQueueHandling(
+ MSIPProfileFSMUser& aUser ) :
+ iUser( aUser )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileQueueHandling::ConstructL()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::~CSIPProfileQueueHandling
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPProfileQueueHandling::~CSIPProfileQueueHandling()
+ {
+ iRegisteringQueue.Close();
+ iDeregisteringQueue.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::AddIntoQueue()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileQueueHandling::AddIntoQueue(
+ CSIPConcreteProfile& aSIPConcreteProfile )
+ {
+ return iUser.AddProfileIntoQueue( aSIPConcreteProfile );
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::AddIntoDeregisterQueueL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileQueueHandling::AddIntoDeregisterQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile )
+ {
+ TSIPProfileQueueItem item( aSIPConcreteProfile, EFalse );
+ return AddToQueueNoDuplicatesL( iDeregisteringQueue, item );
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::AddIntoRegisterQueueL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileQueueHandling::AddIntoRegisterQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile,
+ TBool aRetryRegistration )
+ {
+ TSIPProfileQueueItem item( aSIPConcreteProfile, aRetryRegistration );
+ return AddToQueueNoDuplicatesL( iRegisteringQueue, item );
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::AddDeregisterToQueueL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPProfileQueueHandling::AddDeregisterToQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile )
+ {
+ TBool result = AddIntoQueue( aSIPConcreteProfile );
+ if (result)
+ {
+ result = AddIntoDeregisterQueueL( aSIPConcreteProfile );
+ }
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::AddRegisterToQueueL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPProfileQueueHandling::AddRegisterToQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile,
+ TBool aRetryRegistration )
+ {
+ TBool result = AddIntoQueue( aSIPConcreteProfile );
+ if (result)
+ {
+ result = AddIntoRegisterQueueL( aSIPConcreteProfile,
+ aRetryRegistration );
+ }
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::RegisterFromQueueL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPProfileQueueHandling::RegisterFromQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile )
+ {
+ // Called from ErrorEvent or SIPProfileStatusEvent
+ if ( !CheckRegisterQueueL( aSIPConcreteProfile ) )
+ {
+ CheckDeregisterQueueL( aSIPConcreteProfile );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::FoundIPSecProfileCandidate()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPProfileQueueHandling::FoundIPSecProfileCandidate()
+ {
+ TBool result = EFalse;
+ for (TInt i=0; i< iRegisteringQueue.Count() && !result; i++)
+ {
+ CSIPConcreteProfile& profile = iRegisteringQueue[i].iConcreteProfile;
+ result = profile.IsSecurityNegotiationEnabled() &&
+ (!(profile.ServerParameter(KSIPRegistrar, KSIPDigestRealm).Length()
+ &&
+ (profile.PrivateIdentity().Length() ||
+ profile.ServerParameter(KSIPRegistrar, KSIPDigestUserName).Length())
+ &&
+ profile.ServerParameter(KSIPRegistrar,KSIPDigestPassword).Length()));
+ }
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::CheckDeregisterQueueL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileQueueHandling::CheckDeregisterQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile )
+ {
+ TInt index = FindIndex( aSIPConcreteProfile, iDeregisteringQueue );
+ if ( index >= 0 )
+ {
+ CSIPConcreteProfile& profile =
+ iDeregisteringQueue[index].iConcreteProfile;
+ iUser.DeregisterProfileAfterQueueL( profile );
+ iDeregisteringQueue.Remove(index);
+ iDeregisteringQueue.Compress();
+ }
+ return (index >= 0);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::CheckRegisterQueueL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileQueueHandling::CheckRegisterQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile )
+ {
+ TInt index = FindIndex( aSIPConcreteProfile, iRegisteringQueue );
+ if ( index >= 0 )
+ {
+ CSIPConcreteProfile& profile =
+ iRegisteringQueue[index].iConcreteProfile;
+ if ( iRegisteringQueue[index].iRetryRegistration )
+ {
+ iUser.RetryProfileRegistrationAfterQueueL( profile );
+ }
+ else
+ {
+ iUser.RegisterProfileAfterQueueL( profile );
+ }
+ iRegisteringQueue.Remove(index);
+ iRegisteringQueue.Compress();
+ }
+ return (index >= 0);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::FindIndex()
+// -----------------------------------------------------------------------------
+//
+TInt CSIPProfileQueueHandling::FindIndex(
+ CSIPConcreteProfile& aSIPConcreteProfile,
+ RArray<TSIPProfileQueueItem>& aProfileArray )
+ {
+ TInt index = KErrNotFound;
+ for (TInt i=0; i< aProfileArray.Count() && index == KErrNotFound; i++)
+ {
+ if ( aProfileArray[i].iConcreteProfile.Server( KSIPRegistrar ).Compare(
+ aSIPConcreteProfile.Server( KSIPRegistrar ) ) == 0 )
+ {
+ index = i;
+ }
+ }
+ return index;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::IPSecProfileCandidate()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPConcreteProfile* CSIPProfileQueueHandling::IPSecProfileCandidate(
+ TBool& aRegistering )
+ {
+ CSIPConcreteProfile* profile = NULL;
+ TBool found = EFalse;
+ aRegistering = ETrue;
+
+ for (TInt i=0; i<iRegisteringQueue.Count() && !found; i++)
+ {
+ CSIPConcreteProfile& tmp = iRegisteringQueue[i].iConcreteProfile;
+ found = tmp.IsSecurityNegotiationEnabled() &&
+ (!(tmp.ServerParameter(KSIPRegistrar, KSIPDigestRealm).Length()
+ &&
+ (tmp.PrivateIdentity().Length() ||
+ tmp.ServerParameter(KSIPRegistrar, KSIPDigestUserName).Length())
+ &&
+ tmp.ServerParameter(KSIPRegistrar,KSIPDigestPassword).Length()));
+
+ if (found)
+ {
+ profile = &tmp;
+ iRegisteringQueue.Remove(i);
+ iRegisteringQueue.Compress();
+ }
+ }
+
+ for (TInt i=0; i< iDeregisteringQueue.Count() && !found; i++)
+ {
+ CSIPConcreteProfile& tmp = iDeregisteringQueue[i].iConcreteProfile;
+ found = tmp.IsSecurityNegotiationEnabled() &&
+ (!(tmp.ServerParameter(KSIPRegistrar, KSIPDigestRealm).Length()
+ &&
+ (tmp.PrivateIdentity().Length() ||
+ tmp.ServerParameter(KSIPRegistrar, KSIPDigestUserName).Length())
+ &&
+ tmp.ServerParameter(KSIPRegistrar,KSIPDigestPassword).Length()));
+ aRegistering = EFalse;
+ }
+
+ return profile;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::WaitingForAllowedNetworkProfile()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPConcreteProfile*
+CSIPProfileQueueHandling::WaitingForAllowedNetworkProfile(
+ TBool /*aOnHomeNetwork*/ )
+ {
+ // This function call and execution has been removed, but still in place as it is Exported and for future Use.
+ return NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::RemoveProfileFromRegQueueL()
+// (other items were commented in a header).
+// testi versio
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPConcreteProfile*
+CSIPProfileQueueHandling::RemoveProfileFromRegQueueL(
+ CSIPConcreteProfile& aSIPConcreteProfile)
+ {
+ TBool found = EFalse;
+ CSIPConcreteProfile* profile = NULL;
+ for (TInt i=0; i< iRegisteringQueue.Count() && !found; i++)
+ {
+ CSIPConcreteProfile& tmp = iRegisteringQueue[ i ].iConcreteProfile;
+ found = ( tmp.Id() == aSIPConcreteProfile.Id() );
+ profile = NULL;
+ if ( found )
+ {
+ profile = &tmp;
+ iRegisteringQueue.Remove( i );
+ iRegisteringQueue.Compress();
+ }
+ }
+ return profile;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::IsEmpty()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPProfileQueueHandling::IsEmpty() const
+ {
+ return (iRegisteringQueue.Count() == 0 &&
+ iDeregisteringQueue.Count() == 0);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::Cleanup()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSIPProfileQueueHandling::Cleanup(
+ CSIPConcreteProfile& aOldProfile,
+ CSIPConcreteProfile* aNewProfile )
+ {
+ QueueCleanup( iRegisteringQueue, aOldProfile, aNewProfile );
+ QueueCleanup( iDeregisteringQueue, aOldProfile, aNewProfile );
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::IsInQueue()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPProfileQueueHandling::IsInQueue(
+ CSIPConcreteProfile& aSIPConcreteProfile )
+ {
+ for (TInt i=0; i<iRegisteringQueue.Count();i++)
+ {
+ if (iRegisteringQueue[i].iConcreteProfile.Id() ==
+ aSIPConcreteProfile.Id() )
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::IsRegistrationAllowed
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPProfileQueueHandling::IsRegistrationAllowed(
+ CSIPConcreteProfile& /*aSIPConcreteProfile*/,
+ TBool /*aOnHomeNetwork*/ )
+ {
+ // This function call and execution has been removed, but still in place as it is Exported and for future Use.
+ return EFalse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::AddToQueueNoDuplicatesL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileQueueHandling::AddToQueueNoDuplicatesL(
+ RArray<TSIPProfileQueueItem>& aProfileArray,
+ TSIPProfileQueueItem& aProfileItem )
+ {
+ for (TInt i=0; i<aProfileArray.Count();i++)
+ {
+ if ( aProfileArray[i].iConcreteProfile.Id() ==
+ aProfileItem.iConcreteProfile.Id() )
+ {
+ return EFalse;
+ }
+ }
+ aProfileArray.AppendL( aProfileItem );
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileQueueHandling::QueueCleanup()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileQueueHandling::QueueCleanup(
+ RArray<TSIPProfileQueueItem>& aProfileArray,
+ CSIPConcreteProfile& aOldProfile,
+ CSIPConcreteProfile* aNewProfile )
+ {
+ TInt index = KErrNotFound;
+ for ( TInt i=0; i< aProfileArray.Count() && index == KErrNotFound; i++ )
+ {
+ if ( &(aProfileArray[i].iConcreteProfile) == &aOldProfile )
+ {
+ index = i;
+ }
+ }
+
+ if ( index == KErrNotFound )
+ {
+ return;
+ }
+
+ TBool isAutoRegOnForOld( aOldProfile.IsAutoRegistrationEnabled() );
+
+ if ( ( !isAutoRegOnForOld &&
+ !aOldProfile.IsEnabled() ) ||
+ ( aNewProfile &&
+ !aNewProfile->IsAutoRegistrationEnabled() &&
+ !aNewProfile->IsEnabled() &&
+ isAutoRegOnForOld ) )
+ {
+ aProfileArray.Remove( index );
+ aProfileArray.Compress();
+ }
+ }