diff -r 33a5d2bbf6fc -r 73a1feb507fb mmshplugins/mmshsipcrplugin/src/mussipcrplugin.cpp --- a/mmshplugins/mmshsipcrplugin/src/mussipcrplugin.cpp Thu Aug 19 09:51:39 2010 +0300 +++ b/mmshplugins/mmshsipcrplugin/src/mussipcrplugin.cpp Tue Aug 31 15:12:07 2010 +0300 @@ -24,10 +24,20 @@ #include "musmanager.h" #include "musuid.hrh" #include "musunittesting.h" +#include "mussettings.h" +#include #include #include -#include +#include +#include +#include +#include +#include + +_LIT8( KSendRecv, "sendrecv"); // For attribute checks +_LIT8( KRecvOnly, "recvonly"); // For attribute checks +_LIT8( KSendOnly, "sendonly" ); // For attribute checks _LIT8(KCapabilities, "\ @@ -45,6 +55,7 @@ \ "); + // ------------------------------------------------------------------------- // Two-phased constructor. // ------------------------------------------------------------------------- @@ -69,6 +80,10 @@ { MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::~CMusSipCrPlugin()" ); delete iManager; + if ( iCloseStringPool ) + { + SdpCodecStringPool::Close(); + } MUS_LOG( "mus: [MUSSCR] <- CMusSipCrPlugin::~CMusSipCrPlugin()" ); } @@ -90,6 +105,31 @@ { MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::ConstructL()" ); iManager = CMusManager::NewL(); + + TRAPD( err, SdpCodecStringPool::OpenL() ); + + switch ( err ) + { + case KErrNone: + { + //close pool at destructor, not opened by others + iCloseStringPool = ETrue; + break; + } + + case KErrAlreadyExists: + { + //already opened, do not try to close at destructor + iCloseStringPool = EFalse; + break; + } + + default: + { + User::Leave( err ); + } + } + MUS_LOG( "mus: [MUSSCR] <- CMusSipCrPlugin::ConstructL()" ); } @@ -101,34 +141,16 @@ TUid CMusSipCrPlugin::ChannelL( RStringF aMethod, const TDesC8& /*aRequestUri*/, const RPointerArray& /*aHeaders*/, - const TDesC8& /*aContent*/, - const CSIPContentTypeHeader* /*aContentType*/) + const TDesC8& aContent, + const CSIPContentTypeHeader* /*aContentType*/ ) { - FeatureManager::InitializeLibL(); - TBool support = FeatureManager::FeatureSupported( KFeatureIdMultimediaSharing ); - FeatureManager::UnInitializeLib(); - TUid uid; - uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired; - if ( support ) - { - uid = DoChannelL( aMethod ); - } - return uid; - } - - -// ------------------------------------------------------------------------- -// CMusSipCrPlugin::DoChannelL -// ------------------------------------------------------------------------- -TUid CMusSipCrPlugin::DoChannelL( RStringF aMethod ) - { - MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::DoChannelL()" ); - + MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::ChannelL()" ); + if ( aMethod == SIPStrings::StringF( SipStrConsts::EOptions ) ) { TUid uid; uid.iUid = ( TInt ) CMusManager::ESipOptions; - MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::DoChannelL(): KSipOptions %d", + MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::ChannelL(): KSipOptions %d", uid.iUid ); return uid; } @@ -142,7 +164,7 @@ { TUid uid; uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired; - MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::DoChannelL(): \ + MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::ChannelL(): \ KNotAllowedSipInvite %d", uid.iUid ); return uid; } @@ -150,14 +172,90 @@ { TUid uid; uid.iUid = ( TInt ) CMusManager::ESipInviteDesired; - MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::DoChannelL(): \ + TBool twoWaySupported = MultimediaSharingSettings::VideoDirectionL() == + MusSettingsKeys::ETwoWayVideo; + + if ( ( aContent.Length() > 0 ) && twoWaySupported ) + { + MUS_LOG( "mus: [MUSSCR] 2 way supported, parsing SDP..." ); + CSdpDocument* sdpDocument = CSdpDocument::DecodeLC( aContent ); + TBool sendRecv = CheckForSendRecvAttributeL( sdpDocument->MediaFields() ); + if ( sendRecv ) + { + uid.iUid = ( TInt ) CMusManager::ESipInviteDesired2WayVideo; + } + + CleanupStack::PopAndDestroy( sdpDocument ); + } + + MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::ChannelL(): \ KAllowedSipInvite %d", uid.iUid ); return uid; } } } - +// ------------------------------------------------------------------------- +// CMusSipCrPlugin::CheckForSendRecvAttribute +// ------------------------------------------------------------------------- +// +TBool CMusSipCrPlugin::CheckForSendRecvAttributeL( + RPointerArray& aFields ) const + { + MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::CheckForSendRecvAttribute()" ); + + TBool sendRecv = EFalse; + TBool sendAttrFound = EFalse; + TBool videoFound = EFalse; + RStringF videoType = SdpCodecStringPool::StringPoolL().StringF( + SdpCodecStringConstants::EMediaVideo, + SdpCodecStringPool::StringTableL() ); + const TInt fieldcount = aFields.Count(); + + for ( TInt i = 0; i < fieldcount && !videoFound; i++ ) + { + CSdpMediaField* mField = aFields[i]; + + //only check video fields + videoFound = mField->Media() == videoType; + + if ( videoFound ) + { + RPointerArray< CSdpAttributeField > attrList = + mField->AttributeFields(); + + TInt attrCount = attrList.Count(); + for (TInt j = 0; j < attrCount && !sendAttrFound; j++ ) + { + CSdpAttributeField* attributeField = attrList[j]; + RStringF attribute = attributeField->Attribute(); + + if ( KErrNotFound != attribute.DesC().FindF( KSendRecv ) ) + { + sendRecv = ETrue; + sendAttrFound = ETrue; + MUS_LOG( "mus: [MUSSCR] attribute found!" ); + } + else if ( ( KErrNotFound != attribute.DesC().FindF( KSendOnly ) ) || + ( KErrNotFound != attribute.DesC().FindF( KRecvOnly ) ) ) + { + MUS_LOG( "mus: [MUSSCR] / attribute found!" ); + sendAttrFound = ETrue; + } + } + + if ( !sendAttrFound ) + { + MUS_LOG( "mus: [MUSSCR] no send/recv related attributes found!" ); + sendRecv = ETrue; + } + } + } + MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::CheckForSendRecvAttribute(), \ + sendrecv: %d", sendRecv ); + + return sendRecv; + } // ------------------------------------------------------------------------- // CMusSipCrPlugin::ConnectL @@ -168,6 +266,7 @@ MUS_LOG1( "mus: [MUSSCR] -> CMusSipCrPlugin::ConnectL( %d )", aUid.iUid ); if ( aUid.iUid == CMusManager::ESipOptions || aUid.iUid == CMusManager::ESipInviteDesired || + aUid.iUid == CMusManager::ESipInviteDesired2WayVideo || aUid.iUid == CMusManager::ESipInviteNotDesired ) { iManager->HandleSipRequestL(( CMusManager::TRequestType ) aUid.iUid );