# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1276067066 -10800 # Node ID 822e1f0777220b68bab4c71c9c45f0ebeee0c41f # Parent a7d1e54a73320d9f758a8ac8b1b2379996b038bb Revision: 201021 Kit: 2010123 diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/ApnManager/inc/sipapnconfigurationhandler.h --- a/realtimenetprots/sipfw/ProfileAgent/ApnManager/inc/sipapnconfigurationhandler.h Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/ApnManager/inc/sipapnconfigurationhandler.h Wed Jun 09 10:04:26 2010 +0300 @@ -24,10 +24,11 @@ #include #include #include +#include #include "sipapnmanager.h" // CONSTANTS -const TInt KSecondaryApnMaxRetryCount = 100; +const TInt KDBMaxRetryCount = 100; // FORWARD DECLARATIONS class CCommsDatabase; @@ -107,7 +108,7 @@ void WatchConnectionStatusChange(); - void WatchDatabaseStatusChangeL( TUint32 aIapId ); + void WatchDatabaseStatusChangeL(); TBool ApnChangeNeededL( const TDesC8& aApn ); @@ -153,39 +154,39 @@ /// 2nd phase constructor void ConstructL(); + + void BlockCellularDataUsageL(); + + void AllowCellularDataUsage(); + + + /** + * Rollsback db in case of failure + * @param aDb + */ + static void RollBackDBTransaction(TAny* aDb); private: // Data - MSIPApnChangeObserver& iObserver; - - TSipApnMonitoringState iMonitoringState; - - RSocketServ iSocketSrv; - - RConnection iConnection; - - TPckgBuf iConnectionInfo; - - TNifProgressBuf iProgress; - - HBufC8* iApnProposal; - - TUint32 iIapId; - - CCommsDatabase* iCommsDatabase; - - TInt iMonitoringRetryCount; - - HBufC8* iCurrentApn; - - TBool iApnUseSecureAuthProposal; - - TBool iIsFailed; - - TBool iIsFatalFailure; - - HBufC8* iPrimaryApn; - HBufC8* iSecondaryApn; + MSIPApnChangeObserver& iObserver; + TSipApnMonitoringState iMonitoringState; + RSocketServ iSocketSrv; + RConnection iConnection; + TPckgBuf iConnectionInfo; + TNifProgressBuf iProgress; + HBufC8* iApnProposal; + TUint32 iIapId; + CCommsDatabase* iCommsDatabase; + TInt iDBMonitoringRetryCount; + HBufC8* iCurrentApn; + TBool iApnUseSecureAuthProposal; + TBool iIsFailed; + TBool iIsFatalFailure; + HBufC8* iPrimaryApn; + HBufC8* iSecondaryApn; + CRepository* iRepository; + TInt iCurrentUsageStatus; + TBool iCellularDataBlocked; #ifdef CPPUNIT_TEST friend class CSIPApnManagerTest; diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/ApnManager/src/sipapnconfigurationhandler.cpp --- a/realtimenetprots/sipfw/ProfileAgent/ApnManager/src/sipapnconfigurationhandler.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/ApnManager/src/sipapnconfigurationhandler.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "sipapnconfigurationhandler.h" #include "SipProfileLog.h" @@ -58,17 +60,15 @@ { PROFILE_DEBUG1( "CSIPApnConfigurationHandler::~CSIPApnConfigurationHandler()" ) - + Cancel(); iConnection.Close(); iSocketSrv.Close(); - delete iApnProposal; delete iCurrentApn; - delete iPrimaryApn; delete iSecondaryApn; - + delete iRepository; delete iCommsDatabase; PROFILE_DEBUG1( @@ -105,7 +105,7 @@ return; } - iMonitoringRetryCount = 0; + iDBMonitoringRetryCount = 0; ChangeApnIfNotInUseL( aAllowAsync ); @@ -285,6 +285,11 @@ PROFILE_DEBUG3( "CSIPApnConfigurationHandler::RunError() err", aError ); + if(iCellularDataBlocked) + { + AllowCellularDataUsage(); + } + if ( aError != KErrNoMemory && aError != KErrNone ) { iObserver.ApnChanged( *iApnProposal, iIapId, aError ); @@ -307,7 +312,8 @@ CActiveScheduler::Add( this ); iIapId = aIapId; iIsFailed = EFalse; - iIsFatalFailure = EFalse; + iIsFatalFailure = EFalse; + iCellularDataBlocked = EFalse; } // ----------------------------------------------------------------------------- @@ -320,7 +326,7 @@ "CSIPApnConfigurationHandler::ConstructL()" ) User::LeaveIfError( iSocketSrv.Connect() ); - + iRepository = CRepository::NewL( KCRUidCmManager ); PROFILE_DEBUG1( "CSIPApnConfigurationHandler::ConstructL() exit" ) } @@ -426,7 +432,7 @@ // CSIPApnConfigurationHandler::WatchDatabaseStatusChangeL // ----------------------------------------------------------------------------- // -void CSIPApnConfigurationHandler::WatchDatabaseStatusChangeL( TUint32 aIapId ) +void CSIPApnConfigurationHandler::WatchDatabaseStatusChangeL() { PROFILE_DEBUG1( "CSIPApnConfigurationHandler::WatchDatabaseStatusChangeL()" ) @@ -436,22 +442,26 @@ if ( !iCommsDatabase ) { PROFILE_DEBUG1( - "CSIPApnConfigurationHandler:: create commsdb" ) + "CSIPApnConfigurationHandler::WatchDatabaseStatusChangeL create commsdb" ) iCommsDatabase = CCommsDatabase::NewL(); } PROFILE_DEBUG1( - "CSIPApnConfigurationHandler:: request notification" ) + "CSIPApnConfigurationHandler::WatchDatabaseStatusChangeL request notification" ) // Start monitoring for db events, there will be lots of them pouring in // as there's no filtering feature. We are interested only in // unlocked events. + + if(iDBMonitoringRetryCount > KDBMaxRetryCount) + { + PROFILE_DEBUG1("CSIPApnConfigurationHandler::WatchDatabaseStatusChangeL max retries reached!" ) + User::Leave( KErrAbort ); + } + User::LeaveIfError( iCommsDatabase->RequestNotification( iStatus ) ); - SetActive(); - - iIapId = aIapId; - + SetMonitoringState( EMonitoringDatabase ); PROFILE_DEBUG1( @@ -542,7 +552,7 @@ __ASSERT_ALWAYS( aAllowAsync, User::Leave( KErrInUse ) ); - WatchDatabaseStatusChangeL( iIapId ); + WatchDatabaseStatusChangeL(); } else { @@ -570,8 +580,12 @@ using namespace CommsDat; - CMDBSession* db = CMDBSession::NewL( CMDBSession::LatestVersion() ); + CMDBSession* db = CMDBSession::NewL( KCDVersion1_1 ); CleanupStack::PushL( db ); + + db->OpenTransactionL(); + CleanupStack::PushL(TCleanupItem(RollBackDBTransaction, db)); + // Set attributes so that also protected iaps can be accessed db->SetAttributeMask( ECDHidden | ECDProtectedWrite ); @@ -647,9 +661,19 @@ db->ClearAttributeMask( ECDHidden | ECDProtectedWrite ); CleanupStack::PopAndDestroy( iapRecord ); + + db->CommitTransactionL(); + + CleanupStack::Pop(); //cleanup item + CleanupStack::PopAndDestroy( db ); - SendApnChangedNotificationL( aApn ); + if (iCellularDataBlocked) + { + AllowCellularDataUsage(); + } + + SendApnChangedNotificationL( aApn ); PROFILE_DEBUG1( "CSIPApnConfigurationHandler::ChangeApnL(), exit" ) @@ -701,10 +725,10 @@ void CSIPApnConfigurationHandler::ConnectionMonitoringCompletedL( TInt aError ) { PROFILE_DEBUG3( - "CSIPApnConfigurationHandler:: progress.err", + "CSIPApnConfigurationHandler::ConnectionMonitoringCompletedL progress.err", iProgress().iError ); PROFILE_DEBUG3( - "CSIPApnConfigurationHandler:: progress.stage", + "CSIPApnConfigurationHandler::ConnectionMonitoringCompletedL progress.stage", iProgress().iStage ); if ( !aError ) @@ -748,30 +772,19 @@ { // Changing may be now possible, if not, db notifications or connection // monitoring is re-enabled inside following method + PROFILE_DEBUG1("DatabaseMonitoringCompletedL::DatabaseMonitoringCompletedL BlockCellularDataUsageL" ); + BlockCellularDataUsageL(); apnChanged = ChangeApnIfNotInUseL(); } else { - WatchDatabaseStatusChangeL( iIapId ); + iDBMonitoringRetryCount++; + WatchDatabaseStatusChangeL(); } - // Have some safety limit for monitoring as it's not guaranteed that - // db lock is ever released -> avoid unnecessary battery consumption - if ( !apnChanged ) + if(apnChanged) { - iMonitoringRetryCount++; - PROFILE_DEBUG3( - "DatabaseMonitoringCompletedL:: retrycount", - iMonitoringRetryCount ); - - if ( iMonitoringRetryCount > KSecondaryApnMaxRetryCount ) - { - PROFILE_DEBUG1( - "CSIPApnConfigurationHandler:: max retries reached!" ) - Cancel(); - - User::Leave( KErrAbort ); - } + iDBMonitoringRetryCount = 0; } } @@ -902,4 +915,40 @@ } } +// ----------------------------------------------------------------------------- +// CSIPApnConfigurationHandler::BlockCellularDataUsageL +// ----------------------------------------------------------------------------- +// +void CSIPApnConfigurationHandler::BlockCellularDataUsageL() + { + PROFILE_DEBUG1("DatabaseMonitoringCompletedL::BlockCellularDataUsageL Enter" ); + //Current Usage Status; + iRepository->Get( KCurrentCellularDataUsage, iCurrentUsageStatus ); + iRepository->Set( KCurrentCellularDataUsage, ECmCellularDataUsageDisabled ); + iCellularDataBlocked = ETrue; + PROFILE_DEBUG1("DatabaseMonitoringCompletedL::BlockCellularDataUsageL Exit" ); + } +// ----------------------------------------------------------------------------- +// CSIPApnConfigurationHandler::AllowCellularDataUsage +// ----------------------------------------------------------------------------- +// +void CSIPApnConfigurationHandler::AllowCellularDataUsage() + { + PROFILE_DEBUG1("DatabaseMonitoringCompletedL::AllowCellularDataUsage Enter" ); + iRepository->Set( KCurrentCellularDataUsage, iCurrentUsageStatus ); + iDBMonitoringRetryCount = 0; + iCellularDataBlocked = EFalse; + PROFILE_DEBUG1("DatabaseMonitoringCompletedL::AllowCellularDataUsage Exit" ); + } + +// ----------------------------------------------------------------------------- +// CSIPApnConfigurationHandler::RollBackDBTransaction +// ----------------------------------------------------------------------------- +// +void CSIPApnConfigurationHandler::RollBackDBTransaction(TAny* aDb) + { + CMDBSession* db = static_cast(aDb); + TRAP_IGNORE(db->RollbackTransactionL()); + } + // End of file diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/ApnManager/src/sipapnmanager.cpp --- a/realtimenetprots/sipfw/ProfileAgent/ApnManager/src/sipapnmanager.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/ApnManager/src/sipapnmanager.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -216,7 +216,7 @@ { TBool isIapGPRS(EFalse); using namespace CommsDat; - CMDBSession* db = CMDBSession::NewL( CMDBSession::LatestVersion() ); + CMDBSession* db = CMDBSession::NewL( KCDVersion1_1 ); CleanupStack::PushL( db ); // Set any attributes if any db->SetAttributeMask( ECDHidden ); diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp --- a/realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -494,11 +494,11 @@ return (aError == K503ServiceUnavailable || aError == K408TimeOut || aError == K500ServerInternalError || - aError == KErrSIPOutboundProxyNotResponding || aError == KErrTimedOut || ((aError == KErrSIPResolvingFailure || aError == KErrSIPTransportFailure || - aError == KErrSIPICMPFailure) && + aError == KErrSIPICMPFailure || + aError == KErrSIPOutboundProxyNotResponding ) && iConnection.State() != CSIPConnection::ESuspended)); } diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofilecontext.cpp --- a/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofilecontext.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofilecontext.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -785,12 +785,12 @@ aError == K408TimeOut || aError == K480TemporarilyUnavailable || aError == K500ServerInternalError || - aError == K504ServerTimeOut || - aError == KErrSIPOutboundProxyNotResponding || + aError == K504ServerTimeOut || aError == KErrTimedOut || ((aError == KErrSIPResolvingFailure || aError == KErrSIPTransportFailure || - aError == KErrSIPICMPFailure) && + aError == KErrSIPICMPFailure || + aError == KErrSIPOutboundProxyNotResponding ) && iConnection.State() != CSIPConnection::ESuspended)); } diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCacheItem.cpp --- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCacheItem.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCacheItem.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -571,6 +571,7 @@ void CSIPProfileCacheItem::VpnInUse(TBool aStatus) { iIsVpnInUse = aStatus; + iCurrentState->ShutdownInitiated(*this); } // ----------------------------------------------------------------------------- diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp --- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -475,11 +475,11 @@ TBool waitForDeregistration = EFalse; for (TInt i = 0; i < iProfileCache.Count(); i++) { - iProfileCache[i]->OfflineInitiated(ETrue); CSIPConcreteProfile::TStatus status; iPluginDirector->State(status, iProfileCache[i]->UsedProfile()); if(status != CSIPConcreteProfile::EUnregistered) - waitForDeregistration = ETrue; + waitForDeregistration = ETrue; + iProfileCache[i]->OfflineInitiated(ETrue); } if(!waitForDeregistration) { @@ -515,11 +515,11 @@ TBool waitForDeregistration = EFalse; for (TInt i = 0; i < iProfileCache.Count(); i++) { - iProfileCache[i]->RfsInprogress(ETrue); CSIPConcreteProfile::TStatus status; iPluginDirector->State(status, iProfileCache[i]->UsedProfile()); if (status != CSIPConcreteProfile::EUnregistered) waitForDeregistration = ETrue; + iProfileCache[i]->RfsInprogress(ETrue); } if(!waitForDeregistration) { @@ -564,12 +564,11 @@ TBool waitForDeregistration = EFalse; for (TInt i = 0; i < iProfileCache.Count(); i++) { - iProfileCache[i]->VpnInUse( ETrue ); - iProfileCache[i]->ShutdownInitiated(); CSIPConcreteProfile::TStatus status; iPluginDirector->State(status, iProfileCache[i]->UsedProfile()); if (status != CSIPConcreteProfile::EUnregistered) waitForDeregistration = ETrue; + iProfileCache[i]->VpnInUse( ETrue ); } if (!waitForDeregistration) { diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/profile_fsm/inc/sipprflderegisterrequestedstate.h --- a/realtimenetprots/sipfw/ProfileAgent/profile_fsm/inc/sipprflderegisterrequestedstate.h Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/inc/sipprflderegisterrequestedstate.h Wed Jun 09 10:04:26 2010 +0300 @@ -14,7 +14,7 @@ * Description: * Name : sipprflderegisterrequestedstate.h * Part of : sip profile fsm -* Version : %version: 2.1.1 % +* Version : %version: 2.1.2 % * */ @@ -72,6 +72,13 @@ CSIPConcreteProfile::TStatus ConcreteProfileState() const; + /* DeRegister requested + * update on multiple profile issue, when update on the previous profile is pending. + * 07 May 2010 + * */ + void DeregisterL( + MSIPProfileContext& aContext); + /** * Moves back the profile to "Registered" state * @param aContext a profile context diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflderegisterrequestedstate.cpp --- a/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflderegisterrequestedstate.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflderegisterrequestedstate.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -14,7 +14,7 @@ // Name : sipprflderegisterrequestedstate.cpp // Part of : sip profile fsm // implementation -// Version : %version: 2.1.1 % +// Version : %version: 2.1.2 % // @@ -98,6 +98,41 @@ } // ----------------------------------------------------------------------------- +// CSIPPrflDeregisterRequestedState::DeregisterL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPPrflDeregisterRequestedState::DeregisterL( + MSIPProfileContext& aContext) + { + __ASSERT_DEBUG(aContext.Profile()!=0, User::Invariant()); + __ASSERT_DEBUG(aContext.Registration()!=0, User::Invariant()); + if (aContext.Connection().State()==CSIPConnection::EActive) + { + if (iUser.AddProfileIntoQueue(*aContext.Profile())) //compares the registrar of the present profile with the other profiles existing in the connection context array. + { + iUser.DeregisterProfileL(*aContext.Profile()); + + } + else + { + CSIPMessageElements* elements = + aContext.CreateDeRegisterElementsL(); + CleanupStack::PushL(elements); + CSIPClientTransaction* tx = + aContext.Registration()->DeregisterL(elements); + CleanupStack::Pop(elements); + aContext.SetTransaction(tx); + aContext.SetNextState(*iDeregistrationInProgressState); + } + } + aContext.AgentObserver().SIPProfileStatusEvent( + *aContext.Profile(), + aContext.Registration()->ContextId()); + } + + +// ----------------------------------------------------------------------------- // CSIPPrflDeregisterRequestedState::ErrorOccured() // This can happen if the de-register was reguested while the connection is // suspended (registered->de-register requested). SIP stack has removed diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflregisteredstate.cpp --- a/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflregisteredstate.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflregisteredstate.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -14,7 +14,7 @@ // Name : sipprflregisteredstate.cpp // Part of : sip profile fsm // implementation -// Version : %version: 2.1.2 % +// Version : %version: 2.1.3 % // @@ -370,7 +370,8 @@ } else if ((aError == KErrSIPTransportFailure || aError == KErrSIPResolvingFailure || - aError == KErrSIPICMPFailure) && + aError == KErrSIPICMPFailure || + aError == KErrSIPOutboundProxyNotResponding ) && aContext.Connection().State() == CSIPConnection::ESuspended) { //registration was dropped due to the expired diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/sipprflregistrationinprogressstate.cpp --- a/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/sipprflregistrationinprogressstate.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/sipprflregistrationinprogressstate.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -14,7 +14,7 @@ // Name : sipprflregistrationinprogressstate.cpp // Part of : sip profile fsm // implementation -// Version : %version: 2.1.1 % +// Version : %version: 2.1.2 % // @@ -174,7 +174,8 @@ } else if ((aError == KErrSIPTransportFailure || aError == KErrSIPResolvingFailure || - aError == KErrSIPICMPFailure) && + aError == KErrSIPICMPFailure || + aError == KErrSIPOutboundProxyNotResponding ) && aContext.Connection().State()==CSIPConnection::ESuspended) { //registration failed due to the suspended connection, re-try later diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/Codec/src/CSIPAcceptEncodingHeader.cpp --- a/realtimenetprots/sipfw/SIP/Codec/src/CSIPAcceptEncodingHeader.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/Codec/src/CSIPAcceptEncodingHeader.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -28,6 +28,7 @@ #include "sipstrconsts.h" #include "sipcodecutils.h" #include "_sipcodecdefs.h" +#include // ---------------------------------------------------------------------------- @@ -161,10 +162,19 @@ { HBufC8* tmp = aCodings.AllocLC(); tmp->Des().Trim(); - if (tmp->Length() > 0 && !SIPSyntaxCheck::Token(*tmp)) + //Allowing '/' token for interoperability issues + RArray array; + if(CFeatureDiscovery::IsFeatureSupportedL(TUid::Uid(KFeatureIdFfSipApnSwitching))) + { + array.Append('/'); + } + + if (tmp->Length() > 0 && !SIPSyntaxCheck::Token(*tmp,&array)) { + array.Close(); User::Leave(KErrSipCodecAcceptEncodingHeader); } + array.Close(); CleanupStack::Pop(tmp); delete iCodings; iCodings = tmp; diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/Codec/src/SIPSyntaxCheck.cpp --- a/realtimenetprots/sipfw/SIP/Codec/src/SIPSyntaxCheck.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/Codec/src/SIPSyntaxCheck.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -20,7 +20,6 @@ #include "SIPSyntaxCheck.h" -#include "TSIPChar.h" #include "sipcodecerr.h" #include @@ -31,8 +30,9 @@ // SIPSyntaxCheck::Token // ----------------------------------------------------------------------------- // -TBool SIPSyntaxCheck::Token (const TDesC8& aValue) +TBool SIPSyntaxCheck::Token (const TDesC8& aValue, RArray* aArray) { + if (aValue.Length() == 0) { return EFalse; @@ -41,7 +41,7 @@ TSIPChar sipChr = lex.Get(); while (sipChr) { - if (!sipChr.IsTokenChar()) + if (!sipChr.IsTokenChar( aArray ) ) { return EFalse; } diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/Codec/src/SIPSyntaxCheck.h --- a/realtimenetprots/sipfw/SIP/Codec/src/SIPSyntaxCheck.h Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/Codec/src/SIPSyntaxCheck.h Wed Jun 09 10:04:26 2010 +0300 @@ -31,6 +31,7 @@ #define SIPSYNTAXCHECK_H #include "siphostport.h" +#include "TSIPChar.h" #include @@ -39,7 +40,7 @@ { public: - static TBool Token (const TDesC8& aValue); + static TBool Token (const TDesC8& aValue , RArray* aArray = NULL ); static TBool AlphaMaxSize8 (const TDesC8& aValue); static TBool Host (const TDesC8& aValue); static TBool Word (const TDesC8& aValue); diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/Codec/src/TSIPChar.h --- a/realtimenetprots/sipfw/SIP/Codec/src/TSIPChar.h Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/Codec/src/TSIPChar.h Wed Jun 09 10:04:26 2010 +0300 @@ -45,7 +45,7 @@ inline TBool IsReserved() const; inline TBool IsUnreserved() const; inline TBool IsMark() const; - inline TBool IsTokenChar() const; + inline TBool IsTokenChar(RArray* aArray = NULL) const; inline TBool IsSeparator() const; inline TBool IsWordChar() const; inline TBool IsQuotedPairChar() const; diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/Codec/src/TSIPChar.inl --- a/realtimenetprots/sipfw/SIP/Codec/src/TSIPChar.inl Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/Codec/src/TSIPChar.inl Wed Jun 09 10:04:26 2010 +0300 @@ -112,20 +112,33 @@ // TSIPChar::IsTokenChar // ----------------------------------------------------------------------------- // -inline TBool TSIPChar::IsTokenChar () const +inline TBool TSIPChar::IsTokenChar (RArray* aArray) const { if (IsAlphaDigit()) { return ETrue; } - TSIPChar val = *this; - if (val == '-' || val == '.' || val == '!' || val == '%' || val == '*' || + TInt length= 0; + TSIPChar val = *this; + //Allowing '/' token for interoperability issues + if (aArray) + length = aArray->Count(); + if(length) + { + for (TInt i =0; ioperator [](i)) + return ETrue; + } + } + if (val == '-' || val == '.' || val == '!' || val == '%' || val == '*' || val == '_' || val == '+' || val == '\'' || val == '~' || val == '`') - { - return ETrue; - } - return EFalse; - } + { + return ETrue; + } + + return EFalse; + } // ----------------------------------------------------------------------------- // TSIPChar::IsSeparator diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/ConnectionMgr/src/CTransport.cpp --- a/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CTransport.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CTransport.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -1459,11 +1459,23 @@ if ( Protocol() == KProtocolTls ) { RStringF tls = SIPStrings::StringF( SipStrConsts::ETLS ); - // SIP-URI with transport=TLS must not use sips scheme - uri.SIPURI()->SetSIPS( transportParam != tls ); + // SIP Scheme in Contact header should be same as From Header + CURIContainer& FromUri = (((aMessage->From())->SIPAddress()).URI()); + if(FromUri.IsSIPURI()) + { + CSIPURI* FromSIPUri =FromUri.SIPURI(); + if(FromSIPUri->IsSIPSURI()) + { + uri.SIPURI()->SetSIPS( ETrue ); + } + else + { + uri.SIPURI()->SetSIPS( EFalse ); + } + } if(transportParam == tls) { - uri.SIPURI()->SetSIPS(EFalse); + //uri.SIPURI()->SetSIPS(EFalse); //Delete the param transport=tls from the URI as it is deprecated in RFC 3261 uri.SIPURI()->DeleteParam(SIPStrings::StringF( SipStrConsts::ETransport )); } diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/ConnectionMgr/src/TTlsTransTlsConnecting.cpp --- a/realtimenetprots/sipfw/SIP/ConnectionMgr/src/TTlsTransTlsConnecting.cpp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/TTlsTransTlsConnecting.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -22,8 +22,10 @@ #include "TTlsTransTlsConnecting.h" #include "MTlsTransStateOwner.h" - -const TInt KConnectTLSTimeout = 10000; // 10 seconds +// SIP layer waits 30 seconds for TLS Handshake to happen, if the timer +// fires and negotiation does not happen, it cancels the handshake assuming +// some problem while handshaking. +const TInt KConnectTLSTimeout = 30000; // 30 seconds // ----------------------------------------------------------------------------- // TTlsTransTlsConnecting::EnterL diff -r a7d1e54a7332 -r 822e1f077722 realtimenetprots/sipfw/SIP/Group/sipcodec.mmp --- a/realtimenetprots/sipfw/SIP/Group/sipcodec.mmp Tue May 25 13:04:58 2010 +0300 +++ b/realtimenetprots/sipfw/SIP/Group/sipcodec.mmp Wed Jun 09 10:04:26 2010 +0300 @@ -135,7 +135,8 @@ LIBRARY estor.lib LIBRARY charconv.lib LIBRARY inetprotutil.lib - +LIBRARY featdiscovery.lib + VENDORID 0x70000001 CAPABILITY All -Tcb diff -r a7d1e54a7332 -r 822e1f077722 sipplugins/sippsystemstatemonitor/src/sipdevicestateaware.cpp --- a/sipplugins/sippsystemstatemonitor/src/sipdevicestateaware.cpp Tue May 25 13:04:58 2010 +0300 +++ b/sipplugins/sippsystemstatemonitor/src/sipdevicestateaware.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -219,8 +219,11 @@ if( iObservers.Count() == iCount) { iGuardTimer->Cancel(); - iStateAwareSession.AcknowledgeStateNotification(KErrNone); - iCount = 0; + if(iState == CSipSystemStateMonitor::ESystemOffline) + { + iStateAwareSession.AcknowledgeStateNotification(KErrNone); + iCount = 0; + } } } @@ -231,7 +234,10 @@ void CSipDeviceStateAware::EventProcessingCompleted() { iGuardTimer->Cancel(); - iStateAwareSession.AcknowledgeStateNotification(KErrNone); - iCount = 0; + if(iState == CSipSystemStateMonitor::ESystemOffline) + { + iStateAwareSession.AcknowledgeStateNotification(KErrNone); + iCount = 0; + } } diff -r a7d1e54a7332 -r 822e1f077722 sipplugins/sippsystemstatemonitor/src/sipvpnmonitorao.cpp --- a/sipplugins/sippsystemstatemonitor/src/sipvpnmonitorao.cpp Tue May 25 13:04:58 2010 +0300 +++ b/sipplugins/sippsystemstatemonitor/src/sipvpnmonitorao.cpp Wed Jun 09 10:04:26 2010 +0300 @@ -191,9 +191,11 @@ // SIP deregistration has been completed. Stop the guard timer and tell // the VPN client about it. iGuardTimer->Cancel(); - - iProperty.Set( KPSVpnSipUid, KVpnSipState, ESipDeregisterCompleted ); - iCount = 0; + if (iState == CSipSystemStateMonitor::EVpnInitiating) + { + iProperty.Set( KPSVpnSipUid, KVpnSipState, ESipDeregisterCompleted ); + iCount = 0; + } } // -----------------------------------------------------------------------------