realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrationBindingStore.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2005-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          : CSIPRegistrationBindingStore.cpp
       
    15 // Part of       : Registration
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "CSIPRegistrationBinding.h"
       
    22 #include "CSIPRegistrationRefreshBinding.h"
       
    23 #include "CSIPRegistrationBindingStore.h"
       
    24 #include "CSIPResponseUtility.h"
       
    25 #include "CSIPRegistrarStore.h"
       
    26 #include "sipcontactheader.h"
       
    27 #include "sipaddress.h"
       
    28 #include "uricontainer.h"
       
    29 #include "sipuri.h"
       
    30 #include "siphostport.h"
       
    31 #include "siprouteheader.h"
       
    32 #include "siptoheader.h"
       
    33 #include "DeleteMgr.h"
       
    34 #include "sipstrings.h"
       
    35 #include "sipstrconsts.h"
       
    36 #include "SipLogs.h"
       
    37 
       
    38 // -----------------------------------------------------------------------------
       
    39 // CSIPRegistrationBindingStore::NewL
       
    40 // -----------------------------------------------------------------------------
       
    41 //
       
    42 CSIPRegistrationBindingStore* CSIPRegistrationBindingStore::NewL(
       
    43 	CSIPRegistrarStore& aRegistrarStore)
       
    44 	{
       
    45 	CSIPRegistrationBindingStore* self = 
       
    46 		CSIPRegistrationBindingStore::NewLC(aRegistrarStore);
       
    47 	CleanupStack::Pop(self);
       
    48 	return self;
       
    49 	}
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // CSIPRegistrationBindingStore::NewLC
       
    53 // -----------------------------------------------------------------------------
       
    54 //
       
    55 CSIPRegistrationBindingStore* CSIPRegistrationBindingStore::NewLC(
       
    56 	CSIPRegistrarStore& aRegistrarStore)
       
    57 	{
       
    58     CSIPRegistrationBindingStore* self = 
       
    59 		new (ELeave) CSIPRegistrationBindingStore(aRegistrarStore);
       
    60 	CleanupStack::PushL(self);
       
    61 	self->ConstructL();
       
    62 	return self;
       
    63 	}
       
    64 
       
    65 // -----------------------------------------------------------------------------
       
    66 // CSIPRegistrationBindingStore::CSIPRegistrationBindingStore
       
    67 // -----------------------------------------------------------------------------
       
    68 //
       
    69 CSIPRegistrationBindingStore::CSIPRegistrationBindingStore(
       
    70 	CSIPRegistrarStore& aRegistrarStore)
       
    71 
       
    72   : iRegistrarStore     (aRegistrarStore),
       
    73     iNextRegistrationId (KMinRegistrationId)
       
    74 	{
       
    75 	}
       
    76 
       
    77 // -----------------------------------------------------------------------------
       
    78 // CSIPRegistrationBindingStore::ConstructL
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 void CSIPRegistrationBindingStore::ConstructL()
       
    82 	{
       
    83 	iDeleteMgr = CDeleteMgr::NewL();
       
    84 	}
       
    85 
       
    86 // -----------------------------------------------------------------------------
       
    87 // CSIPRegistrationBindingStore::~CSIPRegistrationBindingStore
       
    88 // -----------------------------------------------------------------------------
       
    89 //
       
    90 CSIPRegistrationBindingStore::~CSIPRegistrationBindingStore()
       
    91 	{
       
    92 	iBindings.ResetAndDestroy();
       
    93 	delete iDeleteMgr;
       
    94 	}
       
    95 
       
    96 // -----------------------------------------------------------------------------
       
    97 // CSIPRegistrationBindingStore::FindBinding
       
    98 // -----------------------------------------------------------------------------
       
    99 //
       
   100 CSIPRegistrationBindingBase* CSIPRegistrationBindingStore::FindBinding(
       
   101 	const MRegistrationOwner& aRegistrationOwner,
       
   102 	CSIPRequest&              aSIPRequest)
       
   103 	{ 
       
   104 	CSIPRegistrationBindingBase* returnValue = NULL;
       
   105 	
       
   106 	for (TInt i=iBindings.Count()-1; (i>=0 && !returnValue); i--)
       
   107 		{
       
   108 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   109 
       
   110 		if (binding->CompareWithRegisterRequest(
       
   111 			aRegistrationOwner, aSIPRequest))
       
   112 			{
       
   113 			returnValue = binding; 
       
   114 			}
       
   115 		}
       
   116 
       
   117 	return returnValue;
       
   118 	}
       
   119 
       
   120 // -----------------------------------------------------------------------------
       
   121 // CSIPRegistrationBindingStore::FindBinding
       
   122 // -----------------------------------------------------------------------------
       
   123 //
       
   124 CSIPRegistrationBindingBase* CSIPRegistrationBindingStore::FindBinding(
       
   125 	const TRegistrationId& aRegistrationId,
       
   126 	const MRegistrationOwner* aOwner)
       
   127 	{
       
   128 	CSIPRegistrationBindingBase* returnValue = NULL;
       
   129 
       
   130 	if (aRegistrationId == KEmptyRegistrationId)
       
   131 		{
       
   132 		return returnValue;
       
   133 		}
       
   134 
       
   135 	for (TInt i=iBindings.Count()-1; (i>=0 && !returnValue); i--)
       
   136 		{
       
   137 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   138 		 
       
   139 		if (binding->RegistrationId() == aRegistrationId &&
       
   140 		    (!aOwner || binding->Owner() == aOwner))
       
   141 			{
       
   142 			returnValue = binding;
       
   143 			}
       
   144 		}
       
   145 
       
   146 	return returnValue;
       
   147 	}
       
   148 
       
   149 // -----------------------------------------------------------------------------
       
   150 // CSIPRegistrationBindingStore::FindBindingForTransaction
       
   151 // -----------------------------------------------------------------------------
       
   152 //
       
   153 const CSIPRegistrationBindingBase* 
       
   154 CSIPRegistrationBindingStore::FindBindingForTransaction(
       
   155     const TTransactionId& aTransactionId)
       
   156     {
       
   157 	for (TInt i=0; i < iBindings.Count(); i++)
       
   158 		{
       
   159 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   160 		if (binding->HasTransaction(aTransactionId))
       
   161 			{
       
   162 			return binding;
       
   163 			}
       
   164 		}
       
   165 	return NULL;
       
   166     }
       
   167 
       
   168 // -----------------------------------------------------------------------------
       
   169 // CSIPRegistrationBindingStore::FindContactByFromL
       
   170 // -----------------------------------------------------------------------------
       
   171 //
       
   172 TBool CSIPRegistrationBindingStore::FindContactByFromL(
       
   173 	const CSIPFromToHeaderBase* aFromToHeader,
       
   174 	CSIPContactHeader&          aContact)
       
   175 	{
       
   176 	TBool found = EFalse;
       
   177 
       
   178 	for (TInt i=iBindings.Count()-1; (i>=0 && !found); i--)
       
   179 		{
       
   180 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   181 		found = binding->FindContactByFromL(aFromToHeader, aContact);
       
   182 		}
       
   183 	
       
   184 	return found;
       
   185 	}
       
   186 
       
   187 // -----------------------------------------------------------------------------
       
   188 // CSIPRegistrationBindingStore::RemoveBinding
       
   189 // -----------------------------------------------------------------------------
       
   190 //
       
   191 TInt CSIPRegistrationBindingStore::RemoveBinding (
       
   192 	const CSIPRegistrationBindingBase* aBinding)
       
   193 	{
       
   194 	TInt err   = KErrNotFound;
       
   195 	TInt index = KErrNotFound;
       
   196 
       
   197 	index  = iBindings.Find(aBinding);
       
   198 
       
   199 	// binding found 
       
   200 	if (index  >= 0)
       
   201 		{
       
   202 		err = iDeleteMgr->AddDeleteRequest(aBinding);
       
   203 
       
   204 		if (err == KErrNone)
       
   205 			{
       
   206 			iBindings.Remove(index);
       
   207 			}
       
   208 		}
       
   209 
       
   210 	return err;
       
   211 	}
       
   212 
       
   213 // -----------------------------------------------------------------------------
       
   214 // CSIPRegistrationBindingStore::RemoveBindingByIAPId
       
   215 // remove bindings, which contain same IAPId as the parameter
       
   216 // -----------------------------------------------------------------------------
       
   217 //
       
   218 void CSIPRegistrationBindingStore::RemoveBindingByIAPId (
       
   219 	const TUint32 aIapId)
       
   220 	{
       
   221 	for (TInt i=iBindings.Count()-1; i>=0; i--)
       
   222 		{
       
   223 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   224 		 
       
   225 		if (binding->IAPId() == aIapId)
       
   226 			{
       
   227 			iBindings.Remove(i);
       
   228 			delete binding;
       
   229 			}
       
   230 		}
       
   231 	}
       
   232 
       
   233 // -----------------------------------------------------------------------------
       
   234 // CSIPRegistrationBindingStore::RemoveBinding
       
   235 // -----------------------------------------------------------------------------
       
   236 //
       
   237 TInt CSIPRegistrationBindingStore::RemoveBinding (
       
   238     const TRegistrationId& aRegistrationId,
       
   239     const MRegistrationOwner* aOwner)
       
   240     {
       
   241     TInt returnValue = KErrNotFound;
       
   242 
       
   243     CSIPRegistrationBindingBase* binding = FindBinding(aRegistrationId,aOwner);
       
   244     if (binding)
       
   245         {
       
   246         TInt index = iBindings.Find(binding); 
       
   247         if (index != KErrNotFound)
       
   248             {
       
   249             iBindings.Remove(index); 
       
   250             delete binding;
       
   251             binding = NULL;
       
   252             returnValue = KErrNone;
       
   253             }
       
   254         }
       
   255 
       
   256     return returnValue;
       
   257     }
       
   258 
       
   259 // -----------------------------------------------------------------------------
       
   260 // CSIPRegistrationBindingStore::ClearRegistrationOwner
       
   261 // -----------------------------------------------------------------------------
       
   262 //
       
   263 TInt CSIPRegistrationBindingStore::ClearRegistrationOwner(
       
   264 	const MRegistrationOwner* aRegistrationOwner)
       
   265 	{
       
   266 	TInt err = KErrNotFound;
       
   267 
       
   268 	for (TInt i=iBindings.Count()-1; i>=0; i--)
       
   269 		{
       
   270 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   271 
       
   272 		if (binding->Owner() == aRegistrationOwner)
       
   273 			{
       
   274 			iBindings.Remove(i);
       
   275 			delete binding;
       
   276 			binding = NULL;
       
   277 			err = KErrNone;
       
   278 			}
       
   279 		}
       
   280 
       
   281 	return err;
       
   282 	}
       
   283 
       
   284 // -----------------------------------------------------------------------------
       
   285 // CSIPRegistrationBindingStore::RegistrarStore
       
   286 // -----------------------------------------------------------------------------
       
   287 //
       
   288 CSIPRegistrarStore& CSIPRegistrationBindingStore::RegistrarStore()
       
   289 	{
       
   290 	return iRegistrarStore;
       
   291 	}
       
   292 
       
   293 // -----------------------------------------------------------------------------
       
   294 // CSIPRegistrationBindingStore::NextRegistrationId
       
   295 // -----------------------------------------------------------------------------
       
   296 //
       
   297 TRegistrationId CSIPRegistrationBindingStore::NextRegistrationId()
       
   298 	{
       
   299 	TRegistrationId registrationId = iNextRegistrationId;
       
   300 
       
   301     if (iNextRegistrationId == KMaxRegistrationId)
       
   302 		{
       
   303 		iNextRegistrationId = KMinRegistrationId;
       
   304 		}
       
   305 	else
       
   306 		{
       
   307 	    iNextRegistrationId++;
       
   308 		}
       
   309 
       
   310 	return registrationId;
       
   311 	}
       
   312 
       
   313 // -----------------------------------------------------------------------------
       
   314 // CSIPRegistrationBindingStore::CheckRequestURI
       
   315 // -----------------------------------------------------------------------------
       
   316 //
       
   317 TBool CSIPRegistrationBindingStore::CheckRequestURI(CURIContainer& aRequestUri)
       
   318 	{
       
   319 	TBool matchFound = EFalse;
       
   320 
       
   321 	for (TInt i=iBindings.Count()-1; i>=0 && !matchFound; i--)
       
   322 		{
       
   323 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   324 		CSIPURI* bindingUri = binding->Contact().SIPAddress()->URI().SIPURI();
       
   325 
       
   326         // Check only the user part. 
       
   327         // The host part may be have been changed 
       
   328         // by the proxy/registrar due to presence of NAT.
       
   329 		if (aRequestUri.IsSIPURI() &&
       
   330 		    bindingUri &&
       
   331 		    bindingUri->IsSIPSURI() == aRequestUri.SIPURI()->IsSIPSURI() &&
       
   332 		    bindingUri->User().CompareF(aRequestUri.SIPURI()->User()) == 0)
       
   333 			{
       
   334 			matchFound = ETrue;
       
   335 			}
       
   336 		}
       
   337 
       
   338 	return matchFound;
       
   339 	}
       
   340 
       
   341 // -----------------------------------------------------------------------------
       
   342 // CSIPRegistrationBindingStore::SetOutboundProxyL
       
   343 // -----------------------------------------------------------------------------
       
   344 //	
       
   345 void CSIPRegistrationBindingStore::SetOutboundProxyL (
       
   346     const TRegistrationId& aRegistrationId,
       
   347     CSIPRouteHeader* aOutboundProxy,
       
   348     const MRegistrationOwner* aOwner)
       
   349     {
       
   350     CSIPRegistrationBindingBase* binding = FindBinding(aRegistrationId,aOwner);
       
   351     if  (!binding)
       
   352         {
       
   353         User::Leave(KErrNotFound);
       
   354         }
       
   355     binding->SetOutboundProxyL(aOutboundProxy);
       
   356     }
       
   357 
       
   358 // -----------------------------------------------------------------------------
       
   359 // CSIPRegistrationBindingStore::OutboundProxy
       
   360 // -----------------------------------------------------------------------------
       
   361 //
       
   362 const CSIPRouteHeader* CSIPRegistrationBindingStore::OutboundProxy(
       
   363 	TRegistrationId aRegistrationId)
       
   364 	{
       
   365 	CSIPRegistrationBindingBase* binding = FindBinding(aRegistrationId);
       
   366 
       
   367     CSIPRouteHeader* proxy = NULL;
       
   368 
       
   369     if (binding)
       
   370         {
       
   371         proxy = const_cast<CSIPRouteHeader*>(binding->OutboundProxy());
       
   372         }
       
   373         
       
   374 	return proxy;
       
   375 	}
       
   376 
       
   377 // -----------------------------------------------------------------------------
       
   378 // CSIPRegistrationBindingStore::HasOutboundProxy
       
   379 // -----------------------------------------------------------------------------
       
   380 //
       
   381 TBool CSIPRegistrationBindingStore::HasOutboundProxy(
       
   382 	TRegistrationId aRegistrationId) 
       
   383 	{
       
   384 	TBool returnValue = EFalse; 
       
   385 
       
   386 	CSIPRegistrationBindingBase* binding = FindBinding(aRegistrationId);
       
   387 
       
   388 	if (binding && binding->HasOutboundProxy())
       
   389 		{
       
   390 		returnValue = ETrue;
       
   391 		}
       
   392 
       
   393 	return returnValue;
       
   394 	}
       
   395 
       
   396 // -----------------------------------------------------------------------------
       
   397 // CSIPRegistrationBindingStore::IsOutboundProxy
       
   398 // -----------------------------------------------------------------------------
       
   399 //
       
   400 TBool CSIPRegistrationBindingStore::IsOutboundProxy (const CURIContainer& aUri)
       
   401     {
       
   402     TBool isOutboundProxy = EFalse;
       
   403 
       
   404 	for (TInt i=iBindings.Count()-1; i>=0 && !isOutboundProxy; i--)
       
   405 		{
       
   406 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   407 		const CSIPRouteHeader* proxy = binding->OutboundProxy();
       
   408 		if (binding->HasOutboundProxy() && 
       
   409 		    proxy->SIPAddress().URI().IsSIPURI() &&
       
   410 		    aUri.IsSIPURI())
       
   411             {
       
   412 	    	const CSIPURI& sipuri = *aUri.SIPURI();
       
   413 	    	RStringF maddr = SIPStrings::StringF(SipStrConsts::EMaddr);
       
   414 
       
   415 	    	const TDesC8 *uriHost(NULL);
       
   416 	    	if (sipuri.HasParam(maddr))
       
   417 	    		{
       
   418 	    		uriHost = &sipuri.ParamValue(maddr).DesC();
       
   419 		   		}
       
   420 			else
       
   421 				{
       
   422 				uriHost = &sipuri.HostPort().Host();
       
   423 				}            
       
   424             TPtrC8 proxyHost = 
       
   425                 proxy->SIPAddress().URI().SIPURI()->HostPort().Host();            
       
   426             if (proxyHost.CompareF(*uriHost) == 0)
       
   427                 {
       
   428                 isOutboundProxy = ETrue;
       
   429                 }
       
   430             }
       
   431 		}
       
   432 
       
   433 	return isOutboundProxy;
       
   434     }
       
   435 
       
   436 // -----------------------------------------------------------------------------
       
   437 // CSIPRegistrationBindingStore::RemoveOutboundProxy
       
   438 // -----------------------------------------------------------------------------
       
   439 //
       
   440 TInt CSIPRegistrationBindingStore::RemoveOutboundProxy(
       
   441 	const TRegistrationId& aRegistrationId,
       
   442 	const MRegistrationOwner* aOwner)
       
   443 	{
       
   444 	TInt err = KErrNotFound;
       
   445 
       
   446 	if (aRegistrationId == KEmptyRegistrationId)
       
   447 		{
       
   448 		return err;
       
   449 		}
       
   450 
       
   451 	for (TInt i=iBindings.Count()-1; (i>=0 && err==KErrNotFound); i--)
       
   452 		{
       
   453 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   454 
       
   455 		if (binding->RegistrationId() == aRegistrationId &&
       
   456 		    binding->Owner() == aOwner)
       
   457 			{
       
   458 			err = binding->RemoveOutboundProxy();
       
   459 			}
       
   460 		}
       
   461 
       
   462 	return err;
       
   463 	}
       
   464 
       
   465 // -----------------------------------------------------------------------------
       
   466 // CSIPRegistrationBindingStore::CompareUri
       
   467 // -----------------------------------------------------------------------------
       
   468 //
       
   469 TBool CSIPRegistrationBindingStore::CompareUri(const CURIContainer& aProxy, CURIContainer& aUri)
       
   470 	{
       
   471     const TUint KDefaultSipPort 	  = 5060;
       
   472     const TUint KDefaultSipPortForTLS = 5061;
       
   473     
       
   474 	if(aProxy.SIPURI()->HostPort().Host() != aUri.SIPURI()->HostPort().Host())
       
   475 		/* Hosts dont match */
       
   476 		{
       
   477 		return FALSE;
       
   478 		}
       
   479 	else if(aProxy.SIPURI()->HostPort().HasPort() != aUri.SIPURI()->HostPort().HasPort())
       
   480 		/* If the port is KDefaultSipPort/KDefaultSipPortForTLS
       
   481 		 * then it is optional to mention the port in the URI
       
   482 		 * and the check can be ignored
       
   483 		 */
       
   484 		{
       
   485 		if(aProxy.SIPURI()->IsSIPSURI() &&
       
   486 				aProxy.SIPURI()->IsSIPSURI() == aUri.SIPURI()->IsSIPSURI())
       
   487 	        {
       
   488 	        if( aProxy.SIPURI()->HostPort().Port() != KDefaultSipPortForTLS &&
       
   489 	        		aUri.SIPURI()->HostPort().Port() != KDefaultSipPortForTLS)
       
   490 	        	{
       
   491 	        	return FALSE;
       
   492 	        	}
       
   493 	        }
       
   494 		else if( aProxy.SIPURI()->HostPort().Port() != KDefaultSipPort &&
       
   495 				aUri.SIPURI()->HostPort().Port() != KDefaultSipPort)
       
   496 			{
       
   497 	        return FALSE;
       
   498 	        }
       
   499 		}
       
   500 	else if(aProxy.SIPURI()->HostPort().HasPort() &&
       
   501 			aProxy.SIPURI()->HostPort().Port() != aUri.SIPURI()->HostPort().Port())
       
   502 		/* Ports dont match */
       
   503 		{
       
   504 		return FALSE;
       
   505 		}
       
   506 	return TRUE;
       
   507  	}
       
   508 
       
   509 // -----------------------------------------------------------------------------
       
   510 // CSIPRegistrationBindingStore::URIFailed
       
   511 // -----------------------------------------------------------------------------
       
   512 //	
       
   513 void CSIPRegistrationBindingStore::URIFailed (CURIContainer& aUri)
       
   514     {
       
   515 	for (TInt i=iBindings.Count()-1; i>=0; i--)
       
   516 		{
       
   517 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   518         const CSIPRouteHeader* proxy = binding->OutboundProxy();
       
   519         if(proxy)
       
   520         	{
       
   521         	TBool uriMatch = CompareUri(proxy->SIPAddress().URI(), aUri);
       
   522         	if (uriMatch &&
       
   523         			!binding->RegisterPending())
       
   524         	            {
       
   525         	            // Remove binding only the registration is not pending,
       
   526         	            // which means this failure was not related to a REGISTER request.
       
   527         	            // If a REGISTER request fails, we will get a 
       
   528         	            // TransactionEnded-callback from TU.
       
   529         	            __SIP_LOG("CSIPRegistrationBindingStore::URIFailed")
       
   530         				iBindings.Remove(i);
       
   531         				binding->OutboundProxyFailed();
       
   532         				delete binding;            
       
   533         	            }
       
   534         	}
       
   535 		}   
       
   536     }
       
   537 
       
   538 // -----------------------------------------------------------------------------
       
   539 // CSIPRegistrationBindingStore::RegisterPendingToAOR
       
   540 // -----------------------------------------------------------------------------
       
   541 //
       
   542 TBool CSIPRegistrationBindingStore::RegisterPendingToAOR (
       
   543 	const CURIContainer& aAOR)
       
   544 	{
       
   545 	TBool registerPending = EFalse;
       
   546 
       
   547 	for (TInt i=iBindings.Count()-1; i>=0 && !registerPending; i--)
       
   548 		{
       
   549 		CSIPRegistrationBindingBase* binding = iBindings[i];
       
   550 
       
   551 		if (binding->AOR().SIPAddress().URI() == aAOR &&
       
   552 		    binding->RegisterPending())
       
   553 			{
       
   554 			registerPending = ETrue;
       
   555 			}
       
   556 		}
       
   557 
       
   558 	return registerPending;
       
   559 	}
       
   560 
       
   561 // -----------------------------------------------------------------------------
       
   562 // CSIPRegistrationBindingStore::AddBindingL
       
   563 // -----------------------------------------------------------------------------
       
   564 //
       
   565 void CSIPRegistrationBindingStore::AddBindingL(
       
   566 	CSIPRegistrationBindingBase* aBinding)
       
   567 	{
       
   568 	iBindings.AppendL(aBinding);
       
   569 	}
       
   570 
       
   571 // -----------------------------------------------------------------------------
       
   572 // CSIPRegistrationBindingStore::DetachBinding
       
   573 // -----------------------------------------------------------------------------
       
   574 //
       
   575 void CSIPRegistrationBindingStore::DetachBinding (
       
   576 	CSIPRegistrationBindingBase* aBinding)
       
   577 	{
       
   578 	TInt index = KErrNotFound;
       
   579 	index  = iBindings.Find(aBinding);
       
   580 	if (index != KErrNotFound)
       
   581 		{
       
   582 		iBindings.Remove(index);
       
   583 		}
       
   584 	}