--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/svtlogging/src/csvtsipuriparser.cpp Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,370 @@
+/*
+* 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;
+ }
+ }