tsrc/musenginestub/src/musenguriparser.cpp
branchRCL_3
changeset 33 bc78a40cd63c
parent 32 73a1feb507fb
child 35 6c57ef9392d2
equal deleted inserted replaced
32:73a1feb507fb 33:bc78a40cd63c
     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( KMusEngSipPrefix() ) != 0 )
       
   161         {
       
   162         // SIP uri without prefix
       
   163         if ( iUri.Length() + KMusEngSipPrefix().Length() <=
       
   164              KMaxUriLength )
       
   165             {
       
   166             iUri.Insert( 0, KMusEngSipPrefix() );
       
   167             }
       
   168         else
       
   169             {
       
   170             User::Leave( KErrCorrupt );
       
   171             }
       
   172         }
       
   173     else
       
   174         {
       
   175         // SIP uri with prefix
       
   176         iUri.Replace( 0, KMusEngSipPrefix().Length(), KMusEngSipPrefix() );
       
   177         }
       
   178 
       
   179     TUriParser8 parser;
       
   180 
       
   181     User::LeaveIfError( parser.Parse( iUri ) );
       
   182 
       
   183     User::LeaveIfError( parser.Validate() );
       
   184     
       
   185     iUriType = TMusEngUriParser::ESip;
       
   186     }
       
   187     
       
   188    
       
   189    
       
   190    
       
   191 // -----------------------------------------------------------------------------
       
   192 // 
       
   193 //
       
   194 // -----------------------------------------------------------------------------
       
   195 //
       
   196 void TMusEngUriParser::HandleTelUriL()
       
   197     {
       
   198     if ( iUri.FindF( KMusEngTelPrefix() ) != 0 )
       
   199         {
       
   200         // Tel uri without prefix
       
   201         if ( iUri.Length() + KMusEngTelPrefix().Length() <=
       
   202              KMaxUriLength )
       
   203             {
       
   204             iUri.Insert( 0, KMusEngTelPrefix() );
       
   205             }
       
   206         else
       
   207             {
       
   208             User::Leave( KErrCorrupt );
       
   209             }
       
   210         }
       
   211     else
       
   212         {
       
   213         //Tel uri with prefix
       
   214         iUri.Replace( 0, KMusEngTelPrefix().Length(), KMusEngTelPrefix() );
       
   215         }
       
   216 
       
   217     TInt index = KMusEngTelPrefix().Length() + KMusEngPlusSign().Length();
       
   218 
       
   219     while ( index < iUri.Length() )
       
   220         {
       
   221         TChar character = iUri[ index ];
       
   222         if ( !character.IsDigit() )
       
   223             {
       
   224             User::Leave( KErrCorrupt );
       
   225             }
       
   226         ++index;
       
   227         }
       
   228 
       
   229     iUriType = TMusEngUriParser::ETel;
       
   230     }
       
   231     
       
   232     
       
   233 // -----------------------------------------------------------------------------
       
   234 // 
       
   235 //
       
   236 // -----------------------------------------------------------------------------
       
   237 //
       
   238 void TMusEngUriParser::HandleLocalTelUriL()
       
   239     {
       
   240     MUS_LOG( "mus: [ENGINE]  -> TMusEngUriParser::ParseUriL() \
       
   241             variant behaviour" )
       
   242     if ( iUri.FindF( KMusEngTelPrefix() ) != 0 )
       
   243         {
       
   244         // local tel uri without prefix
       
   245         if ( iUri.Length() + KMusEngTelPrefix().Length() <=
       
   246              KMaxUriLength )
       
   247             {
       
   248             iUri.Insert( 0, KMusEngTelPrefix() );
       
   249             }
       
   250         else
       
   251             {
       
   252             User::Leave( KErrCorrupt );
       
   253             }
       
   254         }
       
   255     else
       
   256         {
       
   257         //Tel uri with prefix
       
   258         iUri.Replace(
       
   259                 0,
       
   260                 KMusEngTelPrefix().Length(),
       
   261                 KMusEngTelPrefix() );
       
   262         }
       
   263 
       
   264     TInt index = KMusEngTelPrefix().Length();
       
   265 
       
   266     // check if all chars are digits
       
   267     while ( index < iUri.Length() )
       
   268         {
       
   269         TChar character = iUri[ index ];
       
   270         if ( !character.IsDigit() )
       
   271             {
       
   272             User::Leave( KErrCorrupt );
       
   273             }
       
   274         ++index;
       
   275         }
       
   276         
       
   277     iUriType = TMusEngUriParser::ETel;
       
   278     }
       
   279     
       
   280     
       
   281 // End of file