| 65 |      1 | /*
 | 
|  |      2 | * Copyright (c) 2002 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 the License "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: 
 | 
|  |     15 | *      Utilities.
 | 
|  |     16 | *      
 | 
|  |     17 | *
 | 
|  |     18 | */
 | 
|  |     19 | 
 | 
|  |     20 | 
 | 
|  |     21 | // INCLUDE FILES
 | 
|  |     22 | 
 | 
|  |     23 | #include "logger.h"
 | 
|  |     24 | 
 | 
|  |     25 | #include <e32base.h>
 | 
|  |     26 | #include <favouriteslimits.h>
 | 
|  |     27 | #include <favouritesitem.h>
 | 
|  |     28 | #include <uri16.h>
 | 
|  |     29 | #include <SysUtil.h>
 | 
|  |     30 | #include <ErrorUi.h>
 | 
|  |     31 | 
 | 
|  |     32 | #include "BrowserUtil.h"
 | 
|  |     33 | #include "Browser.hrh"
 | 
|  |     34 | 
 | 
|  |     35 | #include "CommonConstants.h"
 | 
|  |     36 | #include "ApiProvider.h"
 | 
|  |     37 | #include <commdb.h>
 | 
|  |     38 | #include <aputils.h>
 | 
|  |     39 | #include "commsmodel.h"
 | 
|  |     40 | #include "preferences.h"
 | 
|  |     41 | #include <FeatMgr.h>
 | 
|  |     42 | 
 | 
|  |     43 | // ================= MEMBER FUNCTIONS =======================
 | 
|  |     44 | 
 | 
|  |     45 | // ---------------------------------------------------------
 | 
|  |     46 | // Util::Panic
 | 
|  |     47 | // ---------------------------------------------------------
 | 
|  |     48 | //
 | 
|  |     49 | void Util::Panic( Util::TPanicReason aReason )
 | 
|  |     50 |     {
 | 
|  |     51 |     _LIT( KAppName, "WmlBrowser" );
 | 
|  |     52 | 	User::Panic( KAppName, aReason );
 | 
|  |     53 |     }
 | 
|  |     54 | 
 | 
|  |     55 | // ---------------------------------------------------------
 | 
|  |     56 | // Util::SanityCheckL
 | 
|  |     57 | // ---------------------------------------------------------
 | 
|  |     58 | //
 | 
|  |     59 | void Util::SanityCheckL()
 | 
|  |     60 |     {
 | 
|  |     61 | #ifdef _DEBUG
 | 
|  |     62 | 
 | 
|  |     63 |     // Check if the Engine limits for bookmarks match editing control sizes.
 | 
|  |     64 |     // Cannot do this compile time, because Engine limits are TInts instead of
 | 
|  |     65 |     // #define-s, so we must do run-time check (debug build only). Naturally,
 | 
|  |     66 |     // the conditional expression here is constant. Avoid warnings by using
 | 
|  |     67 |     // dummy variables (maxEngine...).
 | 
|  |     68 |     TInt maxEngineUrl = KFavouritesMaxUrl;
 | 
|  |     69 |     TInt maxEngineUsername = KFavouritesMaxUserName;
 | 
|  |     70 |     TInt maxEnginePassword = KFavouritesMaxPassword;
 | 
|  |     71 |     TInt maxEngineBookmarkName = KFavouritesMaxName;
 | 
|  |     72 | 
 | 
|  |     73 |     if (
 | 
|  |     74 |         KFavouritesMaxUrlDefine != maxEngineUrl ||
 | 
|  |     75 |         KFavouritesMaxUsernameDefine != maxEngineUsername ||
 | 
|  |     76 |         KFavouritesMaxPasswordDefine != maxEnginePassword ||
 | 
|  |     77 |         KFavouritesMaxBookmarkNameDefine != maxEngineBookmarkName
 | 
|  |     78 |        )
 | 
|  |     79 |         {
 | 
|  |     80 |         Panic( ELimitMismatch );
 | 
|  |     81 |         }
 | 
|  |     82 | 
 | 
|  |     83 | #endif
 | 
|  |     84 |     }
 | 
|  |     85 | 
 | 
|  |     86 | // ---------------------------------------------------------
 | 
|  |     87 | // Util::RetreiveUsernameAndPasswordFromUrlL
 | 
|  |     88 | // ---------------------------------------------------------
 | 
|  |     89 | //
 | 
|  |     90 | void Util::RetreiveUsernameAndPasswordFromUrlL
 | 
|  |     91 | 	( const TDesC& aUrl, CFavouritesItem& aItem )
 | 
|  |     92 | 	{
 | 
|  |     93 |     /// Empty string.
 | 
|  |     94 |     _LIT( KEmptyBuf, "" ); 
 | 
|  |     95 | /*	CUrl* url = NULL;
 | 
|  |     96 | 	TRAPD( error, url = CUrl::NewL( aUrl ) );
 | 
|  |     97 | 	if( error == KErrNone )
 | 
|  |     98 | 		{ 
 | 
|  |     99 | 		CleanupStack::PushL( url );
 | 
|  |    100 | */
 | 
|  |    101 |     TUriParser16 url;
 | 
|  |    102 |     url.Parse(aUrl);
 | 
|  |    103 | 	TPtrC userInfo = url.Extract( EUriUserinfo );
 | 
|  |    104 |     TPtrC userName ;
 | 
|  |    105 |     TPtrC pass ;
 | 
|  |    106 |     userName.Set( KEmptyBuf );
 | 
|  |    107 |     pass.Set( KEmptyBuf );
 | 
|  |    108 | 	if( userInfo.Length() )
 | 
|  |    109 |         { 
 | 
|  |    110 |         TInt position = userInfo.LocateF( ':' );
 | 
|  |    111 | 	    if( ( position != KErrNotFound ) )
 | 
|  |    112 |             {
 | 
|  |    113 |             userName.Set( userInfo.Left( position ) );
 | 
|  |    114 | 	        aItem.SetUserNameL( userName );
 | 
|  |    115 |             pass.Set( userInfo.Right( userInfo.Length()-position-1  ) );
 | 
|  |    116 |     		aItem.SetPasswordL( pass );
 | 
|  |    117 |             }
 | 
|  |    118 | 	    }
 | 
|  |    119 | 
 | 
|  |    120 | 
 | 
|  |    121 | 	HBufC* parsedUrl = HBufC::NewLC( url.UriDes().Length() );
 | 
|  |    122 | 	// get the pure Url (without username & password)
 | 
|  |    123 | 	TInt position = url.UriDes().LocateF( '@' );
 | 
|  |    124 | 	if( ( position != KErrNotFound ) && ( userName.Length() )
 | 
|  |    125 |            && ( url.UriDes().Find(userInfo) != KErrNotFound) )
 | 
|  |    126 | 		{
 | 
|  |    127 | 		parsedUrl->Des().Copy( url.Extract( EUriScheme ) );
 | 
|  |    128 | 		_LIT( KDoubleSlash, "://" );
 | 
|  |    129 | 		parsedUrl->Des().Append( KDoubleSlash );
 | 
|  |    130 | 		parsedUrl->Des().Append( url.UriDes().Right
 | 
|  |    131 | 			( url.UriDes().Length() - position - 1  ) );
 | 
|  |    132 | 		}
 | 
|  |    133 | 	else
 | 
|  |    134 | 		{
 | 
|  |    135 | 		parsedUrl->Des().Copy( url.UriDes() );
 | 
|  |    136 |     	}
 | 
|  |    137 |     if( parsedUrl->Length() )
 | 
|  |    138 | 		{
 | 
|  |    139 | 		aItem.SetUrlL( *parsedUrl );
 | 
|  |    140 | 		}
 | 
|  |    141 | 	CleanupStack::PopAndDestroy( 1 ); //  parsedUrl
 | 
|  |    142 | 	}
 | 
|  |    143 | 
 | 
|  |    144 | 
 | 
|  |    145 | // ---------------------------------------------------------
 | 
|  |    146 | // Util::StripUrl
 | 
|  |    147 | // ---------------------------------------------------------
 | 
|  |    148 | //
 | 
|  |    149 | TPtrC Util::StripUrl( const TDesC& aUrl )
 | 
|  |    150 | 	{
 | 
|  |    151 | 	TUriParser url;
 | 
|  |    152 | 	TInt startPos;
 | 
|  |    153 | 	TInt endPos;
 | 
|  |    154 | 	
 | 
|  |    155 | 	url.Parse ( aUrl );
 | 
|  |    156 | 
 | 
|  |    157 | 	//Return parsed url only if we have a scheme. Otherwise return full url
 | 
|  |    158 | 	if ( url.IsPresent ( EUriScheme ) )
 | 
|  |    159 | 		{
 | 
|  |    160 | 		startPos = url.Extract ( EUriScheme ).Length();
 | 
|  |    161 | 		//jump over the :// chars (or a mistyped version like :/ or :)
 | 
|  |    162 | 		while ( startPos < url.UriDes().Length() &&
 | 
|  |    163 | 				( aUrl.Mid( startPos, 1) == _L("/") || 
 | 
|  |    164 | 				  aUrl.Mid( startPos, 1) == _L(":") ) )
 | 
|  |    165 | 			{
 | 
|  |    166 | 			startPos++;
 | 
|  |    167 | 			}
 | 
|  |    168 | 		endPos = url.UriDes().Length() - url.Extract ( EUriFragment ).Length();
 | 
|  |    169 | 		}
 | 
|  |    170 | 	else
 | 
|  |    171 | 		{
 | 
|  |    172 | 		startPos = 0;
 | 
|  |    173 | 		endPos = url.UriDes().Length();
 | 
|  |    174 | 		}
 | 
|  |    175 | 	
 | 
|  |    176 | 	return aUrl.Mid( startPos, endPos - startPos );
 | 
|  |    177 | 	}
 | 
|  |    178 | 
 | 
|  |    179 | // ---------------------------------------------------------
 | 
|  |    180 | // Util::UrlFromFileNameLC
 | 
|  |    181 | // ---------------------------------------------------------
 | 
|  |    182 | //
 | 
|  |    183 | HBufC* Util::UrlFromFileNameLC( const TDesC& aFileName )
 | 
|  |    184 | 	{
 | 
|  |    185 |     HBufC* buf = HBufC::NewLC
 | 
|  |    186 |         ( aFileName.Length() + KWmlValueFileSlashSlashSlashStr().Length() );
 | 
|  |    187 | 
 | 
|  |    188 |     HBufC* url = HBufC::NewLC
 | 
|  |    189 |         ( aFileName.Length() + KWmlValueFileSlashSlashSlashStr().Length() );
 | 
|  |    190 |     url->Des().Append( KWmlValueFileSlashSlashSlashStr );
 | 
|  |    191 |     url->Des().Append( aFileName );
 | 
|  |    192 | 
 | 
|  |    193 |     for ( TInt i = 0; i < url->Length(); i++ )
 | 
|  |    194 |         {
 | 
|  |    195 |         if ( !url->Mid( i, 1 ).Compare( KWmlBackSlash ) )
 | 
|  |    196 |             {
 | 
|  |    197 |             buf->Des().Append( TChar('/') );
 | 
|  |    198 |             }
 | 
|  |    199 |         else
 | 
|  |    200 |             {
 | 
|  |    201 |             buf->Des().Append( url->Mid( i, 1 ) );
 | 
|  |    202 |             }
 | 
|  |    203 |         }
 | 
|  |    204 |     CleanupStack::PopAndDestroy();  // url
 | 
|  |    205 |     return buf;
 | 
|  |    206 | 	}
 | 
|  |    207 | 
 | 
|  |    208 | // ---------------------------------------------------------
 | 
|  |    209 | // Util::FFSSpaceBelowCriticalLevelL
 | 
|  |    210 | // ---------------------------------------------------------
 | 
|  |    211 | //
 | 
|  |    212 | TBool Util::FFSSpaceBelowCriticalLevelL
 | 
|  |    213 |         ( TBool aShowErrorNote, TInt aBytesToWrite /*=0*/ )
 | 
|  |    214 |     {
 | 
|  |    215 |     TBool ret( EFalse );
 | 
|  |    216 |     if ( SysUtil::FFSSpaceBelowCriticalLevelL
 | 
|  |    217 |                 ( &(CCoeEnv::Static()->FsSession()), aBytesToWrite ) )
 | 
|  |    218 |         {
 | 
|  |    219 |         ret = ETrue;
 | 
|  |    220 |         if ( aShowErrorNote )
 | 
|  |    221 |             {
 | 
|  |    222 |             CErrorUI* errorUi = CErrorUI::NewLC( *(CCoeEnv::Static()) );
 | 
|  |    223 |             errorUi->ShowGlobalErrorNoteL( KErrDiskFull );
 | 
|  |    224 |             CleanupStack::PopAndDestroy();  // errorUi
 | 
|  |    225 |             }
 | 
|  |    226 |         }
 | 
|  |    227 |     return ret;
 | 
|  |    228 |     }
 | 
|  |    229 | 
 | 
|  |    230 | // ---------------------------------------------------------
 | 
|  |    231 | // Util::CheckBookmarkApL
 | 
|  |    232 | // ---------------------------------------------------------
 | 
|  |    233 | //
 | 
|  |    234 | TBool Util::CheckBookmarkApL(
 | 
|  |    235 |         const MApiProvider& aApiProvider,
 | 
|  |    236 |         const TFavouritesWapAp& aItem )
 | 
|  |    237 |     {
 | 
|  |    238 |     TBool apValid( EFalse );
 | 
|  |    239 | 
 | 
|  |    240 |     if ( !aItem.IsNull() && !aItem.IsDefault() )
 | 
|  |    241 |         {
 | 
|  |    242 |         CCommsDatabase& db = aApiProvider.CommsModel().CommsDb();
 | 
|  |    243 |         
 | 
|  |    244 |         CApUtils* apUtils = CApUtils::NewLC( db );
 | 
|  |    245 |         // if error, wapId is not found.
 | 
|  |    246 |         TRAPD( err, apValid = apUtils->WapApExistsL( aItem.ApId() ) );
 | 
|  |    247 |         if ( /* !apValid || */ err )
 | 
|  |    248 |             {
 | 
|  |    249 |             apValid = EFalse;
 | 
|  |    250 |             }
 | 
|  |    251 |         CleanupStack::PopAndDestroy();  // apUtils
 | 
|  |    252 |         }
 | 
|  |    253 |     else 
 | 
|  |    254 |         {
 | 
|  |    255 |         apValid = ETrue;
 | 
|  |    256 |         }
 | 
|  |    257 |     return apValid;
 | 
|  |    258 |     }
 | 
|  |    259 | 
 | 
|  |    260 | // ---------------------------------------------------------
 | 
|  |    261 | // Util::IsValidAPFromParamL
 | 
|  |    262 | // ---------------------------------------------------------
 | 
|  |    263 | //
 | 
|  |    264 | TBool Util::IsValidAPFromParamL(
 | 
|  |    265 |         const MApiProvider& aApiProvider,
 | 
|  |    266 |         TUint32 aIAPid )
 | 
|  |    267 |     {
 | 
|  |    268 |     CCommsDatabase& db = aApiProvider.CommsModel().CommsDb();
 | 
|  |    269 |     CApUtils* apUtils = CApUtils::NewLC( db );
 | 
|  |    270 |     TBool retVal = apUtils->WapApExistsL( aIAPid );
 | 
|  |    271 |     CleanupStack::PopAndDestroy();  // apUtils
 | 
|  |    272 |     return retVal;
 | 
|  |    273 |     }
 | 
|  |    274 | 
 | 
|  |    275 | // ---------------------------------------------------------
 | 
|  |    276 | // Util::CheckApValidityL
 | 
|  |    277 | // ---------------------------------------------------------
 | 
|  |    278 | //
 | 
|  |    279 | TBool Util::CheckApValidityL(
 | 
|  |    280 |         const MApiProvider& aApiProvider,
 | 
|  |    281 |         const TUint32 aItem )
 | 
|  |    282 |     {
 | 
|  |    283 |     CCommsDatabase& db = aApiProvider.CommsModel().CommsDb();
 | 
|  |    284 |     CApUtils* apUtils = CApUtils::NewLC( db );
 | 
|  |    285 |     TBool apValid( EFalse );
 | 
|  |    286 | 
 | 
|  |    287 |     // if error, IapId is not found.
 | 
|  |    288 |     TRAPD( err, apUtils->IapIdFromWapIdL( aItem ) );
 | 
|  |    289 |     if( err == KErrNone )
 | 
|  |    290 |         {
 | 
|  |    291 |         apValid = ETrue;
 | 
|  |    292 |         }
 | 
|  |    293 |     CleanupStack::PopAndDestroy(); // apUtils
 | 
|  |    294 | 
 | 
|  |    295 |     return apValid;
 | 
|  |    296 |     }
 | 
|  |    297 | 
 | 
|  |    298 | // ---------------------------------------------------------
 | 
|  |    299 | // Util::IapIdFromWapIdL
 | 
|  |    300 | // ---------------------------------------------------------
 | 
|  |    301 | //
 | 
|  |    302 | TUint32 Util::IapIdFromWapIdL( const MApiProvider& aApiProvider, const TUint32 aItem )
 | 
|  |    303 | {
 | 
|  |    304 |     CCommsDatabase& db = aApiProvider.CommsModel().CommsDb();
 | 
|  |    305 |     CApUtils* apUtils = CApUtils::NewLC( db );
 | 
|  |    306 |     TUint32 ap = apUtils->IapIdFromWapIdL( aItem );
 | 
|  |    307 |     CleanupStack::PopAndDestroy();  // apUtil
 | 
|  |    308 |     return ap;
 | 
|  |    309 | }
 | 
|  |    310 | 
 | 
|  |    311 | // ---------------------------------------------------------
 | 
|  |    312 | // Util::WapIdFromIapIdL
 | 
|  |    313 | // ---------------------------------------------------------
 | 
|  |    314 | //
 | 
|  |    315 | TUint32 Util::WapIdFromIapIdL( const MApiProvider& aApiProvider, const TUint32 aItem )
 | 
|  |    316 | {
 | 
|  |    317 |     CCommsDatabase& db = aApiProvider.CommsModel().CommsDb();
 | 
|  |    318 |     CApUtils* apUtils = CApUtils::NewLC( db );
 | 
|  |    319 |     TUint32 ap = apUtils->WapIdFromIapIdL( aItem );
 | 
|  |    320 |     CleanupStack::PopAndDestroy();  // apUtil
 | 
|  |    321 |     return ap;
 | 
|  |    322 | }
 | 
|  |    323 | 
 | 
|  |    324 | // ---------------------------------------------------------
 | 
|  |    325 | // Util::EncodeSpaces
 | 
|  |    326 | // ---------------------------------------------------------
 | 
|  |    327 | //
 | 
|  |    328 | void Util::EncodeSpaces(HBufC*& aString)
 | 
|  |    329 |     {
 | 
|  |    330 | 	_LIT(KSpace," ");
 | 
|  |    331 | 	_LIT(KSpaceEncoded,"%20");
 | 
|  |    332 | 
 | 
|  |    333 |     TInt space(KErrNotFound);
 | 
|  |    334 |     TInt spaces(0);
 | 
|  |    335 |     TPtr ptr = aString->Des();
 | 
|  |    336 |     
 | 
|  |    337 |     //Trim leading and trailing spaces in URL before encoding spaces inside URL
 | 
|  |    338 |     ptr.Trim();
 | 
|  |    339 |         
 | 
|  |    340 |     for (TInt i = ptr.Length()-1; i > 0 ; i--)
 | 
|  |    341 |         {
 | 
|  |    342 |         if (ptr[i] == ' ')
 | 
|  |    343 |             {
 | 
|  |    344 |             spaces++;
 | 
|  |    345 |             space = i;
 | 
|  |    346 |             }
 | 
|  |    347 |         }
 | 
|  |    348 |         
 | 
|  |    349 |     if (spaces)
 | 
|  |    350 |         {
 | 
|  |    351 |         TInt newLen = aString->Length() + (spaces * KSpaceEncoded().Length());
 | 
|  |    352 |         TRAPD(err,aString = aString->ReAllocL(newLen));
 | 
|  |    353 |         if (err != KErrNone)
 | 
|  |    354 |             {
 | 
|  |    355 |             return;  // aString was not changed
 | 
|  |    356 |             }
 | 
|  |    357 |         ptr.Set( aString->Des() );
 | 
|  |    358 |        
 | 
|  |    359 |         }
 | 
|  |    360 |         
 | 
|  |    361 | 	while (space != KErrNotFound)
 | 
|  |    362 |     	{
 | 
|  |    363 |     	ptr.Replace(space,1,KSpaceEncoded);
 | 
|  |    364 |     	space = ptr.Find(KSpace);
 | 
|  |    365 |     	}
 | 
|  |    366 |         
 | 
|  |    367 |     }
 | 
|  |    368 | 
 | 
|  |    369 | // ---------------------------------------------------------
 | 
|  |    370 | // Util::AllocateUrlWithSchemeL
 | 
|  |    371 | // ---------------------------------------------------------
 | 
|  |    372 | //
 | 
|  |    373 | HBufC* Util::AllocateUrlWithSchemeL( const TDesC& aUrl )
 | 
|  |    374 |     {
 | 
|  |    375 |     _LIT( KBrowserDefaultScheme, "http://" );
 | 
|  |    376 |     TBool addDefaultScheme( EFalse );
 | 
|  |    377 |     TInt len = aUrl.Length(); 
 | 
|  |    378 | 
 | 
|  |    379 |     // Do not check return value from parse. If the caller wants to allocate a
 | 
|  |    380 |     // badly formed url then let them do so.
 | 
|  |    381 |     TUriParser url;
 | 
|  |    382 |     url.Parse( aUrl ); 
 | 
|  |    383 | 
 | 
|  |    384 |     if( !url.IsPresent( EUriScheme ) )
 | 
|  |    385 |         { 
 | 
|  |    386 |         addDefaultScheme = ETrue; 
 | 
|  |    387 |         len = len + KBrowserDefaultScheme().Length();
 | 
|  |    388 |         }
 | 
|  |    389 | 
 | 
|  |    390 |     HBufC* urlBuffer = HBufC::NewL( len );
 | 
|  |    391 |     TPtr ptr = urlBuffer->Des();
 | 
|  |    392 | 
 | 
|  |    393 |     if ( addDefaultScheme )
 | 
|  |    394 |         {
 | 
|  |    395 |         ptr.Copy( KBrowserDefaultScheme );
 | 
|  |    396 |         }
 | 
|  |    397 |     ptr.Append( aUrl );
 | 
|  |    398 | 
 | 
|  |    399 |     // Handle rare case that the url needs escape encoding.
 | 
|  |    400 |     // Below function will realloc enough space for encoded urlBuffer.
 | 
|  |    401 |     Util::EncodeSpaces( urlBuffer );
 | 
|  |    402 | 
 | 
|  |    403 |     return urlBuffer;
 | 
|  |    404 |     }
 | 
|  |    405 | 
 | 
|  |    406 | 
 | 
|  |    407 | // End of File
 |