diff -r 33a5d2bbf6fc -r 73a1feb507fb tsrc/musenginestub/src/musenguriparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/musenginestub/src/musenguriparser.cpp Tue Aug 31 15:12:07 2010 +0300 @@ -0,0 +1,281 @@ +/* +* Copyright (c) 2005-2006 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: Parser for recipient's address +* +*/ + + +#include "musenguriparser.h" +#include "mussettings.h" +#include "muslogger.h" + +#include +#include +//#include +#include +#include + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// UTF7 is not working, since it converts + as +- +// ----------------------------------------------------------------------------- +// +EXPORT_C TMusEngUriParser::TMusEngUriParser( const TDesC16& aUri ) + :iUriType( ENotParsed ) + { + TBuf8 buf; + + if ( CnvUtfConverter::ConvertFromUnicodeToUtf8( buf, aUri ) == 0 ) + { + iUri = buf; + } + else + { + iUri = KNullDesC8(); + } + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +EXPORT_C TMusEngUriParser::TMusEngUriType TMusEngUriParser::UriType() + { + return iUriType; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC8* TMusEngUriParser::GetUri8L() + { + MUS_LOG( "mus: [ENGINE] -> TMusEngUriParser::GetUri8L()" ) + + __ASSERT_ALWAYS( UriType() != TMusEngUriParser::ENotParsed, + User::Leave( KErrNotReady ) ); + + HBufC8* uri8 = iUri.AllocL(); + + MUS_LOG( "mus: [ENGINE] <- TMusEngUriParser::GetUri8L()" ) + + return uri8; + + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC16* TMusEngUriParser::GetUri16L( TBool aPrefix ) + { + MUS_LOG( "mus: [ENGINE] -> TMusEngUriParser::GetUri16L()" ) + + __ASSERT_ALWAYS( UriType() != TMusEngUriParser::ENotParsed, + User::Leave( KErrNotReady ) ); + + HBufC16* uri16 = NULL; + + if ( aPrefix ) + { + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( iUri ); + } + else + { + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( + iUri.Mid( KMusEngTelPrefix().Length() ) ); + } + + MUS_LOG( "mus: [ENGINE] <- TMusEngUriParser::GetUri16L()" ) + + return uri16; + + } + + +// ----------------------------------------------------------------------------- +// +// +// ----------------------------------------------------------------------------- +// +EXPORT_C void TMusEngUriParser::ParseUriL() + { + MUS_LOG( "mus: [ENGINE] -> TMusEngUriParser::ParseUriL()" ) + + if ( iUri.Find( KMusEngAtSign ) >= 0 ) // Sip uri + { + HandleSipUriL(); + } + else if ( iUri.Find( KMusEngPlusSign ) >= 0 ) // Tel uri + { + HandleTelUriL(); + } + else + { + // check for variant + if ( MultimediaSharingSettings::OperatorVariantSettingL() + != MusSettingsKeys::EOperatorSpecific ) + {// basic behaviour + MUS_LOG( "mus: [ENGINE] -> TMusEngUriParser::ParseUriL() \ + normal behaviour" ) + User::Leave( KErrCorrupt ); + } + else + { // variant behaviour(local tel uri) + HandleLocalTelUriL(); + } + } + } + + +// ----------------------------------------------------------------------------- +// +// +// ----------------------------------------------------------------------------- +// +void TMusEngUriParser::HandleSipUriL() + { + if ( iUri.FindF( KMusEngTelPrefix() ) == 0 ) + { + // SIP uri with prefix "tel:" + User::Leave( KErrCorrupt ); + } + else if ( iUri.FindF( KMusEngSipPrefix() ) != 0 ) + { + // SIP uri without prefix + if ( iUri.Length() + KMusEngSipPrefix().Length() <= + KMaxUriLength ) + { + iUri.Insert( 0, KMusEngSipPrefix() ); + } + else + { + User::Leave( KErrCorrupt ); + } + } + else + { + // SIP uri with prefix + iUri.Replace( 0, KMusEngSipPrefix().Length(), KMusEngSipPrefix() ); + } + + TUriParser8 parser; + + User::LeaveIfError( parser.Parse( iUri ) ); + + User::LeaveIfError( parser.Validate() ); + + iUriType = TMusEngUriParser::ESip; + } + + + + +// ----------------------------------------------------------------------------- +// +// +// ----------------------------------------------------------------------------- +// +void TMusEngUriParser::HandleTelUriL() + { + if ( iUri.FindF( KMusEngTelPrefix() ) != 0 ) + { + // Tel uri without prefix + if ( iUri.Length() + KMusEngTelPrefix().Length() <= + KMaxUriLength ) + { + iUri.Insert( 0, KMusEngTelPrefix() ); + } + else + { + User::Leave( KErrCorrupt ); + } + } + else + { + //Tel uri with prefix + iUri.Replace( 0, KMusEngTelPrefix().Length(), KMusEngTelPrefix() ); + } + + TInt index = KMusEngTelPrefix().Length() + KMusEngPlusSign().Length(); + + while ( index < iUri.Length() ) + { + TChar character = iUri[ index ]; + if ( !character.IsDigit() ) + { + User::Leave( KErrCorrupt ); + } + ++index; + } + + iUriType = TMusEngUriParser::ETel; + } + + +// ----------------------------------------------------------------------------- +// +// +// ----------------------------------------------------------------------------- +// +void TMusEngUriParser::HandleLocalTelUriL() + { + MUS_LOG( "mus: [ENGINE] -> TMusEngUriParser::ParseUriL() \ + variant behaviour" ) + if ( iUri.FindF( KMusEngTelPrefix() ) != 0 ) + { + // local tel uri without prefix + if ( iUri.Length() + KMusEngTelPrefix().Length() <= + KMaxUriLength ) + { + iUri.Insert( 0, KMusEngTelPrefix() ); + } + else + { + User::Leave( KErrCorrupt ); + } + } + else + { + //Tel uri with prefix + iUri.Replace( + 0, + KMusEngTelPrefix().Length(), + KMusEngTelPrefix() ); + } + + TInt index = KMusEngTelPrefix().Length(); + + // check if all chars are digits + while ( index < iUri.Length() ) + { + TChar character = iUri[ index ]; + if ( !character.IsDigit() ) + { + User::Leave( KErrCorrupt ); + } + ++index; + } + + iUriType = TMusEngUriParser::ETel; + } + + +// End of file