realtimenetprots/sipfw/SIP/Server/src/CSIPRoutingRequestStore.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          : CSIPRoutingRequestStore.cpp
       
    15 // Part of       : SIP Server Core
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "CSIPRoutingRequestStore.h"
       
    22 #include "CSIPRoutingRequest.h"
       
    23 #include "MSIPRequestRouterObserver.h"
       
    24 #include "CSipServerCore.h"
       
    25 #include "sipresponse.h"
       
    26 
       
    27 
       
    28 // ----------------------------------------------------------------------------
       
    29 // CSIPRoutingRequestStore::NewL
       
    30 // ----------------------------------------------------------------------------
       
    31 //
       
    32 CSIPRoutingRequestStore* CSIPRoutingRequestStore::NewL(
       
    33     CSipServerCore& aServerCore)
       
    34     {
       
    35     CSIPRoutingRequestStore* self = 
       
    36         CSIPRoutingRequestStore::NewLC(aServerCore);
       
    37     CleanupStack::Pop(self);
       
    38     return self;
       
    39     }
       
    40 
       
    41 // ----------------------------------------------------------------------------
       
    42 // CSIPRoutingRequestStore::NewLC
       
    43 // ----------------------------------------------------------------------------
       
    44 //
       
    45 CSIPRoutingRequestStore* CSIPRoutingRequestStore::NewLC(
       
    46     CSipServerCore& aServerCore)
       
    47     {
       
    48 	CSIPRoutingRequestStore* self = 
       
    49 		new(ELeave)CSIPRoutingRequestStore(aServerCore);
       
    50     CleanupStack::PushL(self);
       
    51     return self;
       
    52     }
       
    53 
       
    54 // ----------------------------------------------------------------------------
       
    55 // CSIPRoutingRequestStore::CSIPRoutingRequestStore
       
    56 // ----------------------------------------------------------------------------
       
    57 //
       
    58 CSIPRoutingRequestStore::CSIPRoutingRequestStore (CSipServerCore& aServerCore)
       
    59 : iServerCore(aServerCore),
       
    60   iList(CSIPRoutingRequest::LinkOffset())
       
    61     {
       
    62     }
       
    63 
       
    64 // ----------------------------------------------------------------------------
       
    65 // CSIPRoutingRequestStore::~CSIPRoutingRequestStore
       
    66 // ----------------------------------------------------------------------------
       
    67 //
       
    68 CSIPRoutingRequestStore::~CSIPRoutingRequestStore ()
       
    69     {
       
    70 	TSglQueIter<CSIPRoutingRequest> iter(iList);
       
    71 	for (CSIPRoutingRequest* request = iter++; request; request = iter++)
       
    72 		{
       
    73 		iList.Remove(*request);
       
    74 		delete request;
       
    75     	}    
       
    76     }
       
    77 
       
    78 // ----------------------------------------------------------------------------
       
    79 // CSIPRoutingRequestStore::TransactionOwnerL
       
    80 // From MSIPRequestRouter
       
    81 // ----------------------------------------------------------------------------
       
    82 //
       
    83 TUint32 CSIPRoutingRequestStore::TransactionOwnerL(
       
    84     CSIPRequest& aRequest,
       
    85     TUint32 aIapId,
       
    86     MSIPRequestRouterObserver& aObs)
       
    87 	{
       
    88 	CSIPRoutingRequest* request = CSIPRoutingRequest::NewLC(aIapId,aObs);
       
    89 	TUint32 requestId = iServerCore.RequestHandler().ChannelL(aRequest);
       
    90 	CleanupStack::Pop(request);
       
    91 	request->SetRequestId(requestId);
       
    92 	iList.AddLast(*request);
       
    93 	return requestId;
       
    94 	}
       
    95 
       
    96 // ----------------------------------------------------------------------------
       
    97 // CSIPRoutingRequestStore::Cancel
       
    98 // From MSIPRequestRouter
       
    99 // ----------------------------------------------------------------------------
       
   100 //   
       
   101 void CSIPRoutingRequestStore::Cancel(TUint32 aRequestId)
       
   102 	{
       
   103 	iServerCore.RequestHandler().Cancel(aRequestId);
       
   104 	RemoveAndDelete(aRequestId);
       
   105 	}
       
   106 	
       
   107 // ----------------------------------------------------------------------------
       
   108 // CSIPRoutingRequestStore::ClientFoundL
       
   109 // From MSIPRequestHandlerObserver	
       
   110 // ----------------------------------------------------------------------------
       
   111 // 	
       
   112 void CSIPRoutingRequestStore::ClientFoundL(TUint32 aRequestId, TUid aUid)
       
   113 	{
       
   114 	CSIPRoutingRequest* request = Find(aRequestId);
       
   115 	if (request)
       
   116 		{
       
   117 		TUint32 iapId = request->IapId();
       
   118 		MTransactionOwner* owner = iServerCore.FindOwner(iapId,aUid);
       
   119 		if (owner)
       
   120 			{
       
   121 			request->Observer().OwnerFoundL(aRequestId,owner);
       
   122 			}
       
   123 		else
       
   124 			{
       
   125 			request->Observer().ErrorOccurred(aRequestId,KErrNotFound);	
       
   126 			}
       
   127 		RemoveAndDelete(aRequestId);
       
   128 		}	
       
   129 	}
       
   130 
       
   131 // ----------------------------------------------------------------------------
       
   132 // CSIPRoutingRequestStore::ClientNotFoundL
       
   133 // From MSIPRequestHandlerObserver	
       
   134 // ----------------------------------------------------------------------------
       
   135 //
       
   136 void CSIPRoutingRequestStore::ClientNotFoundL(TUint32 aRequestId,
       
   137                                               CSIPResponse* aSIPResponse)
       
   138 	{
       
   139 	CSIPRoutingRequest* request = Find(aRequestId);
       
   140 	if (request)
       
   141 		{
       
   142 		request->Observer().OwnerNotFoundL(aRequestId,aSIPResponse);
       
   143 		RemoveAndDelete(aRequestId);
       
   144 		}
       
   145 	else
       
   146 		{
       
   147 		delete aSIPResponse;
       
   148 		}
       
   149 	}
       
   150 
       
   151 // ----------------------------------------------------------------------------
       
   152 // CSIPRoutingRequestStore::ClientFoundL
       
   153 // From MSIPRequestHandlerObserver	
       
   154 // ----------------------------------------------------------------------------
       
   155 //
       
   156 void CSIPRoutingRequestStore::ErrorOccurred(TUint32 aRequestId, TInt aError)
       
   157 	{
       
   158 	CSIPRoutingRequest* request = Find(aRequestId);
       
   159 	if (request)
       
   160 		{
       
   161 		request->Observer().ErrorOccurred(aRequestId,aError);
       
   162 		RemoveAndDelete(aRequestId);		
       
   163 		}	
       
   164 	}
       
   165 	
       
   166 // ----------------------------------------------------------------------------
       
   167 // CSIPRoutingRequestStore::Find
       
   168 // ----------------------------------------------------------------------------
       
   169 //	
       
   170 CSIPRoutingRequest* CSIPRoutingRequestStore::Find(TUint32 aRequestId)
       
   171 	{
       
   172 	TSglQueIter<CSIPRoutingRequest> iter(iList);
       
   173 	for (CSIPRoutingRequest* request = iter++; request; request = iter++)
       
   174 		{
       
   175         if (request->RequestId() == aRequestId)
       
   176             {
       
   177             return request;
       
   178             }
       
   179 		}
       
   180 	return NULL;
       
   181 	}
       
   182 
       
   183 // ----------------------------------------------------------------------------
       
   184 // CSIPRoutingRequestStore::RemoveAndDelete
       
   185 // ----------------------------------------------------------------------------
       
   186 //	
       
   187 void CSIPRoutingRequestStore::RemoveAndDelete(TUint32 aRequestId)
       
   188 	{
       
   189 	CSIPRoutingRequest* request = Find(aRequestId);
       
   190 	if (request)
       
   191 	    {
       
   192 		iList.Remove(*request);
       
   193 		delete request;		
       
   194 		}		
       
   195 	}