mmsharing/mmshengine/src/musenguriparser.cpp
changeset 22 496ad160a278
equal deleted inserted replaced
15:ccd8e69b5392 22:496ad160a278
       
     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 <utf.h>
       
    26 #include <collate.h>
       
    27 
       
    28      
       
    29 // ============================ MEMBER FUNCTIONS ===============================
       
    30 
       
    31 
       
    32 // -----------------------------------------------------------------------------
       
    33 // UTF7 is not working, since it converts + as +-
       
    34 // -----------------------------------------------------------------------------
       
    35 //
       
    36 TMusEngUriParser::TMusEngUriParser( const TDesC16& aUri )
       
    37     :iUriType( ENotParsed )
       
    38     {
       
    39     TBuf8<KMaxUriLength> buf;
       
    40 
       
    41     if ( CnvUtfConverter::ConvertFromUnicodeToUtf8( buf, aUri ) == 0 )
       
    42         {
       
    43         iUri = buf;
       
    44         }
       
    45     else
       
    46         {
       
    47         iUri = KNullDesC8();
       
    48         }
       
    49     }
       
    50 
       
    51 // ----------------------------------------------------------------------------- 
       
    52 //
       
    53 // -----------------------------------------------------------------------------
       
    54 //
       
    55 TMusEngUriParser::TMusEngUriType TMusEngUriParser::UriType()
       
    56     {
       
    57     return iUriType;
       
    58     }
       
    59 
       
    60 // ----------------------------------------------------------------------------- 
       
    61 //
       
    62 // -----------------------------------------------------------------------------
       
    63 //
       
    64 HBufC8* TMusEngUriParser::GetUri8L()
       
    65     {
       
    66     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::GetUri8L()" )
       
    67     
       
    68     __ASSERT_ALWAYS( UriType() != TMusEngUriParser::ENotParsed, 
       
    69                      User::Leave( KErrNotReady ) ); 
       
    70     
       
    71     HBufC8* uri8 = iUri.AllocL();
       
    72     
       
    73     MUS_LOG( "mus: [ENGINE]  <- TMusEngUriParser::GetUri8L()" )
       
    74 
       
    75     return uri8;
       
    76     }
       
    77 
       
    78 // -----------------------------------------------------------------------------
       
    79 // 
       
    80 // -----------------------------------------------------------------------------
       
    81 //
       
    82 HBufC16* TMusEngUriParser::GetUri16L( TBool aPrefix )
       
    83     {
       
    84     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::GetUri16L()" )
       
    85     
       
    86     __ASSERT_ALWAYS( UriType() != TMusEngUriParser::ENotParsed, 
       
    87                      User::Leave( KErrNotReady ) ); 
       
    88 
       
    89     HBufC16* uri16 = NULL;
       
    90     
       
    91     if ( aPrefix )
       
    92         {
       
    93         uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( iUri );
       
    94         }
       
    95     else
       
    96         {
       
    97         uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( 
       
    98                                     iUri.Mid( KMusEngTelPrefix().Length() ) );
       
    99         }
       
   100     
       
   101     MUS_LOG( "mus: [ENGINE]  <- TMusEngUriParser::GetUri16L()" )
       
   102     
       
   103     return uri16;
       
   104     }
       
   105 
       
   106 // ----------------------------------------------------------------------------- 
       
   107 //
       
   108 // -----------------------------------------------------------------------------
       
   109 //
       
   110 void TMusEngUriParser::ParseUriL()
       
   111     {
       
   112     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::ParseUriL()" )
       
   113     
       
   114     if ( iUri.Find( KMusEngAtSign ) >= 0 ) // Sip uri
       
   115         {
       
   116         HandleSipUriL();
       
   117         }
       
   118     else if ( iUri.Find( KMusEngPlusSign ) >= 0 ) // Tel uri
       
   119         {
       
   120         HandleTelUriL();
       
   121         }
       
   122     else
       
   123         {
       
   124         // check for variant
       
   125         if ( MultimediaSharingSettings::OperatorVariantSettingL()
       
   126                 != MusSettingsKeys::EOperatorSpecific )
       
   127             {// basic behaviour
       
   128             MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::ParseUriL() \
       
   129                     normal behaviour" )
       
   130             User::Leave( KErrArgument );        
       
   131             }
       
   132         else
       
   133             { // variant behaviour(local tel uri)
       
   134             HandleLocalTelUriL();
       
   135             }
       
   136         }
       
   137     }
       
   138 
       
   139 // -----------------------------------------------------------------------------
       
   140 //
       
   141 // -----------------------------------------------------------------------------
       
   142 //
       
   143 void TMusEngUriParser::HandleSipUriL()
       
   144     {
       
   145     if ( iUri.FindF( KMusEngTelPrefix() ) == 0 )
       
   146         {
       
   147         // SIP uri with prefix "tel:"
       
   148         User::Leave( KErrCorrupt );
       
   149         }
       
   150     else if ( iUri.FindF( KMusEngSipsPrefix ) == 0 )
       
   151         {
       
   152         // Secure SIP uri with prefix
       
   153         iUri.Replace( 0, KMusEngSipsPrefix().Length(), KMusEngSipsPrefix() );
       
   154         }
       
   155     else if ( iUri.FindF( KMusEngSipPrefix() ) != 0 )
       
   156         {
       
   157         // SIP uri without prefix
       
   158         if ( iUri.Length() + KMusEngSipPrefix().Length() <=
       
   159              KMaxUriLength )
       
   160             {
       
   161             iUri.Insert( 0, KMusEngSipPrefix() );
       
   162             }
       
   163         else
       
   164             {
       
   165             User::Leave( KErrCorrupt );
       
   166             }
       
   167         }
       
   168     else
       
   169         {
       
   170         // SIP uri with prefix
       
   171         iUri.Replace( 0, KMusEngSipPrefix().Length(), KMusEngSipPrefix() );
       
   172         }
       
   173 
       
   174     TUriParser8 parser;
       
   175 
       
   176     User::LeaveIfError( parser.Parse( iUri ) );
       
   177 
       
   178     User::LeaveIfError( parser.Validate() );
       
   179     
       
   180     iUriType = TMusEngUriParser::ESip;
       
   181     }
       
   182    
       
   183 // ----------------------------------------------------------------------------- 
       
   184 //
       
   185 // -----------------------------------------------------------------------------
       
   186 //
       
   187 void TMusEngUriParser::HandleTelUriL()
       
   188     {
       
   189     iUri.TrimAll();
       
   190     if ( iUri.FindF( KMusEngTelPrefix() ) != 0 )
       
   191         {
       
   192         // Tel uri without prefix
       
   193         if ( iUri.Length() + KMusEngTelPrefix().Length() <=
       
   194              KMaxUriLength )
       
   195             {
       
   196             iUri.Insert( 0, KMusEngTelPrefix() );
       
   197             }
       
   198         else
       
   199             {
       
   200             User::Leave( KErrCorrupt );
       
   201             }
       
   202         }
       
   203     else
       
   204         {
       
   205         //Tel uri with prefix
       
   206         iUri.Replace( 0, KMusEngTelPrefix().Length(), KMusEngTelPrefix() );
       
   207         }
       
   208 
       
   209     TInt index = KMusEngTelPrefix().Length() + KMusEngPlusSign().Length();
       
   210 
       
   211     while ( index < iUri.Length() )
       
   212         {
       
   213         TChar character = iUri[ index ];
       
   214         if ( character.IsAlpha() )
       
   215             {
       
   216             User::Leave( KErrCorrupt ); // letters will not be accepted
       
   217             }
       
   218         else if ( !character.IsDigit() )
       
   219             {
       
   220             iUri.Delete( index, 1 ); // extra characters will be removed
       
   221             }
       
   222         else
       
   223             {
       
   224             ++index; // Valid tel URI so far
       
   225             }
       
   226         }
       
   227 
       
   228     iUriType = TMusEngUriParser::ETel;
       
   229     }
       
   230     
       
   231 // -----------------------------------------------------------------------------
       
   232 //
       
   233 // -----------------------------------------------------------------------------
       
   234 //
       
   235 void TMusEngUriParser::HandleLocalTelUriL()
       
   236     {
       
   237     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::ParseUriL() \
       
   238             variant behaviour" )
       
   239     if ( iUri.FindF( KMusEngTelPrefix() ) != 0 )
       
   240         {
       
   241         // local tel uri without prefix
       
   242         if ( iUri.Length() + KMusEngTelPrefix().Length() <= KMaxUriLength )
       
   243             {
       
   244             iUri.Insert( 0, KMusEngTelPrefix() );
       
   245             }
       
   246         else
       
   247             {
       
   248             User::Leave( KErrCorrupt );
       
   249             }
       
   250         }
       
   251     else
       
   252         {
       
   253         //Tel uri with prefix
       
   254         iUri.Replace( 0, KMusEngTelPrefix().Length(), KMusEngTelPrefix() );
       
   255         }
       
   256 
       
   257     TInt index = KMusEngTelPrefix().Length();
       
   258 
       
   259     // check if all chars are digits
       
   260     while ( index < iUri.Length() )
       
   261         {
       
   262         TChar character = iUri[ index ];
       
   263         if ( !character.IsDigit() )
       
   264             {
       
   265             User::Leave( KErrCorrupt );
       
   266             }
       
   267         ++index;
       
   268         }
       
   269         
       
   270     iUriType = TMusEngUriParser::ETel;
       
   271     }
       
   272 
       
   273 // End of file