diff -r 65a3ef1d5bd0 -r f742655b05bf voipplugins/svtlogging/src/csvtsipuriparser.cpp --- a/voipplugins/svtlogging/src/csvtsipuriparser.cpp Thu Aug 19 09:45:22 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,370 +0,0 @@ -/* -* Copyright (c) 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: -* -*/ - - -#include "csvtsipuriparser.h" -#include "svtphonenumbervalidator.h" - -_LIT( KColon, ":"); -_LIT( KAtSign, "@"); -_LIT( KLeftElbow, "<" ); -_LIT( KRightElbow, ">" ); - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::CSvtSipUriParser -// --------------------------------------------------------------------------- -// -CSvtSipUriParser::CSvtSipUriParser( TDomainPartClippingSetting aOptions ) - : - iOptions( aOptions ) - { - - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::ConstructL -// --------------------------------------------------------------------------- -// -void CSvtSipUriParser::ConstructL( const TDesC& aSipUri ) - { - ParseSipUriL( aSipUri ); - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::NewL -// --------------------------------------------------------------------------- -// -CSvtSipUriParser* CSvtSipUriParser::NewL( const TDesC& aSipUri, - TDomainPartClippingSetting aOptions ) - { - CSvtSipUriParser* self = CSvtSipUriParser::NewLC( aSipUri, aOptions ); - CleanupStack::Pop( self ); - return self; - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::NewLC -// --------------------------------------------------------------------------- -// -CSvtSipUriParser* CSvtSipUriParser::NewLC( const TDesC& aSipUri, - TDomainPartClippingSetting aOptions ) - { - CSvtSipUriParser* self = new( ELeave ) CSvtSipUriParser( aOptions ); - CleanupStack::PushL( self ); - self->ConstructL( aSipUri ); - return self; - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::~CSvtSipUriParser -// --------------------------------------------------------------------------- -// -CSvtSipUriParser::~CSvtSipUriParser() - { - iUserName.Close(); - iDomain.Close(); - iDisplayName.Close(); - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::GetVoipAddress -// --------------------------------------------------------------------------- -// -TInt CSvtSipUriParser::GetVoipAddress( RBuf& aVoipAddress ) const - { - aVoipAddress = KNullDesC(); - - if ( IsAnonymousUri( iUserName ) ) - { - return KErrNone; - } - - TInt result( KErrNone ); - TInt addressLength = AddressLength( iUserName, iDomain, iOptions ); - if ( aVoipAddress.MaxLength() < addressLength ) - { - result = aVoipAddress.ReAlloc( addressLength ); - } - - if ( KErrNone == result ) - { - aVoipAddress.Append( iUserName ); - - if ( iUserName.Length() < addressLength ) - { - // domain part clipping isn't used - aVoipAddress.Append( KAtSign() ); - aVoipAddress.Append( iDomain ); - } - } - - return result; - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::GetPhoneNumber -// --------------------------------------------------------------------------- -// -TInt CSvtSipUriParser::GetPhoneNumber( RBuf& aPhoneNumber ) const - { - aPhoneNumber = KNullDesC(); - - TInt result( KErrNone ); - if ( SvtPhoneNumberValidator::IsValidNumber( iUserName ) - && ( ENoClipping != iOptions ) ) - { - if ( aPhoneNumber.MaxLength() < iUserName.Length() ) - { - result = aPhoneNumber.ReAlloc( iUserName.Length() ); - } - - if ( KErrNone == result ) - { - aPhoneNumber.Append( iUserName ); - } - } - - return result; - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::GetDisplayName -// --------------------------------------------------------------------------- -// -TInt CSvtSipUriParser::GetDisplayName( RBuf& aDisplayName ) const - { - aDisplayName = KNullDesC(); - - TInt result( KErrNone ); - if ( aDisplayName.MaxLength() < iDisplayName.Length() ) - { - result = aDisplayName.ReAlloc( iDisplayName.Length() ); - } - - if ( KErrNone == result ) - { - aDisplayName = iDisplayName; - } - - return result; - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::ParseSipUriL -// Accepted URI forms are: [schema:]user@host[:port] and -// displayname <[schema:]user@host[:port]>. URI parameters and headers are -// ripped off in MCE & SVP. -// --------------------------------------------------------------------------- -// -void CSvtSipUriParser::ParseSipUriL( const TDesC& aSipUri ) - { - if ( IsAnonymousUri( aSipUri ) ) - { - ParsePrivateAddress(); - } - else - { - RBuf sipUri( aSipUri.AllocL() ); - CleanupClosePushL( sipUri ); - - // remove trailing and leading white spaces from input uri - sipUri.TrimAll(); - ParseDisplayNameL( sipUri ); - RemoveElbows( sipUri ); - ParseUserNameL( sipUri ); - ParseDomainL( sipUri ); - - CleanupStack::PopAndDestroy( &sipUri ); - } - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::ParseDisplayNameL -// --------------------------------------------------------------------------- -// -void CSvtSipUriParser::ParseDisplayNameL( const TDesC& aSipUri ) - { - iDisplayName.Close(); - - TInt leftElbowIndex = aSipUri.Find( KLeftElbow ); - TInt rightElbowIndex = aSipUri.Find( KRightElbow ); - if ( ( 0 < leftElbowIndex ) && ( KErrNotFound != rightElbowIndex ) ) - { - // display name is available - iDisplayName.Assign( aSipUri.Left( leftElbowIndex ).AllocL() ); - - // remove whitespace around display name - iDisplayName.TrimAll(); - - // remove quatation marks around display name - _LIT( KQuatationMark, "\""); - if ( iDisplayName.Length() && iDisplayName[0] == '"' ) - { - iDisplayName.Delete( 0, KQuatationMark().Length() ); - } - - if ( iDisplayName.Length() - && iDisplayName[iDisplayName.Length() - 1] == '"') - { - iDisplayName.Delete( - iDisplayName.Length() - 1, KQuatationMark().Length() ); - } - } - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::RemoveElbows -// --------------------------------------------------------------------------- -// -void CSvtSipUriParser::RemoveElbows( TDes& sipUri ) const - { - TInt leftElbowIndex = sipUri.Find( KLeftElbow ); - if ( KErrNotFound != leftElbowIndex ) - { - sipUri.Delete( leftElbowIndex, KLeftElbow().Length() ); - } - - TInt rightElbowIndex = sipUri.Find( KRightElbow ); - if ( KErrNotFound != rightElbowIndex ) - { - sipUri.Delete( rightElbowIndex, KRightElbow().Length() ); - } - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::ParseUserNameL -// --------------------------------------------------------------------------- -// -void CSvtSipUriParser::ParseUserNameL( const TDesC& aSipUri ) - { - // If uri does not specify schema, user name starts from the beginning of - // the uri. Otherwise additional calculations are done. - TInt userNameStartInd = 0; - TInt indexOfColon = aSipUri.Find( KColon() ); - if ( KErrNotFound != indexOfColon ) - { - userNameStartInd = aSipUri.Find( KColon() ) + KColon().Length(); - __ASSERT_ALWAYS( KColon().Length() <= userNameStartInd, - User::Leave( KErrArgument ) ); - } - - TInt userNameEndInd = aSipUri.Find( KAtSign() ) - KAtSign().Length(); - __ASSERT_ALWAYS( 0 <= userNameEndInd, User::Leave( KErrArgument ) ); - - TInt userNameLength = ( userNameEndInd - userNameStartInd ) + 1; - __ASSERT_ALWAYS( 0 < userNameLength, User::Leave( KErrArgument ) ); - - iUserName.Close(); - iUserName.Assign( aSipUri.Mid( userNameStartInd, userNameLength ).AllocL() ); - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::ParseDomainL -// --------------------------------------------------------------------------- -// -void CSvtSipUriParser::ParseDomainL( const TDesC& aSipUri ) - { - TInt hostNameStartInd = aSipUri.Find( KAtSign() ) + KAtSign().Length(); - __ASSERT_ALWAYS( KAtSign().Length() <= hostNameStartInd, - User::Leave( KErrArgument ) ); - - TInt hostNameEndInd = aSipUri.Length() - 1; - TInt hostNameLength = ( hostNameEndInd - hostNameStartInd ) + 1; - __ASSERT_ALWAYS( 0 < hostNameLength, User::Leave( KErrArgument ) ); - - iDomain.Close(); - iDomain.Assign( aSipUri.Mid( hostNameStartInd, hostNameLength ).AllocL() ); - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::ParsePrivateAddress -// --------------------------------------------------------------------------- -// -void CSvtSipUriParser::ParsePrivateAddress() - { - iUserName.Close(); - iUserName = KNullDesC(); - - iDomain.Close(); - iDomain = KNullDesC(); - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::AddressLength -// --------------------------------------------------------------------------- -// -TInt CSvtSipUriParser::AddressLength( const TDesC& aUserName, - const TDesC& aDomain, TDomainPartClippingSetting aClipSetting ) const - { - TInt addressLength( 0 ); - TBool isPhoneNumber( SvtPhoneNumberValidator::IsValidNumber( aUserName ) ); - switch ( aClipSetting ) - { - case ENoClipping: - addressLength = - aUserName.Length() + KAtSign().Length() + aDomain.Length(); - break; - - case EClipDomainIfNumber: - addressLength = isPhoneNumber - ? aUserName.Length() - : aUserName.Length() + KAtSign().Length() + aDomain.Length(); - break; - - case EClipDomain: - addressLength = aUserName.Length(); - break; - - default: - ASSERT( EFalse ); - } - - return addressLength; - } - - -// --------------------------------------------------------------------------- -// CSvtSipUriParser::IsAnonymousUri -// --------------------------------------------------------------------------- -// -TBool CSvtSipUriParser::IsAnonymousUri( const TDesC& aCandidate ) const - { - if ( aCandidate.Length() == 0 ) - { - return ETrue; - } - else - { - return EFalse; - } - }