realtimenetprots/sipfw/SIP/Server/src/CSipCSReceiverBase.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          : CSipCSReceiverBase.cpp
       
    15 // Part of       : SIPServerCore
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "CSipCSReceiverBase.h"
       
    22 #include "CSipCSReceiveQueue.h"
       
    23 #include "CSipCSServerITC.h"
       
    24 #include "CSIPCSSerializer.h"
       
    25 #include "sipmessage.h"
       
    26 #include "siprequest.h"
       
    27 #include "SipAssert.h"
       
    28 #include "sipinternalerr.h"
       
    29 #include "SipLogs.h"
       
    30 
       
    31 // -----------------------------------------------------------------------------
       
    32 // CSipCSReceiverBase::ConstructL
       
    33 // -----------------------------------------------------------------------------
       
    34 //
       
    35 void CSipCSReceiverBase::ConstructL()
       
    36 	{
       
    37     iReceiveQueue = new(ELeave)CSipCSReceiveQueue;
       
    38 	}
       
    39 
       
    40 // -----------------------------------------------------------------------------
       
    41 // CSipCSReceiverBase::CSipCSReceiverBase
       
    42 // -----------------------------------------------------------------------------
       
    43 //
       
    44 CSipCSReceiverBase::CSipCSReceiverBase(CSipCSServerITC& aITC,
       
    45                                        MSIPSecUser& aSIPSecUser)
       
    46 : iITC (aITC),
       
    47   iSIPSecUser (aSIPSecUser),
       
    48   iClientReadyToReceive (EFalse)
       
    49 	{
       
    50 	}
       
    51 
       
    52 // -----------------------------------------------------------------------------
       
    53 // CSipCSReceiverBase::~CSipCSReceiverBase
       
    54 // -----------------------------------------------------------------------------
       
    55 //
       
    56 CSipCSReceiverBase::~CSipCSReceiverBase()
       
    57 	{
       
    58     delete iReceiveQueue;
       
    59 	}
       
    60 
       
    61 // -----------------------------------------------------------------------------
       
    62 // CSipCSReceiverBase::WriteSipMessageToClientL
       
    63 // -----------------------------------------------------------------------------
       
    64 //
       
    65 void CSipCSReceiverBase::WriteSipMessageToClientL(const RMessage2& aMessage)
       
    66 	{
       
    67     __ASSERT_ALWAYS (!iReceiveQueue->IsEmpty(), User::Leave (KErrNotFound));
       
    68     __ASSERT_ALWAYS (iReceiveQueue->First().Headers() != 0, 
       
    69                      User::Leave (KErrNotFound));
       
    70     __ASSERT_ALWAYS (iReceiveQueue->First().Content() != 0,
       
    71                      User::Leave (KErrNotFound));
       
    72 
       
    73     iITC.WriteL (aMessage, *iReceiveQueue->First().Headers());
       
    74     iITC.WriteL (aMessage, *iReceiveQueue->First().Content(), 
       
    75                  ESipItcArgMessageContent);
       
    76                  
       
    77     iReceiveQueue->RemoveFirst();
       
    78 	}
       
    79 
       
    80 // -----------------------------------------------------------------------------
       
    81 // CSipCSReceiverBase::ClientReadyToReceiveL
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 void CSipCSReceiverBase::ClientReadyToReceiveL(const RMessage2& aMessage)
       
    85 	{
       
    86     __ASSERT_ALWAYS (!iClientReadyToReceive, User::Leave (KErrAlreadyExists));
       
    87 
       
    88     if (iReceiveQueue->IsEmpty())
       
    89 		{
       
    90         iClientReadyToReceive = ETrue;
       
    91         iReceiveRMessage = aMessage;
       
    92 		}
       
    93     else
       
    94 		{
       
    95         const TSipCSReceiveItem& item = iReceiveQueue->First();
       
    96         TInt error = item.Error();
       
    97         iITC.WriteL (aMessage,item.Ids());
       
    98         if (error == KErrNone || error == KChallengeReceived)
       
    99             {
       
   100             iITC.WriteL (aMessage,item.BufSizes());
       
   101             }
       
   102         else
       
   103             {
       
   104             iReceiveQueue->RemoveFirst();
       
   105             }
       
   106         iITC.Complete (aMessage,error);
       
   107 		}
       
   108 	}
       
   109 
       
   110 // -----------------------------------------------------------------------------
       
   111 // CSipCSReceiverBase::CancelClientReceiveL
       
   112 // -----------------------------------------------------------------------------
       
   113 //
       
   114 void CSipCSReceiverBase::CancelClientReceiveL()
       
   115 	{
       
   116     __ASSERT_ALWAYS (iClientReadyToReceive, User::Leave (KErrNotFound));
       
   117 
       
   118     iClientReadyToReceive = EFalse;
       
   119     iITC.Complete (iReceiveRMessage, KErrCancel);
       
   120 	}
       
   121 
       
   122 // -----------------------------------------------------------------------------
       
   123 // CSipCSReceiverBase::AddItemL
       
   124 // -----------------------------------------------------------------------------
       
   125 //	
       
   126 void CSipCSReceiverBase::AddItemL(const TSipCSReceiveItem& aReceiveItem)
       
   127     {
       
   128     HandleNewReceiveItemL(aReceiveItem);
       
   129     }
       
   130 
       
   131 // -----------------------------------------------------------------------------
       
   132 // CSipCSReceiverBase::TransactionEnded
       
   133 // From MTransactionOwner:
       
   134 // -----------------------------------------------------------------------------
       
   135 //
       
   136 TInt CSipCSReceiverBase::TransactionEnded(TUint32 aIapId,
       
   137                                           TTransactionId aTransactionId,
       
   138                                           TInt aReason)
       
   139 	{
       
   140 	TSIPIds ids;
       
   141 	ids.iIapId = aIapId;
       
   142 	ids.iRequestId = aTransactionId;
       
   143 	return ErrorReceived(ids,aReason);
       
   144 	}
       
   145 
       
   146 // -----------------------------------------------------------------------------
       
   147 // CSipCSReceiverBase::NextCSeq
       
   148 // From MTransactionOwner:
       
   149 // -----------------------------------------------------------------------------
       
   150 //
       
   151 TInt CSipCSReceiverBase::NextCSeq(TUint& aCSeq)
       
   152     {
       
   153     aCSeq++;
       
   154     return KErrNone;
       
   155     }
       
   156     
       
   157 // -----------------------------------------------------------------------------
       
   158 // CSipCSReceiverBase::SIPSecUser
       
   159 // From MTransactionOwner:
       
   160 // -----------------------------------------------------------------------------
       
   161 //    
       
   162 const MSIPSecUser* CSipCSReceiverBase::SIPSecUser() const
       
   163     {
       
   164     return &(iSIPSecUser);
       
   165     }
       
   166     
       
   167 // -----------------------------------------------------------------------------
       
   168 // CSipCSReceiverBase::SipRequestReceivedL
       
   169 // -----------------------------------------------------------------------------
       
   170 //
       
   171 void CSipCSReceiverBase::SipRequestReceivedL(TUint32 aIapId,
       
   172                                              TTransactionId aTransactionId,
       
   173                                              CSIPRequest* aRequest)
       
   174 	{
       
   175 	TSIPIds ids;
       
   176     ids.iIapId = aIapId;
       
   177 	ids.iRequestId = aTransactionId;
       
   178     SipMessageReceivedL(ids,aRequest);
       
   179 	}
       
   180 
       
   181 // -----------------------------------------------------------------------------
       
   182 // CSipCSReceiverBase::SipMessageReceivedL
       
   183 // -----------------------------------------------------------------------------
       
   184 //
       
   185 void CSipCSReceiverBase::SipMessageReceivedL(const TSIPIds& aIds,
       
   186                                              CSIPMessage* aSipMessage)
       
   187     {
       
   188     __ASSERT_ALWAYS (aSipMessage, User::Leave(KErrArgument));
       
   189     __SIP_MESSAGE_LOG ("ServerCore: ReceiveL",*aSipMessage)
       
   190 
       
   191     CBufFlat* headers = iITC.Serializer().ExternalizeLC(*aSipMessage);
       
   192     HBufC8* content = aSipMessage->TakeContentOwnershipL();
       
   193     CleanupStack::PushL (content);
       
   194     TSipCSReceiveItem item(aIds,headers,content,aSipMessage->IsRequest());
       
   195 
       
   196     HandleNewReceiveItemL(item);
       
   197 
       
   198     CleanupStack::Pop(content);
       
   199     CleanupStack::Pop(headers);
       
   200     delete aSipMessage;
       
   201     }
       
   202 
       
   203 // -----------------------------------------------------------------------------
       
   204 // CSipCSReceiverBase::HandleNewReceiveItemL
       
   205 // -----------------------------------------------------------------------------
       
   206 //       
       
   207 void CSipCSReceiverBase::HandleNewReceiveItemL(const TSipCSReceiveItem& aItem)
       
   208     {
       
   209     if (iClientReadyToReceive)
       
   210         {
       
   211         iITC.WriteL (iReceiveRMessage,aItem.Ids());
       
   212         iITC.WriteL (iReceiveRMessage,aItem.BufSizes());
       
   213         User::LeaveIfError(iReceiveQueue->AddLast(aItem));
       
   214         iITC.Complete (iReceiveRMessage,aItem.Error());
       
   215         iClientReadyToReceive = EFalse;
       
   216         }
       
   217     else
       
   218         {
       
   219         User::LeaveIfError(iReceiveQueue->AddLast(aItem));
       
   220         }     
       
   221     }
       
   222 
       
   223 // -----------------------------------------------------------------------------
       
   224 // CSipCSReceiverBase::ErrorReceived
       
   225 // -----------------------------------------------------------------------------
       
   226 //
       
   227 TInt CSipCSReceiverBase::ErrorReceived(const TSIPIds& aIds, TInt aError)
       
   228     {
       
   229     TInt err = KErrNone;
       
   230     if (aError != KErrNone)
       
   231         {
       
   232         if (iClientReadyToReceive)
       
   233             {
       
   234             TRAP (err, iITC.WriteL (iReceiveRMessage,aIds));
       
   235             if (err == KErrNone)
       
   236                 {
       
   237                 iITC.Complete(iReceiveRMessage,aError);
       
   238                 iClientReadyToReceive = EFalse;
       
   239                 }
       
   240             }
       
   241         else
       
   242         	{
       
   243             TSipCSReceiveItem item(aIds,aError);
       
   244             err = iReceiveQueue->AddLast(item);       		
       
   245         	}
       
   246         if (aError == KErrTimedOut && err == KErrNone)
       
   247         	{
       
   248         	// In case a transaction times out before a client
       
   249         	// has received the SIP request related to the transaction
       
   250         	// these SIP requests are dropped.
       
   251         	iReceiveQueue->RemoveSIPRequestsWith(aIds.iRequestId);
       
   252         	}
       
   253         }
       
   254     return err;
       
   255     }