diff -r fb024d5e35fa -r 64c62431ac08 multimediacommsengine/mmcecli/src/mcesessionutility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcecli/src/mcesessionutility.cpp Mon Sep 06 17:32:13 2010 +0530 @@ -0,0 +1,492 @@ +/* +* Copyright (c) 2005 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: +* +*/ + + + +#include +#include +#include +#include +#include +#include +#include "mceclilogs.h" +#include "mcecomsession.h" +#include "mcecommediastream.h" +#include "mcesessionutility.h" +#include +#include +#include "mcecommediastream.h" +#include +#include +#include +#include +#include + +//# define _OPEN_SDPCODEC_STRINGPOOL SdpCodecStringPool::OpenL() + +#define _CLOSE_SDPCODEC_STRINGPOOL SdpCodecStringPool::Close(); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::getSessionSdPLineL +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC8* TMceSessionUtility::getSessionSdPLineL(CMceSession* aSession, + TSDPLineName aSdpLineName) + { + __ASSERT_ALWAYS(aSession, User::Leave(KErrArgument)); + + // Ownership is tranferred to us for sessionLines + CDesC8Array* sessionLines = static_cast (aSession->SessionSDPLinesL()); + + if (sessionLines->MdcaCount() == 0) + { + MCECLI_DEBUG("TMceSessionUtility::getSessionSdPLineL: No session attributes set in the passed session \n"); + sessionLines->Reset(); + delete sessionLines; + return NULL; + } + + // Open SIP coec string pool + TRAPD(error, SdpCodecStringPool::OpenL()); + if (error != KErrAlreadyExists && error != KErrNone) + { + delete sessionLines; + User::Leave(error); + } + CSdpDocument* sdpDoc = NULL; + CleanupStack::PushL(sessionLines); + ConstructSdpDocumentL(sessionLines, sdpDoc); + CleanupStack::Pop(sessionLines); + + HBufC8* retValue = NULL; + switch(aSdpLineName) + { + case EVersion: + { + TInt value = sdpDoc->SdpVersion(); + TBuf8<10> tmp; + tmp.Num(value); + retValue = tmp.AllocL(); + } + break; + + case ESession: + retValue = sdpDoc->SessionName().AllocL(); + break; + + case EInfo: + retValue = sdpDoc->Info().AllocL(); + break; + + case EUri: + { + // Ownership will not be transferred to us so shouldn't delete the pointer + CUri8* uri = sdpDoc->Uri(); + if (uri != NULL) + { + retValue = uri->Uri().UriDes().AllocL(); + } + } + break; + + case EZone: + retValue = sdpDoc->ZoneAdjustments().AllocL(); + break; + + default: + sessionLines->Reset(); + delete sessionLines; + delete sdpDoc; + _CLOSE_SDPCODEC_STRINGPOOL; + User::Leave(KErrNotSupported); + } + sessionLines->Reset(); + delete sessionLines; + delete sdpDoc; + + if (error == KErrNone) + _CLOSE_SDPCODEC_STRINGPOOL; + __ASSERT_ALWAYS(retValue!=NULL, User::Leave(KErrArgument)); + return retValue; + } + + + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::getRemoteMediaSDPAttrL +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC8* TMceSessionUtility::getRemoteMediaSDPAttrL(CMceMediaStream* aStream, + const TDesC8& aAttrName) + { + __ASSERT_ALWAYS(aStream, User::Leave(KErrArgument)); + // Ownership is not transferred to us + CMceSession* session = aStream->Session(); + __ASSERT_ALWAYS(session, User::Leave(KErrArgument)); + + if ( (session->State() >= CMceSession::ECancelling) || + (session->State() <= CMceSession::EIdle) ) + { + MCECLI_DEBUG(" Session state shouldn't be idle Or shouldn't be either in cancelling, terminating , terminated \n"); + User::Leave(KErrArgument); + } + + CDesC8Array* mediaAttrs = NULL; + mediaAttrs = aStream->FlatData()->iRemoteMediaSDPLines; + + if (mediaAttrs == NULL || mediaAttrs->MdcaCount() == 0) + { + if (aStream->BoundStream()) + { + mediaAttrs = aStream->BoundStreamL().FlatData()->iRemoteMediaSDPLines; + } + } + + if (mediaAttrs == NULL || mediaAttrs->MdcaCount() == 0) + { + // Look for the another staream of same type to extract the remote media sdp attributes + CMceMediaStream* tempStrm; + for(TInt i=0; iStreams().Count(); i++) + { + tempStrm = session->Streams()[i]; + if (tempStrm != aStream && (tempStrm->Type() == aStream->Type()) ) + { + mediaAttrs = tempStrm->FlatData()->iRemoteMediaSDPLines; + } + } + if (mediaAttrs == NULL || mediaAttrs->MdcaCount() == 0) + { + MCECLI_DEBUG("TMceSessionUtility::getRemoteMediaSDPAttrL: No Remote Media SDP attributes set to the streams \n"); + return NULL; + } + } + //_OPEN_SDPCODEC_STRINGPOOL; + TRAPD(error, SdpCodecStringPool::OpenL()); + if (error != KErrAlreadyExists && error != KErrNone) + { + User::Leave(error); + } + // If the attribute is found then the value will be in aValue. + HBufC8* value = NULL; + value = FindAttributeL(mediaAttrs, aAttrName); + if (error == KErrNone) + _CLOSE_SDPCODEC_STRINGPOOL; + return value; + } + + + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::GetLocalConnectionAddrL +// ----------------------------------------------------------------------------- +// +EXPORT_C void TMceSessionUtility::GetLocalConnectionAddrL(CMceSession* aSess, TInetAddr& aAddr) + { + __ASSERT_ALWAYS(aSess, User::Leave(KErrArgument)); + aAddr = aSess->FlatData()->iLocalIpAddress; + } + + + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::GetRemoteConnectionAddrL +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC8* TMceSessionUtility::GetRemoteConnectionAddrL(CMceMediaStream* aStream/*, TDesC8* hostAddr*/) + { + CMceSession* session = aStream->Session(); + __ASSERT_ALWAYS(session, User::Leave(KErrArgument)); + if ( (session->State() >= CMceSession::ECancelling) || + (session->State() <= CMceSession::EIdle) ) + { + MCECLI_DEBUG("TMceSessionUtility::GetRemoteConnectionAddrL: Session state shouldn't be idle Or shouldn't be either in cancelling, terminating , terminated"); + User::Leave(KErrArgument); + } + TBuf8<10> attrName; + + if (aStream->Type() == KMceMessage) + { + // Get the remote end's path attribute and extracts the host number from that + //ownership willbe transferred to us so have to free up later + HBufC8* pathValue = NULL; + attrName.Zero(); + attrName.Copy(_L8("path")); + pathValue = TMceSessionUtility::getRemoteMediaSDPAttrL(aStream, attrName); + if (NULL!=pathValue) + { + TUriParser8 parser; + TInt parseValue = parser.Parse(*pathValue); + + MCECLI_DEBUG_DVALUE("\n CMceMessageSdpCodec::SetHostAddrPortFromPathAttr: Parsed return value for MSRP URI: ", + parseValue); + + User::LeaveIfError(parseValue); + //TBuf8<50> host = parser.Extract(EUriHost); + HBufC8* hostAddr = parser.Extract(EUriHost).AllocL(); + delete pathValue; + return hostAddr; + } + } + + // check if c line exists for the m-line correspands to this stream + attrName.Zero(); + attrName.Copy(_L8("c")); + HBufC8* hostAddr = NULL; + hostAddr = TMceSessionUtility::getRemoteMediaSDPAttrL(aStream, attrName); + if (hostAddr!=NULL) + return hostAddr; + else + { + TBuf<32> addr; + session->FlatData()->iRemoteIpAddress.Output(addr); + TBuf8<32> value; + value.Copy(addr); + return value.AllocL(); + } + } + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::GetLocalMediaPortL +// ----------------------------------------------------------------------------- +// +EXPORT_C void TMceSessionUtility::GetLocalMediaPortL(CMceMediaStream* aStream, TUint& aMediaPort ) + { + MCECLI_DEBUG("TMceSessionUtility::GetLocalMediaPortL: Entry "); + __ASSERT_ALWAYS(aStream!=NULL, User::Leave(KErrArgument)); + + if ( (aStream->Session()->State() >= CMceSession::ECancelling) || + (aStream->Session()->State() <= CMceSession::EIdle) ) + { + MCECLI_DEBUG("TMceSessionUtility::GetRemoteConnectionAddrL : Session state shouldn't be idle Or shouldn't be either in cancelling, terminating , terminated"); + User::Leave(KErrArgument); + } + + aMediaPort = aStream->FlatData()->LocalMediaPort(); + MCECLI_DEBUG_DVALUE("TMceSessionUtility::GetLocalMediaPortL : ", aMediaPort) + MCECLI_DEBUG("TMceSessionUtility::GetLocalMediaPortL: Exit "); + } + + + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::GetRemoteMediaPortL +// ----------------------------------------------------------------------------- +// +EXPORT_C void TMceSessionUtility::GetRemoteMediaPortL(CMceMediaStream* aStream, + TUint& aMediaPort ) + { + MCECLI_DEBUG("TMceSessionUtility::GetRemoteMediaPortL: Entry "); + __ASSERT_ALWAYS(aStream!=NULL, User::Leave(KErrArgument)); + CMceSession* session = aStream->Session(); + __ASSERT_ALWAYS(session, User::Leave(KErrArgument)); + if ( (session->State() >= CMceSession::ECancelling) || + (session->State() <= CMceSession::EIdle) ) + { + MCECLI_DEBUG("TMceSessionUtility::GetRemoteConnectionAddrL : Session state shouldn't be idle Or shouldn't be either in cancelling, terminating , terminated"); + User::Leave(KErrArgument); + } + if (aStream->Type() == KMceMessage) + { + TBuf8<10> aAttrName(_L8("path")); + + // Get the remote end's path attribute and extracts the port number from that + //ownership willbe transferred to us so have to free up later + HBufC8* pathValue = NULL; + pathValue = TMceSessionUtility::getRemoteMediaSDPAttrL(aStream, aAttrName); + + if (pathValue == NULL) + { + aMediaPort = aStream->FlatData()->RemoteMediaPort(); + return; + } + // + TUriParser8 parser; + TInt parseValue = parser.Parse(pathValue->Des()); + MCECLI_DEBUG_DVALUE("\n CMceMsrpSource::SetHostAddrPortFromPathAttr: Parsed return value for MSRP URI: ", + parseValue); + + TBuf8<10> portBuf = parser.Extract(EUriPort); + + TBuf16<10> portBuf16; + portBuf16.Copy(portBuf); + TLex iLex(portBuf16); + iLex.Val(aMediaPort); // returns the port value + delete pathValue; + return; + } + else + { + // Get send streams and use remotemediaport + if ( aStream->Source()->Type() == KMceRTPSource) + { + // find the send stream and get the remote media port + if (aStream->BoundStream() && + aStream->BoundStreamL().Source() != NULL && + aStream->BoundStreamL().Source()->Type() != KMceRTPSource) + { + aMediaPort = aStream->BoundStreamL().FlatData()->RemoteMediaPort(); + return; + } + // if the streams are not binded then find the send stream aong the session streams + for (TInt i=0; iStreams().Count(); i++) + { + if (session->Streams()[i]!=NULL && (session->Streams()[i]!=aStream) && + session->Streams()[i]->Type() == aStream->Type()) + { + if (session->Streams()[i]->Source()->Type()!=KMceRTPSource) + { + aMediaPort = session->Streams()[i]->FlatData()->RemoteMediaPort(); + return; + } + } // inside if + } // For loop + } // + } + aMediaPort = aStream->FlatData()->RemoteMediaPort(); + MCECLI_DEBUG_DVALUE("TMceSessionUtility::GetRemoteMediaPortL : ", aMediaPort) + MCECLI_DEBUG("TMceSessionUtility::GetRemoteMediaPortL: Exit "); + } + + + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::FindAttributeL +// ----------------------------------------------------------------------------- +// +HBufC8* TMceSessionUtility::FindAttributeL(CDesC8Array* asdpLines , const TDesC8& aAttrName) + { + // Put all those session level names in single DesC8 object and pass that to CSdpDocument + TBool attrFound = EFalse; + CSdpAttributeField* attr=NULL; + RStringF searchAttr = SdpCodecStringPool::StringPoolL().OpenFStringL(aAttrName); + HBufC8* retValue = NULL; + for (TInt i=0; i< asdpLines->MdcaCount()&& !attrFound; i++) + { + TBuf8<200> attrText(asdpLines->MdcaPoint(i)); + + // media attrivutes can also contain 'b' &'c' lines so skip them + _LIT8( KMceSdpConnectionLineMarker, "c=" ); + _LIT8( KMceSdpBandwidthLineMarker, "b=" ); + + // Look for media specific conneciton(c= ) line + if ( (attrText.Find(KMceSdpConnectionLineMarker) >= 0) ) + { + if (attrText.Find(aAttrName) >= 0) + { + // get the conneciton filed value + CSdpConnectionField* conn = NULL; + TRAPD(err, conn = CSdpConnectionField::DecodeL(attrText)); + if (err != KErrNone) + { + searchAttr.Close(); + _CLOSE_SDPCODEC_STRINGPOOL; + User::Leave(err); + } + __ASSERT_ALWAYS(conn!=NULL, User::Leave(KErrArgument)); + retValue = conn->Address().Alloc(); + attrFound = ETrue; + delete conn; // Free the memory for conn pointer + } + } + // Look for media specific bandwidth(b= ) line + else if ( (attrText.Find(KMceSdpBandwidthLineMarker) >= 0) ) + { + if ((attrText.Find(aAttrName) >= 0)) + { + // get the bandwidth filed and return the value + CSdpBandwidthField* bandWidth = NULL; + TRAPD(err, bandWidth = CSdpBandwidthField::DecodeL(attrText)); + if (err != KErrNone) + { + searchAttr.Close(); + _CLOSE_SDPCODEC_STRINGPOOL; + User::Leave(err); + } + __ASSERT_ALWAYS(bandWidth!=NULL, User::Leave(KErrArgument)); + TBuf8<20> value; + value.Num(bandWidth->Value()); + retValue = value.Alloc(); + attrFound = ETrue; + delete bandWidth; + } + } + else + // Look for media specific attribute(a= ) lines + { + // Have to free up later point of time + TRAPD(err, attr = CSdpAttributeField::DecodeL(attrText)); + if (err != KErrNone) + { + searchAttr.Close(); + _CLOSE_SDPCODEC_STRINGPOOL; + User::Leave(err); + } + if (attr == NULL) + { + MCECLI_DEBUG("TMceSessionUtility::FindAttributeL: Error in decoding the media attribute : "); + searchAttr.Close(); + _CLOSE_SDPCODEC_STRINGPOOL; + User::Leave(KErrArgument); + } + if (attr->Attribute() == searchAttr && !attrFound) + { + retValue = attr->Value().Alloc(); + attrFound = ETrue; + } + delete attr; + } + } + if (attrFound == EFalse) + { + retValue = NULL; + } + searchAttr.Close(); + return retValue; + } + + +// ----------------------------------------------------------------------------- +// TMceSessionUtility::ConstructSdpDocumentL +// ----------------------------------------------------------------------------- +// +void TMceSessionUtility::ConstructSdpDocumentL(CDesC8Array* asdpLines, CSdpDocument*& asdpDoc) + { + if (asdpDoc) + { + delete asdpDoc; + asdpDoc = NULL; + } + TBuf8<1000> text; + for(TInt i=0; iMdcaCount(); i++) + { + TBuf8<200> temp(asdpLines->MdcaPoint(i)); + text.Append( temp ); + } + TInt leaveValue = KErrNone; + // Ownership for sdpDoc is tranferred to us.. + TRAP(leaveValue, asdpDoc = CSdpDocument::DecodeL(text)); + + if (leaveValue != KErrNone) + { + MCECLI_DEBUG_DVALUE("TMceSessionUtility::ConstructSdpDocument: Error in decoding the SdpDocument text : %d", leaveValue); + SdpCodecStringPool::Close(); + User::Leave(leaveValue); + } + }