realtimenetprots/sipfw/ClientResolver/Client/src/CSIPClientDiscoveryReceiver.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          : CSIPClientResolverReceiver.cpp
       
    15 // Part of       : SIP Client Resolver
       
    16 // Version       : 1.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 // INCLUDES
       
    22 #include "CSIPClientDiscoveryReceiver.h"
       
    23 #include "sipresponse.h"
       
    24 #include "MSIPClientDiscoveryITC.h"
       
    25 #include "sipclientdiscoveryobserver.h"
       
    26 #include "CSIPClientDiscoverySerializer.h"
       
    27 
       
    28 // ============================ MEMBER FUNCTIONS ===============================
       
    29 
       
    30 // -----------------------------------------------------------------------------
       
    31 // CSIPClientDiscoveryReceiver::CSIPClientDiscoveryReceiver
       
    32 // -----------------------------------------------------------------------------
       
    33 //
       
    34 CSIPClientDiscoveryReceiver::CSIPClientDiscoveryReceiver (
       
    35                                     MSIPClientDiscoveryITC& aITC, 
       
    36                                     MSIPClientDiscoveryObserver& aObserver,
       
    37                                     CSIPClientDiscoverySerializer& aSerializer)
       
    38 : CActive (EPriorityStandard),
       
    39   iObserver (aObserver),
       
    40   iSerializer (aSerializer),
       
    41   iITC(aITC)
       
    42     {
       
    43     CActiveScheduler::Add (this);
       
    44     iITCMsgArgs.Set(ESIPCRIpcArgReqId, &iIdsPckg);
       
    45     iITCMsgArgs.Set(ESIPCRIpcArgClientResolved, &iClientResolved);
       
    46     iITCMsgArgs.Set(ESIPCRIpcArgBufSizes, &iSizesPckg);
       
    47     iITCMsgArgs.Set(ESIPCRIpcArgResolverUid, &iResolverUid);
       
    48     ReceiveNext();
       
    49     }
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // CSIPClientDiscoveryReceiver::~CSIPClientDiscoveryReceiver
       
    53 // -----------------------------------------------------------------------------
       
    54 //
       
    55 CSIPClientDiscoveryReceiver::~CSIPClientDiscoveryReceiver () 
       
    56 	{
       
    57 	CActive::Cancel();
       
    58 	}
       
    59 
       
    60     
       
    61 // -----------------------------------------------------------------------------
       
    62 // CSIPClientDiscoveryReceiver::HandleClientNotFoundL
       
    63 // -----------------------------------------------------------------------------
       
    64 //
       
    65 void CSIPClientDiscoveryReceiver::HandleClientNotFoundL()
       
    66     {
       
    67     TIpcArgs tmpITCArgs;
       
    68     tmpITCArgs.Set(ESIPCRIpcArgReqId, &iIdsPckg);
       
    69 
       
    70     HBufC8* content = HBufC8::NewLC(iSizesPckg().iContentBufSize);
       
    71     TPtr8 contentPtr(content->Des());
       
    72     tmpITCArgs.Set(ESIPCRIpcArgSipMessageContent, &contentPtr);
       
    73 
       
    74     HBufC8* responseBuf = HBufC8::NewLC(iSizesPckg().iHeaderBufSize);
       
    75     TPtr8 responsePtr(responseBuf->Des());
       
    76     tmpITCArgs.Set(ESIPCRIpcArgSipResponse, &responsePtr);
       
    77 
       
    78     TInt err = iITC.Receive(tmpITCArgs);
       
    79     if (err != KErrNone) 
       
    80         {
       
    81         User::Leave(err);
       
    82         }
       
    83        
       
    84     CSIPResponse* response =  
       
    85         iSerializer.InternalizeSIPResponseL(*responseBuf);                              
       
    86     CleanupStack::PopAndDestroy(responseBuf);
       
    87     CleanupStack::PushL(response);
       
    88     
       
    89     RPointerArray<CSIPHeaderBase> headers;
       
    90     CSIPHeaderBase::PushLC(&headers);
       
    91     
       
    92     const RPointerArray<CSIPHeaderBase>& responseHeaders = 
       
    93         response->AllHeadersL();
       
    94     
       
    95     for (TInt i=0; i < responseHeaders.Count(); i++)
       
    96         {
       
    97         CSIPHeaderBase* header = responseHeaders[i];
       
    98         User::LeaveIfError(headers.Append(header));
       
    99         response->RemoveHeader(header);
       
   100         }       
       
   101     
       
   102     iObserver.ClientNotFoundL(iIdsPckg(),
       
   103                               response->ResponseCode(),
       
   104                               response->ReasonPhrase(),
       
   105                               headers,
       
   106                               content);
       
   107 
       
   108     CleanupStack::Pop(1); // headers
       
   109     CleanupStack::PopAndDestroy(response);
       
   110     CleanupStack::Pop(content);
       
   111     }
       
   112 
       
   113 // -----------------------------------------------------------------------------
       
   114 // CSIPClientDiscoveryReceiver::HandleChannelResolvedL
       
   115 // -----------------------------------------------------------------------------
       
   116 //
       
   117 void CSIPClientDiscoveryReceiver::HandleChannelResolvedL()
       
   118     {
       
   119     iObserver.ChannelResolvedL(iResolverUid(), iIdsPckg());
       
   120     }
       
   121 
       
   122 // -----------------------------------------------------------------------------
       
   123 // CSIPClientDiscoveryReceiver::ErrorOccured
       
   124 // -----------------------------------------------------------------------------
       
   125 //
       
   126 void CSIPClientDiscoveryReceiver::ErrorOccured(TInt aError)
       
   127     {
       
   128     iObserver.ErrorOccurred(aError, iIdsPckg());
       
   129     }
       
   130 	
       
   131 // -----------------------------------------------------------------------------
       
   132 // CSIPClientDiscoveryReceiver::RunL
       
   133 // -----------------------------------------------------------------------------
       
   134 //
       
   135 void CSIPClientDiscoveryReceiver::RunL()
       
   136     {
       
   137     TInt err = iStatus.Int();
       
   138     
       
   139     if (err == KErrServerTerminated)
       
   140         {
       
   141         // This will leave to RunError-function. See below.
       
   142     	User::Leave(err);
       
   143 	    }
       
   144 		
       
   145     if (err == KErrNone)
       
   146         {
       
   147         switch (iClientResolved())
       
   148             {
       
   149             case ESIPCRChannelComplete:
       
   150                 HandleChannelResolvedL();
       
   151                 break;
       
   152             
       
   153             case ESIPCRClientNotFound:
       
   154                 HandleClientNotFoundL();
       
   155                 break;
       
   156             
       
   157             default:
       
   158                 break;
       
   159             }
       
   160         }
       
   161     else
       
   162         {
       
   163         ErrorOccured(err);
       
   164         }
       
   165 
       
   166 	ReceiveNext ();
       
   167     }
       
   168     
       
   169 // -----------------------------------------------------------------------------
       
   170 // CSIPClientDiscoveryReceiver::RunError
       
   171 // -----------------------------------------------------------------------------
       
   172 //
       
   173 TInt CSIPClientDiscoveryReceiver::RunError(TInt aError) 
       
   174     {
       
   175 	if (aError == KErrServerTerminated)
       
   176 		{
       
   177 		// Return the error to the active scheduler and stop receiving.
       
   178 		// Receiving must be stopped.
       
   179 		// It would lead to infinite RunL-RunError-loop.
       
   180 		return aError;
       
   181 		}
       
   182     // Ignore all the other errors and continue receiving
       
   183 	ReceiveNext ();
       
   184 	return KErrNone;
       
   185     }
       
   186     
       
   187 // -----------------------------------------------------------------------------
       
   188 // CSIPClientDiscoveryReceiver::DoCancel
       
   189 // -----------------------------------------------------------------------------
       
   190 //
       
   191 void CSIPClientDiscoveryReceiver::DoCancel()
       
   192     {
       
   193     iITC.CancelReceive();
       
   194     }
       
   195 
       
   196 // -----------------------------------------------------------------------------
       
   197 // CSIPClientDiscoveryReceiver::ReceiveNext
       
   198 // -----------------------------------------------------------------------------
       
   199 //
       
   200 void CSIPClientDiscoveryReceiver::ReceiveNext()
       
   201     {
       
   202 	if (!IsActive())
       
   203         {
       
   204         iITC.Receive( iITCMsgArgs,iStatus);
       
   205         SetActive();
       
   206         }
       
   207     }
       
   208     
       
   209 //  End of File