diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/sipapi/src/sipdialogtrying.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/sipapi/src/sipdialogtrying.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,302 @@ +// Copyright (c) 2003-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 : sipdialogtrying.cpp +// Part of : SIPAPI +// Version : SIP/4.0 +// + + + +#include "SipAssert.h" +#include "sip.h" +#include "siperr.h" +#include "siptoheader.h" +#include "SipConnectionImplementation.h" +#include "sipclientconnection.h" +#include "sipdialogtrying.h" +#include "SipDialogImplementation.h" +#include "sipclienttransaction.h" +#include "sipservertransaction.h" +#include "sipmessageelements.h" +#include "sipresponseelements.h" +#include "sipinvitedialogassoc.h" +#include "sipsubscribedialogassoc.h" +#include "sipreferdialogassoc.h" +#include "sipconnectioncallback.h" +#include "sipstrings.h" +#include "sipstrconsts.h" + + +// ----------------------------------------------------------------------------- +// CDialogTrying::NewL +// ----------------------------------------------------------------------------- +// +CDialogTrying* CDialogTrying::NewL() + { + return new (ELeave) CDialogTrying(); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::CDialogTrying +// ----------------------------------------------------------------------------- +// +CDialogTrying::CDialogTrying() + { + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::~CDialogTrying +// ----------------------------------------------------------------------------- +// +CDialogTrying::~CDialogTrying() + { + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::State +// ----------------------------------------------------------------------------- +// +CSIPDialog::TState CDialogTrying::State() const + { + return CSIPDialog::EInit; + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::SetNeighbourStates +// ----------------------------------------------------------------------------- +// +void CDialogTrying::SetNeighbourStates(CDialogState& aEarly, + CDialogState& aConfirmed, + CDialogState& aTerminated) + { + iEarly = &aEarly; + iConfirmed = &aConfirmed; + iTerminated = &aTerminated; + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::SendInviteL +// Only the initial request creating the dialog, can be sent in Trying state. +// ----------------------------------------------------------------------------- +// +CSIPClientTransaction* +CDialogTrying::SendInviteL(const CSIPDialogImplementation& aDialog, + CSIPInviteDialogAssoc& aAssoc, + CSIPMessageElements* aElements) const + { + aDialog.CheckNoTransactionExistsL(); + return aAssoc.DoSendInviteL(aElements); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::SendSubscribeL +// Only the initial request creating the dialog, can be sent in Trying state. +// ----------------------------------------------------------------------------- +// +CSIPClientTransaction* +CDialogTrying::SendSubscribeL(const CSIPDialogImplementation& aDialog, + CSIPSubscribeDialogAssoc& aAssoc, + CSIPMessageElements* aElements, + CSIPRefresh* aRefresh) const + { + aDialog.CheckNoTransactionExistsL(); + return aAssoc.DoSendSubscribeL(aElements, aRefresh, EFalse); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::SendReferL +// Only the initial request creating the dialog, can be sent in Trying state. +// ----------------------------------------------------------------------------- +// +CSIPClientTransaction* +CDialogTrying::SendReferL(const CSIPDialogImplementation& aDialog, + CSIPReferDialogAssoc& aAssoc, + CSIPMessageElements* aElements) const + { + aDialog.CheckNoTransactionExistsL(); + return aAssoc.DoSendReferL(aElements, EFalse); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::SendResponseL +// This is the first response sent and it can't be a 100 response. A 101-299 +// response creates a dialog, a 300-699 response does not. +// ----------------------------------------------------------------------------- +// +void CDialogTrying::SendResponseL(CSIPDialogImplementation& aDialog, + const CSIPResponseElements& aElements, + TUint32 aRequestId, + TBool aAffectsDialogState, + TBool /*aTargetRefresh*/) const + { + __SIP_ASSERT_LEAVE(aAffectsDialogState, KErrArgument); + + CSIPConnection* connection = aDialog.Connection(); + __ASSERT_ALWAYS(connection, User::Leave(KErrSIPResourceNotAvailable)); + + CSIPClientConnection& client = + connection->Implementation().ClientConnectionL(); + if (aElements.StatusCode() >= 300) + { + client.SendResponseL(aElements, aRequestId); + aDialog.ChangeState(iTerminated); + } + else + { + TUint32 dialogId(0); + client.SendResponseAndCreateDialogL(aElements, aRequestId, + dialogId, aDialog.RegistrationId()); + aDialog.SetDialogId(dialogId); + aDialog.StoreCallIdL(); + aDialog.FillLocalTagL(EFalse); + + //Enter next state when the response has been successfully sent + if (aElements.StatusCode() >= 200) + { + aDialog.ChangeState(iConfirmed); + } + else + { + //TransactionUser will add to-tag into other responses than 100 + aDialog.ChangeState(iEarly); + } + } + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::IncomingResponseL +// ----------------------------------------------------------------------------- +// +TBool +CDialogTrying::IncomingResponseL(CSIPDialogImplementation& aDialog, + CSIPResponseElements* aElements, + TUint32 aRequestId, + TUint32 /*aDialogId*/, + CConnectionCallback& aCallback) const + { + __SIP_ASSERT_LEAVE(aElements, KErrArgument); + + CSIPTransactionBase* ta = NULL; + CSIPDialogAssocBase* assoc = NULL; + if (aDialog.FindTransactionAndAssoc(aRequestId, &ta, &assoc)) + { + __SIP_ASSERT_LEAVE(ta->IsSIPClientTransaction(), KErrGeneral); + aDialog.UpdateRemoteTargetL(ta->Type(), aElements->MessageElements()); + + __SIP_ASSERT_LEAVE(aElements->ToHeader() != NULL, KErrArgument); + aDialog.FillRemoteTagL(*aElements->ToHeader()); + + CSIPClientTransaction* clientTa = + static_cast(ta); + clientTa->SetResponseElements(aElements); + + aDialog.UpdateState(*clientTa, + *iEarly, + *iConfirmed, + *iTerminated); + aCallback.Set(CConnectionCallback::EIncomingResponse, + clientTa, + NULL, + NULL, + assoc); + return ETrue; + } + + //Transaction not found, ignore response + delete aElements; + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::IncomingResponseL +// ----------------------------------------------------------------------------- +// +TBool CDialogTrying::IncomingResponseL(CSIPDialogImplementation& aDialog, + CSIPResponseElements* aElements, + TUint32 aRequestId, + TUint32 aRefreshId, + TUint32 /*aDialogId*/, + CConnectionCallback& aCallback) const + { + return ResponseToRefreshL(aDialog, + aElements, + aRequestId, + aRefreshId, + aCallback, + *iEarly, + *iConfirmed, + *iTerminated); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::IncomingRequestL +// ----------------------------------------------------------------------------- +// +TBool CDialogTrying::IncomingRequestL(CSIPDialogImplementation& aDialog, + CSIPServerTransaction* aTransaction, + CConnectionCallback& aCallback) const + { + __SIP_ASSERT_LEAVE(aTransaction, KErrArgument); + + if (aTransaction->Type() == SIPStrings::StringF(SipStrConsts::ENotify) && + aDialog.DoesNotifyConfirmDialog()) + { + aDialog.ChangeRefreshesToActive(); + aDialog.ChangeState(iConfirmed); + } + + return RequestReceivedL(aDialog, aTransaction, aCallback); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::ErrorOccured +// ----------------------------------------------------------------------------- +// +TBool CDialogTrying::ErrorOccured(CSIPDialogImplementation& aDialog, + TInt aError, + TUint32 aRequestId, + CConnectionCallback& aCallback) const + { + return HandleErrorOccurred(aDialog, + aError, + aRequestId, + aCallback, + *iTerminated); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::ErrorOccured +// ----------------------------------------------------------------------------- +// +TBool CDialogTrying::ErrorOccured(CSIPDialogImplementation& aDialog, + TInt aError, + TUint32 aRefreshId, + TUint32 /*aRequestId*/, + CConnectionCallback& aCallback) const + { + return HandleRefreshErrorOccurred(aDialog, + aError, + aRefreshId, + aCallback, + *iTerminated); + } + +// ----------------------------------------------------------------------------- +// CDialogTrying::ConnectionLost +// ----------------------------------------------------------------------------- +// +void CDialogTrying::ConnectionLost(CSIPDialogImplementation& aDialog) const + { + aDialog.ChangeState(iTerminated); + }