--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Client/src/CSIPITCSender.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,456 @@
+// 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 : CSIPITCSender.cpp
+// Part of : SIPClient
+// Version : SIP/4.0
+//
+
+
+
+#include "CSIPITCSender.h"
+#include "MSIPITC.h"
+#include "sipmessageelements.h"
+#include "siprequestelements.h"
+#include "sipresponseelements.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "uricontainer.h"
+#include "siprouteheader.h"
+#include "sipcallidheader.h"
+#include "SIPHeaderLookup.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+const TInt KMaxHeaderSizeInReadStream = 300;
+const TInt KMaxTagLength = 100;
+const TInt KExternalizeBufferExpandSize = 100;
+
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPITCSender* CSIPITCSender::NewL (MSIPITC& aITC)
+ {
+ CSIPITCSender* self = CSIPITCSender::NewLC(aITC);
+ CleanupStack::Pop (self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPITCSender* CSIPITCSender::NewLC (MSIPITC& aITC)
+ {
+ CSIPITCSender* self = new(ELeave)CSIPITCSender(aITC);
+ CleanupStack::PushL (self);
+ self->ConstructL ();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::CSIPITCSender
+// -----------------------------------------------------------------------------
+//
+CSIPITCSender::CSIPITCSender (MSIPITC& aITC)
+ : iITC (aITC),
+ iLookupOpened (EFalse)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::ConstructL ()
+ {
+ SIPHeaderLookup::OpenL();
+ iLookupOpened = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::~CSIPITCSender
+// -----------------------------------------------------------------------------
+//
+CSIPITCSender::~CSIPITCSender ()
+ {
+ if (iLookupOpened)
+ {
+ SIPHeaderLookup::Close();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::Send
+// -----------------------------------------------------------------------------
+//
+TInt CSIPITCSender::Send (TSIPIds& aIds, TSipItcFunctions aITCFunction)
+ {
+ TPckgBuf<TSIPIds> sipIdsPckg(aIds);
+ iITCMsgArgs.Set (ESipItcArgIds, &sipIdsPckg);
+
+ TInt err = iITC.Send(aITCFunction,iITCMsgArgs);
+ aIds = sipIdsPckg();
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SendL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SendL (TSIPIds& aIds, TSipItcFunctions aITCFunction)
+ {
+ TInt err = Send(aIds,aITCFunction);
+ if (err != KErrNone)
+ {
+ User::Leave(err);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SendL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SendL (TSIPIds& aIds,
+ TSipItcFunctions aITCFunction,
+ const CSIPRequestElements& aElements)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ CBufFlat* buf = ExternalizeLC (aElements);
+ TPtr8 externalizedHeaders = buf->Ptr(0);
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &externalizedHeaders);
+
+ SetContentToSend (aElements.MessageElements());
+ SendL (aIds,aITCFunction);
+ CleanupStack::PopAndDestroy(buf);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SendL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SendL (TSIPIds& aIds,
+ TSipItcFunctions aITCFunction,
+ RStringF aMethod,
+ const CUri8* aRemoteUri,
+ const CSIPFromHeader* aFrom,
+ const CSIPToHeader* aTo,
+ const CSIPMessageElements* aElements,
+ const CSIPRouteHeader* aOutboundProxy)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ CBufFlat* buf = CBufFlat::NewL(KExternalizeBufferExpandSize);
+ CleanupStack::PushL(buf);
+ RBufWriteStream writeStream(*buf,0);
+ writeStream.PushL();
+ ExternalizeL(aMethod,writeStream);
+ if (aRemoteUri)
+ {
+ writeStream.WriteUint8L(1); // remote uri present
+ TPtrC8 uri(aRemoteUri->Uri().UriDes());
+ writeStream.WriteUint32L(uri.Length());
+ writeStream.WriteL(uri);
+ }
+ else
+ {
+ writeStream.WriteUint8L(0); // remote not uri present
+ }
+ if (aOutboundProxy)
+ {
+ aOutboundProxy->ExternalizeL(writeStream,EFalse);
+ }
+ if (aFrom)
+ {
+ ExternalizeL(aFrom,writeStream);
+ }
+ if (aTo)
+ {
+ ExternalizeL(aTo,writeStream);
+ }
+ ExternalizeL(aElements,writeStream,EFalse);
+ writeStream.Pop();
+ writeStream.Close();
+ TPtr8 externalizedHeaders = buf->Ptr(0);
+ iITCMsgArgs.Set(ESipItcArgMessageHeaders,&externalizedHeaders);
+
+ SetContentToSend (aElements);
+ SendL (aIds,aITCFunction);
+ CleanupStack::PopAndDestroy(buf);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SendL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SendL (TSIPIds& aIds,
+ TSipItcFunctions aITCFunction,
+ const CSIPMessageElements* aElements)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ SetContentToSend (aElements);
+ if (aElements != 0)
+ {
+ CBufFlat* buf = ExternalizeLC (*aElements);
+ TPtr8 externalizedHeaders = buf->Ptr(0);
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &externalizedHeaders);
+ SendL(aIds,aITCFunction);
+ CleanupStack::PopAndDestroy(buf);
+ }
+ else
+ {
+ TBuf8<1> emptyBuf;
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &emptyBuf);
+ SendL(aIds,aITCFunction);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SendL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SendL (TSIPIds& aIds,
+ TSipItcFunctions aITCFunction,
+ RStringF aMethod,
+ const CSIPMessageElements* aElements)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ SetContentToSend (aElements);
+ CBufFlat* buf = CBufFlat::NewL(KExternalizeBufferExpandSize);
+ CleanupStack::PushL(buf);
+ RBufWriteStream writeStream(*buf,0);
+ writeStream.PushL();
+ ExternalizeL(aMethod,writeStream);
+ ExternalizeL (aElements,writeStream,EFalse);
+ TPtr8 bufPtr = buf->Ptr(0);
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &bufPtr);
+ SendL(aIds,aITCFunction);
+ writeStream.Pop();
+ writeStream.Close();
+ CleanupStack::PopAndDestroy(buf);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SendL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SendL (TSIPIds& aIds,
+ TSipItcFunctions aITCFunction,
+ const CSIPResponseElements& aElements)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ CBufFlat* buf = ExternalizeLC (aElements);
+ TPtr8 externalizedHeaders = buf->Ptr(0);
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &externalizedHeaders);
+
+ SetContentToSend (aElements.MessageElements());
+ SendL (aIds,aITCFunction);
+ CleanupStack::PopAndDestroy(buf);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::OutboundProxyL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SetOutboundProxyL (TSIPIds& aIds,
+ const CSIPRouteHeader& aOutboundProxy)
+ {
+ CBufFlat* buf = CBufFlat::NewL(KExternalizeBufferExpandSize);
+ CleanupStack::PushL(buf);
+ RBufWriteStream writeStream(*buf,0);
+ writeStream.PushL();
+ aOutboundProxy.ExternalizeL(writeStream,EFalse);
+ writeStream.Pop();
+ writeStream.Close();
+ TPtr8 externalizedProxy = buf->Ptr(0);
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &externalizedProxy);
+ SendL (aIds,ESipItcSetOutboundProxy);
+ CleanupStack::PopAndDestroy(buf);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::ReadSIPHeaderL
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderBase* CSIPITCSender::ReadSIPHeaderL (TSIPIds& aIds,
+ TSipItcFunctions aITCFunction,
+ RStringF aHeaderName)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ HBufC8* headerBuf = HBufC8::NewLC(KMaxHeaderSizeInReadStream);
+ TPtr8 headerBufPtr = headerBuf->Des();
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &headerBufPtr);
+ SendL (aIds,aITCFunction);
+ CSIPHeaderBase* header = InternalizeL(aHeaderName, headerBufPtr);
+ CleanupStack::PopAndDestroy(headerBuf);
+ return header;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::ReadCallIDHeaderL
+// -----------------------------------------------------------------------------
+//
+CSIPCallIDHeader* CSIPITCSender::ReadCallIDHeaderL(TSIPIds& aIds)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ HBufC8* headerBuf = HBufC8::NewLC(KMaxHeaderSizeInReadStream);
+ TPtr8 headerBufPtr = headerBuf->Des();
+ iITCMsgArgs.Set (ESipItcArgMessageHeaders, &headerBufPtr);
+ SendL (aIds,ESipItcGetCallIDHeader);
+ RDesReadStream readStream(headerBufPtr);
+ readStream.PushL();
+ CSIPCallIDHeader* callID = NULL;
+ if (headerBufPtr.Length() > 0)
+ {
+ callID = static_cast<CSIPCallIDHeader*>(
+ CSIPCallIDHeader::InternalizeValueL(readStream));
+ }
+ readStream.Pop();
+ readStream.Close();
+ CleanupStack::PopAndDestroy(headerBuf);
+ return callID;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::ReadLocalTagL
+// -----------------------------------------------------------------------------
+//
+RStringF CSIPITCSender::ReadLocalTagL(TSIPIds& aIds)
+ {
+ Mem::FillZ(&iITCMsgArgs, sizeof(iITCMsgArgs));
+ HBufC8* localTagBuf = HBufC8::NewLC(KMaxTagLength);
+ TPtr8 localTagBufPtr = localTagBuf->Des();
+ iITCMsgArgs.Set(ESipItcArgLocalTag, &localTagBufPtr);
+ SendL(aIds,ESipItcGetLocalTag);
+ RStringF localTag = SIPStrings::Pool().OpenFStringL(localTagBufPtr);
+ CleanupStack::PopAndDestroy(localTagBuf);
+ return localTag;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SetRefreshIntervalL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SetRefreshIntervalL (TSIPIds& aIds, TInt aInterval)
+ {
+ iITCMsgArgs.Set(ESipItcArgRefreshInterval, aInterval);
+ SendL(aIds,ESipItcSetRefreshInterval);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::GetRefreshIntervalL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::GetRefreshIntervalL (TSIPIds& aIds, TInt& aInterval)
+ {
+ TPckgBuf<TInt> intervalPckg(0);
+ iITCMsgArgs.Set(ESipItcArgRefreshInterval, &intervalPckg);
+ SendL (aIds,ESipItcGetRefreshInterval);
+ aInterval = intervalPckg();
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SetContentToSend
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SetContentToSend (const CSIPMessageElements* aElements)
+ {
+ if (aElements != 0)
+ {
+ SetContentToSend(*aElements);
+ }
+ else
+ {
+ iITCMsgArgs.Set (ESipItcArgMessageContent, &iEmptyContent);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::SetContentToSend
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::SetContentToSend (const CSIPMessageElements& aElements)
+ {
+ iITCMsgArgs.Set (ESipItcArgMessageContent, &(aElements.Content()));
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::ExternalizeLC
+// -----------------------------------------------------------------------------
+//
+template<class T> CBufFlat* CSIPITCSender::ExternalizeLC (const T& aElements)
+ {
+ CBufFlat* buf = CBufFlat::NewL(KExternalizeBufferExpandSize);
+ CleanupStack::PushL(buf);
+ RBufWriteStream writeStream(*buf,0);
+ writeStream.PushL();
+ aElements.ExternalizeL(writeStream);
+ writeStream.Pop();
+ writeStream.Close();
+ return buf;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::ExternalizeL
+// -----------------------------------------------------------------------------
+//
+template<class T> void CSIPITCSender::ExternalizeL (const T* aElement,
+ RWriteStream& aWriteStream,
+ TBool aAddExpectedFlag)
+ {
+ if (aElement)
+ {
+ if (aAddExpectedFlag)
+ {
+ aWriteStream.WriteUint8L(1); // element expected flag
+ }
+ aElement->ExternalizeL(aWriteStream);
+ }
+ else
+ {
+ aWriteStream.WriteUint8L(0); // element not expected flag
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::ExternalizeL
+// -----------------------------------------------------------------------------
+//
+void CSIPITCSender::ExternalizeL (RStringF aStr, RWriteStream& aWriteStream)
+ {
+ TPtrC8 des(aStr.DesC());
+ if (des.Length() > 0)
+ {
+ aWriteStream.WriteUint32L(des.Length());
+ aWriteStream.WriteL(des);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPITCSender::InternalizeL
+// -----------------------------------------------------------------------------
+//
+CSIPHeaderBase* CSIPITCSender::InternalizeL (RStringF aName, TDes8& aDes)
+ {
+ CSIPHeaderBase* header = NULL;
+ if (aDes.Length() > 0)
+ {
+ RDesReadStream readStream(aDes);
+ readStream.PushL();
+ header = SIPHeaderLookup::InternalizeL(aName,readStream);
+ readStream.Pop();
+ readStream.Close();
+ }
+ return header;
+ }