realtimenetprots/sipfw/SIP/Dialogs/src/SipDialogItem.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2007-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          : SipDialogItem.cpp
       
    15 // Part of       : SIPDialogs
       
    16 // Version       : SIP/6.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 #include "CSipDialogItem.h"
       
    23 #include "MSipRefreshMgr.h"
       
    24 #include "MTransactionUser.h"
       
    25 #include "sipsec.h"
       
    26 #include "DeleteMgr.h"
       
    27 #include "MDialogOwner.h"
       
    28 #include "SipLogs.h"
       
    29 #include "SipAssert.h"
       
    30 #include "siprequest.h"
       
    31 #include "sipresponse.h"
       
    32 #include "sipcontactheader.h"
       
    33 #include "siptoheader.h"
       
    34 #include "sipfromheader.h"
       
    35 #include "sipcseqheader.h"
       
    36 #include "sipcallidheader.h"
       
    37 #include "siprecordrouteheader.h"
       
    38 #include "siprouteheader.h"
       
    39 #include "sipaddress.h"
       
    40 #include "uricontainer.h"
       
    41 #include "sipuri.h"
       
    42 #include "Establishing.h"
       
    43 #include "Early.h"
       
    44 #include "Confirmed.h"
       
    45 #include "Terminated.h"
       
    46 #include "DialogsStore.h"
       
    47 #include "TransactionItemStore.h"
       
    48 #include "TransactionItemBase.h"
       
    49 #include "RefreshItem.h"
       
    50 #include "TransactionItem.h"
       
    51 #include "CSigCompMgr.h"
       
    52 #include "MSigComp.h"
       
    53 #include "sipcodecutils.h"
       
    54 #include "sipstrings.h"
       
    55 #include "sipstrconsts.h"
       
    56 #include "sipcodecerr.h"
       
    57 #include "siperr.h"
       
    58 #include "TSIPTransportParams.h"
       
    59 
       
    60 const TUint K100Response = 100;
       
    61 const TUint K400Response = 400;
       
    62 const TUint K500Response = 500;
       
    63 
       
    64 
       
    65 // -----------------------------------------------------------------------------
       
    66 // CSipDialogItem::NewLC
       
    67 // -----------------------------------------------------------------------------
       
    68 //
       
    69 CSipDialogItem* CSipDialogItem::NewLC(CDialogsStore& aDialogStore,
       
    70                                       MDialogOwner* aDialogOwner,
       
    71                                       MSIPSecUser& aSIPSecUser,
       
    72                                       MTransactionUser& aTransactionUser, 
       
    73                                       MSipRefreshMgr& aRefreshMgr,
       
    74                                       CSIPSec& aSIPSec,
       
    75                                       CDeleteMgr& aDeleteMgr,
       
    76                                       MSigComp& aSigComp,
       
    77                                       TRegistrationId aRegistrationId)
       
    78 	{
       
    79 	CSipDialogItem* self = new(ELeave)CSipDialogItem(aDialogStore,
       
    80 	                                                 aSIPSecUser,
       
    81                                                      aTransactionUser,
       
    82                                                      aRefreshMgr,
       
    83                                                      aSIPSec,
       
    84                                                      aDeleteMgr,
       
    85                                                      aSigComp,
       
    86                                                      aRegistrationId);
       
    87 	CleanupStack::PushL(self);	
       
    88 	self->ConstructL(aDialogOwner);
       
    89 	return self;
       
    90 	}
       
    91 
       
    92 // -----------------------------------------------------------------------------
       
    93 // CSipDialogItem::CSipDialogItem
       
    94 // -----------------------------------------------------------------------------
       
    95 //
       
    96 CSipDialogItem::CSipDialogItem (CDialogsStore& aDialogStore,
       
    97                                 MSIPSecUser& aSIPSecUser,
       
    98 								MTransactionUser& aTransactionUser, 
       
    99 								MSipRefreshMgr& aRefreshMgr,
       
   100 								CSIPSec& aSIPSec,
       
   101 								CDeleteMgr& aDeleteMgr,
       
   102 								MSigComp& aSigComp,
       
   103 								TRegistrationId aRegistrationId)
       
   104 : iRegistrationId(aRegistrationId),
       
   105   iDialogStore(aDialogStore),
       
   106   iTU(aTransactionUser),
       
   107   iRefreshMgr(aRefreshMgr),
       
   108   iSIPSec(aSIPSec), 
       
   109   iDeleteMgr(aDeleteMgr),
       
   110   iSigComp(aSigComp),
       
   111   iSIPSecUser(aSIPSecUser),
       
   112   iTerminated(*this),
       
   113   iConfirmed(*this,iTerminated),
       
   114   iEarly(*this,iConfirmed,iTerminated),
       
   115   iEstablishing(*this,iEarly,iConfirmed,iTerminated),    
       
   116   iRemoteTagSet(EFalse)
       
   117   	{
       
   118   	iTagParamName = SIPStrings::StringF(SipStrConsts::ETag);
       
   119   	iTransportParamName = SIPStrings::StringF(SipStrConsts::ETransport);
       
   120   	iContactHeaderName = SIPStrings::StringF(SipStrConsts::EContactHeader);
       
   121 	}
       
   122 
       
   123 // -----------------------------------------------------------------------------
       
   124 // CSipDialogItem::ConstructL
       
   125 // -----------------------------------------------------------------------------
       
   126 //
       
   127 void CSipDialogItem::ConstructL (MDialogOwner* aDialogOwner)
       
   128 	{
       
   129     __SIP_ASSERT_LEAVE(aDialogOwner, KErrArgument);
       
   130 
       
   131     iDialogOwner = aDialogOwner;
       
   132     iTransactionItemStore = CTransactionItemStore::NewL();
       
   133     iSigCompMgr = CSigCompMgr::NewL(
       
   134         aDialogOwner->TransportParams(KEmptyRegistrationId).IapId(),iSigComp);
       
   135 
       
   136     iDialogId = iDialogStore.NewDialogId();
       
   137 	ChangeState(iEstablishing);
       
   138 	}
       
   139 
       
   140 // -----------------------------------------------------------------------------
       
   141 // CSipDialogItem::~CSipDialogItem
       
   142 // -----------------------------------------------------------------------------
       
   143 //
       
   144 CSipDialogItem::~CSipDialogItem()
       
   145 	{
       
   146     iTU.ClearTransactionOwner(this);
       
   147     delete iSigCompMgr;
       
   148 	delete iCallId;
       
   149 	iLocalTag.Close();
       
   150 	iRemoteTag.Close();
       
   151 	delete iLocalAddress;
       
   152 	delete iRemoteAddress;
       
   153 	delete iLocalTarget;
       
   154 	delete iRemoteTarget;
       
   155 	iRouteSet.ResetAndDestroy();
       
   156     delete iTransactionItemStore;
       
   157     iSIPSec.ClearCache(this);
       
   158 	}
       
   159 
       
   160 // -----------------------------------------------------------------------------
       
   161 // CSipDialogItem::IapId
       
   162 // -----------------------------------------------------------------------------
       
   163 //
       
   164 TUint32 CSipDialogItem::IapId()
       
   165     {
       
   166     return TransportParams(KEmptyRegistrationId).IapId();
       
   167     }
       
   168 
       
   169 // -----------------------------------------------------------------------------
       
   170 // CSipDialogItem::RegistrationId
       
   171 // -----------------------------------------------------------------------------
       
   172 //
       
   173 TRegistrationId CSipDialogItem::RegistrationId() const
       
   174     {
       
   175     return iRegistrationId;
       
   176     }
       
   177 
       
   178 // -----------------------------------------------------------------------------
       
   179 // CSipDialogItem::Offset
       
   180 // -----------------------------------------------------------------------------
       
   181 //
       
   182 TInt CSipDialogItem::Offset ()
       
   183 	{
       
   184     return _FOFF(CSipDialogItem,iLink);
       
   185 	}
       
   186 
       
   187 // -----------------------------------------------------------------------------
       
   188 // CSipDialogItem::ResetStateL
       
   189 // -----------------------------------------------------------------------------
       
   190 //
       
   191 void CSipDialogItem::ResetStateL()
       
   192     {
       
   193     CTransactionItemStore* transactionStore = CTransactionItemStore::NewLC();
       
   194     CSigCompMgr* sigCompMgr = 
       
   195         CSigCompMgr::NewL(
       
   196             iDialogOwner->TransportParams(KEmptyRegistrationId).IapId(),
       
   197             iSigComp);
       
   198     CleanupStack::Pop(transactionStore);
       
   199     iTU.ClearTransactionOwner(this);
       
   200     iSIPSec.ClearCache(this);
       
   201     delete iTransactionItemStore;
       
   202     iTransactionItemStore = transactionStore;  
       
   203     delete iSigCompMgr;
       
   204     iSigCompMgr = sigCompMgr;
       
   205     iRemoteTag = SIPStrings::StringF(SipStrConsts::EEmpty);
       
   206     iRemoteTagSet = EFalse;
       
   207     ChangeState(iEstablishing);
       
   208     }
       
   209 
       
   210 // -----------------------------------------------------------------------------
       
   211 // CSipDialogItem::DialogOwner
       
   212 // -----------------------------------------------------------------------------
       
   213 //
       
   214 MDialogOwner* CSipDialogItem::DialogOwner()
       
   215 	{
       
   216 	return iDialogOwner;
       
   217 	}
       
   218 
       
   219 // -----------------------------------------------------------------------------
       
   220 // CSipDialogItem::DeleteMgr
       
   221 // -----------------------------------------------------------------------------
       
   222 //
       
   223 CDeleteMgr& CSipDialogItem::DeleteMgr()
       
   224 	{
       
   225 	return iDeleteMgr;
       
   226 	}
       
   227 
       
   228 // -----------------------------------------------------------------------------
       
   229 // CSipDialogItem::Match
       
   230 // -----------------------------------------------------------------------------
       
   231 //	
       
   232 TBool CSipDialogItem::Match(CSIPRequest& aRequest) const
       
   233     {
       
   234 	CSIPCallIDHeader* callId = aRequest.CallID();
       
   235 	CSIPToHeader* to = aRequest.To();	
       
   236 	CSIPFromHeader* from = aRequest.From();
       
   237 	
       
   238 	if ((callId && *callId == *iCallId) &&
       
   239 		(to && 
       
   240 		 to->HasParam(iTagParamName) && 
       
   241 	     iLocalTag == to->ParamValue(iTagParamName)))
       
   242 		{
       
   243 		if (iRemoteTagSet)
       
   244 			{
       
   245 			if (from && 
       
   246 			    from->HasParam(iTagParamName) &&
       
   247                 iRemoteTag == from->ParamValue(iTagParamName))
       
   248                 {
       
   249                 return iCurrentState->Accept(aRequest);
       
   250                 }
       
   251             }
       
   252         else
       
   253             {
       
   254 			return iCurrentState->Accept(aRequest);
       
   255             }
       
   256 		}
       
   257 		
       
   258     return EFalse;
       
   259     }
       
   260 
       
   261 // -----------------------------------------------------------------------------
       
   262 // CSipDialogItem::ContactOk
       
   263 // -----------------------------------------------------------------------------
       
   264 //    
       
   265 TBool CSipDialogItem::ContactOk(const CSIPContactHeader& aContact)
       
   266     {		
       
   267 	if (aContact.Star() || !aContact.SIPAddress())
       
   268         {
       
   269         return EFalse;
       
   270         }
       
   271     return (aContact.SIPAddress()->URI().IsSIPURI());   
       
   272     }
       
   273 
       
   274 // -----------------------------------------------------------------------------
       
   275 // CSipDialogItem::SetFirstTransactionIdId
       
   276 // -----------------------------------------------------------------------------
       
   277 //
       
   278 void CSipDialogItem::SetFirstTransactionId(const TTransactionId& aTransactionId)
       
   279 	{
       
   280 	iFirstTransactionId = aTransactionId;
       
   281 	}
       
   282 
       
   283 // -----------------------------------------------------------------------------
       
   284 // CSipDialogItem::FirstTransactionId
       
   285 // -----------------------------------------------------------------------------
       
   286 //
       
   287 TTransactionId CSipDialogItem::FirstTransactionId()
       
   288 	{
       
   289 	return iFirstTransactionId;
       
   290 	}
       
   291 
       
   292 // -----------------------------------------------------------------------------
       
   293 // CSipDialogItem::DialogId
       
   294 // -----------------------------------------------------------------------------
       
   295 //
       
   296 TDialogId CSipDialogItem::DialogId() const
       
   297 	{
       
   298 	return iDialogId;
       
   299 	}
       
   300 
       
   301 // -----------------------------------------------------------------------------
       
   302 // CSipDialogItem::SelfDestruct
       
   303 // -----------------------------------------------------------------------------
       
   304 //
       
   305 void CSipDialogItem::SelfDestruct ()
       
   306     {
       
   307 	iTU.ClearTransactionOwner(this);
       
   308 	ChangeState(iTerminated);
       
   309     iDialogStore.Remove(this);
       
   310     }
       
   311 
       
   312 // -----------------------------------------------------------------------------
       
   313 // CSipDialogItem::TerminateForkedDialogs
       
   314 // -----------------------------------------------------------------------------
       
   315 //
       
   316 void CSipDialogItem::TerminateForkedDialogs (TTransactionId aTransactionId)
       
   317     {
       
   318     iDialogStore.RemoveAllEarlyDialogsWith(aTransactionId);
       
   319     }
       
   320 
       
   321 // -----------------------------------------------------------------------------
       
   322 // CSipDialogItem::IsEarly
       
   323 // -----------------------------------------------------------------------------
       
   324 //
       
   325 TBool CSipDialogItem::IsEarly () const
       
   326     {
       
   327     return (iCurrentState == &iEarly);
       
   328     }
       
   329 
       
   330 // -----------------------------------------------------------------------------
       
   331 // CSipDialogItem::TransactionItems
       
   332 // -----------------------------------------------------------------------------
       
   333 //
       
   334 CTransactionItemStore& CSipDialogItem::TransactionItems ()
       
   335     {
       
   336     return *iTransactionItemStore;
       
   337     }
       
   338 
       
   339 // -----------------------------------------------------------------------------
       
   340 // CSipDialogItem::HasTransactionItem
       
   341 // -----------------------------------------------------------------------------
       
   342 //
       
   343 TBool CSipDialogItem::HasTransactionItem (TTransactionId aTransactionId)
       
   344     {
       
   345     return iTransactionItemStore->HasItem(aTransactionId);
       
   346     }
       
   347 
       
   348 // -----------------------------------------------------------------------------
       
   349 // CSipDialogItem::RemoveTransactionItem
       
   350 // -----------------------------------------------------------------------------
       
   351 //
       
   352 TInt CSipDialogItem::RemoveTransactionItem(TTransactionId& aTransactionId)
       
   353     {
       
   354     return iTransactionItemStore->RemoveItem(aTransactionId);
       
   355     }
       
   356 
       
   357 // -----------------------------------------------------------------------------
       
   358 // CSipDialogItem::ChangeState
       
   359 // -----------------------------------------------------------------------------
       
   360 //
       
   361 void CSipDialogItem::ChangeState(TDialogStateBase& aState)
       
   362 	{
       
   363 	if (iCurrentState != &aState)
       
   364 		{
       
   365 		iCurrentState = &aState;
       
   366 		__SIP_INT_LOG1( "CSipDialogItem::ChangeState: ID", iDialogId )
       
   367 		__SIP_DES8_LOG( "CSipDialogItem::ChangeState: state", aState.Name() )
       
   368 		}
       
   369 	}
       
   370 
       
   371 // -----------------------------------------------------------------------------
       
   372 // CSipDialogItem::CurrentState
       
   373 // -----------------------------------------------------------------------------
       
   374 //
       
   375 TDialogStateBase& CSipDialogItem::CurrentState()
       
   376 	{
       
   377 	return *iCurrentState;
       
   378 	}
       
   379 
       
   380 // -----------------------------------------------------------------------------
       
   381 // CSipDialogItem::CallId
       
   382 // -----------------------------------------------------------------------------
       
   383 //
       
   384 CSIPCallIDHeader* CSipDialogItem::CallId()
       
   385 	{
       
   386 	return iCallId;
       
   387 	}
       
   388 
       
   389 // -----------------------------------------------------------------------------
       
   390 // CSipDialogItem::SetCallId
       
   391 // -----------------------------------------------------------------------------
       
   392 //
       
   393 void CSipDialogItem::SetCallId (CSIPCallIDHeader* aCallId)
       
   394 	{
       
   395     delete iCallId;
       
   396 	iCallId = aCallId;
       
   397 	}
       
   398 
       
   399 // -----------------------------------------------------------------------------
       
   400 // CSipDialogItem::LocalTag
       
   401 // -----------------------------------------------------------------------------
       
   402 //
       
   403 RStringF CSipDialogItem::LocalTag ()
       
   404 	{
       
   405 	return iLocalTag;
       
   406 	}
       
   407 
       
   408 // -----------------------------------------------------------------------------
       
   409 // CSipDialogItem::SetLocalTag
       
   410 // -----------------------------------------------------------------------------
       
   411 //
       
   412 void CSipDialogItem::SetLocalTag (RStringF aTag)
       
   413 	{
       
   414 	iLocalTag.Close();
       
   415 	iLocalTag = aTag.Copy();
       
   416 	}
       
   417 
       
   418 // -----------------------------------------------------------------------------
       
   419 // CSipDialogItem::RemoteTag
       
   420 // -----------------------------------------------------------------------------
       
   421 //
       
   422 RStringF CSipDialogItem::RemoteTag ()
       
   423 	{
       
   424 	return iRemoteTag;
       
   425 	}
       
   426 
       
   427 // -----------------------------------------------------------------------------
       
   428 // CSipDialogItem::RemoteTag
       
   429 // -----------------------------------------------------------------------------
       
   430 //
       
   431 TBool CSipDialogItem::RemoteTagSet ()
       
   432 	{
       
   433 	return iRemoteTagSet;
       
   434 	}
       
   435 
       
   436 // -----------------------------------------------------------------------------
       
   437 // CSipDialogItem::SetRemoteTagL
       
   438 // -----------------------------------------------------------------------------
       
   439 //
       
   440 void CSipDialogItem::SetRemoteTagL (CSIPFromToHeaderBase* aFromTo)
       
   441 	{
       
   442     if (aFromTo->HasParam(iTagParamName))
       
   443         {
       
   444 	    if (iRemoteTagSet)
       
   445             {
       
   446             if (iRemoteTag != aFromTo->ParamValue(iTagParamName))
       
   447                 {
       
   448                 User::Leave (KErrAlreadyExists);
       
   449                 }
       
   450             }
       
   451         else
       
   452             {
       
   453             RStringF tmp = aFromTo->ParamValue(iTagParamName);
       
   454 			UpdateRemoteTagForRefreshesL(tmp);
       
   455 	        iRemoteTag.Close();
       
   456             iRemoteTag = tmp.Copy();
       
   457 			iRemoteTagSet = ETrue;
       
   458             }
       
   459         }
       
   460 	}
       
   461 
       
   462 // -----------------------------------------------------------------------------
       
   463 // CSipDialogItem::LocalSeqNum
       
   464 // -----------------------------------------------------------------------------
       
   465 //
       
   466 TUint CSipDialogItem::LocalSeqNum()
       
   467 	{
       
   468 	return iLocalSeqNum;
       
   469 	}
       
   470 
       
   471 // -----------------------------------------------------------------------------
       
   472 // CSipDialogItem::SetLocalSeqNum
       
   473 // -----------------------------------------------------------------------------
       
   474 //
       
   475 void CSipDialogItem::SetLocalSeqNum(TUint aNum)
       
   476 	{
       
   477 	iLocalSeqNum = aNum;
       
   478 	}
       
   479 
       
   480 // -----------------------------------------------------------------------------
       
   481 // CSipDialogItem::RemoteSeqNum
       
   482 // -----------------------------------------------------------------------------
       
   483 //
       
   484 TUint CSipDialogItem::RemoteSeqNum()
       
   485 	{
       
   486 	return iRemoteSeqNum;
       
   487 	}
       
   488 
       
   489 // -----------------------------------------------------------------------------
       
   490 // CSipDialogItem::SetRemoteSeqNum
       
   491 // -----------------------------------------------------------------------------
       
   492 //
       
   493 void CSipDialogItem::SetRemoteSeqNum(TUint aNum)
       
   494 	{
       
   495 	iRemoteSeqNum = aNum;
       
   496 	}
       
   497 
       
   498 // -----------------------------------------------------------------------------
       
   499 // CSipDialogItem::LocalAddress
       
   500 // -----------------------------------------------------------------------------
       
   501 //
       
   502 const CSIPAddress* CSipDialogItem::LocalAddress()
       
   503 	{
       
   504 	return iLocalAddress;
       
   505 	}
       
   506 
       
   507 // -----------------------------------------------------------------------------
       
   508 // CSipDialogItem::SetLocalAddressL
       
   509 // -----------------------------------------------------------------------------
       
   510 //
       
   511 void CSipDialogItem::SetLocalAddressL (const CSIPAddress& aAddr)
       
   512 	{
       
   513 	CSIPAddress* tmp = CSIPAddress::NewL(aAddr);
       
   514 	delete iLocalAddress;
       
   515 	iLocalAddress = tmp;
       
   516 	}
       
   517 
       
   518 // -----------------------------------------------------------------------------
       
   519 // CSipDialogItem::RemoteAddress
       
   520 // -----------------------------------------------------------------------------
       
   521 //
       
   522 const CSIPAddress* CSipDialogItem::RemoteAddress()
       
   523 	{
       
   524 	return iRemoteAddress;
       
   525 	}
       
   526 
       
   527 // -----------------------------------------------------------------------------
       
   528 // CSipDialogItem::SetRemoteAddressL
       
   529 // -----------------------------------------------------------------------------
       
   530 //
       
   531 void CSipDialogItem::SetRemoteAddressL (const CSIPAddress& aAddr)
       
   532 	{
       
   533 	CSIPAddress* tmp = CSIPAddress::NewL(aAddr);
       
   534 	delete iRemoteAddress;
       
   535 	iRemoteAddress = tmp;
       
   536 	}
       
   537 
       
   538 // -----------------------------------------------------------------------------
       
   539 // CSipDialogItem::RemoteTarget
       
   540 // -----------------------------------------------------------------------------
       
   541 //
       
   542 CURIContainer* CSipDialogItem::RemoteTarget()
       
   543 	{
       
   544 	return iRemoteTarget;
       
   545 	}
       
   546 	
       
   547 // -----------------------------------------------------------------------------
       
   548 // CSipDialogItem::SetInitialRemoteTargetL
       
   549 // -----------------------------------------------------------------------------
       
   550 //	
       
   551 void CSipDialogItem::SetInitialRemoteTargetL (CURIContainer& aUri)
       
   552     {
       
   553     CURIContainer* tmp = CURIContainer::NewL(aUri);
       
   554 	delete iRemoteTarget;
       
   555     iRemoteTarget = tmp;    
       
   556     }
       
   557 
       
   558 // -----------------------------------------------------------------------------
       
   559 // CSipDialogItem::SetRemoteTargetL
       
   560 // -----------------------------------------------------------------------------
       
   561 //
       
   562 void CSipDialogItem::SetRemoteTargetL (CURIContainer& aUri)
       
   563 	{
       
   564 	__ASSERT_ALWAYS(aUri.IsSIPURI(), User::Leave(KErrSIPInvalidURIType));
       
   565 	if (iLocalTarget)
       
   566 		{
       
   567 		CSIPURI* localTargetURI = iLocalTarget->SIPAddress()->URI().SIPURI();
       
   568 		iSigCompMgr->UpdateL(aUri,iRouteSet,*localTargetURI);
       
   569 		}
       
   570     CURIContainer* tmp = CURIContainer::NewL(aUri);
       
   571 	if (iTransactionItemStore->HasRefreshedItems())
       
   572 		{
       
   573 		CleanupStack::PushL(tmp);
       
   574 		iRefreshMgr.UpdateRemoteTargetL(this,*tmp);
       
   575 		CleanupStack::Pop(tmp);
       
   576 		}
       
   577 	delete iRemoteTarget;
       
   578     iRemoteTarget = tmp;
       
   579  	}
       
   580 
       
   581 // -----------------------------------------------------------------------------
       
   582 // CSipDialogItem::SetRemoteTargetWithMsgL
       
   583 // -----------------------------------------------------------------------------
       
   584 //
       
   585 void CSipDialogItem::SetRemoteTargetWithMsgL (CSIPMessage& aMsg)
       
   586 	{
       
   587 	CSIPContactHeader* contact = static_cast<CSIPContactHeader*> 
       
   588                                    (aMsg.Header(iContactHeaderName,0));
       
   589 	if (contact && contact->SIPAddress())
       
   590         {
       
   591 		SetRemoteTargetL(contact->SIPAddress()->URI());
       
   592 		// Contact is updated only for outgoing requests
       
   593 		UpdateTransportForNextHopAndLocalTargetL(NULL);
       
   594         }
       
   595 	}
       
   596 
       
   597 // -----------------------------------------------------------------------------
       
   598 // CSipDialogItem::LocalTarget
       
   599 // -----------------------------------------------------------------------------
       
   600 //
       
   601 CSIPContactHeader* CSipDialogItem::LocalTarget()
       
   602 	{
       
   603 	return iLocalTarget;
       
   604 	}
       
   605 
       
   606 // -----------------------------------------------------------------------------
       
   607 // CSipDialogItem::SetLocalTargetL
       
   608 // -----------------------------------------------------------------------------
       
   609 //
       
   610 void CSipDialogItem::SetLocalTargetL(CSIPContactHeader& aContact,
       
   611                                      TBool aUpdateSigCompParam)
       
   612 	{
       
   613 	__ASSERT_ALWAYS(aContact.SIPAddress(), 
       
   614 	                User::Leave(KErrSIPInvalidURIType));
       
   615 	CURIContainer& contactURI = aContact.SIPAddress()->URI();
       
   616 	__ASSERT_ALWAYS(contactURI.IsSIPURI(), User::Leave(KErrSIPInvalidURIType));
       
   617     if (iRouteSet.Count() > 0 && iRouteSet[0] != NULL &&
       
   618         iRouteSet[0]->SIPAddress().URI().IsSIPURI() && 
       
   619         iRouteSet[0]->SIPAddress().URI().SIPURI()->IsSIPSURI())
       
   620         {
       
   621         // Next hop has sips-scheme
       
   622 		aContact.SIPAddress()->URI().SIPURI()->SetSIPS(ETrue);
       
   623 		}	
       
   624 	if (iRemoteTarget)
       
   625 		{
       
   626 		iSigCompMgr->UpdateL(*iRemoteTarget, iRouteSet,
       
   627 		                     *contactURI.SIPURI(), aUpdateSigCompParam);
       
   628 		}
       
   629     CSIPContactHeader* tmp = static_cast<CSIPContactHeader*>(aContact.CloneL());
       
   630 	delete iLocalTarget;
       
   631 	iLocalTarget = tmp;
       
   632     }
       
   633 
       
   634 // -----------------------------------------------------------------------------
       
   635 // CSipDialogItem::SetLocalTargetWithMsgL
       
   636 // -----------------------------------------------------------------------------
       
   637 //
       
   638 void CSipDialogItem::SetLocalTargetWithMsgL(CSIPMessage& aMsg, 
       
   639 											TBool aUpdateSigCompParam)
       
   640 	{
       
   641 	CSIPContactHeader* contact = 
       
   642 	    static_cast<CSIPContactHeader*>(aMsg.Header(iContactHeaderName,0));
       
   643 	if (contact)
       
   644         {       
       
   645 		SetLocalTargetL(*contact,aUpdateSigCompParam);
       
   646 		UpdateTransportForNextHopAndLocalTargetL(contact);
       
   647 		if (aMsg.IsRequest())
       
   648 		    {
       
   649 		    // UpdateTransportForNextHopAndLocalTargetL 
       
   650 		    // may have updated the next hop transport
       
   651 		    aMsg.DeleteHeaders(SIPStrings::StringF(SipStrConsts::ERouteHeader));
       
   652 		    AddRouteToMessageL(aMsg);
       
   653 		    }
       
   654         }
       
   655 	}
       
   656 
       
   657 // -----------------------------------------------------------------------------
       
   658 // CSipDialogItem::SetRouteSetL
       
   659 // -----------------------------------------------------------------------------
       
   660 //
       
   661 void CSipDialogItem::SetRouteSetL(RPointerArray<CSIPRouteHeaderBase>& aRoute)
       
   662 	{
       
   663 	RPointerArray<CSIPRouteHeader>* routeSet = 
       
   664         new(ELeave)RPointerArray<CSIPRouteHeader>;
       
   665     TCleanupItem cleanupItem(CleanupRouteSet,routeSet);
       
   666 	CleanupStack::PushL (cleanupItem);
       
   667 
       
   668 	for (TInt i=0; i < aRoute.Count(); i++)
       
   669 		{
       
   670 		CSIPRouteHeader* routeHeader = 
       
   671 		    SIPCodecUtils::CreateRouteHeaderLC(*(aRoute[i]));    
       
   672 		User::LeaveIfError(routeSet->Append(routeHeader));
       
   673 		CleanupStack::Pop(routeHeader);
       
   674 		}
       
   675 
       
   676 	/* Ownership is transferred for routeset, so popping routset before passing 
       
   677 	 * to SetRouteSet()
       
   678 	 */
       
   679 	CleanupStack::Pop(1); // cleanupItem
       
   680 	SetRouteSet(routeSet); // ownership transferred
       
   681 	}
       
   682 
       
   683 // -----------------------------------------------------------------------------
       
   684 // CSipDialogItem::SetRouteSetUsingRouteL
       
   685 // -----------------------------------------------------------------------------
       
   686 //
       
   687 void CSipDialogItem::SetRouteSetUsingRouteL (CSIPMessage& aMessage)
       
   688 	{
       
   689 	TSglQueIter<CSIPHeaderBase> iter = 
       
   690         aMessage.Headers(SIPStrings::StringF(SipStrConsts::ERouteHeader));
       
   691 	
       
   692 	RPointerArray<CSIPRouteHeader>* routeSet = 
       
   693         new(ELeave)RPointerArray<CSIPRouteHeader>;
       
   694     TCleanupItem cleanupItem(CleanupRouteSet,routeSet);
       
   695 	CleanupStack::PushL (cleanupItem);
       
   696 
       
   697 	while (iter)
       
   698 		{
       
   699 		CSIPHeaderBase* header = iter++;
       
   700 		CSIPRouteHeader* newRoute = 
       
   701 		    static_cast<CSIPRouteHeader*>(header->CloneL());
       
   702 		CleanupStack::PushL(newRoute);
       
   703         User::LeaveIfError(routeSet->Append(newRoute));
       
   704         CleanupStack::Pop(newRoute);
       
   705 		}
       
   706 
       
   707 	/* Ownership is transferred for routeset, so popping routset before passing 
       
   708 	 * to SetRouteSet()
       
   709 	 */
       
   710 	CleanupStack::Pop(1); // cleanupItem
       
   711 	SetRouteSet(routeSet); // ownership transferred
       
   712 	}
       
   713 
       
   714 // -----------------------------------------------------------------------------
       
   715 // CSipDialogItem::SetRouteSetUsingRecordRouteL
       
   716 // -----------------------------------------------------------------------------
       
   717 //
       
   718 void CSipDialogItem::SetRouteSetUsingRecordRouteL (CSIPMessage& aMessage, 
       
   719 												   TBool aIsUAC,
       
   720 												   TInt aLeaveCode)
       
   721 	{
       
   722 	TSglQueIter<CSIPHeaderBase> iter = 
       
   723         aMessage.Headers(SIPStrings::StringF(SipStrConsts::ERecordRouteHeader));
       
   724 	
       
   725 	if (iter)
       
   726 		{
       
   727 		RPointerArray<CSIPRouteHeader>* routeSet = 
       
   728             new(ELeave)RPointerArray<CSIPRouteHeader>;
       
   729 		TCleanupItem cleanupItem(CleanupRouteSet,routeSet);
       
   730 		CleanupStack::PushL (cleanupItem);
       
   731 	
       
   732 	    while (iter)
       
   733     		{
       
   734 	    	CSIPHeaderBase* header = iter++;
       
   735 		    CSIPRecordRouteHeader* recRoute = 
       
   736                 static_cast<CSIPRecordRouteHeader*>(header);
       
   737 	    	CSIPRouteHeader* newRoute = 
       
   738 	    	    SIPCodecUtils::CreateRouteHeaderLC(*recRoute);
       
   739             if (aIsUAC)
       
   740                 {
       
   741 		    	User::LeaveIfError(routeSet->Insert(newRoute, 0));
       
   742                 }
       
   743 	    	else
       
   744                 {
       
   745 	    		User::LeaveIfError(routeSet->Append(newRoute));
       
   746                 }
       
   747 		    CleanupStack::Pop(newRoute);
       
   748 		    }
       
   749 		CSIPRouteHeader* firstRoute = (*routeSet)[0];
       
   750 		if (!firstRoute->SIPAddress().URI().IsSIPURI())
       
   751 		    {
       
   752 		    User::Leave(aLeaveCode);
       
   753 		    }           
       
   754 		iRefreshMgr.UpdateRouteSetsL(this,*routeSet);
       
   755 
       
   756 		/* Ownership is transferred for routeset, so popping routset before passing 
       
   757 	 	* to SetRouteSet()
       
   758 	 	*/
       
   759 		CleanupStack::Pop(1); // cleanupItem
       
   760 		SetRouteSet(routeSet); // ownership transferred
       
   761     	
       
   762 	    }
       
   763     else
       
   764 		{
       
   765 		iRefreshMgr.RemoveRouteSets(this);
       
   766 		iRouteSet.ResetAndDestroy();
       
   767 		}
       
   768 	// Route updated, tell Refreshes not to include Registration Id 
       
   769 	// for the calls to TU anymore.
       
   770 	iRefreshMgr.SetRegistrationIdsEmpty(this);
       
   771 	}
       
   772 
       
   773 // -----------------------------------------------------------------------------
       
   774 // CSipDialogItem::SetRouteSet
       
   775 // -----------------------------------------------------------------------------
       
   776 //
       
   777 void CSipDialogItem::SetRouteSet (RPointerArray<CSIPRouteHeader>* aRouteSet)
       
   778 	{
       
   779 	iRouteSet.ResetAndDestroy();
       
   780 	if (aRouteSet)
       
   781 		{
       
   782 		iRouteSet = *aRouteSet;
       
   783 		
       
   784 		delete aRouteSet;
       
   785 		}
       
   786 	}
       
   787 
       
   788 // -----------------------------------------------------------------------------
       
   789 // CSipDialogItem::HasRouteSet
       
   790 // -----------------------------------------------------------------------------
       
   791 //
       
   792 TBool CSipDialogItem::HasRouteSet() const
       
   793     {
       
   794     return (iRouteSet.Count() > 0);
       
   795     }
       
   796 
       
   797 // -----------------------------------------------------------------------------
       
   798 // CSipDialogItem::AddRouteToMessageL
       
   799 // -----------------------------------------------------------------------------
       
   800 //
       
   801 void CSipDialogItem::AddRouteToMessageL(CSIPMessage& aMessage)
       
   802 	{
       
   803 	for (TInt i=0; i < iRouteSet.Count(); i++)
       
   804 		{
       
   805 		CSIPRouteHeader* route = 
       
   806 		    static_cast<CSIPRouteHeader*>(iRouteSet[i]->CloneL());
       
   807 		CleanupStack::PushL(route);		    
       
   808 		aMessage.AddHeaderL(route);
       
   809 		CleanupStack::Pop(route);
       
   810         }
       
   811 	}
       
   812 
       
   813 // -----------------------------------------------------------------------------
       
   814 // CSipDialogItem::AddRecordRouteToMessageL
       
   815 // -----------------------------------------------------------------------------
       
   816 //
       
   817 void CSipDialogItem::AddRecordRouteToMessageL(CSIPMessage& aMessage)
       
   818 	{
       
   819 	for (TInt i=0; i < iRouteSet.Count(); i++)
       
   820 		{
       
   821 		CSIPRecordRouteHeader* route = 
       
   822 		    SIPCodecUtils::CreateRecordRouteHeaderLC(*(iRouteSet[i]));
       
   823 		aMessage.AddHeaderL(route);
       
   824 		CleanupStack::Pop(route);
       
   825 		}
       
   826 	}
       
   827 
       
   828 // -----------------------------------------------------------------------------
       
   829 // CSipDialogItem::AddToHeaderInDialogL
       
   830 // -----------------------------------------------------------------------------
       
   831 //
       
   832 void CSipDialogItem::AddToHeaderInDialogL(CSIPRequest& aRequest)
       
   833 	{
       
   834     if (!aRequest.To())
       
   835         {
       
   836 	    CSIPAddress* address = CSIPAddress::NewLC(*iRemoteAddress);
       
   837 	    CSIPToHeader* to = CSIPToHeader::NewL(address);
       
   838 	    CleanupStack::Pop(address);
       
   839 	    CleanupStack::PushL(to);
       
   840 	    if (iRemoteTagSet)
       
   841             {
       
   842     		to->SetParamL(iTagParamName,iRemoteTag);
       
   843 			}
       
   844     	aRequest.AddHeaderL(to);
       
   845     	CleanupStack::Pop(to);
       
   846         }
       
   847 	}
       
   848 
       
   849 // -----------------------------------------------------------------------------
       
   850 // CSipDialogItem::AddFromHeaderInDialogL
       
   851 // -----------------------------------------------------------------------------
       
   852 //
       
   853 void CSipDialogItem::AddFromHeaderInDialogL(CSIPRequest& aRequest)
       
   854 	{
       
   855     if (!aRequest.From())
       
   856         {
       
   857     	CSIPAddress* address = CSIPAddress::NewLC(*iLocalAddress);
       
   858     	CSIPFromHeader* from = CSIPFromHeader::NewL(address);
       
   859     	CleanupStack::Pop(address);
       
   860     	CleanupStack::PushL(from);
       
   861     	from->SetParamL(iTagParamName,iLocalTag);
       
   862     	aRequest.AddHeaderL(from);
       
   863     	CleanupStack::Pop(from);
       
   864         }
       
   865 	}
       
   866 
       
   867 // -----------------------------------------------------------------------------
       
   868 // CSipDialogItem::AddCallIdHeaderInDialogL
       
   869 // -----------------------------------------------------------------------------
       
   870 //
       
   871 void CSipDialogItem::AddCallIdHeaderInDialogL(CSIPMessage& aMessage)
       
   872 	{    
       
   873     if (!aMessage.CallID())
       
   874         {
       
   875     	CSIPCallIDHeader* callId = 
       
   876     	    static_cast<CSIPCallIDHeader*>(iCallId->CloneL());
       
   877     	CleanupStack::PushL(callId);
       
   878     	aMessage.AddHeaderL(callId);
       
   879     	CleanupStack::Pop(callId);
       
   880         }
       
   881     }
       
   882 
       
   883 // -----------------------------------------------------------------------------
       
   884 // CSipDialogItem::AddCSeqHeaderInDialogL
       
   885 // -----------------------------------------------------------------------------
       
   886 //
       
   887 void CSipDialogItem::AddCSeqHeaderInDialogL(CSIPRequest& aRequest)
       
   888 	{
       
   889     if (!aRequest.CSeq())
       
   890         {
       
   891     	CSIPCSeqHeader* cseq = 
       
   892     	    CSIPCSeqHeader::NewLC(iLocalSeqNum+1,aRequest.Method());
       
   893     	aRequest.AddHeaderL(cseq);
       
   894     	CleanupStack::Pop(cseq);
       
   895     	iLocalSeqNum++;
       
   896     	}
       
   897     }
       
   898     
       
   899 // -----------------------------------------------------------------------------
       
   900 // CSipDialogItem::ReceiveL
       
   901 // From MTransactionOwner:
       
   902 // -----------------------------------------------------------------------------
       
   903 //
       
   904 void CSipDialogItem::ReceiveL (TTransactionId aTransactionId,
       
   905                                CSIPResponse* aResponse)
       
   906 	{
       
   907     __SIP_ASSERT_LEAVE(aTransactionId, KErrSIPInvalidDialogResponse);
       
   908 	__SIP_ASSERT_LEAVE(aResponse, KErrSIPInvalidDialogResponse);
       
   909     CTransactionItemBase* transactionItem = 
       
   910         iTransactionItemStore->FindItem(aTransactionId);
       
   911     __SIP_ASSERT_LEAVE (transactionItem, KErrNotFound);
       
   912     
       
   913 	__SIP_MESSAGE_LOG("Dialogs", *aResponse)
       
   914 	
       
   915 	if (transactionItem->TargetRefresh())
       
   916 	    {
       
   917 	    CheckContactsL(aTransactionId,*aResponse);
       
   918 	    }
       
   919 
       
   920     CSIPToHeader* to = aResponse->To();
       
   921 	if (!CheckResponse(aResponse) || 
       
   922         (aResponse->ResponseCode() > K100Response &&
       
   923          iRemoteTagSet && iRemoteTag != to->ParamValue(iTagParamName) && 
       
   924          aTransactionId != FirstTransactionId()))
       
   925 		{
       
   926         iDialogOwner->DialogsError(aTransactionId,KEmptyRefreshId,iDialogId,
       
   927                                    KErrSIPInvalidDialogResponse);
       
   928 		delete aResponse;
       
   929 		return;
       
   930 		}
       
   931 
       
   932 	if (aResponse->ResponseCode() > K100Response && 
       
   933 	    !aResponse->IsErrorResponse() &&
       
   934 		iRemoteTagSet && 
       
   935 		iRemoteTag != to->ParamValue(iTagParamName))
       
   936 		{
       
   937 		if(to->HasParam(iTagParamName))
       
   938 			{		
       
   939 			CSipDialogItem* dialog = 
       
   940                 iDialogStore.FindDialogItemForPass(aTransactionId,aResponse);
       
   941 			if(!dialog)
       
   942 				{
       
   943 				dialog = CreateForkingDialogLC(); 
       
   944                 dialog->SetRemoteTagL(to);
       
   945 				dialog->ReceiveL(aTransactionId, aResponse);
       
   946             	iDialogStore.AddDialogItem(dialog);
       
   947 	            CleanupStack::Pop(dialog);
       
   948 				}
       
   949             else
       
   950                 {
       
   951 				dialog->ReceiveL(aTransactionId, aResponse);
       
   952                 }
       
   953             return;
       
   954 			}
       
   955 		}
       
   956 		
       
   957 	iCurrentState->ReceiveL(*transactionItem,aResponse);
       
   958 	}
       
   959 
       
   960 // -----------------------------------------------------------------------------
       
   961 // CSipDialogItem::ReceiveL
       
   962 // From MTransactionOwner:
       
   963 // -----------------------------------------------------------------------------
       
   964 //
       
   965 void CSipDialogItem::ReceiveL (TUint32 aIapId,
       
   966                                TTransactionId aTransactionId,
       
   967                                CSIPRequest* aRequest)
       
   968 	{
       
   969 	__SIP_ASSERT_LEAVE(aTransactionId, KErrSIPInvalidDialogResponse);
       
   970 	__SIP_ASSERT_LEAVE(aRequest, KErrSIPInvalidDialogRequest);
       
   971 	__SIP_ASSERT_LEAVE(CheckRequest(aRequest), KErrSIPMalformedMessage);
       
   972 	__SIP_ASSERT_LEAVE(aIapId == IapId(), KErrArgument);
       
   973 	__SIP_MESSAGE_LOG("Dialogs", *aRequest)
       
   974 
       
   975     TSIPTransportParams transportParams(TransportParams(KEmptyRegistrationId));
       
   976 	if (!CheckContacts(*aRequest))
       
   977 		{
       
   978 		if (aRequest->Method() == SIPStrings::StringF(SipStrConsts::EAck))
       
   979 			{
       
   980 			iDialogOwner->DialogsError(aTransactionId, KEmptyRefreshId,
       
   981                                        iDialogId, KErrSIPNoAckReceived);
       
   982 			delete aRequest;
       
   983 			return;
       
   984 			}
       
   985 		CSIPResponse* response = 
       
   986 		    CSIPResponse::NewLC(K400Response,
       
   987 		        SIPStrings::StringF(SipStrConsts::EPhraseBadRequest));
       
   988 		iTU.SendL(aTransactionId, response, this, transportParams);
       
   989 		CleanupStack::Pop(response);
       
   990 		delete aRequest;
       
   991 		return;
       
   992 		}
       
   993 
       
   994 	// check cseq compared to iRemoteSeqNum
       
   995 	if (aRequest->Method() != SIPStrings::StringF(SipStrConsts::EAck))
       
   996 		{	
       
   997 		if (iRemoteSeqNum > aRequest->CSeq()->Seq())
       
   998 			{
       
   999 			CSIPResponse* response = 
       
  1000 			    CSIPResponse::NewLC(K500Response,
       
  1001 			        SIPStrings::StringF(
       
  1002 			            SipStrConsts::EPhraseServerInternalError));
       
  1003 			iTU.SendL(aTransactionId, response, this, transportParams);
       
  1004 			CleanupStack::Pop(response);
       
  1005 			delete aRequest;
       
  1006 			return;
       
  1007 			}
       
  1008 		}
       
  1009 
       
  1010 	iRemoteSeqNum = aRequest->CSeq()->Seq();
       
  1011     CTransactionItem* transactionItem = 
       
  1012         CTransactionItem::NewLC(iTU,this,aTransactionId,aRequest->Method());
       
  1013     iCurrentState->ReceiveL(aTransactionId, aRequest);
       
  1014 	iTransactionItemStore->AddItem(transactionItem);
       
  1015 	CleanupStack::Pop(transactionItem);
       
  1016 	}
       
  1017 
       
  1018 // -----------------------------------------------------------------------------
       
  1019 // CSipDialogItem::TransactionEnded
       
  1020 // From MTransactionOwner:
       
  1021 // -----------------------------------------------------------------------------
       
  1022 //
       
  1023 TInt CSipDialogItem::TransactionEnded (TUint32 /*aIapId*/,
       
  1024                                        TTransactionId aTransactionId, 
       
  1025                                        TInt aReason)
       
  1026 	{
       
  1027     TInt err = KErrNone;
       
  1028 
       
  1029     CTransactionItemBase* item = 
       
  1030         iTransactionItemStore->FindItem(aTransactionId);
       
  1031     if (item && 
       
  1032         aReason == KErrNone && 
       
  1033         item->Method() == SIPStrings::StringF(SipStrConsts::EInvite))
       
  1034         {
       
  1035         err = iDialogOwner->InviteTransactionCompleted(aTransactionId);
       
  1036         }
       
  1037 
       
  1038     iDialogStore.TransactionEnded(aTransactionId,aReason);
       
  1039 
       
  1040 	return err;
       
  1041 	}
       
  1042 
       
  1043 // -----------------------------------------------------------------------------
       
  1044 // CSipDialogItem::NextCSeq
       
  1045 // From MTransactionOwner:
       
  1046 // -----------------------------------------------------------------------------
       
  1047 //
       
  1048 TInt CSipDialogItem::NextCSeq(TUint& aCSeq)
       
  1049 	{
       
  1050 	aCSeq = ++iLocalSeqNum;
       
  1051 	return KErrNone;
       
  1052 	}
       
  1053 	
       
  1054 // -----------------------------------------------------------------------------
       
  1055 // CSipDialogItem::SIPSecUser
       
  1056 // From MTransactionOwner:
       
  1057 // -----------------------------------------------------------------------------
       
  1058 //    
       
  1059 const MSIPSecUser* CSipDialogItem::SIPSecUser() const
       
  1060     {
       
  1061     return this;
       
  1062     }    
       
  1063 
       
  1064 // -----------------------------------------------------------------------------
       
  1065 // CSipDialogItem::RefreshReceivedL
       
  1066 // From MRefreshOwner:
       
  1067 // -----------------------------------------------------------------------------
       
  1068 //
       
  1069 void CSipDialogItem::RefreshReceivedL (TTransactionId aTransactionId,
       
  1070                                        TRefreshId aRefreshId,
       
  1071                                        CSIPResponse* aResponse)
       
  1072 	{
       
  1073     __SIP_ASSERT_LEAVE(aTransactionId, KErrSIPInvalidDialogResponse);
       
  1074     __SIP_ASSERT_LEAVE(aResponse, KErrSIPInvalidDialogResponse);
       
  1075 	__SIP_MESSAGE_LOG("Dialogs", *aResponse)
       
  1076 
       
  1077 	// Check Call-ID, CSeq and From-tag
       
  1078 	if (!CheckResponse(aResponse))
       
  1079 		{
       
  1080 		iDialogOwner->DialogsError(aTransactionId, aRefreshId, iDialogId,
       
  1081                                    KErrSIPInvalidDialogResponse);
       
  1082 		delete aResponse;
       
  1083 		return;
       
  1084 		}
       
  1085 
       
  1086 	CRefreshItem* item = iTransactionItemStore->FindRefreshItem(aRefreshId);
       
  1087 	if (!item)
       
  1088 		{
       
  1089 		iDialogOwner->DialogsError(aTransactionId,aRefreshId,iDialogId,
       
  1090                                    KErrSIPInvalidTransactionState);
       
  1091 		delete aResponse;
       
  1092 		return;
       
  1093 		}
       
  1094 
       
  1095 	if (iRemoteTagSet)
       
  1096 		{
       
  1097 		if (iRemoteTag != aResponse->To()->ParamValue(iTagParamName))
       
  1098 			{
       
  1099 			iDialogOwner->DialogsError(aTransactionId,aRefreshId,iDialogId, 
       
  1100                                        KErrSIPInvalidDialogResponse);
       
  1101 			delete aResponse;
       
  1102 			return;
       
  1103 			}
       
  1104 		}
       
  1105 
       
  1106 	if (item->TargetRefresh())
       
  1107 	    {
       
  1108 	    CheckContactsL(aTransactionId,*aResponse);
       
  1109 	    }
       
  1110 
       
  1111 	if (aResponse->IsErrorResponse())
       
  1112 		{
       
  1113 		item->SetTerminated();
       
  1114 		}
       
  1115 
       
  1116     item->SetTransactionId(aTransactionId);
       
  1117 	iCurrentState->ReceiveL(*item, aResponse);
       
  1118 	}
       
  1119 	
       
  1120 // -----------------------------------------------------------------------------
       
  1121 // CSipDialogItem::RefreshError
       
  1122 // From MRefreshOwner:
       
  1123 // -----------------------------------------------------------------------------
       
  1124 //
       
  1125 TInt CSipDialogItem::RefreshError (TRefreshId aRefreshId,
       
  1126                                    TTransactionId aTransactionId,
       
  1127                                    TInt aReason)
       
  1128 	{
       
  1129 	CTransactionItemBase* refreshItem = 
       
  1130 		iTransactionItemStore->FindItem(aTransactionId);
       
  1131 	if (!refreshItem)
       
  1132 		{
       
  1133 		refreshItem = iTransactionItemStore->FindRefreshItem(aRefreshId);
       
  1134 		if (!refreshItem)
       
  1135 			{
       
  1136 			return KErrArgument;
       
  1137 			}
       
  1138 		}
       
  1139     refreshItem->SetTransactionId(aTransactionId);
       
  1140     iDialogStore.TransactionEnded(refreshItem->Id(),aReason);
       
  1141 	return KErrNone;
       
  1142 	}	
       
  1143 	
       
  1144 // -----------------------------------------------------------------------------
       
  1145 // CSipDialogItem::NextRefreshCSeq
       
  1146 // From MRefreshOwner:
       
  1147 // -----------------------------------------------------------------------------
       
  1148 //
       
  1149 TInt CSipDialogItem::NextRefreshCSeq(TUint& aCSeq)
       
  1150 	{
       
  1151 	return NextCSeq(aCSeq);
       
  1152 	}
       
  1153 
       
  1154 // -----------------------------------------------------------------------------
       
  1155 // CSipDialogItem::TransportParams
       
  1156 // From MRefreshOwner:
       
  1157 // -----------------------------------------------------------------------------
       
  1158 //
       
  1159 TSIPTransportParams CSipDialogItem::TransportParams(
       
  1160     const TRegistrationId& aRegistrationId)
       
  1161 	{
       
  1162 	TSIPTransportParams transportParams(
       
  1163 	    iDialogOwner->TransportParams(aRegistrationId));
       
  1164 	if (aRegistrationId == KEmptyRegistrationId)
       
  1165 	    {
       
  1166 	    // Registration id is set empty after receiving the first
       
  1167 	    // response to the refreshed initial request.
       
  1168 	    // See function SetRouteSetUsingRecordRouteL.
       
  1169 	    transportParams.SetCompartmentId(iSigCompMgr->CompartmentId());
       
  1170 	    }
       
  1171 	return transportParams;
       
  1172 	}
       
  1173 
       
  1174 // -----------------------------------------------------------------------------
       
  1175 // CSipDialogItem::SIPSecUser
       
  1176 // From MRefreshOwner:
       
  1177 // -----------------------------------------------------------------------------
       
  1178 //	
       
  1179 const MSIPSecUser* CSipDialogItem::SIPSecUser(
       
  1180     const TRegistrationId& aRegistrationId)
       
  1181     {
       
  1182     return iDialogOwner->SIPSecUser(aRegistrationId);
       
  1183     }
       
  1184 	
       
  1185 // -----------------------------------------------------------------------------
       
  1186 // CSipDialogItem::RefreshDurationL
       
  1187 // -----------------------------------------------------------------------------
       
  1188 //
       
  1189 TUint CSipDialogItem::RefreshDurationL()
       
  1190 	{
       
  1191 	User::Leave(KErrNotFound);
       
  1192 	return 0;
       
  1193 	}
       
  1194 
       
  1195 // -----------------------------------------------------------------------------
       
  1196 // CSipDialogItem::PassOnlyRealmsToUser
       
  1197 // From MSIPSecUser:
       
  1198 // -----------------------------------------------------------------------------
       
  1199 //    
       
  1200 TBool CSipDialogItem::PassOnlyRealmsToUser() const
       
  1201     {
       
  1202     return iSIPSecUser.PassOnlyRealmsToUser();
       
  1203     }
       
  1204     
       
  1205 // -----------------------------------------------------------------------------
       
  1206 // CSipDialogItem::RequestCredentialsL
       
  1207 // From MSIPSecUser:
       
  1208 // -----------------------------------------------------------------------------
       
  1209 //
       
  1210 void CSipDialogItem::RequestCredentialsL(const TDesC8& aRealm)
       
  1211     {
       
  1212     iSIPSecUser.RequestCredentialsL(aRealm);
       
  1213     }    	
       
  1214 	
       
  1215 // -----------------------------------------------------------------------------
       
  1216 // CSipDialogItem::RequestCredentialsL
       
  1217 // From MSIPSecUser:
       
  1218 // -----------------------------------------------------------------------------
       
  1219 //	
       
  1220 void CSipDialogItem::RequestCredentialsL(CSIPResponse& aResponse,
       
  1221 	                                     TTransactionId aTransactionId,
       
  1222 	                                     TRefreshId aRefreshId)
       
  1223     {
       
  1224     iSIPSecUser.RequestCredentialsL(aResponse,aTransactionId,aRefreshId);
       
  1225     }
       
  1226 
       
  1227 // -----------------------------------------------------------------------------
       
  1228 // CSipDialogItem::TrustedUser
       
  1229 // From MSIPSecUser:
       
  1230 // -----------------------------------------------------------------------------
       
  1231 //    
       
  1232 const MSIPSecUser* CSipDialogItem::TrustedUser(
       
  1233     TRegistrationId /*aRegistrationId*/)
       
  1234     {
       
  1235     return iDialogOwner->SIPSecUser(iRegistrationId);
       
  1236     }
       
  1237 
       
  1238 // -----------------------------------------------------------------------------
       
  1239 // CSipDialogItem::ByPassSIPSec
       
  1240 // From MSIPSecUser:
       
  1241 // -----------------------------------------------------------------------------
       
  1242 //
       
  1243 TBool CSipDialogItem::ByPassSIPSec() const
       
  1244     {
       
  1245     const MSIPSecUser* trustedUser = iDialogOwner->SIPSecUser(iRegistrationId);
       
  1246     if (trustedUser)
       
  1247         {
       
  1248         // Use the same value as the related registration, if possible
       
  1249         return trustedUser->ByPassSIPSec();
       
  1250         }
       
  1251     return iSIPSecUser.ByPassSIPSec();
       
  1252     }
       
  1253 
       
  1254 // -----------------------------------------------------------------------------
       
  1255 // CSipDialogItem::EndTransaction
       
  1256 // -----------------------------------------------------------------------------
       
  1257 //
       
  1258 void CSipDialogItem::EndTransaction (TTransactionId aTransactionId,
       
  1259 									 TInt aReason)
       
  1260 	{
       
  1261     CTransactionItemBase* transactionItem = 
       
  1262         iTransactionItemStore->FindItem(aTransactionId);
       
  1263 	if (transactionItem)
       
  1264         {
       
  1265 	    iCurrentState->EndTransaction(*transactionItem, aReason);
       
  1266 	    iTransactionItemStore->RemoveItem(transactionItem->Id());
       
  1267         }
       
  1268 	}
       
  1269 
       
  1270 // -----------------------------------------------------------------------------
       
  1271 // CSipDialogItem::CheckResponse
       
  1272 // -----------------------------------------------------------------------------
       
  1273 //
       
  1274 TBool CSipDialogItem::CheckResponse(CSIPResponse* aResponse)
       
  1275 	{
       
  1276 	CSIPCallIDHeader* callId = aResponse->CallID();
       
  1277     if (!callId)
       
  1278         {
       
  1279         return EFalse;
       
  1280         }
       
  1281     if (!(*iCallId == *callId))
       
  1282         {
       
  1283         return EFalse;
       
  1284         }
       
  1285 	CSIPFromHeader* from = aResponse->From();
       
  1286     if (!from)
       
  1287         {
       
  1288         return EFalse;
       
  1289         }   
       
  1290     if (iLocalTag != from->ParamValue(iTagParamName))
       
  1291         {
       
  1292         return EFalse;
       
  1293         }
       
  1294     if (!aResponse->CSeq())
       
  1295         {
       
  1296         return EFalse;
       
  1297         }
       
  1298 	return ETrue;
       
  1299 	}
       
  1300 
       
  1301 // -----------------------------------------------------------------------------
       
  1302 // CSipDialogItem::CheckRequest
       
  1303 // -----------------------------------------------------------------------------
       
  1304 //
       
  1305 TBool CSipDialogItem::CheckRequest(CSIPRequest* aRequest)
       
  1306 	{
       
  1307 	CSIPCallIDHeader* callId = aRequest->CallID();
       
  1308     if (!callId)
       
  1309         {
       
  1310         return EFalse;
       
  1311         }
       
  1312     if (!(*iCallId == *callId))
       
  1313         {
       
  1314         return EFalse;
       
  1315         }
       
  1316 	CSIPToHeader* to = aRequest->To();
       
  1317     if (!to)
       
  1318         {
       
  1319         return EFalse;
       
  1320         }   
       
  1321     if (iLocalTag != to->ParamValue(iTagParamName))
       
  1322         {
       
  1323         return EFalse;
       
  1324         }
       
  1325 	return ETrue;
       
  1326 	}
       
  1327 
       
  1328 // -----------------------------------------------------------------------------
       
  1329 // CSipDialogItem::UpdateRemoteTagForRefreshesL
       
  1330 // -----------------------------------------------------------------------------
       
  1331 //
       
  1332 void CSipDialogItem::UpdateRemoteTagForRefreshesL (RStringF aRemoteTag)
       
  1333 	{
       
  1334     RArray<TRefreshId> ids = iTransactionItemStore->RefreshItemIdsL();
       
  1335     CleanupClosePushL(ids);
       
  1336     for (TInt i=0; i<ids.Count(); i++)
       
  1337 		{					
       
  1338 		TRefreshId refreshId = ids[i];
       
  1339 		CSIPRequest* refreshReq = iRefreshMgr.Request(refreshId);
       
  1340 		if (refreshReq)
       
  1341 			{
       
  1342 			CSIPToHeader* refreshReqTo = refreshReq->To();
       
  1343 			if (refreshReqTo && !refreshReqTo->HasParam(iTagParamName))
       
  1344 				{
       
  1345 				refreshReqTo->SetParamL(iTagParamName,aRemoteTag);
       
  1346 				}
       
  1347 			}
       
  1348 		}
       
  1349     CleanupStack::PopAndDestroy(1); // ids
       
  1350 	}
       
  1351 
       
  1352 // -----------------------------------------------------------------------------
       
  1353 // CSipDialogItem::UpdateLocalTargetL
       
  1354 // -----------------------------------------------------------------------------
       
  1355 //
       
  1356 void CSipDialogItem::UpdateLocalTargetL(CSIPMessage& aMessage)
       
  1357 	{
       
  1358 	SetLocalTargetWithMsgL(aMessage);
       
  1359 	CSIPContactHeader* contact = 
       
  1360 	    static_cast<CSIPContactHeader*>(aMessage.Header(iContactHeaderName,0));
       
  1361 	
       
  1362     RArray<TRefreshId> ids = iTransactionItemStore->RefreshItemIdsL();
       
  1363     CleanupClosePushL(ids);
       
  1364     for (TInt i=0; i<ids.Count(); i++)
       
  1365 		{
       
  1366 		CSIPContactHeader* newContact = 
       
  1367 		    static_cast<CSIPContactHeader*>(contact->CloneL());
       
  1368 		CleanupStack::PushL(newContact);
       
  1369 		iRefreshMgr.UpdateHeaderL(ids[i],this,newContact);
       
  1370 		CleanupStack::Pop(newContact);
       
  1371 		}
       
  1372     CleanupStack::PopAndDestroy(1); // ids
       
  1373 	}
       
  1374 
       
  1375 // -----------------------------------------------------------------------------
       
  1376 // CSipDialogItem::CheckContacts
       
  1377 // -----------------------------------------------------------------------------
       
  1378 //
       
  1379 TBool CSipDialogItem::CheckContacts (CSIPMessage& aMessage, 
       
  1380                                      TBool aContactRequired) const
       
  1381 	{
       
  1382 	TInt contactCount = aMessage.HeaderCount(iContactHeaderName);
       
  1383     if (contactCount == 1)
       
  1384         {
       
  1385 		CSIPContactHeader* contact = 
       
  1386             static_cast<CSIPContactHeader*>(
       
  1387                 aMessage.Header(iContactHeaderName,0));
       
  1388 		if (!ContactOk(*contact))
       
  1389             {
       
  1390 			return EFalse;
       
  1391             }
       
  1392         }
       
  1393     if (aContactRequired)
       
  1394         {
       
  1395         return (contactCount == 1);
       
  1396         }
       
  1397     return (contactCount <= 1);
       
  1398 	}
       
  1399 	
       
  1400 // -----------------------------------------------------------------------------
       
  1401 // CSipDialogItem::CheckContactsL
       
  1402 // -----------------------------------------------------------------------------
       
  1403 //	
       
  1404 void CSipDialogItem::CheckContactsL (TTransactionId aTransactionId,
       
  1405                                      CSIPResponse& aResponse) const
       
  1406     {
       
  1407     if (aResponse.ResponseCode() > K100Response && 
       
  1408         !aResponse.IsErrorResponse())
       
  1409         {        
       
  1410         TBool contactRequired = 
       
  1411             (aResponse.Type() == CSIPResponse::E2XX &&
       
  1412              aTransactionId == iFirstTransactionId);
       
  1413         if (!CheckContacts(aResponse,contactRequired))
       
  1414             {
       
  1415             User::Leave(KErrSIPInvalidDialogResponse);
       
  1416             }   
       
  1417         }
       
  1418     }
       
  1419 
       
  1420 // -----------------------------------------------------------------------------
       
  1421 // CSipDialogItem::CreateForkingDialogLC
       
  1422 // -----------------------------------------------------------------------------
       
  1423 //
       
  1424 CSipDialogItem* CSipDialogItem::CreateForkingDialogLC ()
       
  1425 	{
       
  1426 	CSipDialogItem* dialog = 
       
  1427         CSipDialogItem::NewLC(iDialogStore,iDialogOwner,iSIPSecUser,iTU,
       
  1428                               iRefreshMgr,iSIPSec,iDeleteMgr,iSigComp);
       
  1429 
       
  1430 	//copy the first TransactionItem from parent dialog
       
  1431     TTransactionId firstTransactionId = iFirstTransactionId;
       
  1432 	CTransactionItemBase* firstTransactionItem = 
       
  1433         iTransactionItemStore->FindItem(firstTransactionId);
       
  1434     __ASSERT_ALWAYS (firstTransactionItem, User::Leave(KErrGeneral));
       
  1435 
       
  1436     CTransactionItemBase* forkingTransactionItem =
       
  1437         CTransactionItem::NewL(iTU,this,*firstTransactionItem);
       
  1438     
       
  1439     dialog->TransactionItems().AddItem(forkingTransactionItem);
       
  1440 
       
  1441 	dialog->SetFirstTransactionId(iFirstTransactionId);
       
  1442 
       
  1443 	CSIPCallIDHeader* callIdHeader = 
       
  1444 	    static_cast<CSIPCallIDHeader*>(iCallId->CloneL());
       
  1445 	dialog->SetCallId(callIdHeader);
       
  1446 	dialog->SetLocalTag(iLocalTag);
       
  1447 
       
  1448 	__SIP_ASSERT_LEAVE(iLocalAddress, KErrArgument);
       
  1449 	dialog->SetLocalAddressL(*iLocalAddress);
       
  1450 
       
  1451 	__SIP_ASSERT_LEAVE(iRemoteAddress, KErrArgument);
       
  1452 	dialog->SetRemoteAddressL(*iRemoteAddress);
       
  1453 
       
  1454 	dialog->SetLocalSeqNum(iLocalSeqNum);
       
  1455 
       
  1456 	__SIP_ASSERT_LEAVE(iLocalTarget, KErrArgument);
       
  1457 	dialog->SetLocalTargetL(*iLocalTarget);
       
  1458 
       
  1459 	return dialog;
       
  1460 	}
       
  1461 
       
  1462 // -----------------------------------------------------------------------------
       
  1463 // CSipDialogItem::UpdateTransportForNextHopAndLocalTargetL
       
  1464 // -----------------------------------------------------------------------------
       
  1465 //
       
  1466 void CSipDialogItem::UpdateTransportForNextHopAndLocalTargetL(
       
  1467     CSIPContactHeader* aContactInOutgoingRequest)
       
  1468     {
       
  1469     CSIPURI& localTarget = ExtractUriL(iLocalTarget);
       
  1470     RStringF localTargetTransport = localTarget.ParamValue(iTransportParamName);
       
  1471    
       
  1472     CSIPURI* nextHop = NULL;
       
  1473     if (iRouteSet.Count() > 0)
       
  1474         {
       
  1475         CURIContainer& uri = iRouteSet[0]->SIPAddress().URI();
       
  1476         __ASSERT_ALWAYS(uri.IsSIPURI(), User::Leave(KErrSIPInvalidURIType));
       
  1477         nextHop = uri.SIPURI();
       
  1478         }
       
  1479     else
       
  1480         {
       
  1481         __ASSERT_ALWAYS(iRemoteTarget, User::Leave(KErrNotFound));
       
  1482         __ASSERT_ALWAYS(iRemoteTarget->IsSIPURI(), 
       
  1483                         User::Leave(KErrSIPInvalidURIType));
       
  1484         nextHop = iRemoteTarget->SIPURI();        
       
  1485         }
       
  1486     RStringF nextHopTransport = nextHop->ParamValue(iTransportParamName);
       
  1487     
       
  1488     if (nextHopTransport.DesC().Length() > 0)
       
  1489         {
       
  1490         if (localTargetTransport.DesC().Length() == 0 &&
       
  1491             !localTarget.IsSIPSURI())
       
  1492             {
       
  1493             localTarget.SetParamL(iTransportParamName,nextHopTransport);
       
  1494             if (aContactInOutgoingRequest)
       
  1495                 {
       
  1496                 CSIPURI& contactUri = ExtractUriL(aContactInOutgoingRequest);
       
  1497                 contactUri.SetParamL(iTransportParamName,nextHopTransport);
       
  1498                 }
       
  1499             }        
       
  1500         }
       
  1501     else
       
  1502         {
       
  1503         if (localTargetTransport.DesC().Length() > 0 &&
       
  1504             !nextHop->IsSIPSURI())
       
  1505             {
       
  1506             nextHop->SetParamL(iTransportParamName,localTargetTransport);
       
  1507             }
       
  1508         }
       
  1509     }
       
  1510 
       
  1511 // -----------------------------------------------------------------------------
       
  1512 // CSipDialogItem::ExtractUriL
       
  1513 // -----------------------------------------------------------------------------
       
  1514 //
       
  1515 CSIPURI& CSipDialogItem::ExtractUriL(CSIPContactHeader* aContact)
       
  1516     {
       
  1517     __ASSERT_ALWAYS(aContact, User::Leave(KErrNotReady));
       
  1518     __ASSERT_ALWAYS(aContact->SIPAddress(), User::Leave(KErrNotReady));
       
  1519     __ASSERT_ALWAYS(aContact->SIPAddress()->URI().IsSIPURI(), 
       
  1520                     User::Leave(KErrSIPInvalidURIType));
       
  1521     return *(aContact->SIPAddress()->URI().SIPURI()); 
       
  1522     }
       
  1523 
       
  1524 // -----------------------------------------------------------------------------
       
  1525 // CSipDialogItem::CleanupRouteSet
       
  1526 // -----------------------------------------------------------------------------
       
  1527 //
       
  1528 void CSipDialogItem::CleanupRouteSet (TAny* aRouteSet)
       
  1529 	{
       
  1530     RPointerArray<CSIPRouteHeader>* routeSet =
       
  1531         reinterpret_cast<RPointerArray<CSIPRouteHeader>*>(aRouteSet);
       
  1532     if (routeSet)
       
  1533         {
       
  1534         routeSet->ResetAndDestroy();
       
  1535         }
       
  1536     delete routeSet;
       
  1537 	}