--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserui/browser/BrowserAppSrc/BrowserPopupEngine.cpp Mon Mar 30 12:49:49 2009 +0300
@@ -0,0 +1,743 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* Implementation of popupblocking
+*
+*
+*/
+
+
+// INCLUDES
+#include <Uri16.h>
+#include "BrowserPopupEngine.h"
+#include <f32file.h>
+#include "logger.h"
+#include "BrowserUtil.h"
+
+// CONSTANTS
+_LIT( KWhiteListFileName, "bpopupwl.db" );
+_LIT( KWhiteTmpFileName, "bpopwtmp.db" );
+_LIT( KWhiteBkpFileName, "bpopbbkp.db" );
+_LIT( KEndMark, "\n" );
+const TInt KArrayGranularity = 10;
+const TInt KCacheSize = 32;//The maximum size of the memory cache
+const TInt KMaxDbSize = 16384;// (255/max length of the domain/+1/\n/)*64
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::CBrowserPopupEngine()
+// -----------------------------------------------------------------------------
+//
+CBrowserPopupEngine::CBrowserPopupEngine()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::~CBrowserPopupEngine
+// -----------------------------------------------------------------------------
+//
+CBrowserPopupEngine::~CBrowserPopupEngine()
+ {
+ iWhiteListFile.Flush();
+ iWhiteListFile.Close();
+ iFs.Close();
+ delete iCachedWhiteUrls;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::NewLC
+// -----------------------------------------------------------------------------
+//
+CBrowserPopupEngine* CBrowserPopupEngine::NewLC()
+ {
+ CBrowserPopupEngine* self = new (ELeave) CBrowserPopupEngine;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::NewL
+// -----------------------------------------------------------------------------
+//
+CBrowserPopupEngine* CBrowserPopupEngine::NewL()
+ {
+ CBrowserPopupEngine* self = new (ELeave) CBrowserPopupEngine;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::ConstructL()
+ {
+LOG_ENTERFN("CBrowserPopupEngine::ConstructL");
+ User::LeaveIfError(iFs.Connect());
+//open databases
+ BROWSER_LOG( ( _L( "<-Popup engine-> RFs Connected." ) ) );
+ OpenDatabaseL( &iWhiteListFile );
+ BROWSER_LOG( ( _L( "<-Popup engine-> white file opened." ) ) );
+//Create memory cache
+ iCachedWhiteUrls = new(ELeave) CDesCArrayFlat(KArrayGranularity);
+ BROWSER_LOG( ( _L( "<-Popup engine-> Cache created." ) ) );
+ iCachedWhiteUrls->Reset();
+//Load some to memory cache
+ LoadUrlsToCacheL( &iWhiteListFile, iCachedWhiteUrls, &iWhiteCacheNo);
+ BROWSER_LOG( ( _L( "<-Popup engine-> Urls loaded to cache." ) ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::OpenDatabaseL
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::OpenDatabaseL(RFile* aFile)
+ {
+LOG_ENTERFN("CBrowserPopupEngine::OpenDatabaseL");
+
+ __ASSERT_DEBUG( (aFile != NULL), Util::Panic( Util::EUninitializedData ));
+
+ TInt err;
+ RFile tmpFile;
+ TPtrC fileNamePtr;
+ TPtrC bkpFileNamePtr;
+ TBuf<KMaxFileName> privatePath;
+ TBuf<KMaxFileName> listFileName;
+ TBuf<KMaxFileName> bkpFileName;
+ TBuf<KMaxFileName> tmpFileName;
+ iFs.PrivatePath( privatePath );
+ listFileName.Copy( privatePath );
+ listFileName.Append( KWhiteListFileName );
+ bkpFileName.Copy( privatePath );
+ bkpFileName.Append( KWhiteBkpFileName );
+ tmpFileName.Copy( privatePath );
+ tmpFileName.Append( KWhiteTmpFileName );
+ err = aFile->Open( iFs, listFileName, EFileWrite | EFileStream | EFileShareExclusive );
+ BROWSER_LOG( ( _L( "<-Popup engine-> File open error: %d" ), err ) );
+ if ( err == KErrNotFound )
+ {
+ err = tmpFile.Open( iFs, bkpFileName, EFileWrite | EFileShareExclusive );
+ if( err != KErrNone )
+ {
+ err = aFile->Create( iFs, listFileName, EFileWrite | EFileShareExclusive );
+ BROWSER_LOG( ( _L( "<-Popup engine-> white file created." ) ) );
+ }
+ else
+ {
+//check validity of tmp file if the last char is \n it is probably OK
+ if( !CheckDbValidity( &tmpFile ) )
+ {
+ User::LeaveIfError(
+ aFile->Create( iFs, listFileName,
+ EFileWrite | EFileShareExclusive ) );
+ }
+ else
+ {
+//rename tmp to origin
+ err = tmpFile.Rename( listFileName );
+ if(err == KErrNone)
+ {
+ tmpFile.Close();
+ User::LeaveIfError(aFile->Open( iFs, listFileName, EFileWrite | EFileStream | EFileShareExclusive ) );
+ }
+ else
+ {
+ User::LeaveIfError(
+ aFile->Create( iFs, listFileName,
+ EFileWrite | EFileShareExclusive ) );
+ }
+ }
+ }
+ }
+ else if ( err == KErrPathNotFound )
+ {
+ User::LeaveIfError( iFs.CreatePrivatePath( EDriveC ) );
+ User::LeaveIfError(
+ aFile->Create( iFs, listFileName, EFileWrite | EFileShareExclusive ) );
+ }
+ else if((err != KErrInUse)&&( err != KErrNone ))
+ {
+ User::Leave(err);
+ }
+ else if( !CheckDbValidity( aFile ) )
+ {
+//if the file is not valid delete it and create a new one
+ aFile->Close();
+ User::LeaveIfError( iFs.Delete( listFileName ) );
+ User::LeaveIfError(
+ aFile->Create( iFs, listFileName, EFileWrite | EFileShareExclusive ) );
+ }
+//delete tmp and bkp files if they exist
+ iFs.Delete( tmpFileName );
+ iFs.Delete( bkpFileName );
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::AddUrlToWhiteListL
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::AddUrlToWhiteListL(const TDesC& aUrl)
+ {
+LOG_ENTERFN("CBrowserPopupEngine::AddUrlToWhiteListL");
+ TUriParser16 urlParser;
+ BROWSER_LOG( ( _L( "<-Popup engine-> url to add to white list : %S" ), &aUrl ) );
+//check whether file allready exists in list
+ /*if( IsUrlOnWhiteListL( aUrl ) )
+ {
+ RDebug::Print(_L("<-Popup engine-> url is in white cache allready.\n"));
+ return;
+ }*/
+//get the domain from the url
+ urlParser.Parse(aUrl);
+ if( urlParser.IsSchemeValid() )
+ {
+//write domain to file
+ HandleUrlOrderChangeL( &iWhiteListFile, urlParser.Extract( EUriHost), EFalse, ETrue );
+//add domain to memory cache
+ AddUrlToCacheL( iCachedWhiteUrls, urlParser.Extract( EUriHost) );
+ }
+ else
+ {
+ User::Leave( KErrBadName );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::IsUrlOnWhiteListL
+// -----------------------------------------------------------------------------
+//
+TBool CBrowserPopupEngine::IsUrlOnWhiteListL(const TDesC& aUrl)
+ {
+LOG_ENTERFN("CBrowserPopupEngine::IsUrlOnWhiteListL");
+ TUriParser16 urlParser;
+ urlParser.Parse(aUrl);
+ if( !urlParser.IsSchemeValid() )
+ {
+ User::Leave( KErrBadName );
+ }
+//look for URL in memory cache
+ if( IsUrlInWhiteCacheL( urlParser.Extract( EUriHost) ) )
+ {
+ BROWSER_LOG( ( _L( "<-Popup engine-> url is in white cache." ) ) );
+ HandleUrlOrderChangeL( &iWhiteListFile, urlParser.Extract( EUriHost), ETrue, ETrue );
+ return ETrue;
+ }
+//look for URL in file
+ if( IsUrlInWhiteFileL( urlParser.Extract( EUriHost) ) )
+ {
+ HandleUrlOrderChangeL( &iWhiteListFile, urlParser.Extract( EUriHost), ETrue, ETrue );
+//if found and not in memory cache put it there
+ AddUrlToCacheL( iCachedWhiteUrls, urlParser.Extract( EUriHost) );
+ BROWSER_LOG( ( _L( "<-Popup engine-> url is in white file." ) ) );
+ return ETrue;
+ }
+ BROWSER_LOG( ( _L( "<-Popup engine-> url is not on white list." ) ) );
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::IsUrlInWhiteCacheL
+// -----------------------------------------------------------------------------
+//
+TBool CBrowserPopupEngine::IsUrlInWhiteCacheL(const TDesC& aUrl)
+ {
+ return IsUrlInCacheL( iCachedWhiteUrls, aUrl, iWhiteCacheNo );
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::IsUrlInWhiteFileL
+// -----------------------------------------------------------------------------
+//
+TBool CBrowserPopupEngine::IsUrlInWhiteFileL(const TDesC& aUrl)
+ {
+ return IsUrlInFileL( &iWhiteListFile , aUrl );
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::IsUrlInFileL
+// -----------------------------------------------------------------------------
+//
+TBool CBrowserPopupEngine::IsUrlInFileL(const RFile* aFile, const TDesC& aUrl)
+ {
+
+ __ASSERT_DEBUG( (aFile != NULL), Util::Panic( Util::EUninitializedData ));
+
+ HBufC8* line = HBufC8::NewL( 256 );
+ CleanupStack::PushL( line );
+ HBufC8* parturl = HBufC8::NewL( 256 );
+ CleanupStack::PushL( parturl );
+ TInt match = 1;
+ TInt pos = 0;
+ TInt result;
+ TPtrC16 linePtr16;
+ HBufC8* url8 = TDesC16ToHBufC8LC( aUrl );
+ User::LeaveIfError( aFile->Seek( ESeekStart, pos ) );
+ TPtr8 linePtr = line->Des();
+ result = aFile->Read( linePtr );
+ parturl->Des().Zero();
+ while ( ( line->Des().Length() > 0 ) && ( result == KErrNone ) )
+ {
+ if(parturl->Des().Length() != 0 )
+ {
+ pos = linePtr.Locate( '\n' );
+ parturl->Des().Append( linePtr.Left( pos ) );
+ match = url8->Des().Compare( parturl->Des() );
+ if( match == 0 )
+ {
+ CleanupStack::PopAndDestroy( 3 );
+ return ETrue;
+ }
+ parturl->Des().Zero();
+ }
+ match = linePtr.Find( url8->Des() );
+ if( match == KErrNotFound )
+ {
+ pos = linePtr.LocateReverse( '\n' );
+ if(( linePtr.Length() != pos )&&( linePtr.Length() > 1 ))
+ {
+ parturl->Des().Append( linePtr.Mid( pos + 1, linePtr.Length() - pos - 1 ));
+ }
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( 3 );
+ return ETrue;
+ }
+ result = aFile->Read( linePtr, 256 );
+ }
+ CleanupStack::PopAndDestroy( 3 );
+ User::LeaveIfError( result );
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::LoadUrlsToCacheL
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::LoadUrlsToCacheL(const RFile* aFile, CDesCArrayFlat* aCacheArray, TInt* aLoadedUrlNo)
+ {
+LOG_ENTERFN( "PopupEngine::LoadUrlsToCacheL" );
+
+ __ASSERT_DEBUG( (aFile != NULL), Util::Panic( Util::EUninitializedData ));
+ __ASSERT_DEBUG( (aCacheArray != NULL), Util::Panic( Util::EUninitializedData ));
+ __ASSERT_DEBUG( (aLoadedUrlNo != NULL), Util::Panic( Util::EUninitializedData ));
+
+ TPtrC8 test;
+ HBufC8* line = HBufC8::NewL( 256 );
+ CleanupStack::PushL( line );
+ HBufC8* parturl = HBufC8::NewL( 256 );
+ CleanupStack::PushL( parturl );
+ TInt result;
+ TInt itemno = 0;
+ TInt offset = 0;
+ TInt prevOffset = 0;
+ TPtr8 linePtr = line->Des();
+ parturl->Des().Zero();
+ User::LeaveIfError( aFile->Seek( ESeekStart, offset ) );
+ result = aFile->Read( linePtr, 256 );
+ while ( ( line->Des().Length() > 0 ) &&( result == KErrNone ) && ( itemno < KCacheSize ))
+ {
+ offset = linePtr.Locate('\n' );
+ if( parturl->Length() != 0 )
+ {
+ parturl->Des().Append( linePtr.Mid( prevOffset, offset ) );
+ aCacheArray->AppendL( *TDesC8ToHBufC16LC( parturl->Des() ) );
+ CleanupStack::PopAndDestroy( );
+ prevOffset = prevOffset + offset +1;
+ itemno++;
+ if( itemno == KCacheSize )
+ {
+ break;
+ }
+ offset = ( linePtr.Right( linePtr.Length() - prevOffset ) ).Locate('\n');
+ }
+ while(( offset != KErrNotFound ) && ( itemno < KCacheSize ))
+ {
+ aCacheArray->AppendL( *TDesC8ToHBufC16LC( linePtr.Mid( prevOffset, offset ) ) );
+ CleanupStack::PopAndDestroy( );
+ prevOffset = prevOffset + offset +1;
+ itemno++;
+ offset = ( linePtr.Right( linePtr.Length() - prevOffset ) ).Locate('\n' );
+ }
+ if( prevOffset != linePtr.Length() )
+ {
+ parturl->Des().Zero();
+ parturl->Des().Append( linePtr.Right( linePtr.Length() - prevOffset ));
+ }
+ prevOffset = 0;
+ result = aFile->Read( linePtr, 256 );
+ }
+ *aLoadedUrlNo = itemno;
+ CleanupStack::PopAndDestroy( 2 );
+ User::LeaveIfError( result );
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::IsUrlInCacheL
+// -----------------------------------------------------------------------------
+//
+TBool CBrowserPopupEngine::IsUrlInCacheL( const CDesCArrayFlat* aCacheArray, const TDesC& aUrl, const TInt aLoadedurlno )
+ {
+LOG_ENTERFN("CBrowserPopupEngine::IsUrlInCacheL");
+
+ __ASSERT_DEBUG( (aCacheArray != NULL), Util::Panic( Util::EUninitializedData ));
+
+ TInt itemno=0;
+ BROWSER_LOG( ( _L( "<-Popup engine-> url to find in cache : %S" ), &aUrl ) );
+ while( ( itemno < aLoadedurlno ) && ( aUrl.Compare((*aCacheArray)[ itemno ]) != 0 ) )
+ {
+ itemno++;
+ }
+ if( itemno != aLoadedurlno )
+ {
+ BROWSER_LOG( ( _L( "<-Popup engine-> url found in cache" ) ) );
+ return ETrue;
+ }
+ BROWSER_LOG( ( _L( "<-Popup engine-> url not found in cache" ) ) );
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::AddUrlToCacheL
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::AddUrlToCacheL( CDesCArrayFlat* aCacheArray, const TDesC& aUrl )
+ {
+LOG_ENTERFN("CBrowserPopupEngine::AddUrlToCacheL");
+
+ __ASSERT_DEBUG( (aCacheArray != NULL), Util::Panic( Util::EUninitializedData ));
+
+ if( iWhiteCacheNo < KCacheSize )
+ {
+ aCacheArray->AppendL( aUrl );
+ iWhiteCacheNo++;
+ BROWSER_LOG( ( _L( "<-Popup engine-> url added to cache : %S" ), &aUrl ) );
+ }
+ else
+ {
+ BROWSER_LOG( ( _L( "<-Popup engine-> url not added to cache : %S" ), &aUrl ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::TDesC16ToTPtrC8
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CBrowserPopupEngine::TDesC16ToTPtrC8(const TDesC16 &aString)
+ {
+ TPtrC8 ptr8(reinterpret_cast<const TUint8*>(aString.Ptr()),(aString.Length()*2));
+ return ptr8;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::TDesC8ToTPtrC16
+// -----------------------------------------------------------------------------
+//
+TPtrC16 CBrowserPopupEngine::TDesC8ToTPtrC16(const TDesC8 &aString)
+ {
+ TPtrC16 ptr16(reinterpret_cast<const TUint16*>(aString.Ptr()),(aString.Length()/2));
+ return ptr16;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::HandleUrlOrderChange
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::HandleUrlOrderChangeL(RFile* aFile, const TDesC& aUrl, const TBool aExists,const TBool aToAdd )
+ {
+LOG_ENTERFN("CBrowserPopupEngine::HandleUrlOrderChangeL");
+
+ __ASSERT_DEBUG( (aFile != NULL), Util::Panic( Util::EUninitializedData ));
+
+ RFile tmpFile;
+ TInt err, match;
+ HBufC8* line = HBufC8::NewL( 256 );
+ CleanupStack::PushL( line );
+ HBufC8* parturl = HBufC8::NewL( 256 );
+ CleanupStack::PushL( parturl );
+ HBufC8* url8;
+ parturl->Des().Zero();
+ TPtr8 linePtr = line->Des();
+ TPtrC8 linePtrOffset;
+ TPtrC8 tmpPtr;
+ TInt result;
+ TInt pos = 0;
+ TInt offset;
+ TInt writtenSize = 0;
+ TBuf<KMaxFileName> privatePath;
+ TBuf<KMaxFileName> listFileName;
+ TBuf<KMaxFileName> bkpFileName;
+ TBuf<KMaxFileName> tmpFileName;
+//set the filenames
+ iFs.PrivatePath( privatePath );
+ listFileName.Copy( privatePath );
+ listFileName.Append( KWhiteListFileName );
+ bkpFileName.Copy( privatePath );
+ bkpFileName.Append( KWhiteBkpFileName );
+ tmpFileName.Copy( privatePath );
+ tmpFileName.Append( KWhiteTmpFileName );
+//create a tmp file
+ err = tmpFile.Create( iFs, tmpFileName, EFileWrite | EFileShareExclusive );
+ if( err != KErrNone )
+ {
+ RDebug::Print(_L("Creation of tmp file failed.\n"));
+ BROWSER_LOG( ( _L( "<-Popup engine-> Creation of tmp file failed." ) ) );
+ User::LeaveIfError( err );
+ }
+//convert url to 8bit
+ url8 = TDesC16ToHBufC8LC( aUrl );
+//add url to tmp file
+ if( aToAdd )
+ {
+//by url removal it is not needed to write the url
+ tmpFile.Seek( ESeekStart, pos );
+ tmpFile.Write( url8->Des() );
+ tmpFile.Write( *TDesC16ToHBufC8LC( KEndMark ) );
+ CleanupStack::PopAndDestroy();
+ tmpFile.Flush();
+ writtenSize = url8->Des().Size() + 1;
+ }
+//write all urls to tmp file except the if needed
+ parturl->Des().Zero();
+ User::LeaveIfError( aFile->Seek( ESeekStart, pos ) );
+ result = aFile->Read( linePtr, 256 );
+ linePtr.Set(line->Des());
+ writtenSize += linePtr.Length();
+ if ( aExists )
+ {
+ while ( ( line->Des().Length() > 0 ) &&( result == KErrNone ))
+ {
+ offset=0;
+//if there was a part of an url check it too
+ if( parturl->Length() != 0 )
+ {
+ offset = linePtr.Locate('\n' );
+ parturl->Des().Append( linePtr.Left( offset ) );
+ match = url8->Des().Compare( parturl->Des() );
+ if( match != 0 )
+ {
+ tmpFile.Write( parturl->Des() );
+ tmpFile.Write( *TDesC16ToHBufC8LC( KEndMark ) );
+ CleanupStack::PopAndDestroy();
+ }
+ offset++;
+ parturl->Des().Zero();
+ }
+//find the new url in the old file
+ linePtrOffset.Set( linePtr.Right( linePtr.Length() - offset ));
+ match = linePtrOffset.Find( url8->Des() );
+ if( match == KErrNotFound )
+ {
+ pos = linePtrOffset.LocateReverse('\n' );
+//store the remaining part of the last url
+ if( pos != KErrNotFound )
+ {
+ if( pos == linePtrOffset.Length() -1 )
+ {
+ tmpFile.Write( linePtrOffset );
+ }
+ else
+ {
+ parturl->Des( ).Append( linePtrOffset.Mid( pos + 1, linePtrOffset.Length() - pos - 1 ));
+ tmpFile.Write( linePtrOffset.Left( pos+1 ));
+ }
+ }
+ else if( linePtrOffset.Length() > 0 )
+ {
+ parturl->Des( ).Append( linePtrOffset );
+ }
+ }
+ else
+ {
+ if( match == 0)
+ {
+ tmpFile.Write( linePtrOffset.Right( linePtrOffset.Length() - url8->Des().Length() - 1 ) );
+ }
+ else
+ {
+ pos = linePtrOffset.LocateReverse('\n' );
+ tmpFile.Write( linePtrOffset, match );
+ if( pos < linePtrOffset.Length() - 1 )
+ {
+ if( pos == linePtrOffset.Length() - url8->Des().Length() - 1 )
+ {
+ parturl->Des( ).Append( linePtrOffset.Right( url8->Des().Length() ) );
+ }
+ else//add to offset
+ {
+ tmpFile.Write( linePtrOffset.Right( linePtrOffset.Length() - match - url8->Des().Length() - 1 ) );
+ }
+ }
+ }
+ }
+ result = aFile->Read( linePtr, 256 );
+ linePtr.Set(line->Des());
+ }
+ }
+ else
+ {
+//copy the whole file
+ while ( ( line->Des().Length() > 0 ) &&( result == KErrNone ))
+ {
+ result = tmpFile.Write( linePtr );
+ if ( result == KErrNone )
+ {
+ result = aFile->Read( linePtr, 256 );
+ linePtr.Set( line->Des() );
+ writtenSize += linePtr.Length();
+ if( writtenSize > KMaxDbSize )
+ {
+ offset = linePtr.Length();
+ while( writtenSize > KMaxDbSize )
+ {
+ offset = linePtr.Left( offset ).LocateReverse('\n' );
+ writtenSize -= linePtr.Length() - offset ;
+ }
+ tmpFile.Write( linePtr, offset );
+ tmpFile.Write( *TDesC16ToHBufC8LC( KEndMark ) );
+ CleanupStack::PopAndDestroy();
+ break;
+ }
+ }
+ }
+ }
+ tmpFile.Flush();
+//rename original file to bkp
+ User::LeaveIfError( aFile->Rename( bkpFileName ) );
+ aFile->Close();
+//rename temp file to original
+ User::LeaveIfError( tmpFile.Rename( listFileName ) );
+ tmpFile.Close();
+ User::LeaveIfError( aFile->Open( iFs, listFileName, EFileWrite | EFileStream | EFileShareExclusive ) );
+//delete bkp file
+ User::LeaveIfError( iFs.Delete( bkpFileName ) );
+ CleanupStack::PopAndDestroy( 3 );
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::RemoveUrlFromWhiteListL
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::RemoveUrlFromWhiteListL(const TDesC& aUrl)
+ {
+LOG_ENTERFN("CBrowserPopupEngine::RemoveUrlFromWhiteListL");
+ TUriParser16 urlParser;
+ urlParser.Parse(aUrl);
+ if( !urlParser.IsSchemeValid() )
+ {
+ BROWSER_LOG( ( _L( "<-Popup engine-> Url is not valid." ) ) );
+ User::Leave( KErrBadName );
+ }
+ HandleUrlOrderChangeL( &iWhiteListFile, urlParser.Extract( EUriHost), ETrue, EFalse );
+ BROWSER_LOG( ( _L( "<-Popup engine-> Url removed from database." ) ) );
+ if( iWhiteCacheNo > 0)
+ {
+ RemoveUrlFromCacheL( iCachedWhiteUrls, urlParser.Extract( EUriHost), iWhiteCacheNo );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::RemoveUrlFromCacheL
+// -----------------------------------------------------------------------------
+//
+void CBrowserPopupEngine::RemoveUrlFromCacheL( CDesCArrayFlat* aCacheArray, const TDesC& aUrl, TInt &aCacheNo )
+ {
+LOG_ENTERFN("CBrowserPopupEngine::RemoveUrlFromCacheL");
+
+ __ASSERT_DEBUG( (aCacheArray != NULL), Util::Panic( Util::EUninitializedData ));
+
+ TInt pos;
+ TInt ret;
+ ret = aCacheArray->Find( aUrl, pos );
+ if( ret == 0 )
+ {
+ aCacheArray->Delete( pos );
+ aCacheArray->Compress();
+ aCacheNo--;
+ BROWSER_LOG( ( _L( "<-Popup engine-> Url is found in cache and removed." ) ) );
+ }
+ else
+ {
+ BROWSER_LOG( ( _L( "<-Popup engine-> Url is not in cache." ) ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::CheckDbValidity
+// -----------------------------------------------------------------------------
+//
+TBool CBrowserPopupEngine::CheckDbValidity(RFile* aFile)
+{
+LOG_ENTERFN("CBrowserPopupEngine::CheckDbValidity");
+
+ __ASSERT_DEBUG( (aFile != NULL), Util::Panic( Util::EUninitializedData ));
+
+ TInt size;
+ TBuf8<1> tmp;
+ aFile->Size( size );
+ if( size == 0)
+ {
+//empty file is ok
+ BROWSER_LOG( ( _L( "<-Popup engine-> File is valid." ) ) );
+ return ETrue;
+ }
+ else
+ {
+//check whether the last char is \n
+ size = -1;
+ aFile->Seek( ESeekEnd, size );
+ aFile->Read( tmp, 1 );
+ if( tmp.Compare( *TDesC16ToHBufC8LC( KEndMark ) ) == 0 )
+ {
+ CleanupStack::PopAndDestroy( );
+ BROWSER_LOG( ( _L( "<-Popup engine-> File is valid." ) ) );
+ return ETrue;
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( );
+ BROWSER_LOG( ( _L( "<-Popup engine-> File is not valid." ) ) );
+ return EFalse;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::ConvertTDesC16ToHBufC8LC
+// -----------------------------------------------------------------------------
+//
+HBufC8 *CBrowserPopupEngine::TDesC16ToHBufC8LC(const TDesC16 &string)
+ {
+ HBufC8 *buff = HBufC8::NewLC(string.Length());
+ buff->Des().Copy(string);
+ return buff;
+ }
+
+// -----------------------------------------------------------------------------
+// CBrowserPopupEngine::TDesC8ToHBufC16LC
+// -----------------------------------------------------------------------------
+//
+HBufC16 *CBrowserPopupEngine::TDesC8ToHBufC16LC(const TDesC8 &aString)
+ {
+ HBufC16 *buff = HBufC16::NewLC(aString.Length());
+ buff->Des().Copy(aString);
+ return buff;
+ }
+
+// End of File