mmsharing/mmshengine/src/musenguriparser.cpp
changeset 15 ccd8e69b5392
parent 2 b31261fd4e04
child 20 e8be2c2e049d
child 22 496ad160a278
equal deleted inserted replaced
2:b31261fd4e04 15:ccd8e69b5392
     1 /*
       
     2 * Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Parser for recipient's address
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "musenguriparser.h"
       
    20 #include "mussettings.h"
       
    21 #include "muslogger.h"
       
    22 
       
    23 #include <uri8.h>
       
    24 #include <charconv.h>
       
    25 //#include <f32file.h>
       
    26 #include <utf.h>
       
    27 #include <collate.h>
       
    28 
       
    29      
       
    30 // ============================ MEMBER FUNCTIONS ===============================
       
    31 
       
    32 
       
    33 // -----------------------------------------------------------------------------
       
    34 // UTF7 is not working, since it converts + as +-
       
    35 // -----------------------------------------------------------------------------
       
    36 //
       
    37 EXPORT_C TMusEngUriParser::TMusEngUriParser( const TDesC16& aUri )
       
    38     :iUriType( ENotParsed )
       
    39     {
       
    40     TBuf8<KMaxUriLength> buf;
       
    41 
       
    42     if ( CnvUtfConverter::ConvertFromUnicodeToUtf8( buf, aUri ) == 0 )
       
    43         {
       
    44         iUri = buf;
       
    45         }
       
    46     else
       
    47         {
       
    48         iUri = KNullDesC8();
       
    49         }
       
    50     }
       
    51 
       
    52 
       
    53 // ----------------------------------------------------------------------------- 
       
    54 //
       
    55 // -----------------------------------------------------------------------------
       
    56 //
       
    57 EXPORT_C TMusEngUriParser::TMusEngUriType TMusEngUriParser::UriType()
       
    58     {
       
    59     return iUriType;
       
    60     }
       
    61     
       
    62 
       
    63 // ----------------------------------------------------------------------------- 
       
    64 //
       
    65 // -----------------------------------------------------------------------------
       
    66 //
       
    67 EXPORT_C HBufC8* TMusEngUriParser::GetUri8L()
       
    68     {
       
    69     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::GetUri8L()" )
       
    70     
       
    71     __ASSERT_ALWAYS( UriType() != TMusEngUriParser::ENotParsed, 
       
    72                      User::Leave( KErrNotReady ) ); 
       
    73     
       
    74     HBufC8* uri8 = iUri.AllocL();
       
    75     
       
    76     MUS_LOG( "mus: [ENGINE]  <- TMusEngUriParser::GetUri8L()" )
       
    77 
       
    78     return uri8;
       
    79 
       
    80     }
       
    81 
       
    82 
       
    83 // -----------------------------------------------------------------------------
       
    84 // 
       
    85 // -----------------------------------------------------------------------------
       
    86 //
       
    87 EXPORT_C HBufC16* TMusEngUriParser::GetUri16L( TBool aPrefix )
       
    88     {
       
    89     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::GetUri16L()" )
       
    90     
       
    91     __ASSERT_ALWAYS( UriType() != TMusEngUriParser::ENotParsed, 
       
    92                      User::Leave( KErrNotReady ) ); 
       
    93 
       
    94     HBufC16* uri16 = NULL;
       
    95     
       
    96     if ( aPrefix )
       
    97         {
       
    98         uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( iUri );
       
    99         }
       
   100     else
       
   101         {
       
   102         uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( 
       
   103                                     iUri.Mid( KMusEngTelPrefix().Length() ) );
       
   104         }
       
   105     
       
   106     MUS_LOG( "mus: [ENGINE]  <- TMusEngUriParser::GetUri16L()" )
       
   107     
       
   108     return uri16;
       
   109    
       
   110     }
       
   111 
       
   112 
       
   113 // -----------------------------------------------------------------------------
       
   114 // 
       
   115 //
       
   116 // -----------------------------------------------------------------------------
       
   117 //
       
   118 EXPORT_C void TMusEngUriParser::ParseUriL()
       
   119     {
       
   120     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::ParseUriL()" )
       
   121     
       
   122     if ( iUri.Find( KMusEngAtSign ) >= 0 ) // Sip uri
       
   123         {
       
   124         HandleSipUriL();
       
   125         }
       
   126     else if ( iUri.Find( KMusEngPlusSign ) >= 0 ) // Tel uri
       
   127         {
       
   128         HandleTelUriL();
       
   129         }
       
   130     else
       
   131         {
       
   132         // check for variant
       
   133         if ( MultimediaSharingSettings::OperatorVariantSettingL()
       
   134                 != MusSettingsKeys::EOperatorSpecific )
       
   135             {// basic behaviour
       
   136             MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::ParseUriL() \
       
   137                     normal behaviour" )
       
   138             User::Leave( KErrCorrupt );
       
   139             }
       
   140         else
       
   141             { // variant behaviour(local tel uri)
       
   142             HandleLocalTelUriL();
       
   143             }
       
   144         }
       
   145     }
       
   146 
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 // 
       
   150 //
       
   151 // -----------------------------------------------------------------------------
       
   152 //
       
   153 void TMusEngUriParser::HandleSipUriL()
       
   154     {
       
   155     if ( iUri.FindF( KMusEngTelPrefix() ) == 0 )
       
   156         {
       
   157         // SIP uri with prefix "tel:"
       
   158         User::Leave( KErrCorrupt );
       
   159         }
       
   160     else if ( iUri.FindF( KMusEngSipsPrefix ) == 0 )
       
   161         {
       
   162         // Secure SIP uri with prefix
       
   163         iUri.Replace( 0, KMusEngSipsPrefix().Length(), KMusEngSipsPrefix() );
       
   164         }
       
   165     else if ( iUri.FindF( KMusEngSipPrefix() ) != 0 )
       
   166         {
       
   167         // SIP uri without prefix
       
   168         if ( iUri.Length() + KMusEngSipPrefix().Length() <=
       
   169              KMaxUriLength )
       
   170             {
       
   171             iUri.Insert( 0, KMusEngSipPrefix() );
       
   172             }
       
   173         else
       
   174             {
       
   175             User::Leave( KErrCorrupt );
       
   176             }
       
   177         }
       
   178     else
       
   179         {
       
   180         // SIP uri with prefix
       
   181         iUri.Replace( 0, KMusEngSipPrefix().Length(), KMusEngSipPrefix() );
       
   182         }
       
   183 
       
   184     TUriParser8 parser;
       
   185 
       
   186     User::LeaveIfError( parser.Parse( iUri ) );
       
   187 
       
   188     User::LeaveIfError( parser.Validate() );
       
   189     
       
   190     iUriType = TMusEngUriParser::ESip;
       
   191     }
       
   192     
       
   193    
       
   194    
       
   195    
       
   196 // -----------------------------------------------------------------------------
       
   197 // 
       
   198 //
       
   199 // -----------------------------------------------------------------------------
       
   200 //
       
   201 void TMusEngUriParser::HandleTelUriL()
       
   202     {
       
   203     // Remove leading and trailing whitespaces
       
   204     iUri.TrimAll();
       
   205     if ( iUri.FindF( KMusEngTelPrefix() ) != 0 )
       
   206         {
       
   207         // Tel uri without prefix
       
   208         if ( iUri.Length() + KMusEngTelPrefix().Length() <=
       
   209              KMaxUriLength )
       
   210             {
       
   211             iUri.Insert( 0, KMusEngTelPrefix() );
       
   212             }
       
   213         else
       
   214             {
       
   215             User::Leave( KErrCorrupt );
       
   216             }
       
   217         }
       
   218     else
       
   219         {
       
   220         //Tel uri with prefix
       
   221         iUri.Replace( 0, KMusEngTelPrefix().Length(), KMusEngTelPrefix() );
       
   222         }
       
   223 
       
   224     TInt index = KMusEngTelPrefix().Length() + KMusEngPlusSign().Length();
       
   225 
       
   226     // Remove whitespaces and extra chracters like parentheses. Check that the
       
   227     // rest characters are digits
       
   228     while ( index < iUri.Length() )
       
   229         {
       
   230         TChar character = iUri[ index ];
       
   231         if ( character.IsAlpha() )
       
   232             {
       
   233             User::Leave( KErrCorrupt ); // letters will not be accepted
       
   234             }
       
   235         else if ( !character.IsDigit() )
       
   236             {
       
   237             iUri.Delete( index, 1 ); // extra characters will be removed
       
   238             }
       
   239         else
       
   240             {
       
   241             ++index; // Valid tel URI so far
       
   242             }
       
   243         }
       
   244 
       
   245     iUriType = TMusEngUriParser::ETel;
       
   246     }
       
   247     
       
   248     
       
   249 // -----------------------------------------------------------------------------
       
   250 // 
       
   251 //
       
   252 // -----------------------------------------------------------------------------
       
   253 //
       
   254 void TMusEngUriParser::HandleLocalTelUriL()
       
   255     {
       
   256     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::ParseUriL() \
       
   257             variant behaviour" )
       
   258     if ( iUri.FindF( KMusEngTelPrefix() ) != 0 )
       
   259         {
       
   260         // local tel uri without prefix
       
   261         if ( iUri.Length() + KMusEngTelPrefix().Length() <=
       
   262              KMaxUriLength )
       
   263             {
       
   264             iUri.Insert( 0, KMusEngTelPrefix() );
       
   265             }
       
   266         else
       
   267             {
       
   268             User::Leave( KErrCorrupt );
       
   269             }
       
   270         }
       
   271     else
       
   272         {
       
   273         //Tel uri with prefix
       
   274         iUri.Replace(
       
   275                 0,
       
   276                 KMusEngTelPrefix().Length(),
       
   277                 KMusEngTelPrefix() );
       
   278         }
       
   279 
       
   280     TInt index = KMusEngTelPrefix().Length();
       
   281 
       
   282     // check if all chars are digits
       
   283     while ( index < iUri.Length() )
       
   284         {
       
   285         TChar character = iUri[ index ];
       
   286         if ( !character.IsDigit() )
       
   287             {
       
   288             User::Leave( KErrCorrupt );
       
   289             }
       
   290         ++index;
       
   291         }
       
   292         
       
   293     iUriType = TMusEngUriParser::ETel;
       
   294     }
       
   295     
       
   296     
       
   297 // End of file