--- a/sipvoipprovider/src/svpuriparser.cpp Thu Aug 19 09:45:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,830 +0,0 @@
-/*
-* Copyright (c) 2006-2008 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: provides uri parser methods for SVP
-*
-*/
-
-#include <uri8.h>
-#include <sipstrings.h> // For remote party data parsing
-#include <sipfromheader.h> // For remote party data parsing
-#include <sipaddress.h> // For remote party data parsing
-
-#include "svplogger.h"
-#include "svpconsts.h"
-#include "svpuriparser.h"
-#include "svpcleanupresetanddestroy.h"
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CSVPUriParser
-// ---------------------------------------------------------------------------
-//
-CSVPUriParser::CSVPUriParser()
- {
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::NewLC
-// ---------------------------------------------------------------------------
-//
-CSVPUriParser* CSVPUriParser::NewLC()
- {
- CSVPUriParser* self = new ( ELeave ) CSVPUriParser;
- CleanupStack::PushL( self );
- return self;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::NewL
-// ---------------------------------------------------------------------------
-//
-CSVPUriParser* CSVPUriParser::NewL()
- {
- CSVPUriParser* self = CSVPUriParser::NewLC();
- CleanupStack::Pop( self );
- return self;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::~CSVPUriParser
-// ---------------------------------------------------------------------------
-//
-CSVPUriParser::~CSVPUriParser()
- {
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::SetUserEqualsPhoneRequiredL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::SetUserEqualsPhoneRequiredL( TBool aValue )
- {
- SVPDEBUG1( "CSVPUriParser::SetUserEqualsPhoneRequiredL" )
- iUserEqualsPhoneRequired = aValue;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::UserEqualsPhoneRequiredL
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::UserEqualsPhoneRequiredL() const
- {
- SVPDEBUG1( "CSVPUriParser::UserEqualsPhoneRequired In" )
- // check if user=phone is required
- SVPDEBUG2( "CSVPUriParser::UserEqualsPhoneRequired Out: %d",
- iUserEqualsPhoneRequired )
- return iUserEqualsPhoneRequired;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::IsUriValidForUserEqualsPhoneL
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::IsUriValidForUserEqualsPhoneL( const TDesC8& aUri )
- {
- SVPDEBUG1( "CSVPUriParser::IsUriValidForUserEqualsPhoneL In" )
-
- /// flag to indicate if all checks are ok
- TBool userEqPhoneCheck = EFalse;
-
- // Extract user info
- TUriParser8 uri8Parser;
- uri8Parser.Parse( aUri );
- CUri8* cUri8 = CUri8::NewLC( uri8Parser ); // CS:1
-
- const TUriC8& tempUri = cUri8->Uri();
- const TDesC8& userInfo = tempUri.Extract( EUriUserinfo );
-
- TLex8 user( userInfo );
- TInt length = userInfo.Length();
- const TChar KSvpPlus( '+' );
-
- // Check if there is a preceeding plus
- if ( KSvpPlus == user.Peek() )
- {
- user.Inc();
- length--;
- }
-
- // Check the minimum length
- if ( KSVPMinUserInfoLength > length )
- {
- userEqPhoneCheck = EFalse;
- }
- else // Check that there is only digits
- {
- userEqPhoneCheck = ETrue;
-
- while ( !user.Eos() )
- {
- if ( !user.Peek().IsDigit() )
- {
- userEqPhoneCheck = EFalse;
- break;
- }
-
- user.Inc();
- }
- }
-
- CleanupStack::PopAndDestroy( cUri8 );
-
- SVPDEBUG2( "CSVPUriParser::IsUriValidForUserEqualsPhoneL Out: %d",
- userEqPhoneCheck )
- return userEqPhoneCheck;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CompleteSipUriL
-// ---------------------------------------------------------------------------
-//
-HBufC8* CSVPUriParser::CompleteSipUriL(
- const TDesC8& aUri, const TDesC8& aAOR, TBool aIsEmergency ) const
- {
- SVPDEBUG1( "CSVPUriParser::CompleteSipUriL In" )
-
- // Copy the parameter to a new buffer.
- HBufC8* uri = aUri.AllocLC(); // CS: 1
-
-#ifdef _DEBUG
- TBuf<KSvpMaxDebugBufferSize> tmpStr;
- tmpStr.Copy( aAOR );
- SVPDEBUG2( "CSVPUriParser::CompleteSipUriL IN aAOR: %S", &tmpStr )
- tmpStr.Copy( aUri );
- SVPDEBUG2( "CSVPUriParser::CompleteSipUriL IN aURI: %S", &tmpStr )
-#endif // _DEBUG
-
- // Trim ALL white space from URI, even if used as an user name
- uri->Des().TrimAll();
-
- if ( uri )
- {
- //First check is this tel-uri. Domain part is not allowed in tel-uri.
- if ( uri->Length() >= KTelPrefixLength &&
- KErrNotFound != uri->Des().Left( KTelPrefixLength ).Find( KTelPrefix ) &&
- KErrNotFound == uri->Des().Find( KSVPAt ) )
- {
- CleanupStack::Pop( uri ); // CS:0
- return uri;
- }
-
- // parse display name if exists
- while ( KErrNotFound != uri->Find( KSVPSipPrefix ) )
- {
- TInt index = uri->Find( KSVPSipPrefix );
-
- if ( 0 == index )
- {
- uri->Des().Delete( index, 4 );
- }
- else
- {
- uri->Des().Delete( 0, index );
- }
- }
-
- // Check "<" and remove it if exists
- if ( uri->Length() && CheckLeftBracket( *uri ) )
- {
- RemoveLeftBracket( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Check ">" and remove it if exists
- if ( uri->Length() && CheckRightBracket( *uri ) )
- {
- RemoveRightBracket( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Check "sips:" and remove it if exists
- if ( uri->Length() && CheckSipsPrefix( *uri ) )
- {
- RemoveSipsPrefixL( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Add "sip:" prefix, if it's missing.
- if ( !CheckSipPrefix( *uri ) )
- {
- AddSipPrefixL( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Add "@" character if it's missing
- if ( !CheckAt( *uri ) )
- {
- AddAtL( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Add domain, if it's missing
- if ( !CheckDomain( *uri ) )
- {
- AddDomainL( uri, aAOR );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- EscapeEncodeSipUriL( uri, EscapeUtils::EEscapeNormal );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
-
- // Emergency call has no knowledge of the service ID, therefore
- // user=phone parameter is omitted
- if ( !aIsEmergency &&
- IsUriValidForUserEqualsPhoneL( *uri ) &&
- UserEqualsPhoneRequiredL() )
- {
- AddUserEqualsPhoneL( uri );
- }
- }
- else
- {
- SVPDEBUG1( " CSVPUriParser::CompleteSipUriL uri null" )
- }
-
-#ifdef _DEBUG
- tmpStr.Copy( *uri );
- SVPDEBUG2( "CSVPUriParser::CompleteSipUriL OUT: %S", &tmpStr )
-#endif // _DEBUG
-
- CleanupStack::Pop( 1 ); // uri
- return uri;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::AddUserEqualsPhone
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::AddUserEqualsPhoneL( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::AddUserEqualsPhoneL In" )
-
- aUri = aUri->ReAllocL( aUri->Length() +
- KSVPUserEqualsPhoneLength +
- KSVPDoubleBracketLength );
- aUri->Des().Insert( 0, KSVPLeftBracketMark );
- aUri->Des().Append( KSVPUserEqualsPhone );
- aUri->Des().Append( KSVPRightBracketMark );
-
- SVPDEBUG1( "CSVPUriParser::AddUserEqualsPhoneL Out" )
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CompleteSecureSipUriL
-// ---------------------------------------------------------------------------
-//
-HBufC8* CSVPUriParser::CompleteSecureSipUriL(
- const TDesC8& aUri, const TDesC8& aAOR ) const
- {
- SVPDEBUG1( "CSVPUriParser::CompleteSecureSipUriL In" )
-
- // Copy the parameter to a new buffer.
- HBufC8* uri = aUri.AllocLC();
-
-#ifdef _DEBUG
- TBuf<KSvpMaxDebugBufferSize> tmpStr;
- tmpStr.Copy( aAOR );
- SVPDEBUG2( "CSVPUriParser::CompleteSecureSipUriL IN aAOR: %S", &tmpStr )
- tmpStr.Copy( aUri );
- SVPDEBUG2( "CSVPUriParser::CompleteSecureSipUriL IN aURI: %S", &tmpStr )
-#endif // _DEBUG
-
- // Trim ALL white space from URI, even if used as an user name
- uri->Des().TrimAll();
-
- if ( uri )
- {
- //First check is this tel-uri. Domain part is not allowed in tel-uri.
- if ( uri->Length() >= KTelPrefixLength &&
- KErrNotFound != uri->Des().Left( KTelPrefixLength ).Find( KTelPrefix ) &&
- KErrNotFound == uri->Des().Find( KSVPAt ) )
- {
- CleanupStack::Pop( uri );
- return uri;
- }
-
- // Check "<" and remove it if exists
- if ( uri->Length() && CheckLeftBracket( *uri ) )
- {
- RemoveLeftBracket( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Check ">" and remove it if exists
- if ( uri->Length() && CheckRightBracket( *uri ) )
- {
- RemoveRightBracket( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Check "sip:" and remove it if exists
- if ( uri->Length() && CheckSipPrefix( *uri ) )
- {
- RemoveSipPrefixL( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Add "sips:" prefix, if it's missing.
- if ( !CheckSipsPrefix( *uri ) )
- {
- AddSipsPrefixL( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Add "@" character if it's missing
- if ( !CheckAt( *uri ) )
- {
- AddAtL( uri );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- // Add domain, if it's missing
- if ( !CheckDomain( *uri ) )
- {
- AddDomainL( uri, aAOR );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
- }
-
- EscapeEncodeSipUriL( uri, EscapeUtils::EEscapeNormal );
- CleanupStack::Pop( 1 ); // uri, ReAlloc possible
- CleanupStack::PushL( uri );
-
- if ( UserEqualsPhoneRequiredL() &&
- IsUriValidForUserEqualsPhoneL( *uri ) )
- {
- AddUserEqualsPhoneL( uri );
- }
- }
- else
- {
- SVPDEBUG1( " CSVPUriParser::CompleteSecureSipUriL uri null" )
- }
-
-#ifdef _DEBUG
- tmpStr.Copy( *uri );
- SVPDEBUG2( "CSVPUriParser::CompleteSecureSipUriL OUT: %S", &tmpStr )
-#endif // _DEBUG
-
- CleanupStack::Pop( 1 ); // uri
- return uri;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CompleteEventSipUriL
-// ---------------------------------------------------------------------------
-//
-HBufC8* CSVPUriParser::CompleteEventSipUriL( const TDesC8& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::CompleteEventSipUriL In" )
-
- // Copy the parameter to a new buffer.
- HBufC8* uri = aUri.AllocLC();
-
- // Add "sip:" prefix, if it's missing.
- if ( !CheckSipPrefix( *uri ) )
- {
- AddSipPrefixL( uri );
- }
-
- CleanupStack::Pop( 1 ); // uri
-
- SVPDEBUG1( "CSVPUriParser::CompleteEventSipUriL Out" )
- return uri;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CheckSipPrefix
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::CheckSipPrefix( const TDesC8& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::CheckSipPrefix" )
-
- // The "sip:" prefix is expected to be at the beginning of the URI.
- if ( KErrNotFound == aUri.Find( KSVPSipPrefix ) )
- {
- return EFalse;
- }
- else
- {
- return ETrue;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CheckSipsPrefix
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::CheckSipsPrefix( const TDesC8& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::CheckSipsPrefix" )
-
- // The "sips:" prefix is expected to be at the beginning of the URI.
- return ( 0 == aUri.Find( KSVPSipsPrefix ) );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CheckAt
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::CheckAt( const TDesC8& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::CheckAt" )
-
- // It is expected that there is atleast one character between
- // "sip:" prefix and "@" character.
- return ( aUri.Find( KSVPAt ) >= KSVPSipPrefixLength );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CheckDomain
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::CheckDomain( const TDesC8& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::CheckDomain" )
-
- // Check whether the "@" chearacter is the last one.
- return ( aUri.Find( KSVPAt ) < aUri.Length() - 1 );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::DomainL
-// ---------------------------------------------------------------------------
-//
-HBufC8* CSVPUriParser::DomainL( const TDesC8& aUri )
- {
- SVPDEBUG1( "CSVPUriParser::DomainL In" )
-
- HBufC8* ptr = NULL;
-
- // Check that URI is complete; it has domain part:
- if ( aUri.Find( KSVPAt ) < aUri.Length() - 1 )
- {
- TInt uriLength = aUri.Length();
- TInt atPos = aUri.Find( KSVPAt );
- //__ASSERT_ALWAYS( atPos != KErrNotFound, User::Leave( KErrArgument ) );
- TPtrC8 domainPart = aUri.Right( uriLength - atPos - 1 );
- ptr = domainPart.AllocL();
- }
-
- SVPDEBUG1( "CSVPUriParser::DomainL Out" )
- return ptr;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::AddSipPrefixL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::AddSipPrefixL( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::AddSipPrefixL In" )
- aUri = aUri->ReAllocL( aUri->Length() + KSVPSipPrefixLength );
- aUri->Des().Insert( 0, KSVPSipPrefix );
-
- SVPDEBUG1( "CSVPUriParser::AddSipPrefixL Out" )
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::RemoveSipPrefixL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::RemoveSipPrefixL( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::RemoveSipPrefixL" )
-
- aUri->Des().Delete( 0, KSVPSipPrefixLength );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::AddSipsPrefixL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::AddSipsPrefixL( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::AddSipsPrefixL In" )
-
- aUri = aUri->ReAllocL( aUri->Length() + KSVPSipsPrefixLength );
- aUri->Des().Insert( 0, KSVPSipsPrefix );
-
- SVPDEBUG1( "CSVPUriParser::AddSipsPrefixL Out" )
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::RemoveSipsPrefixL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::RemoveSipsPrefixL( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::RemoveSipsPrefixL" )
-
- aUri->Des().Delete( 0, KSVPSipsPrefixLength );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::AddAtL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::AddAtL( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::AddAtL In" )
-
- aUri = aUri->ReAllocL( aUri->Length() + KSVPAtLength );
- aUri->Des().Append( KSVPAt );
-
- SVPDEBUG1( "CSVPUriParser::AddAtL Out" )
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::AddDomainL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::AddDomainL(
- HBufC8*& aUri, const TDesC8& aAOR ) const
- {
- SVPDEBUG1( "CSVPUriParser::AddDomainL In" )
-
- // Parse the domain part from the AOR.
- HBufC8* domainBuf = HBufC8::NewLC( aAOR.Length() ); // CS : 1
- TInt atPos = aAOR.Find( KSVPAt );
-
- // Check, that the "@" character is in AOR.
- __ASSERT_ALWAYS( KErrNotFound != atPos, User::Leave( KErrArgument ) );
- // Check, that there is a domain part.
- __ASSERT_ALWAYS( atPos < aAOR.Length()-1, User::Leave( KErrArgument ) );
-
- // Copy the domain to the domain buffer.
- domainBuf->Des().Append( aAOR.Mid( atPos + 1 ) );
-
- // Re-allocate the URI
- aUri = aUri->ReAllocL( aUri->Length() + domainBuf->Length() );
- aUri->Des().Append( *domainBuf ); // Append the domain.
-
- CleanupStack::PopAndDestroy( domainBuf ); // CS : 0
-
- SVPDEBUG1( "CSVPUriParser::AddDomainL Out" )
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CheckLeftBracket
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::CheckLeftBracket( const TDesC8& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::CheckLeftBracket" )
-
- // The "<" prefix is expected to be at the beginning of the URI.
- return ( 0 == aUri.Find( KSVPLeftBracketMark ) );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::RemoveLeftBracket
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::RemoveLeftBracket( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::RemoveLeftBracket" )
-
- aUri->Des().Delete( 0, KSVPSingleBracketLength );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::CheckRightBracket
-// ---------------------------------------------------------------------------
-//
-TBool CSVPUriParser::CheckRightBracket( const TDesC8& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::CheckRightBracket" )
-
- // The ">" prefix is expected to be at the end of the URI.
- return ( aUri.Length() == ( aUri.Find( KSVPRightBracketMark )
- + KSVPSingleBracketLength ) );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::RemoveRightBracket
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::RemoveRightBracket( HBufC8*& aUri ) const
- {
- SVPDEBUG1( "CSVPUriParser::RemoveRightBracket" )
-
- aUri->Des().Delete( aUri->Length() - KSVPSingleBracketLength,
- KSVPSingleBracketLength );
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::EscapeEncodeSipUriL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::EscapeEncodeSipUriL( HBufC8*& aSipUri,
- EscapeUtils::TEscapeMode aMode )
- {
- SVPDEBUG1( "CSVPUriParser::EscapeEncodeSipUriL In" )
-
- HBufC8* temp = EscapeUtils::EscapeEncodeL( *aSipUri, aMode );
- CleanupStack::PushL( temp );
- aSipUri = aSipUri->ReAllocL( temp->Length() );
- *aSipUri = *temp;
- CleanupStack::PopAndDestroy( temp );
-
- SVPDEBUG1( "CSVPUriParser::EscapeEncodeSipUriL Out" )
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::EscapeDecodeSipUriL
-// ---------------------------------------------------------------------------
-//
-void CSVPUriParser::EscapeDecodeSipUriL( HBufC8*& aSipUri )
- {
- SVPDEBUG1( "CSVPUriParser::EscapeDecodeSipUriL In" )
-
- HBufC8* temp = EscapeUtils::EscapeDecodeL( *aSipUri );
- CleanupStack::PushL( temp );
-
- if( temp->Length() > aSipUri->Length() )
- {
- aSipUri = aSipUri->ReAllocL( temp->Length() );
- }
-
- *aSipUri = *temp;
-
- CleanupStack::PopAndDestroy( temp );
-
- SVPDEBUG1( "CSVPUriParser::EscapeDecodeSipUriL Out" )
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::ParseDisplayNameL
-// ---------------------------------------------------------------------------
-//
-HBufC* CSVPUriParser::ParseDisplayNameL( const TDesC8& aRemoteParty )
- {
- SVPDEBUG1( "CSVPUriParser::ParseDisplayNameL()" )
-
- // Open SIP string pool
- SIPStrings::OpenL();
-
- // Make a local copy
- HBufC8* utf8 = HBufC8::NewLC( aRemoteParty.Length() ); // CS:1
- ( utf8->Des() ).Copy( aRemoteParty );
-
- // Escape decode
- CSVPUriParser::EscapeDecodeSipUriL( utf8 );
-
- // Convert from UTF8 to unicode
- HBufC* unicode16 = EscapeUtils::ConvertToUnicodeFromUtf8L( *utf8 );
- CleanupStack::PopAndDestroy( utf8 ); // CS:0
- CleanupStack::PushL( unicode16 ); // CS:1
- HBufC8* unicode8 = HBufC8::NewL( unicode16->Length() );
- ( unicode8->Des() ).Copy( *unicode16 );
- CleanupStack::PopAndDestroy( unicode16 ); // CS:0
- CleanupStack::PushL( unicode8 ); // CS:1
-
- // Create SIP From header
- CSIPFromHeader* originatorHdr = CSIPFromHeader::DecodeL( *unicode8 );
- CleanupStack::PopAndDestroy( unicode8 ); // CS:0
- CleanupStack::PushL( originatorHdr ); // CS:1
-
- // Extract and parse display name, format is "..."
- HBufC8* displayName8 = originatorHdr->SIPAddress().DisplayName().AllocL();
- CleanupStack::PopAndDestroy( originatorHdr ); // CS:0
- CleanupStack::PushL( displayName8 ); // CS:1
-
- // Convert to 16-bit
- HBufC* displayName = HBufC::NewL( displayName8->Length() );
- ( displayName->Des() ).Copy( *displayName8 );
- CleanupStack::PopAndDestroy( displayName8 ); // CS:0
-
- // Close SIP string pool
- SIPStrings::Close();
-
- // Parse: remove quotation marks from both ends
- displayName->Des().Trim();
- if ( KSVPQuotationMark() == displayName->Left( 1 ) &&
- KSVPQuotationMark() == displayName->Right( 1 ) )
- {
- displayName->Des().Delete( 0, 1 );
- displayName->Des().Delete( displayName->Length() - 1, 1 );
- }
-
- // Parse: remove backslashes
- TLex lex( *displayName );
- const TChar backslash = '\\';
- TBool chDeleted = EFalse;
- while ( !lex.Eos() )
- {
- if ( backslash == lex.Peek() && !chDeleted )
- {
- // Backslash found, delete it if not consecutive
- displayName->Des().Delete( lex.Offset() , 1 );
- lex.Inc();
- chDeleted = ETrue;
- }
- else
- {
- // Not a backslash
- lex.Inc();
- chDeleted = EFalse;
- }
- }
-
- // Handle anonymous
- if ( KErrNotFound != displayName->Des().FindF( KSVPAnonymous ) )
- {
- SVPDEBUG1( "CSVPUriParser::ParseDisplayNameL, anonymous case" )
- displayName->Des().Copy( KNullDesC );
- }
-
- SVPDEBUG2( "CSVPUriParser::ParseDisplayNameL, display name: %S",
- displayName )
- return displayName;
- }
-
-// ---------------------------------------------------------------------------
-// CSVPUriParser::ParseRemotePartyUriL
-// ---------------------------------------------------------------------------
-//
-HBufC* CSVPUriParser::ParseRemotePartyUriL( const TDesC8& aRemoteParty )
- {
- SVPDEBUG1( "CSVPUriParser::ParseRemotePartyUriL()" )
-
- // Open SIP string pool
- SIPStrings::OpenL();
-
- // Make a local copy
- HBufC8* utf8 = HBufC8::NewLC( aRemoteParty.Length() ); // CS:1
- ( utf8->Des() ).Copy( aRemoteParty );
-
- // Escape decode
- CSVPUriParser::EscapeDecodeSipUriL( utf8 );
-
- // Convert from UTF8 to unicode
- HBufC* unicode16 = EscapeUtils::ConvertToUnicodeFromUtf8L( *utf8 );
- CleanupStack::PopAndDestroy( utf8 ); // CS:0
- CleanupStack::PushL( unicode16 ); // CS:1
- HBufC8* unicode8 = HBufC8::NewL( unicode16->Length() );
- ( unicode8->Des() ).Copy( *unicode16 );
- CleanupStack::PopAndDestroy( unicode16 ); // CS:0
- CleanupStack::PushL( unicode8 ); // CS:1
-
- // Create SIP From header
- CSIPFromHeader* originatorHdr = CSIPFromHeader::DecodeL( *unicode8 );
- CleanupStack::PopAndDestroy( unicode8 ); // CS:0
- CleanupStack::PushL( originatorHdr ); // CS:1
-
- // Extract URI, returned without angle brackets
- HBufC8* uri8 = originatorHdr->SIPAddress().Uri8().Uri().UriDes().AllocL();
- CleanupStack::PopAndDestroy( originatorHdr ); // CS:0
- CleanupStack::PushL( uri8 ); // CS:1
-
- // Parse: remove URI parameters
- TInt posSemiColon = uri8->FindF( KSVPSemiCln );
- if ( KErrNotFound != posSemiColon )
- {
- uri8->Des().Delete( posSemiColon, uri8->Length() - posSemiColon );
- }
-
- // Convert to 16-bit
- HBufC* uri = HBufC::NewL( uri8->Length() );
- ( uri->Des() ).Copy( *uri8 );
- CleanupStack::PopAndDestroy( uri8 ); // CS:0
-
- // Handle anonymous
- if ( KErrNotFound != uri->Des().FindF( KSVPAnonymous ) )
- {
- SVPDEBUG1( "CSVPUriParser::ParseRemotePartyUriL, anonymous case" )
- uri->Des().Copy( KNullDesC );
- }
-
- // Close SIP string pool
- SIPStrings::Close();
-
- SVPDEBUG2( "CSVPUriParser::ParseRemotePartyUriL, URI: %S", uri )
- return uri;
- }
-
-// End of File