realtimenetprots/sipfw/ClientResolver/Resolver/src/CSdpMediaAttributeStrategy.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name          : CSdpMediaAttributeStrategy.cpp
       
    15 // Part of       : SIP Client Resolver
       
    16 // Version       : 1.0
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "CSdpMediaAttributeStrategy.h"
       
    22 #include "MSipClients.h"
       
    23 #include "MSipClient.h"
       
    24 #include "sdpdocument.h"
       
    25 #include "sdpmediafield.h"
       
    26 #include "sdpattributefield.h"
       
    27 #include "sdpcodecstringconstants.h"
       
    28 #include "sdpcodecstringpool.h"
       
    29 
       
    30 // ----------------------------------------------------------------------------
       
    31 // CSdpMediaAttributeStrategy::NewLC
       
    32 // ----------------------------------------------------------------------------
       
    33 //
       
    34 CSdpMediaAttributeStrategy* CSdpMediaAttributeStrategy::NewLC(
       
    35     const MSipClients& aSipClients)
       
    36 	{
       
    37 	CSdpMediaAttributeStrategy* self = 
       
    38 		new(ELeave)CSdpMediaAttributeStrategy(aSipClients);
       
    39 	CleanupStack::PushL(self);
       
    40 	self->ConstructL();
       
    41 	return self;
       
    42 	}
       
    43 
       
    44 // ----------------------------------------------------------------------------
       
    45 // CSdpMediaAttributeStrategy::CSdpMediaAttributeStrategy
       
    46 // ----------------------------------------------------------------------------
       
    47 //
       
    48 CSdpMediaAttributeStrategy::CSdpMediaAttributeStrategy(
       
    49     const MSipClients& aSipClients) 
       
    50  : CSdpStrategyBase(aSipClients)
       
    51 	{
       
    52 	}
       
    53 
       
    54 // ----------------------------------------------------------------------------
       
    55 // CSdpMediaAttributeStrategy::ConstructL
       
    56 // ----------------------------------------------------------------------------
       
    57 //
       
    58 void CSdpMediaAttributeStrategy::ConstructL()
       
    59 	{
       
    60 	CSdpStrategyBase::ConstructL();
       
    61 	}
       
    62 
       
    63 // ----------------------------------------------------------------------------
       
    64 // CSdpMediaAttributeStrategy::~CSdpMediaAttributeStrategy
       
    65 // ----------------------------------------------------------------------------
       
    66 //
       
    67 CSdpMediaAttributeStrategy::~CSdpMediaAttributeStrategy ()
       
    68 	{
       
    69 	}
       
    70 
       
    71 // ----------------------------------------------------------------------------
       
    72 // CSdpMediaAttributeStrategy::ApplyL
       
    73 // ----------------------------------------------------------------------------
       
    74 //	
       
    75 CSIPResponse* CSdpMediaAttributeStrategy::ApplyL(
       
    76     CSdpDocument& aDocument, 
       
    77     RArray<TUid>& aUids)
       
    78     {	
       
    79 	RArray<TUid> uids;
       
    80 	CleanupClosePushL(uids);
       
    81 	
       
    82     for (TInt i=0; i<aUids.Count(); i++)
       
    83         {
       
    84         uids.AppendL(aUids[i]);
       
    85         }
       
    86 	
       
    87 	for (TInt i=uids.Count()-1; i>=0; i--)
       
    88 		{
       
    89 		MSipClient* client = iSipClients.GetByUID(uids[i]);
       
    90 		if (client)
       
    91 			{
       
    92         	if (!Match(aDocument,*client))
       
    93         	    {
       
    94 			    uids.Remove(i);
       
    95         	    }           
       
    96 			}		
       
    97 		}
       
    98     
       
    99 	if (uids.Count() > 0)
       
   100 	    {
       
   101 	    aUids.Reset();
       
   102         for (TInt i=0; i<uids.Count(); i++)
       
   103             {
       
   104             aUids.AppendL(uids[i]);
       
   105             }	    
       
   106 	    }
       
   107 
       
   108     CleanupStack::PopAndDestroy(&uids);
       
   109     return NULL;   
       
   110     }
       
   111  
       
   112 // ----------------------------------------------------------------------------
       
   113 // CSdpMediaAttributeStrategy::Match
       
   114 // ----------------------------------------------------------------------------
       
   115 //
       
   116 TBool CSdpMediaAttributeStrategy::Match(
       
   117     CSdpDocument& aDocument,
       
   118     MSipClient& aClient)
       
   119     {    
       
   120 	RPointerArray<CSdpMediaField>& clientMedias = 
       
   121 	    aClient.SdpDocument().MediaFields();
       
   122 	
       
   123 	RPointerArray<CSdpMediaField>& receivedMedias = 
       
   124 	    aDocument.MediaFields();	
       
   125 	  
       
   126 	for (TInt i=0; i < receivedMedias.Count(); i++)
       
   127 	    {
       
   128 	    CSdpMediaField* receivedMedia = receivedMedias[i];
       
   129 	    for (TInt j=0; j < clientMedias.Count(); j++)
       
   130             {
       
   131             CSdpMediaField* clientMedia = clientMedias[j];
       
   132             if (HasMatchingAttribute(*receivedMedia,*clientMedia))
       
   133                 {
       
   134                 return ETrue;
       
   135                 }
       
   136 	        }
       
   137 	    }
       
   138 
       
   139 	return EFalse;
       
   140 	}
       
   141     
       
   142 // ----------------------------------------------------------------------------
       
   143 // CSdpMediaAttributeStrategy::HasMatchingAttribute
       
   144 // ----------------------------------------------------------------------------
       
   145 //    
       
   146 TBool CSdpMediaAttributeStrategy::HasMatchingAttribute(
       
   147     CSdpMediaField& aReceivedMedia,
       
   148     CSdpMediaField& aClientMedia)
       
   149     {
       
   150     if (aReceivedMedia.Media() != aClientMedia.Media())
       
   151         {
       
   152         return EFalse;
       
   153         }
       
   154     
       
   155     const RPointerArray<CSdpAttributeField>& clientAttributes = 
       
   156 	    aClientMedia.AttributeFields();	
       
   157 	
       
   158     const RPointerArray<CSdpAttributeField>& receivedAttributes = 
       
   159 	    aReceivedMedia.AttributeFields();	
       
   160 	  
       
   161 	for (TInt i=0; i < clientAttributes.Count(); i++)
       
   162 	    {
       
   163     	for (TInt j=0; j < receivedAttributes.Count(); j++)
       
   164     	    {
       
   165     	    if (*clientAttributes[i] == *receivedAttributes[j])
       
   166     	        {
       
   167     	        return ETrue;
       
   168     	        }
       
   169     	    }
       
   170 	    }    
       
   171     
       
   172     return EFalse;
       
   173     }