diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ClientResolver/Client/src/CSIPClientDiscoveryReceiver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ClientResolver/Client/src/CSIPClientDiscoveryReceiver.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,209 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Name : CSIPClientResolverReceiver.cpp +// Part of : SIP Client Resolver +// Version : 1.0 +// + + + +// INCLUDES +#include "CSIPClientDiscoveryReceiver.h" +#include "sipresponse.h" +#include "MSIPClientDiscoveryITC.h" +#include "sipclientdiscoveryobserver.h" +#include "CSIPClientDiscoverySerializer.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::CSIPClientDiscoveryReceiver +// ----------------------------------------------------------------------------- +// +CSIPClientDiscoveryReceiver::CSIPClientDiscoveryReceiver ( + MSIPClientDiscoveryITC& aITC, + MSIPClientDiscoveryObserver& aObserver, + CSIPClientDiscoverySerializer& aSerializer) +: CActive (EPriorityStandard), + iObserver (aObserver), + iSerializer (aSerializer), + iITC(aITC) + { + CActiveScheduler::Add (this); + iITCMsgArgs.Set(ESIPCRIpcArgReqId, &iIdsPckg); + iITCMsgArgs.Set(ESIPCRIpcArgClientResolved, &iClientResolved); + iITCMsgArgs.Set(ESIPCRIpcArgBufSizes, &iSizesPckg); + iITCMsgArgs.Set(ESIPCRIpcArgResolverUid, &iResolverUid); + ReceiveNext(); + } + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::~CSIPClientDiscoveryReceiver +// ----------------------------------------------------------------------------- +// +CSIPClientDiscoveryReceiver::~CSIPClientDiscoveryReceiver () + { + CActive::Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::HandleClientNotFoundL +// ----------------------------------------------------------------------------- +// +void CSIPClientDiscoveryReceiver::HandleClientNotFoundL() + { + TIpcArgs tmpITCArgs; + tmpITCArgs.Set(ESIPCRIpcArgReqId, &iIdsPckg); + + HBufC8* content = HBufC8::NewLC(iSizesPckg().iContentBufSize); + TPtr8 contentPtr(content->Des()); + tmpITCArgs.Set(ESIPCRIpcArgSipMessageContent, &contentPtr); + + HBufC8* responseBuf = HBufC8::NewLC(iSizesPckg().iHeaderBufSize); + TPtr8 responsePtr(responseBuf->Des()); + tmpITCArgs.Set(ESIPCRIpcArgSipResponse, &responsePtr); + + TInt err = iITC.Receive(tmpITCArgs); + if (err != KErrNone) + { + User::Leave(err); + } + + CSIPResponse* response = + iSerializer.InternalizeSIPResponseL(*responseBuf); + CleanupStack::PopAndDestroy(responseBuf); + CleanupStack::PushL(response); + + RPointerArray headers; + CSIPHeaderBase::PushLC(&headers); + + const RPointerArray& responseHeaders = + response->AllHeadersL(); + + for (TInt i=0; i < responseHeaders.Count(); i++) + { + CSIPHeaderBase* header = responseHeaders[i]; + User::LeaveIfError(headers.Append(header)); + response->RemoveHeader(header); + } + + iObserver.ClientNotFoundL(iIdsPckg(), + response->ResponseCode(), + response->ReasonPhrase(), + headers, + content); + + CleanupStack::Pop(1); // headers + CleanupStack::PopAndDestroy(response); + CleanupStack::Pop(content); + } + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::HandleChannelResolvedL +// ----------------------------------------------------------------------------- +// +void CSIPClientDiscoveryReceiver::HandleChannelResolvedL() + { + iObserver.ChannelResolvedL(iResolverUid(), iIdsPckg()); + } + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::ErrorOccured +// ----------------------------------------------------------------------------- +// +void CSIPClientDiscoveryReceiver::ErrorOccured(TInt aError) + { + iObserver.ErrorOccurred(aError, iIdsPckg()); + } + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::RunL +// ----------------------------------------------------------------------------- +// +void CSIPClientDiscoveryReceiver::RunL() + { + TInt err = iStatus.Int(); + + if (err == KErrServerTerminated) + { + // This will leave to RunError-function. See below. + User::Leave(err); + } + + if (err == KErrNone) + { + switch (iClientResolved()) + { + case ESIPCRChannelComplete: + HandleChannelResolvedL(); + break; + + case ESIPCRClientNotFound: + HandleClientNotFoundL(); + break; + + default: + break; + } + } + else + { + ErrorOccured(err); + } + + ReceiveNext (); + } + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::RunError +// ----------------------------------------------------------------------------- +// +TInt CSIPClientDiscoveryReceiver::RunError(TInt aError) + { + if (aError == KErrServerTerminated) + { + // Return the error to the active scheduler and stop receiving. + // Receiving must be stopped. + // It would lead to infinite RunL-RunError-loop. + return aError; + } + // Ignore all the other errors and continue receiving + ReceiveNext (); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::DoCancel +// ----------------------------------------------------------------------------- +// +void CSIPClientDiscoveryReceiver::DoCancel() + { + iITC.CancelReceive(); + } + +// ----------------------------------------------------------------------------- +// CSIPClientDiscoveryReceiver::ReceiveNext +// ----------------------------------------------------------------------------- +// +void CSIPClientDiscoveryReceiver::ReceiveNext() + { + if (!IsActive()) + { + iITC.Receive( iITCMsgArgs,iStatus); + SetActive(); + } + } + +// End of File