mmshplugins/mmshsipcrplugin/src/mussipcrplugin.cpp
branchRCL_3
changeset 33 bc78a40cd63c
parent 32 73a1feb507fb
equal deleted inserted replaced
32:73a1feb507fb 33:bc78a40cd63c
    22 #include "muscommon.h"
    22 #include "muscommon.h"
    23 #include "muslogger.h"
    23 #include "muslogger.h"
    24 #include "musmanager.h"
    24 #include "musmanager.h"
    25 #include "musuid.hrh"
    25 #include "musuid.hrh"
    26 #include "musunittesting.h"
    26 #include "musunittesting.h"
    27 #include "mussettings.h"
       
    28 
    27 
    29 #include <mussettingskeys.h>
       
    30 #include <sipstrings.h>
    28 #include <sipstrings.h>
    31 #include <sipstrconsts.h>
    29 #include <sipstrconsts.h>
    32 #include <sdpdocument.h>
    30 #include <featmgr.h>
    33 #include <sdpmediafield.h>
       
    34 #include <sdpcodecstringpool.h>
       
    35 #include <sdpcodecstringconstants.h>
       
    36 #include <sdpattributefield.h>
       
    37 
       
    38 _LIT8( KSendRecv, "sendrecv");                  // For attribute checks
       
    39 _LIT8( KRecvOnly, "recvonly");                  // For attribute checks
       
    40 _LIT8( KSendOnly, "sendonly" );                 // For attribute checks
       
    41 
    31 
    42 _LIT8(KCapabilities,
    32 _LIT8(KCapabilities,
    43 "<SIP_CLIENT ALLOW_STARTING=\"YES\">\
    33 "<SIP_CLIENT ALLOW_STARTING=\"YES\">\
    44 <SIP_HEADERS>\
    34 <SIP_HEADERS>\
    45 <ACCEPT value=\"application/sdp\"/>\
    35 <ACCEPT value=\"application/sdp\"/>\
    52 </LINE>\
    42 </LINE>\
    53 <LINE name=\"m\" value=\"audio 0 RTP/AVP 97\">\
    43 <LINE name=\"m\" value=\"audio 0 RTP/AVP 97\">\
    54 </LINE>\
    44 </LINE>\
    55 </SDP_LINES>\
    45 </SDP_LINES>\
    56 </SIP_CLIENT>");
    46 </SIP_CLIENT>");
    57 
       
    58 
    47 
    59 // -------------------------------------------------------------------------
    48 // -------------------------------------------------------------------------
    60 // Two-phased constructor.
    49 // Two-phased constructor.
    61 // -------------------------------------------------------------------------
    50 // -------------------------------------------------------------------------
    62 //
    51 //
    78 //
    67 //
    79 CMusSipCrPlugin::~CMusSipCrPlugin()
    68 CMusSipCrPlugin::~CMusSipCrPlugin()
    80     {
    69     {
    81     MUS_LOG( "mus: [MUSSCR]  -> CMusSipCrPlugin::~CMusSipCrPlugin()" );
    70     MUS_LOG( "mus: [MUSSCR]  -> CMusSipCrPlugin::~CMusSipCrPlugin()" );
    82     delete iManager;
    71     delete iManager;
    83     if ( iCloseStringPool )
       
    84         {
       
    85         SdpCodecStringPool::Close();
       
    86         }
       
    87     MUS_LOG( "mus: [MUSSCR]  <- CMusSipCrPlugin::~CMusSipCrPlugin()" );
    72     MUS_LOG( "mus: [MUSSCR]  <- CMusSipCrPlugin::~CMusSipCrPlugin()" );
    88     }
    73     }
    89 
    74 
    90 
    75 
    91 // -------------------------------------------------------------------------
    76 // -------------------------------------------------------------------------
   103 //
    88 //
   104 void CMusSipCrPlugin::ConstructL()
    89 void CMusSipCrPlugin::ConstructL()
   105     {
    90     {
   106     MUS_LOG( "mus: [MUSSCR]  -> CMusSipCrPlugin::ConstructL()" );
    91     MUS_LOG( "mus: [MUSSCR]  -> CMusSipCrPlugin::ConstructL()" );
   107     iManager = CMusManager::NewL();
    92     iManager = CMusManager::NewL();
   108     
       
   109     TRAPD( err, SdpCodecStringPool::OpenL() );
       
   110     
       
   111     switch ( err )
       
   112         {
       
   113         case KErrNone:
       
   114             {
       
   115             //close pool at destructor, not opened by others
       
   116             iCloseStringPool = ETrue;
       
   117             break;
       
   118             }
       
   119         
       
   120         case KErrAlreadyExists:
       
   121             {
       
   122             //already opened, do not try to close at destructor
       
   123             iCloseStringPool = EFalse;
       
   124             break;
       
   125             }
       
   126         
       
   127         default:
       
   128             {
       
   129             User::Leave( err );
       
   130             }
       
   131         }
       
   132     
       
   133     MUS_LOG( "mus: [MUSSCR]  <- CMusSipCrPlugin::ConstructL()" );
    93     MUS_LOG( "mus: [MUSSCR]  <- CMusSipCrPlugin::ConstructL()" );
   134     }
    94     }
   135 
    95 
   136 
    96 
   137 // -------------------------------------------------------------------------
    97 // -------------------------------------------------------------------------
   139 // -------------------------------------------------------------------------
    99 // -------------------------------------------------------------------------
   140 //
   100 //
   141 TUid CMusSipCrPlugin::ChannelL( RStringF aMethod,
   101 TUid CMusSipCrPlugin::ChannelL( RStringF aMethod,
   142     const TDesC8& /*aRequestUri*/,
   102     const TDesC8& /*aRequestUri*/,
   143     const RPointerArray<CSIPHeaderBase>& /*aHeaders*/,
   103     const RPointerArray<CSIPHeaderBase>& /*aHeaders*/,
   144     const TDesC8& aContent,
   104     const TDesC8& /*aContent*/,
   145     const CSIPContentTypeHeader* /*aContentType*/ )
   105     const CSIPContentTypeHeader* /*aContentType*/)
   146     {
   106     {
   147     MUS_LOG( "mus: [MUSSCR]  -> CMusSipCrPlugin::ChannelL()" );
   107 	FeatureManager::InitializeLibL();
   148     
   108     TBool support = FeatureManager::FeatureSupported( KFeatureIdMultimediaSharing );
       
   109 	FeatureManager::UnInitializeLib();
       
   110 	TUid uid;
       
   111 	uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired;
       
   112 	if ( support )
       
   113 		{
       
   114 	    uid = DoChannelL( aMethod );  
       
   115 		}
       
   116     return uid;	
       
   117     }
       
   118 	
       
   119 	
       
   120 // -------------------------------------------------------------------------
       
   121 // CMusSipCrPlugin::DoChannelL
       
   122 // -------------------------------------------------------------------------
       
   123 TUid CMusSipCrPlugin::DoChannelL( RStringF aMethod )
       
   124     {
       
   125     MUS_LOG( "mus: [MUSSCR]  -> CMusSipCrPlugin::DoChannelL()" );
       
   126 
   149     if ( aMethod == SIPStrings::StringF( SipStrConsts::EOptions ) )
   127     if ( aMethod == SIPStrings::StringF( SipStrConsts::EOptions ) )
   150         {
   128         {
   151         TUid uid;
   129         TUid uid;
   152         uid.iUid = ( TInt ) CMusManager::ESipOptions;
   130         uid.iUid = ( TInt ) CMusManager::ESipOptions;
   153         MUS_LOG1( "mus: [MUSSCR]     <- CMusSipCrPlugin::ChannelL(): KSipOptions %d",
   131         MUS_LOG1( "mus: [MUSSCR]     <- CMusSipCrPlugin::DoChannelL(): KSipOptions %d",
   154                   uid.iUid );
   132                   uid.iUid );
   155         return uid;
   133         return uid;
   156         }
   134         }
   157     else
   135     else
   158         {
   136         {
   162         if( capability < KErrNone || 
   140         if( capability < KErrNone || 
   163             capability >= MultimediaSharing::EErrServerShutDown )
   141             capability >= MultimediaSharing::EErrServerShutDown )
   164             {
   142             {
   165             TUid uid;
   143             TUid uid;
   166             uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired;
   144             uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired;
   167             MUS_LOG1( "mus: [MUSSCR]     <- CMusSipCrPlugin::ChannelL(): \
   145             MUS_LOG1( "mus: [MUSSCR]     <- CMusSipCrPlugin::DoChannelL(): \
   168                       KNotAllowedSipInvite %d", uid.iUid );
   146                       KNotAllowedSipInvite %d", uid.iUid );
   169             return uid;
   147             return uid;
   170             }
   148             }
   171         else
   149         else
   172             {
   150             {
   173             TUid uid;
   151             TUid uid;
   174             uid.iUid = ( TInt ) CMusManager::ESipInviteDesired;
   152             uid.iUid = ( TInt ) CMusManager::ESipInviteDesired;
   175             TBool twoWaySupported = MultimediaSharingSettings::VideoDirectionL() == 
   153             MUS_LOG1( "mus: [MUSSCR]     <- CMusSipCrPlugin::DoChannelL(): \
   176                                     MusSettingsKeys::ETwoWayVideo;
       
   177             
       
   178             if ( ( aContent.Length() > 0 ) && twoWaySupported )
       
   179                 {
       
   180                 MUS_LOG( "mus: [MUSSCR]  2 way supported, parsing SDP..." );
       
   181                 CSdpDocument* sdpDocument = CSdpDocument::DecodeLC( aContent );
       
   182                 TBool sendRecv = CheckForSendRecvAttributeL( sdpDocument->MediaFields() );
       
   183                 if ( sendRecv )
       
   184                     {
       
   185                     uid.iUid = ( TInt ) CMusManager::ESipInviteDesired2WayVideo;
       
   186                     }
       
   187                     
       
   188                 CleanupStack::PopAndDestroy( sdpDocument );
       
   189                 }
       
   190 
       
   191             MUS_LOG1( "mus: [MUSSCR]     <- CMusSipCrPlugin::ChannelL(): \
       
   192                       KAllowedSipInvite %d", uid.iUid );
   154                       KAllowedSipInvite %d", uid.iUid );
   193             return uid;
   155             return uid;
   194             }
   156             }
   195         }
   157         }
   196     }
   158     }
   197 
   159 
   198 // -------------------------------------------------------------------------
   160 
   199 // CMusSipCrPlugin::CheckForSendRecvAttribute
       
   200 // -------------------------------------------------------------------------
       
   201 //
       
   202 TBool CMusSipCrPlugin::CheckForSendRecvAttributeL(
       
   203     RPointerArray<CSdpMediaField>& aFields ) const
       
   204     {
       
   205     MUS_LOG( "mus: [MUSSCR]  -> CMusSipCrPlugin::CheckForSendRecvAttribute()" );
       
   206     
       
   207     TBool sendRecv = EFalse;
       
   208     TBool sendAttrFound = EFalse;
       
   209     TBool videoFound = EFalse;
       
   210     RStringF videoType = SdpCodecStringPool::StringPoolL().StringF(
       
   211                     SdpCodecStringConstants::EMediaVideo,
       
   212                     SdpCodecStringPool::StringTableL() );
       
   213     const TInt fieldcount = aFields.Count();
       
   214     
       
   215     for ( TInt i = 0; i < fieldcount && !videoFound; i++ )
       
   216         {
       
   217         CSdpMediaField* mField = aFields[i];
       
   218         
       
   219         //only check video fields
       
   220         videoFound = mField->Media() == videoType;
       
   221         
       
   222         if ( videoFound )
       
   223             {
       
   224             RPointerArray< CSdpAttributeField > attrList =
       
   225                 mField->AttributeFields();
       
   226             
       
   227             TInt attrCount = attrList.Count();
       
   228             for (TInt j = 0; j < attrCount && !sendAttrFound; j++ )
       
   229                 {
       
   230                 CSdpAttributeField* attributeField = attrList[j];
       
   231                 RStringF attribute = attributeField->Attribute();                
       
   232                 
       
   233                 if ( KErrNotFound != attribute.DesC().FindF( KSendRecv ) )
       
   234                     {
       
   235                     sendRecv = ETrue;
       
   236                     sendAttrFound = ETrue;
       
   237                     MUS_LOG( "mus: [MUSSCR]  <sendrecv> attribute found!" );
       
   238                     }
       
   239                 else if ( ( KErrNotFound != attribute.DesC().FindF( KSendOnly ) ) ||
       
   240                           ( KErrNotFound != attribute.DesC().FindF( KRecvOnly ) ) )
       
   241                     {
       
   242                     MUS_LOG( "mus: [MUSSCR]  <sendonly>/<recvonly> attribute found!" );
       
   243                     sendAttrFound = ETrue;
       
   244                     }
       
   245                 }
       
   246             
       
   247             if ( !sendAttrFound )
       
   248                 {
       
   249                 MUS_LOG( "mus: [MUSSCR]  no send/recv related attributes found!" );
       
   250                 sendRecv = ETrue;
       
   251                 }
       
   252             }
       
   253         }
       
   254     MUS_LOG1( "mus: [MUSSCR]  <- CMusSipCrPlugin::CheckForSendRecvAttribute(), \
       
   255             sendrecv: %d", sendRecv );
       
   256    
       
   257     return sendRecv;
       
   258     }
       
   259 
   161 
   260 // -------------------------------------------------------------------------
   162 // -------------------------------------------------------------------------
   261 // CMusSipCrPlugin::ConnectL
   163 // CMusSipCrPlugin::ConnectL
   262 // -------------------------------------------------------------------------
   164 // -------------------------------------------------------------------------
   263 //
   165 //
   264 void CMusSipCrPlugin::ConnectL( TUid aUid )
   166 void CMusSipCrPlugin::ConnectL( TUid aUid )
   265     {
   167     {
   266     MUS_LOG1( "mus: [MUSSCR]     -> CMusSipCrPlugin::ConnectL( %d )", aUid.iUid );
   168     MUS_LOG1( "mus: [MUSSCR]     -> CMusSipCrPlugin::ConnectL( %d )", aUid.iUid );
   267     if ( aUid.iUid == CMusManager::ESipOptions ||
   169     if ( aUid.iUid == CMusManager::ESipOptions ||
   268          aUid.iUid == CMusManager::ESipInviteDesired ||
   170          aUid.iUid == CMusManager::ESipInviteDesired ||
   269          aUid.iUid == CMusManager::ESipInviteDesired2WayVideo ||
       
   270          aUid.iUid == CMusManager::ESipInviteNotDesired )
   171          aUid.iUid == CMusManager::ESipInviteNotDesired )
   271         {
   172         {
   272         iManager->HandleSipRequestL(( CMusManager::TRequestType ) aUid.iUid );
   173         iManager->HandleSipRequestL(( CMusManager::TRequestType ) aUid.iUid );
   273         }
   174         }
   274     else
   175     else