multimediacommsengine/mmcesrv/mmceevent/src/mcesipeventhelper.cpp
changeset 0 1bce908db942
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    Makes the contents of SIP messages using SIP API
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 // INCLUDE FILES
       
    22 #include <sipeventheader.h>
       
    23 #include <siprefresh.h>
       
    24 #include <sipsubscribedialogassoc.h>
       
    25 #include <sipexpiresheader.h>
       
    26 #include <sipacceptheader.h>
       
    27 #include <sipstrings.h>
       
    28 #include <sipstrconsts.h>
       
    29 #include <sipsubscriptionstateheader.h>
       
    30 #include <sipmessageelements.h>
       
    31 #include <sipcontenttypeheader.h>
       
    32 #include <sipextensionheader.h>
       
    33 #include <sipresponseelements.h>
       
    34 #include <sipsupportedheader.h>
       
    35 #include <siprequireheader.h>
       
    36 #include <sipeventheader.h>
       
    37 #include "mcesipeventhelper.h"
       
    38 #include "mcesipevent.h"
       
    39 #include "mcecomevent.h"
       
    40 #include "mcecomeventconstants.h"
       
    41 #include "mcesipconnection.h"
       
    42 #include "mcesip.h"
       
    43 
       
    44 // -----------------------------------------------------------------------------
       
    45 // MCESIPEventHelper::CreateMessageElementsLC
       
    46 // -----------------------------------------------------------------------------
       
    47 //    
       
    48 CSIPMessageElements* 
       
    49     MCESIPEventHelper::CreateMessageElementsLC( CMceComEvent& aEvent,
       
    50                                                 TInt aRequestType,
       
    51 											    CMceRefer::TType aReferType )
       
    52     { 
       
    53     CSIPMessageElements* message = CSIPMessageElements::NewLC();
       
    54     
       
    55 	//Headers from client
       
    56 	RPointerArray< CSIPHeaderBase > sipHdrs;
       
    57 	CSIPHeaderBase::PushLC( &sipHdrs );
       
    58 	
       
    59     MceSip::ToSIPExtensionHeadersL( sipHdrs, aEvent.MsgHeaders( aRequestType ) );
       
    60 	
       
    61 	// Add extension specific headers:
       
    62 	switch( aReferType )
       
    63 	    {
       
    64 	    case CMceRefer::ESuppressed:
       
    65 	        {
       
    66 	        // Refer-Sub: false
       
    67 	        CSIPExtensionHeader* exHdr = 
       
    68 	            CSIPExtensionHeader::NewLC( KMceSipHeaderReferSub, KMceSipValueFalse );
       
    69 	        sipHdrs.AppendL( exHdr );
       
    70 	        CleanupStack::Pop( exHdr );
       
    71 	        
       
    72 	        // Supported: norefersub
       
    73 	        RStringF val = SIPStrings::Pool().OpenFStringL( KMceSipValueNoReferSub );
       
    74 	        CleanupClosePushL( val );
       
    75 	        CSIPSupportedHeader*  hdr = CSIPSupportedHeader::NewLC( val );
       
    76 	        sipHdrs.AppendL( hdr );
       
    77 	        CleanupStack::Pop( hdr );
       
    78 	        CleanupStack::PopAndDestroy(); // val
       
    79 	        break;
       
    80 	        }
       
    81 	        
       
    82 	    case CMceRefer::EMultipleRefer:
       
    83 	        {
       
    84 	        // Require: multiple-refer, norefersub
       
    85 	        // Create two headers, one with each parameter.
       
    86 	        // SIP stack knows how to encode the header.
       
    87 	        RStringF valMult = 
       
    88 	            SIPStrings::Pool().OpenFStringL( KMceSipValueMultipleRefer );
       
    89 	        CleanupClosePushL( valMult );
       
    90 	        CSIPRequireHeader* hdrMult = CSIPRequireHeader::NewLC( valMult );
       
    91 	        sipHdrs.AppendL( hdrMult );
       
    92 	        CleanupStack::Pop( hdrMult );
       
    93 	        CleanupStack::PopAndDestroy(); // valMult  
       
    94 	        
       
    95 	        RStringF valNoSub = 
       
    96 	            SIPStrings::Pool().OpenFStringL( KMceSipValueNoReferSub );
       
    97 	        CleanupClosePushL( valNoSub );
       
    98 	        CSIPRequireHeader* hdrNoSub = CSIPRequireHeader::NewLC( valNoSub );
       
    99 	        sipHdrs.AppendL( hdrNoSub );
       
   100 	        CleanupStack::Pop( hdrNoSub );
       
   101 	        CleanupStack::PopAndDestroy(); // valNoSub
       
   102 	        
       
   103 	        break;
       
   104 	        }
       
   105 	        
       
   106 	    default:
       
   107 	        {
       
   108 	        // add nothing
       
   109 	        break;
       
   110 	        }
       
   111 	    }
       
   112 	    
       
   113 	message->SetUserHeadersL( sipHdrs );
       
   114     CleanupStack::Pop( &sipHdrs );
       
   115     
       
   116     SetContentL( *message, aEvent );
       
   117     return message;
       
   118     }
       
   119 
       
   120 
       
   121 // -----------------------------------------------------------------------------
       
   122 // MCESIPEventHelper::CreateMessageElementsLC
       
   123 // -----------------------------------------------------------------------------
       
   124 //    
       
   125 CSIPMessageElements* 
       
   126     MCESIPEventHelper::CreateMessageElementsLC( CMceComEvent& aEvent,
       
   127                                                 TInt aRequestType,
       
   128 											    TUint aExpiresValue   )
       
   129     {
       
   130     
       
   131     CSIPMessageElements* message = CSIPMessageElements::NewLC();
       
   132 	
       
   133 	//Headers from client
       
   134 	RPointerArray< CSIPHeaderBase > sipHdrs;
       
   135 	CSIPHeaderBase::PushLC( &sipHdrs );
       
   136     
       
   137 	MceSip::ToSIPExtensionHeadersL( sipHdrs, aEvent.MsgHeaders( aRequestType ) );
       
   138 	 
       
   139     // Expires
       
   140 	CSIPExpiresHeader* expires = 
       
   141 	    new ( ELeave ) CSIPExpiresHeader( aExpiresValue );
       
   142 	CleanupStack::PushL( expires );
       
   143 	sipHdrs.AppendL( expires );
       
   144 	CleanupStack::Pop( expires );
       
   145 	message->SetUserHeadersL( sipHdrs );
       
   146 	CleanupStack::Pop( &sipHdrs );
       
   147 	
       
   148 	SetContentL( *message, aEvent );
       
   149     return message;
       
   150     }
       
   151 
       
   152 // -----------------------------------------------------------------------------
       
   153 // MCESIPEventHelper::CreateMessageElementsLC
       
   154 // -----------------------------------------------------------------------------
       
   155 //    
       
   156 CSIPMessageElements* 
       
   157 MCESIPEventHelper::CreateMessageElementsLC( CMceComEvent& aEvent, 
       
   158                                             TInt aRequestType )
       
   159     {    
       
   160     CSIPMessageElements* message = CSIPMessageElements::NewLC();
       
   161 	
       
   162 	//Headers from client
       
   163 	RPointerArray< CSIPHeaderBase > sipHdrs;
       
   164 	CSIPHeaderBase::PushLC( &sipHdrs );
       
   165     
       
   166     MceSip::ToSIPExtensionHeadersL( sipHdrs, aEvent.MsgHeaders( aRequestType ) );
       
   167 	message->SetUserHeadersL( sipHdrs );
       
   168 	CleanupStack::Pop( &sipHdrs );
       
   169 	
       
   170 	SetContentL( *message, aEvent );
       
   171 	
       
   172 	return message;
       
   173     }
       
   174 
       
   175 // -----------------------------------------------------------------------------
       
   176 // MCESIPEventHelper::CreateResponseL
       
   177 // -----------------------------------------------------------------------------
       
   178 //    
       
   179 CSIPResponseElements* 
       
   180     MCESIPEventHelper::CreateResponseL( CMceComEvent& aEvent, 
       
   181                                         TUint aReason,
       
   182                                         TBool aAddClientData )
       
   183     {
       
   184     RStringF phrase = MceSip::ReasonPhraseL( aReason );
       
   185     
       
   186     return CreateResponseL( aEvent,  
       
   187                             aReason,
       
   188                             phrase,
       
   189                             aAddClientData );    
       
   190     }
       
   191 
       
   192 // -----------------------------------------------------------------------------
       
   193 // MCESIPEventHelper::CreateResponseL
       
   194 // -----------------------------------------------------------------------------
       
   195 //    
       
   196 CSIPResponseElements* 
       
   197     MCESIPEventHelper::CreateResponseL( CMceComEvent& aEvent,
       
   198                                         TUint aReason,
       
   199                                         RStringF aPhrase,
       
   200                                         TBool aAddClientData )
       
   201     {    
       
   202     CSIPResponseElements* response = CSIPResponseElements::NewLC( aReason,
       
   203                                                                   aPhrase );
       
   204 	
       
   205 	//Headers from client
       
   206 	RPointerArray< CSIPHeaderBase > sipHdrs;
       
   207 	CSIPHeaderBase::PushLC( &sipHdrs );
       
   208    
       
   209     // add Refer-Sub header for suppressed refer
       
   210     if ( aReason >= KMceSipOK 
       
   211       && aReason < KMceSipMultipleChoices 
       
   212       && aEvent.ReferType() == CMceRefer::ESuppressed )
       
   213         {
       
   214         // Add Refer-Sub header when responding 2xx to suppressed REFER
       
   215         CSIPExtensionHeader* extHeader = 
       
   216             CSIPExtensionHeader::NewLC( KMceSipHeaderReferSub, KMceSipValueFalse );
       
   217         sipHdrs.AppendL( extHeader );
       
   218         CleanupStack::Pop( extHeader );
       
   219         }
       
   220    	
       
   221     CSIPMessageElements& message = response->MessageElements();
       
   222      
       
   223     if ( aAddClientData )
       
   224         {
       
   225         MceSip::ToSIPExtensionHeadersL( sipHdrs, 
       
   226                                         aEvent.MsgHeaders( KErrNotFound ) );
       
   227 	    SetContentL( message, aEvent );    
       
   228         }
       
   229         
       
   230 	message.SetUserHeadersL( sipHdrs );
       
   231     CleanupStack::Pop( &sipHdrs );
       
   232 	
       
   233 	CleanupStack::Pop( response );
       
   234 	
       
   235 	return response;
       
   236     }
       
   237 
       
   238 // -----------------------------------------------------------------------------
       
   239 // MCESIPEventHelper::SetContentL
       
   240 // -----------------------------------------------------------------------------
       
   241 //    
       
   242 void MCESIPEventHelper::SetContentL( CSIPMessageElements& aMsgElem,
       
   243                                      CMceComEvent& aEvent )
       
   244     {
       
   245     if( aEvent.MsgContentType().Length() )
       
   246     	{
       
   247     	CSIPContentTypeHeader* contenttype = 
       
   248     			CSIPContentTypeHeader::DecodeL( aEvent.MsgContentType() );
       
   249     	CleanupStack::PushL( contenttype );
       
   250     	aMsgElem.SetContentL( aEvent.MsgContent(), contenttype );
       
   251     	CleanupStack::Pop( contenttype );
       
   252     	}
       
   253     else
       
   254     	{
       
   255     	delete aEvent.MsgContent();
       
   256     	}
       
   257     }
       
   258 
       
   259 // -----------------------------------------------------------------------------
       
   260 // MCESIPEventHelper::CreateReferNotifyMessageElementsLC
       
   261 // -----------------------------------------------------------------------------
       
   262 //    
       
   263 
       
   264 CSIPMessageElements* 
       
   265     MCESIPEventHelper::CreateReferNotifyMessageElementsLC( 
       
   266                                                    CMceComEvent& aEvent )
       
   267         {
       
   268         CSIPMessageElements* message = CSIPMessageElements::NewLC();
       
   269         
       
   270         //Headers from client
       
   271 	    RPointerArray< CSIPHeaderBase > sipHdrs;
       
   272 	    CSIPHeaderBase::PushLC( &sipHdrs );
       
   273     
       
   274 	    MceSip::ToSIPExtensionHeadersL( 
       
   275 	                            sipHdrs, 
       
   276 	                            aEvent.MsgHeaders( SipStrConsts::ENotify ) );
       
   277 		message->SetUserHeadersL( sipHdrs );
       
   278 	    CleanupStack::Pop( &sipHdrs );
       
   279 	
       
   280         // content type
       
   281         CSIPContentTypeHeader* contentType = 
       
   282             CSIPContentTypeHeader::NewLC( KMceSipReferAcceptType, 
       
   283                                           KMceSipReferAcceptSubtype );
       
   284         RStringF version = SIPStrings::Pool().OpenFStringL( KMceSipVersion );
       
   285         CleanupClosePushL( version );
       
   286         contentType->SetParamL( version, 
       
   287             SIPStrings::StringF( SipStrConsts::EDefaultVersionNumber ) );
       
   288         
       
   289         //content                       
       
   290         HBufC8* content = KMceSipNotifyContent().AllocLC();
       
   291         
       
   292         message->SetContentL( content, contentType );
       
   293         
       
   294         // clean
       
   295         CleanupStack::Pop( content );
       
   296         CleanupStack::PopAndDestroy();// version
       
   297         CleanupStack::Pop( contentType );
       
   298         
       
   299         return message;
       
   300         }
       
   301   
       
   302 // -----------------------------------------------------------------------------
       
   303 // MCESIPEventHelper::HandleExpireHeaderL
       
   304 // For Subscribe
       
   305 // -----------------------------------------------------------------------------
       
   306 void MCESIPEventHelper::HandleExpireHeaderL(
       
   307     								const CSIPMessageElements& aMessage,
       
   308     								TBool& aTerminated)
       
   309     {
       
   310     TBool terminated = EFalse;
       
   311     
       
   312     CSIPHeaderBase* header = MceSip::FindHeader( 
       
   313                                 aMessage, 
       
   314                                 SIPStrings::StringF( SipStrConsts::EExpires ) );
       
   315             
       
   316     User::LeaveIfError( header ? KErrNone : KErrNotFound );
       
   317             
       
   318     CSIPExpiresHeader* expireHeader = 
       
   319         static_cast<CSIPExpiresHeader*>(header);
       
   320 
       
   321 	TUint expires = expireHeader->Value();
       
   322  	if (expires > 0)
       
   323         {
       
   324         terminated = EFalse;
       
   325         }
       
   326     else
       
   327         {
       
   328         terminated = ETrue;
       
   329         }
       
   330         
       
   331     aTerminated = terminated;
       
   332     }
       
   333  
       
   334 // -----------------------------------------------------------------------------
       
   335 // MCESIPEventHelper::HandleSubscriptionStateHeaderL
       
   336 // Refer 
       
   337 // -----------------------------------------------------------------------------
       
   338 void MCESIPEventHelper::HandleSubscriptionStateHeaderL(
       
   339     								const CSIPMessageElements& aMessage,
       
   340     								TBool& aTerminated)
       
   341     {
       
   342     CSIPHeaderBase* header = MceSip::FindHeader( aMessage,
       
   343             SIPStrings::StringF( SipStrConsts::ESubscriptionStateHeader ) );
       
   344             
       
   345     User::LeaveIfError( header ? KErrNone : KErrNotFound );
       
   346             
       
   347     CSIPSubscriptionStateHeader* ssHeader = 
       
   348         static_cast<CSIPSubscriptionStateHeader*>(header);
       
   349 
       
   350         
       
   351     TPtrC8 state( ssHeader->SubStateValue() );
       
   352     
       
   353     if (state.CompareF(KMceSipStateActive) == 0 || 
       
   354         state.CompareF(KMceSipStatePending) == 0)
       
   355         {
       
   356         aTerminated = EFalse;
       
   357         }
       
   358     else if (state.CompareF(KMceSipStateTerminated) == 0)
       
   359         {
       
   360         aTerminated = ETrue;
       
   361         }
       
   362     else
       
   363         {
       
   364         User::Leave( KErrArgument );
       
   365         }
       
   366     }
       
   367 
       
   368 // -----------------------------------------------------------------------------
       
   369 // MCESIPEventHelper::SetSubsStateHeaderValueAndParamsL
       
   370 // 
       
   371 // -----------------------------------------------------------------------------
       
   372 void MCESIPEventHelper::SetSubsStateHeaderValueAndParamsL ( 
       
   373 									CMceComEvent& aEvent,
       
   374 									TInt aRequestType,
       
   375 									CSIPSubscriptionStateHeader& aSubStateHeader,
       
   376 									const TDesC8& aSubStateValue,
       
   377 									TUint32 aExpireParam,
       
   378 									TBool aTerminating )
       
   379 	{
       
   380 	TInt index = 0;
       
   381 
       
   382 	if ( !HasSubscriptionStateHeader( aEvent, aRequestType, index ) )
       
   383 		{
       
   384 		aSubStateHeader.SetSubStateValueL( aSubStateValue );
       
   385         aSubStateHeader.SetExpiresParameterL( aExpireParam );
       
   386         // delete expires parameter
       
   387         if ( aTerminating ) 
       
   388         	{
       
   389         	RStringF expires = SIPStrings::StringF( SipStrConsts::EExpires );
       
   390         	aSubStateHeader.DeleteParam( expires );
       
   391         	}
       
   392         }
       
   393 	else
       
   394 		{
       
   395 		// delete expires parameter and set by client if any
       
   396 		RStringF expires = SIPStrings::StringF( SipStrConsts::EExpires );
       
   397         aSubStateHeader.DeleteParam( expires );
       
   398 		SetSSHeaderValueAndParamL( 	aEvent.MsgHeaders( aRequestType ),
       
   399 									index,
       
   400 									aSubStateHeader );
       
   401 	
       
   402 		}
       
   403 	
       
   404 	}
       
   405 
       
   406 // -----------------------------------------------------------------------------
       
   407 // MCESIPEventHelper::SetSSHeaderValueAndParamL
       
   408 // 
       
   409 // -----------------------------------------------------------------------------
       
   410 void MCESIPEventHelper::SetSSHeaderValueAndParamL( 	
       
   411 											const MDesC8Array& aMsgHeader,
       
   412 										   	TUint aHeaderIndex,
       
   413 											CSIPSubscriptionStateHeader& aSubStateHeader )
       
   414 	{
       
   415 	TPtrC8 param  = aMsgHeader.MdcaPoint( aHeaderIndex );
       
   416 	TInt index = param.Locate( KMceSipSeparator );
       
   417 	User::LeaveIfError( index != KErrNotFound ? KErrNone : KErrArgument );
       
   418 
       
   419 	CSIPSubscriptionStateHeader* ssHeader = 
       
   420 			CSIPSubscriptionStateHeader::DecodeL( param.Right( param.Length() - ( index + 1 ) ) );
       
   421 	CleanupStack::PushL( ssHeader );
       
   422 	
       
   423 	User::LeaveIfError( ssHeader->SubStateValue().Length() ? KErrNone : KErrArgument );
       
   424 	
       
   425 	aSubStateHeader.SetSubStateValueL( ssHeader->SubStateValue() );
       
   426 	
       
   427 	if ( ssHeader->ExpiresParameter() != KErrNotFound )
       
   428 		{
       
   429 		aSubStateHeader.SetExpiresParameterL( ssHeader->ExpiresParameter());
       
   430 		}
       
   431 	if ( ssHeader->RetryAfterParameter() != KErrNotFound )
       
   432 		{
       
   433 		aSubStateHeader.SetRetryAfterParameterL( ssHeader->RetryAfterParameter() );
       
   434 		}
       
   435 	
       
   436 	RStringF reason = SIPStrings::StringF( SipStrConsts::EReason );	
       
   437 	
       
   438 	if ( ssHeader->HasParam( reason ) )
       
   439 		{
       
   440 		aSubStateHeader.SetParamL( reason, ssHeader->ParamValue( reason ) );
       
   441 		}
       
   442 	
       
   443 	CleanupStack::PopAndDestroy( ssHeader );
       
   444 	}
       
   445 	
       
   446 // -----------------------------------------------------------------------------
       
   447 // MCESIPEventHelper::HasSubscriptionStateHeader
       
   448 // 
       
   449 // -----------------------------------------------------------------------------
       
   450 TBool MCESIPEventHelper::HasSubscriptionStateHeader(
       
   451 									CMceComEvent& aEvent,
       
   452 									TInt aRequestType,
       
   453 									TInt aIndex )
       
   454     {
       
   455     TBool hasHeader = EFalse;
       
   456     
       
   457     TUint count = aEvent.MsgHeaders( aRequestType ).MdcaCount();
       
   458     
       
   459    	for ( TUint i = 0; i < count; i++ )
       
   460 		{
       
   461 		TPtrC8 param = aEvent.MsgHeaders( aRequestType ).MdcaPoint( i );
       
   462 		aIndex = param.FindF( KMceSipSubscriptionStateHeader );
       
   463 		if ( aIndex != KErrNotFound )
       
   464 			{
       
   465 			hasHeader = ETrue;
       
   466 			}
       
   467 		}
       
   468 	return hasHeader;
       
   469     }
       
   470     
       
   471 // -----------------------------------------------------------------------------
       
   472 // MCESIPEventHelper::NotifyRequestReceivedLC
       
   473 // -----------------------------------------------------------------------------
       
   474 // 
       
   475 CSIPResponseElements* MCESIPEventHelper::NotifyRequestReceivedLC(
       
   476                                         CMceComEvent& aEvent,
       
   477                                         const CSIPMessageElements& aMessage )
       
   478     {
       
   479     CSIPResponseElements* response = NULL;
       
   480     if ( !SubscriptionStateOK( aMessage ) )
       
   481         {
       
   482         response = CreateResponseL( aEvent, KMceSipBadRequest );
       
   483         }
       
   484     else if( !EventOK( aMessage ) )
       
   485         {
       
   486         response = CreateResponseL( aEvent, KMceSipBadEvent );
       
   487         }
       
   488     else
       
   489         {
       
   490         response = CreateResponseL( aEvent, KMceSipOK );
       
   491         }
       
   492     CleanupStack::PushL( response );
       
   493     return response;
       
   494 	}
       
   495 
       
   496 // -----------------------------------------------------------------------------
       
   497 // MCESIPEventHelper::ReferNotifyRequestReceivedLC
       
   498 // -----------------------------------------------------------------------------
       
   499 // 
       
   500 CSIPResponseElements* MCESIPEventHelper::ReferNotifyRequestReceivedLC(
       
   501                                          CMceComEvent& aEvent,
       
   502                                          const CSIPMessageElements& aMessage )
       
   503     {
       
   504     CSIPResponseElements* response = NULL;
       
   505     if ( !( ReferContentTypeOK( aMessage ) && 
       
   506             SubscriptionStateOK( aMessage ) ) )
       
   507         {
       
   508         response = CreateResponseL( aEvent, KMceSipBadRequest );
       
   509         }
       
   510     else if( !ReferEventOK( aMessage ) )
       
   511         {
       
   512         response = CreateResponseL( aEvent, KMceSipBadEvent );
       
   513         }
       
   514     else
       
   515         {
       
   516         response = CreateResponseL( aEvent, KMceSipOK );
       
   517         }
       
   518     CleanupStack::PushL( response );
       
   519     return response;
       
   520 	}
       
   521         
       
   522 // -----------------------------------------------------------------------------
       
   523 // MCESIPEventHelper::SubscribeRequestReceivedLC
       
   524 // -----------------------------------------------------------------------------
       
   525 // 
       
   526 CSIPResponseElements* MCESIPEventHelper::SubscribeRequestReceivedLC(
       
   527                                     CMceComEvent& aEvent,
       
   528                                     const CSIPMessageElements& aMessage )
       
   529     {
       
   530     //no subscription-state checking only in Notify msg
       
   531     CSIPResponseElements* response = NULL;
       
   532     if ( !EventOK( aMessage ) )
       
   533         {
       
   534         response = CreateResponseL( aEvent, KMceSipBadEvent );
       
   535         }
       
   536     else
       
   537         {
       
   538         response = CreateResponseL( aEvent, KMceSipOK );    
       
   539         }
       
   540     CleanupStack::PushL( response );
       
   541     return response;
       
   542 	}	
       
   543 
       
   544 // -----------------------------------------------------------------------------
       
   545 // MCESIPEventHelper::ReferContentTypeOK
       
   546 // -----------------------------------------------------------------------------
       
   547 //    
       
   548 TBool MCESIPEventHelper::ReferContentTypeOK(
       
   549     const CSIPMessageElements& aMessage )
       
   550     {
       
   551     const CSIPContentTypeHeader* contentType = 
       
   552         aMessage.ContentType();
       
   553     if (!contentType)
       
   554         {
       
   555         return ETrue;//if there is no content in the notify msg
       
   556         }
       
   557     if (contentType->MediaType().CompareF(KMceSipReferAcceptType) != 0)
       
   558         {
       
   559         return EFalse;
       
   560         }
       
   561     return ( contentType->MediaSubtype().
       
   562         CompareF( KMceSipReferAcceptSubtype ) == 0);
       
   563     }
       
   564     
       
   565 // -----------------------------------------------------------------------------
       
   566 // MCESIPEventHelper::SubscriptionStateOK
       
   567 // -----------------------------------------------------------------------------
       
   568 //    
       
   569 TBool MCESIPEventHelper::SubscriptionStateOK(
       
   570     const CSIPMessageElements& aMessage )
       
   571     {
       
   572     CSIPHeaderBase* header = MceSip::FindHeader( aMessage,
       
   573         SIPStrings::StringF( SipStrConsts::ESubscriptionStateHeader ) );
       
   574     return MCE_NOT_NULL_PTR( header );
       
   575     }    
       
   576 
       
   577 // -----------------------------------------------------------------------------
       
   578 // MCESIPEventHelper::EventOK
       
   579 // -----------------------------------------------------------------------------
       
   580 //    
       
   581 TBool MCESIPEventHelper::EventOK( const CSIPMessageElements& aMessage )
       
   582     {
       
   583     CSIPHeaderBase* header = MceSip::FindHeader( aMessage,
       
   584         SIPStrings::StringF( SipStrConsts::EEventHeader ) );
       
   585     return MCE_NOT_NULL_PTR( header );
       
   586     }  
       
   587 
       
   588 // -----------------------------------------------------------------------------
       
   589 // MCESIPEventHelper::ReferEventOK
       
   590 // -----------------------------------------------------------------------------
       
   591 //    
       
   592 TBool MCESIPEventHelper::ReferEventOK(
       
   593     const CSIPMessageElements& aMessage )
       
   594     {
       
   595     CSIPHeaderBase* header = MceSip::FindHeader( aMessage,
       
   596         SIPStrings::StringF( SipStrConsts::EEventHeader ) );
       
   597     if (!header)
       
   598         {
       
   599         return EFalse;
       
   600         }
       
   601     CSIPEventHeader* event = static_cast<CSIPEventHeader*>(header);
       
   602     return (event->EventPackage().CompareF(KMceSipReferEventName) == 0);
       
   603     }  
       
   604 
       
   605 // -----------------------------------------------------------------------------
       
   606 // MCESIPEventHelper::ResolveReferTypeL
       
   607 // -----------------------------------------------------------------------------
       
   608 //        
       
   609 CMceRefer::TType MCESIPEventHelper::ResolveReferTypeL( 
       
   610                                         const CSIPMessageElements& aMessage )
       
   611     {
       
   612     /**
       
   613     * IF required "multiple-refer" THEN return EMultipleRefer
       
   614     *
       
   615     * ELSE IF there is "Refer-Sub: false" then return ESuppressed
       
   616     *
       
   617     * ELSE return ENoSuppression
       
   618     */
       
   619     
       
   620     CMceRefer::TType ret = CMceRefer::ENoSuppression;
       
   621     const RPointerArray<CSIPHeaderBase>& headers = aMessage.UserHeaders();
       
   622     CSIPHeaderBase* header = NULL;
       
   623     
       
   624     for ( TInt ind = 0; 
       
   625           ret != CMceRefer::EMultipleRefer && ind < headers.Count() ; ind++ )
       
   626         {
       
   627         header = headers[ ind ]; 
       
   628         
       
   629         if ( header->Name() 
       
   630              == SIPStrings::StringF( SipStrConsts::ERequireHeader ) )
       
   631             {
       
   632             RStringF multiple = 
       
   633                 SIPStrings::Pool().OpenFStringL( KMceSipValueMultipleRefer );
       
   634             CleanupClosePushL( multiple );
       
   635             
       
   636             if ( static_cast< CSIPTokenHeaderBase* >( header )->Value() 
       
   637                  == multiple )
       
   638                 {
       
   639                 // multiple-refer extension required.
       
   640                 ret = CMceRefer::EMultipleRefer;
       
   641                 }
       
   642             CleanupStack::PopAndDestroy(); // multiple
       
   643             }
       
   644         else
       
   645             {
       
   646             RStringF referSub = 
       
   647                 SIPStrings::Pool().OpenFStringL( KMceSipHeaderReferSub );
       
   648             CleanupClosePushL( referSub );
       
   649             
       
   650             if ( header->Name() == referSub )
       
   651                 {
       
   652                 if ( static_cast< CSIPExtensionHeader* >( header )->
       
   653                     Value().CompareF( KMceSipValueFalse ) == 0 )
       
   654                     {
       
   655                     ret = CMceRefer::ESuppressed;
       
   656                     }
       
   657                 }
       
   658             CleanupStack::PopAndDestroy(); // referSub
       
   659             }
       
   660         }
       
   661     
       
   662     return ret;
       
   663     }
       
   664 
       
   665 // -----------------------------------------------------------------------------
       
   666 // MCESIPEventHelper::MatchEvents
       
   667 // -----------------------------------------------------------------------------
       
   668 // 
       
   669 TBool MCESIPEventHelper::MatchEvents( const CSIPEventHeader& aFirstEvent,
       
   670                                       const CSIPEventHeader& aSecondEvent )
       
   671     {
       
   672     TBool ret( EFalse );
       
   673     
       
   674     if ( aFirstEvent.EventPackage().CompareF( 
       
   675          aSecondEvent.EventPackage() ) == 0 )
       
   676         {
       
   677         // event packages match, concentrate on id params
       
   678         RStringF idParam = SIPStrings::StringF( SipStrConsts::EId );
       
   679         if ( aFirstEvent.HasParam( idParam ) )
       
   680             {
       
   681             // id's must match
       
   682             if ( aSecondEvent.HasParam( idParam ) )
       
   683                 {
       
   684                 if ( aFirstEvent.ParamValue( idParam ) == 
       
   685                      aSecondEvent.ParamValue( idParam ) )
       
   686                     {
       
   687                     ret = ETrue;
       
   688                     }
       
   689                 }
       
   690             }
       
   691         else if ( aSecondEvent.HasParam( idParam ) )
       
   692             {
       
   693             // first has no, second has
       
   694             }
       
   695         else
       
   696             {
       
   697             // neither has
       
   698             ret = ETrue;
       
   699             }  
       
   700         }
       
   701     return ret;            
       
   702     }
       
   703     
       
   704 // -----------------------------------------------------------------------------
       
   705 // MCESIPEventHelper::MatchEvents
       
   706 // -----------------------------------------------------------------------------
       
   707 //     
       
   708 TBool MCESIPEventHelper::MatchEventsL( const TDesC8& aEventPackage,
       
   709                                       TUint aIdValue,
       
   710                                       const CSIPEventHeader& aEvent )
       
   711     {
       
   712     TBool ret( EFalse );
       
   713     
       
   714     if ( aEvent.EventPackage().CompareF( aEventPackage ) == 0 )
       
   715         {
       
   716         // event packages match, concentrate on id params
       
   717         RStringF idParam = SIPStrings::StringF( SipStrConsts::EId );
       
   718         if ( aEvent.HasParam( idParam ) )
       
   719             {
       
   720             if ( aIdValue > KMceEventIdNotAssigned )
       
   721                 {
       
   722                 HBufC8* idParamBuf = 
       
   723                     aEvent.ParamValue( idParam ).DesC().AllocLC();
       
   724                 TUint idParamValue = MceSip::HeaderValueL( idParamBuf->Des() );
       
   725                 CleanupStack::PopAndDestroy( idParamBuf );
       
   726                 if ( idParamValue == aIdValue )
       
   727                     {
       
   728                     ret = ETrue;
       
   729                     }
       
   730                 }
       
   731             }
       
   732          else // no id param
       
   733             {
       
   734             ret = ETrue;
       
   735             }
       
   736         }
       
   737     return ret;                   
       
   738     }
       
   739 
       
   740 //  End of File