realtimenetprots/sipfw/SIP/Refreshes/src/CSipRefreshMgr.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name          : CSipRefreshMgr.cpp
       
    15 // Part of       : SIPRefreshes
       
    16 // Version       : SIP/5.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "CSipRefreshMgr.h"
       
    22 #include "MTransactionUser.h"
       
    23 #include "CSipRegisterRefresh.h"
       
    24 #include "CSipAnyRefresh.h"
       
    25 #include "MTransactionHeaders.h"
       
    26 #include "TSIPTransportParams.h"
       
    27 #include "siprequest.h"
       
    28 #include "sipresponse.h"
       
    29 #include "sipfromheader.h"
       
    30 #include "sipcontactheader.h"
       
    31 #include "sipexpiresheader.h"
       
    32 #include "sipcseqheader.h"
       
    33 #include "siptoheader.h"
       
    34 #include "SipLogs.h"
       
    35 #include "DeleteMgr.h"
       
    36 #include "SipAssert.h"
       
    37 #include "sipstrings.h"
       
    38 #include "sipstrconsts.h"
       
    39 
       
    40 
       
    41 // -----------------------------------------------------------------------------
       
    42 // CSipRefreshMgr::NewL
       
    43 // -----------------------------------------------------------------------------
       
    44 //
       
    45 CSipRefreshMgr* CSipRefreshMgr::NewL (MTransactionUser& aTU, 
       
    46                                       MTimerManager&    aTimerMgr,
       
    47                                       CSIPSec&          aSIPSec)
       
    48 	{
       
    49 	CSipRefreshMgr* self = new(ELeave)CSipRefreshMgr(aTU,aTimerMgr,aSIPSec);
       
    50 	CleanupStack::PushL(self);	
       
    51 	self->ConstructL();
       
    52 	CleanupStack::Pop(self);
       
    53 	return self;
       
    54 	}
       
    55 
       
    56 // -----------------------------------------------------------------------------
       
    57 // CSipRefreshMgr::CSipRefreshMgr
       
    58 // -----------------------------------------------------------------------------
       
    59 //
       
    60 CSipRefreshMgr::CSipRefreshMgr (
       
    61     MTransactionUser& aTU,
       
    62     MTimerManager& aTimerMgr,
       
    63     CSIPSec& aSIPSec)
       
    64  : iTU(aTU),
       
    65    iTimerMgr(aTimerMgr),
       
    66    iSIPSec(aSIPSec),
       
    67    iNextRefreshId (KMinRefreshId)
       
    68 	{
       
    69 	}
       
    70 
       
    71 // -----------------------------------------------------------------------------
       
    72 // CSipRefreshMgr::ConstructL
       
    73 // -----------------------------------------------------------------------------
       
    74 //
       
    75 void CSipRefreshMgr::ConstructL ()
       
    76 	{
       
    77 	iDeleteMgr = CDeleteMgr::NewL();
       
    78 	}
       
    79 
       
    80 // -----------------------------------------------------------------------------
       
    81 // CSipRefreshMgr::~CSipRefreshMgr
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 CSipRefreshMgr::~CSipRefreshMgr ()
       
    85 	{
       
    86 	delete iDeleteMgr;
       
    87 	iRefreshes.ResetAndDestroy();
       
    88 	}
       
    89 
       
    90 // -----------------------------------------------------------------------------
       
    91 // CSipRefreshMgr::RefreshL
       
    92 // From MSipRefreshMgr:
       
    93 // -----------------------------------------------------------------------------
       
    94 //
       
    95 void CSipRefreshMgr::RefreshL (TTransactionId& aTransactionId,
       
    96                                TRefreshId& aRefreshId,
       
    97 							   TRegistrationId aRegistrationId,
       
    98 							   CSIPRequest* aRequest,
       
    99 							   MRefreshOwner* aOwner,
       
   100 							   MSIPSecUser& aSIPSecUser,
       
   101 							   CURIContainer& aRemoteTarget,
       
   102 							   TBool aDeleteRequest,
       
   103 							   TBool aPassAllResponsesToOwner)
       
   104 	{
       
   105     __SIP_ASSERT_LEAVE (aRequest, KErrArgument);
       
   106 
       
   107     __SIP_ASSERT_LEAVE (aRequest->Method().DesC().Length() > 0, KErrArgument);
       
   108 
       
   109     __SIP_ASSERT_LEAVE (aRequest->From(), KErrArgument);
       
   110 
       
   111     __SIP_ASSERT_LEAVE (aRequest->To(), KErrArgument);
       
   112 
       
   113     __SIP_ASSERT_LEAVE (aOwner, KErrArgument);
       
   114     
       
   115 	__SIP_MESSAGE_LOG ("Refreshes", *aRequest)
       
   116 
       
   117 	CSipRefreshBase* refresh = NULL;
       
   118 
       
   119 	// method is register
       
   120 	if (aRequest->Method() == SIPStrings::StringF(SipStrConsts::ERegister)) 
       
   121 		{
       
   122 		refresh = CSipRegisterRefresh::NewLC(iTU,iTimerMgr,iSIPSec,*this, 
       
   123 		                                     aRegistrationId,aRequest,aOwner,
       
   124 		                                     aSIPSecUser,aRemoteTarget);
       
   125 		}
       
   126 	else
       
   127 		{
       
   128 		refresh = CSipAnyRefresh::NewLC(iTU,iTimerMgr,iSIPSec,*this,
       
   129 		                                aRegistrationId,aRequest,aOwner,
       
   130 		                                aSIPSecUser,aRemoteTarget,
       
   131 		                                aPassAllResponsesToOwner);
       
   132 		}
       
   133 
       
   134 	refresh->SendL(aTransactionId, aRequest);
       
   135 
       
   136 	User::LeaveIfError(iRefreshes.Append(refresh));
       
   137 	CleanupStack::Pop(refresh);
       
   138 
       
   139 	refresh->SetRequest(aRequest,aDeleteRequest);
       
   140 	aRefreshId = refresh->Id();
       
   141 	}
       
   142 
       
   143 // -----------------------------------------------------------------------------
       
   144 // CSipRefreshMgr::RefreshAndGetHeadersL
       
   145 // From MSipRefreshMgr:
       
   146 // -----------------------------------------------------------------------------
       
   147 //
       
   148 MTransactionHeaders* CSipRefreshMgr::RefreshAndGetHeadersL (
       
   149 	TTransactionId& aTransactionId,
       
   150 	TRefreshId& aRefreshId,
       
   151 	TRegistrationId aRegistrationId,
       
   152 	CSIPRequest* aRequest,
       
   153 	MRefreshOwner* aOwner,
       
   154 	MSIPSecUser& aSIPSecUser,
       
   155 	CURIContainer&  aRemoteTarget)
       
   156 	{
       
   157     __SIP_ASSERT_LEAVE (aRequest, KErrArgument);
       
   158 
       
   159     __SIP_ASSERT_LEAVE (aRequest->Method().DesC().Length() != 0, KErrArgument);
       
   160 
       
   161     __SIP_ASSERT_LEAVE (aRequest->From(), KErrArgument);
       
   162 
       
   163     __SIP_ASSERT_LEAVE (aRequest->To(), KErrArgument);
       
   164 
       
   165     __SIP_ASSERT_LEAVE (aOwner, KErrArgument);
       
   166 
       
   167 	__SIP_MESSAGE_LOG ("Refreshes", *aRequest)
       
   168 
       
   169 	__ASSERT_ALWAYS (aRequest->Method() != 
       
   170 	                 SIPStrings::StringF(SipStrConsts::ERegister), 
       
   171 		             User::Leave(KErrNotSupported));
       
   172 
       
   173 	// Only Dialogs uses this function, so any refresh is always created
       
   174 	// with flag telling the refresh to pass all the responses up to the owner.
       
   175 	CSipRefreshBase* refresh = CSipAnyRefresh::NewLC (iTU, iTimerMgr, iSIPSec,
       
   176 	                                                  *this, aRegistrationId, 
       
   177 	                                                  aRequest, aOwner, 
       
   178 	                                                  aSIPSecUser, 
       
   179 	                                                  aRemoteTarget, ETrue);
       
   180 
       
   181 	MTransactionHeaders* headers = 
       
   182 		refresh->SendAndGetHeadersL (aTransactionId,aRequest);
       
   183 
       
   184     TCleanupItem cleanupItem(DeleteTransactionHeaders,headers);
       
   185 	CleanupStack::PushL (cleanupItem);
       
   186 
       
   187 	User::LeaveIfError(iRefreshes.Append(refresh));
       
   188 
       
   189 	CleanupStack::Pop(1); // cleanupItem
       
   190 	CleanupStack::Pop(refresh);
       
   191 
       
   192 	refresh->SetRequest(aRequest,ETrue);
       
   193 	
       
   194     aRefreshId = refresh->Id();
       
   195 
       
   196 	return headers;
       
   197 	}
       
   198 
       
   199 // -----------------------------------------------------------------------------
       
   200 // CSipRefreshMgr::UpdateRefreshL
       
   201 // From MSipRefreshMgr:
       
   202 // -----------------------------------------------------------------------------
       
   203 //
       
   204 void CSipRefreshMgr::UpdateRefreshL (TTransactionId& aTransactionId,
       
   205 							         const TRefreshId& aRefreshId,
       
   206 							         CSIPRequest* aRequest,
       
   207 							         const MRefreshOwner* aOwner,
       
   208 							         TBool aDeleteRequest)
       
   209 	{
       
   210     __SIP_ASSERT_LEAVE (aRequest, KErrArgument);
       
   211 
       
   212 	__SIP_MESSAGE_LOG ("Refreshes", *aRequest)
       
   213 
       
   214 	CSipRefreshBase& refresh = FindRefreshL(aRefreshId,aOwner);
       
   215 
       
   216 	// increase the request CSeq number if it is none REGISTER request
       
   217 	// and if there is CSeqHeader in the request.
       
   218 	// since Registration subsystem update CSeq itself for update Request
       
   219 	if(aRequest->Method() != SIPStrings::StringF(SipStrConsts::ERegister) &&
       
   220 	   aRequest->CSeq() != 0)
       
   221 		{
       
   222 		refresh.UpdateCSeqValueL(*aRequest);
       
   223 		}
       
   224 
       
   225 	refresh.UpdateRequestL(aTransactionId,aRequest);
       
   226 
       
   227 	refresh.SetRequest(aRequest,aDeleteRequest);
       
   228 	}
       
   229 
       
   230 // -----------------------------------------------------------------------------
       
   231 // CSipRefreshMgr::TerminateRefreshL
       
   232 // From MSipRefreshMgr:
       
   233 // -----------------------------------------------------------------------------
       
   234 //
       
   235 void CSipRefreshMgr::TerminateRefreshL (TTransactionId& aTransactionId,
       
   236 								        const TRefreshId& aRefreshId,
       
   237 								        CSIPRequest* aRequest,
       
   238 								        const MRefreshOwner* aOwner,
       
   239 								        TBool aDeleteRequest)
       
   240 	{
       
   241     __SIP_ASSERT_LEAVE (aRequest, KErrArgument);
       
   242 
       
   243 	__SIP_MESSAGE_LOG ("Refreshes", *aRequest)
       
   244 
       
   245 	CSipRefreshBase& refresh = FindRefreshL(aRefreshId,aOwner);
       
   246 
       
   247 	// increase the request CSeq number if it is none REGISTER request
       
   248 	// and if there is CSeqHeader in the request.
       
   249 	// since Registration subsystem update CSeq itself for terminate Request
       
   250 	if(aRequest->Method() != SIPStrings::StringF(SipStrConsts::ERegister) &&
       
   251 	   aRequest->CSeq() != 0)
       
   252 		{
       
   253 		refresh.UpdateCSeqValueL(*aRequest);
       
   254 		}
       
   255 
       
   256 	refresh.TerminateRequestL(aTransactionId,aRequest);
       
   257 
       
   258 	refresh.SetRequest(aRequest,aDeleteRequest);
       
   259 	}
       
   260 
       
   261 // -----------------------------------------------------------------------------
       
   262 // CSipRefreshMgr::TerminateRefresh
       
   263 // From MSipRefreshMgr:
       
   264 // -----------------------------------------------------------------------------
       
   265 //
       
   266 TInt CSipRefreshMgr::TerminateRefresh (const TRefreshId& aRefreshId,
       
   267                                        const MRefreshOwner* aOwner)
       
   268 	{
       
   269 	TInt index = FindIndex(aRefreshId,aOwner);
       
   270 	if (index < 0 || index >= iRefreshes.Count()) 
       
   271 		{
       
   272 		return KErrNotFound;
       
   273 		}
       
   274 	return RemoveRefreshBy(iRefreshes[index]);
       
   275 	}
       
   276 
       
   277 // -----------------------------------------------------------------------------
       
   278 // CSipRefreshMgr::RemoveRefreshesFor
       
   279 // From MSipRefreshMgr:
       
   280 // -----------------------------------------------------------------------------
       
   281 //
       
   282 TInt CSipRefreshMgr::RemoveRefreshesFor (const MRefreshOwner* aOwner)
       
   283 	{
       
   284 	if (!aOwner)
       
   285 		{
       
   286 		return KErrNotFound;
       
   287 		}
       
   288 
       
   289     for (TInt i=iRefreshes.Count()-1; i>=0; i--)
       
   290 		{
       
   291         if (iRefreshes[i]->Owner() == aOwner)
       
   292 			{
       
   293 			iRefreshes[i]->StopTimer();	
       
   294 			iRefreshes[i]->SetRequest(NULL,EFalse);
       
   295 			TInt err = RemoveRefreshBy (iRefreshes[i]);
       
   296 			if (err)
       
   297 				{
       
   298 				return err;
       
   299 				}
       
   300 			}
       
   301 		}
       
   302 	return KErrNone;
       
   303 	}
       
   304 
       
   305 // -----------------------------------------------------------------------------
       
   306 // CSipRefreshMgr::Request
       
   307 // From MSipRefreshMgr:
       
   308 // const CSIPRequest* CSipRefreshMgr::Request (const TRefreshId& aRefreshId) const
       
   309 // -----------------------------------------------------------------------------
       
   310 //
       
   311 CSIPRequest* CSipRefreshMgr::Request (const TRefreshId& aRefreshId) 
       
   312 	{
       
   313 	if (aRefreshId == KEmptyRefreshId)
       
   314 		{
       
   315 		return NULL;
       
   316 		}
       
   317 	for (TInt i=0; i<iRefreshes.Count(); i++)
       
   318 		{
       
   319 		if (iRefreshes[i]->Id() == aRefreshId)
       
   320 			{
       
   321 			return (iRefreshes[i]->Request());
       
   322 			}
       
   323 		}
       
   324 	return NULL;
       
   325 	}
       
   326 
       
   327 // -----------------------------------------------------------------------------
       
   328 // CSipRefreshMgr::RemoveRefreshBy
       
   329 // -----------------------------------------------------------------------------
       
   330 //
       
   331 void CSipRefreshMgr::SetIntervalL  (const TRefreshId& aRefreshId,
       
   332                                     TInt aInterval)
       
   333     {
       
   334     CSipRefreshBase& refresh = FindRefreshL(aRefreshId,NULL,EFalse);
       
   335     refresh.SetIntervalL(aInterval);
       
   336     }
       
   337 	
       
   338 // -----------------------------------------------------------------------------
       
   339 // CSipRefreshMgr::RemoveRefreshBy
       
   340 // -----------------------------------------------------------------------------
       
   341 //	
       
   342 TInt CSipRefreshMgr::IntervalL (const TRefreshId& aRefreshId)
       
   343     {
       
   344     CSipRefreshBase& refresh = FindRefreshL(aRefreshId,NULL,EFalse);
       
   345     return refresh.Interval();    
       
   346     }
       
   347 
       
   348 // -----------------------------------------------------------------------------
       
   349 // CSipRefreshMgr::RemoveRefreshBy
       
   350 // -----------------------------------------------------------------------------
       
   351 //
       
   352 TInt CSipRefreshMgr::RemoveRefreshBy (CSipRefreshBase* aRefresh)
       
   353 	{
       
   354 	for (TInt i=0; i < iRefreshes.Count(); i++)
       
   355 		{
       
   356         if (iRefreshes[i] == aRefresh)
       
   357 			{
       
   358 			// Transaction owner needs to be cleared so that TU will not
       
   359 			// call the refresh while it is in DeleteMgr 
       
   360 			aRefresh->ClearTransactionOwner();
       
   361 			TInt err = iDeleteMgr->AddDeleteRequest(aRefresh);
       
   362 			if (err == KErrNone) 
       
   363 				{
       
   364 				iRefreshes.Remove (i);
       
   365 				}
       
   366 			return err;
       
   367 			}
       
   368 		}
       
   369 	return KErrNone;
       
   370 	}
       
   371 
       
   372 // -----------------------------------------------------------------------------
       
   373 // CSipRefreshMgr::CurrentTransactionId
       
   374 // -----------------------------------------------------------------------------
       
   375 //
       
   376 TTransactionId CSipRefreshMgr::CurrentTransactionId(
       
   377     const TRefreshId& aRefreshId) const
       
   378     {
       
   379     TTransactionId transactionId = KEmptyTransactionId;
       
   380 	TInt index = FindIndex(aRefreshId,NULL,EFalse);
       
   381 	if (index >= 0) 
       
   382 		{
       
   383 		transactionId = iRefreshes[index]->CurrentTransactionId();
       
   384 		}
       
   385 	return transactionId;   
       
   386     }
       
   387 
       
   388 // -----------------------------------------------------------------------------
       
   389 // CSipRefreshMgr::SIPSecUser
       
   390 // -----------------------------------------------------------------------------
       
   391 //        
       
   392 const MSIPSecUser* CSipRefreshMgr::SIPSecUser(
       
   393     const TRefreshId& aRefreshId) const
       
   394     {
       
   395     const MSIPSecUser* sipSecUser = NULL;
       
   396     TInt index = FindIndex(aRefreshId,NULL,EFalse);
       
   397     if (index >= 0)
       
   398         {
       
   399         sipSecUser = iRefreshes[index]->SIPSecUser();
       
   400         }
       
   401     return sipSecUser;
       
   402     }
       
   403 
       
   404 // -----------------------------------------------------------------------------
       
   405 // CSipRefreshMgr::NextRefreshId
       
   406 // -----------------------------------------------------------------------------
       
   407 //
       
   408 TRefreshId CSipRefreshMgr::NextRefreshId()
       
   409 	{
       
   410 	TRefreshId refreshId = iNextRefreshId;
       
   411     if (iNextRefreshId == KMaxRefreshId)
       
   412 		{
       
   413 		iNextRefreshId = KMinRefreshId;
       
   414 		}
       
   415 	else
       
   416 		{
       
   417 		iNextRefreshId++;
       
   418 		}
       
   419 	return refreshId;
       
   420 	}
       
   421 
       
   422 // -----------------------------------------------------------------------------
       
   423 // CSipRefreshMgr::FindIndex
       
   424 // -----------------------------------------------------------------------------
       
   425 //
       
   426 TInt CSipRefreshMgr::FindIndex (const TRefreshId& aRefreshId,
       
   427                                 const MRefreshOwner* aOwner,
       
   428                                 TBool aCheckOwner) const
       
   429 	{
       
   430 	for (TInt i=0; i < iRefreshes.Count(); i++)
       
   431 		{
       
   432 		CSipRefreshBase* refresh = iRefreshes[i];
       
   433 		if (refresh->Id() == aRefreshId) 
       
   434 			{
       
   435 			if (!aCheckOwner || refresh->Owner() == aOwner)
       
   436 			    {
       
   437 			    return i;
       
   438 			    }
       
   439 			}
       
   440 		}
       
   441     return KErrNotFound;
       
   442 	}
       
   443 
       
   444 // -----------------------------------------------------------------------------
       
   445 // CSipRefreshMgr::FindRefreshL
       
   446 // -----------------------------------------------------------------------------
       
   447 //
       
   448 CSipRefreshBase& CSipRefreshMgr::FindRefreshL (const TRefreshId& aRefreshId,
       
   449                                                const MRefreshOwner* aOwner,
       
   450                                                TBool aCheckOwner)
       
   451 	{
       
   452 	TInt index = FindIndex(aRefreshId,aOwner,aCheckOwner);
       
   453 	if (index < 0) 
       
   454 		{
       
   455 		User::Leave (KErrNotFound);
       
   456 		}
       
   457 	return *iRefreshes[index];
       
   458 	}
       
   459 
       
   460 // -----------------------------------------------------------------------------
       
   461 // CSipRefreshMgr::RemoveRefreshByIAPId
       
   462 // -----------------------------------------------------------------------------
       
   463 //
       
   464 void CSipRefreshMgr::RemoveRefreshByIAPId(const TUint aIAPId)
       
   465 	{
       
   466 	for (TInt i=iRefreshes.Count() - 1; i >= 0; i--)
       
   467 		{
       
   468 		CSipRefreshBase* refresh = iRefreshes[i];
       
   469         if (refresh->IAPId() == aIAPId)
       
   470 			{
       
   471 			iRefreshes.Remove (i);
       
   472 			delete refresh;
       
   473 			}
       
   474 		}
       
   475 	}
       
   476 
       
   477 // -----------------------------------------------------------------------------
       
   478 // CSipRefreshMgr::ConnectionStateChangedL
       
   479 // -----------------------------------------------------------------------------
       
   480 //
       
   481 void CSipRefreshMgr::ConnectionStateChangedL (TUint32                aIapId,
       
   482                                               CSIPConnection::TState aState)
       
   483 	{
       
   484 	if (aState == CSIPConnection::EInactive || 
       
   485         aState == CSIPConnection::EUnavailable)
       
   486 		{
       
   487 		RemoveRefreshByIAPId(aIapId);
       
   488 		}
       
   489 	}
       
   490 
       
   491 // -----------------------------------------------------------------------------
       
   492 // CSipRefreshMgr::UpdateRemoteTargetL
       
   493 // From MSipRefreshMgr:
       
   494 // -----------------------------------------------------------------------------
       
   495 //
       
   496 void CSipRefreshMgr::UpdateRemoteTargetL (const MRefreshOwner* aOwner, 
       
   497 										  CURIContainer& aRemoteTarget)
       
   498 	{
       
   499     __SIP_ASSERT_LEAVE (aOwner != 0, KErrArgument);
       
   500 
       
   501     for (TInt i=iRefreshes.Count()-1; i>=0; i--)
       
   502 		{
       
   503         if (iRefreshes[i]->Owner() == aOwner)
       
   504 			{
       
   505 			iRefreshes[i]->UpdateRemoteTargetL(aRemoteTarget);
       
   506 			}
       
   507 		}
       
   508 	}
       
   509 
       
   510 // -----------------------------------------------------------------------------
       
   511 // CSipRefreshMgr::UpdateHeaderL
       
   512 // From MSipRefreshMgr:
       
   513 // -----------------------------------------------------------------------------
       
   514 //
       
   515 void CSipRefreshMgr::UpdateHeaderL (const TRefreshId& aRefreshId,
       
   516                                     const MRefreshOwner* aOwner,
       
   517 									CSIPHeaderBase* aSIPHeader)
       
   518 	{
       
   519 	TInt index = FindIndex(aRefreshId,aOwner);
       
   520 	if (index >= 0) 
       
   521 		{
       
   522 	    CSipRefreshBase* refresh = iRefreshes[index];
       
   523 	    refresh->SetUpdatedHeader(aSIPHeader);
       
   524 		}
       
   525 	// if no refresh could found by the Id, aSIPHeader is must be deleted
       
   526 	// since the ownersip is transferred.
       
   527 	else 
       
   528 		{
       
   529 		delete aSIPHeader; 
       
   530 		}
       
   531 	}
       
   532 
       
   533 // -----------------------------------------------------------------------------
       
   534 // CSipRefreshMgr::UpdateRouteSetsL
       
   535 // From MSipRefreshMgr:
       
   536 // -----------------------------------------------------------------------------
       
   537 //
       
   538 void CSipRefreshMgr::UpdateRouteSetsL (
       
   539 	const MRefreshOwner* aOwner, 
       
   540 	const RPointerArray<CSIPRouteHeader>& aRouteSet)
       
   541 	{
       
   542 	for (TInt i=0; i < iRefreshes.Count(); i++)
       
   543 		{
       
   544 		if (iRefreshes[i]->Owner() == aOwner) 
       
   545 			{
       
   546 			iRefreshes[i]->SetUpdatedRouteHeadersL(aRouteSet);
       
   547 			}
       
   548 		}	
       
   549 	}
       
   550 
       
   551 // -----------------------------------------------------------------------------
       
   552 // CSipRefreshMgr::RemoveRouteSets
       
   553 // From MSipRefreshMgr:
       
   554 // -----------------------------------------------------------------------------
       
   555 //
       
   556 void CSipRefreshMgr::RemoveRouteSets (const MRefreshOwner* aOwner)
       
   557 	{
       
   558 	for (TInt i=0; i < iRefreshes.Count(); i++)
       
   559 		{
       
   560 		if (iRefreshes[i]->Owner() == aOwner) 
       
   561 			{
       
   562 			iRefreshes[i]->RemoveRouteHeaders();
       
   563 			}
       
   564 		}	
       
   565 	}
       
   566 
       
   567 // -----------------------------------------------------------------------------
       
   568 // CSipRefreshMgr::SetRegistrationIdsEmpty
       
   569 // From MSipRefreshMgr:
       
   570 // -----------------------------------------------------------------------------
       
   571 //
       
   572 void CSipRefreshMgr::SetRegistrationIdsEmpty (const MRefreshOwner* aOwner)
       
   573 	{
       
   574 	for (TInt i=iRefreshes.Count()-1; i>=0; i--)
       
   575 		{
       
   576 		// iRefreshes[i]->Owner() never could be NULL, aOwner could be NULL
       
   577         if (iRefreshes[i]->Owner() == aOwner)
       
   578 			{
       
   579 			iRefreshes[i]->ResetRegistrationId();
       
   580 			}
       
   581 		}
       
   582 	}
       
   583 
       
   584 // -----------------------------------------------------------------------------
       
   585 // CSipRefreshMgr::DeleteTransactionHeaders
       
   586 // -----------------------------------------------------------------------------
       
   587 //
       
   588 void CSipRefreshMgr::DeleteTransactionHeaders (TAny* aTransactionHeaders)
       
   589 	{
       
   590 	MTransactionHeaders* transactionHeaders = 
       
   591         reinterpret_cast<MTransactionHeaders*>(aTransactionHeaders);
       
   592     delete transactionHeaders;
       
   593 	}