--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshengine/src/musenguriparser.cpp Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,297 @@
+/*
+* 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 <uri8.h>
+#include <charconv.h>
+//#include <f32file.h>
+#include <utf.h>
+#include <collate.h>
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// UTF7 is not working, since it converts + as +-
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TMusEngUriParser::TMusEngUriParser( const TDesC16& aUri )
+ :iUriType( ENotParsed )
+ {
+ TBuf8<KMaxUriLength> 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( KMusEngSipsPrefix ) == 0 )
+ {
+ // Secure SIP uri with prefix
+ iUri.Replace( 0, KMusEngSipsPrefix().Length(), KMusEngSipsPrefix() );
+ }
+ 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()
+ {
+ // Remove leading and trailing whitespaces
+ iUri.TrimAll();
+ 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();
+
+ // Remove whitespaces and extra chracters like parentheses. Check that the
+ // rest characters are digits
+ while ( index < iUri.Length() )
+ {
+ TChar character = iUri[ index ];
+ if ( character.IsAlpha() )
+ {
+ User::Leave( KErrCorrupt ); // letters will not be accepted
+ }
+ else if ( !character.IsDigit() )
+ {
+ iUri.Delete( index, 1 ); // extra characters will be removed
+ }
+ else
+ {
+ ++index; // Valid tel URI so far
+ }
+ }
+
+ 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