browserutilities/favouritesengine/ClientServer/utilsrc/BookmarkFileImporter.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/favouritesengine/ClientServer/utilsrc/BookmarkFileImporter.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,442 @@
+/*
+* Copyright (c) 2003 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 CBookmarkFileImporter.
+*      
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "BookmarkFileImporter.h"
+#include <FavouritesLimits.h>
+// TEMP
+#include <s32file.h>
+// END TEMP
+
+// CONSTANTS
+
+/// ',' character.
+LOCAL_C const TUint KComma = ',';
+/// '#' character.
+LOCAL_C const TUint KHash = '#';
+/// EOF (0) character.
+LOCAL_C const TUint KEof = 0;
+/// '\r' character.
+LOCAL_C const TUint KCr = '\r';
+/// '\n' character.
+LOCAL_C const TUint KLf = '\n';
+
+/// LF-EOF stop token set.
+_LIT( KStopLfEof, "\n\0" );
+/// Comma stop token set.
+_LIT( KStopComma, "," );
+/// Comma-LF-EOF stop token set.
+_LIT( KStopCommaLfEof, ",\n\0" );
+
+/// "Folder" kewyword.
+_LIT( KFolder, "Folder" );
+/// "Item" kewyword.
+_LIT( KItem, "Item" );
+/// "Homepage" kewyword.
+_LIT( KHomepage, "Homepage" );
+/// "LastVisited" kewyword.
+_LIT( KLastVisited, "LastVisited" );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::NewLC
+// ---------------------------------------------------------
+//
+CBookmarkFileImporter* CBookmarkFileImporter::NewL()
+    {
+    CBookmarkFileImporter* importer = new (ELeave) CBookmarkFileImporter();
+    CleanupStack::PushL( importer );
+    importer->ConstructL();
+    CleanupStack::Pop();    // importer
+    return importer;
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::~CBookmarkFileImporter
+// ---------------------------------------------------------
+//
+CBookmarkFileImporter::~CBookmarkFileImporter()
+    {
+    delete iBuf;
+    iFile.Close();
+    iFs.Close();
+    delete iItem;
+    iDb.Close();
+    iSess.Close();
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::ImportL
+// ---------------------------------------------------------
+//
+void CBookmarkFileImporter::ImportL( const TDesC& aFileName )
+    {
+    User::LeaveIfError( iFile.Open( iFs, aFileName,
+        EFileRead | EFileShareReadersOnly ) );
+    CleanupClosePushL<RUnicodeFile>( iFile );
+    User::LeaveIfError( iDb.Open( iSess, KBrowserBookmarks ) );
+    // Import is done in a transaction - all or nothing.
+    User::LeaveIfError( iDb.Begin( /*aWrite=*/ETrue ) );
+    iDb.CleanupRollbackPushL();
+    GetCharL();
+    while( NextLineL() );
+    User::LeaveIfError( iDb.Commit() );
+    CleanupStack::Pop();            // the rollback
+    CleanupStack::PopAndDestroy();  // close iFile
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::CBookmarkFileImporter
+// ---------------------------------------------------------
+//
+CBookmarkFileImporter::CBookmarkFileImporter()
+    {
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::ConstructL
+// ---------------------------------------------------------
+//
+void CBookmarkFileImporter::ConstructL()
+    {
+    User::LeaveIfError( iSess.Connect() );
+    iItem = CFavouritesItem::NewL();
+    User::LeaveIfError( iFs.Connect() );
+    iBuf = new (ELeave) TText16[KFavouritesMaxUrl];
+    iMaxCh = iBuf + KFavouritesMaxUrl;
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::GetCharL
+// ---------------------------------------------------------
+//
+void CBookmarkFileImporter::GetCharL()
+    {
+    iCurCh = iFile.GetCharL();
+    if ( iCurCh == KCr )
+        {
+        // CR character found - ignore it. Not expecting CR to appear anywhere
+        // else than before an LF.
+        iCurCh = iFile.GetCharL();
+        }
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::NextLineL
+// ---------------------------------------------------------
+//
+TBool CBookmarkFileImporter::NextLineL()
+    {
+    switch( iCurCh )
+        {
+        case KEof:
+            // EOF
+            return EFalse;
+
+        case KHash:
+            // Comment line; skip over.
+            SkipL( KStopLfEof );
+            GetCharL();
+            break;
+
+        case KCr:
+        case KLf:
+            // Empty line; skip over.
+            GetCharL();
+            break;
+
+        default:
+            // Parse bookmark attributes.
+            AttrsL();
+            break;
+        }
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::NextTokenL
+// ---------------------------------------------------------
+//
+TPtrC CBookmarkFileImporter::NextTokenL( const TDesC& aStopCharSet )
+    {
+    iNextCh = iBuf; // Start storing token at start of buffer.
+    while ( iNextCh < iMaxCh )
+        {
+        if ( aStopCharSet.Locate( iCurCh ) != KErrNotFound )
+            {
+            // Stop character found - return what we have stored so far. This
+            // may be an empty string as well.
+            return TPtrC( iBuf, iNextCh - iBuf );
+            }
+        *iNextCh = STATIC_CAST( TText16, iCurCh );
+        iNextCh++;
+        GetCharL();
+        }
+    // No more space in buffer to store token.
+    User::Leave( KErrOverflow );
+    /*NOTREACHED*/
+    return TPtrC();
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::NextIntTokenL
+// ---------------------------------------------------------
+//
+TInt CBookmarkFileImporter::NextIntTokenL( const TDesC& aStopCharSet )
+    {
+    TInt ret = 0;
+    TPtrC token( NextTokenL( aStopCharSet ) );
+    if ( token.Length() )
+        {
+        TLex lex( token );
+        User::LeaveIfError( lex.Val( ret ) );
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::NextHexTokenL
+// ---------------------------------------------------------
+//
+TInt32 CBookmarkFileImporter::NextHexTokenL( const TDesC& aStopCharSet )
+    {
+    TUint32 ret = 0;
+    TPtrC token( NextTokenL( aStopCharSet ) );
+    if ( token.Length() )
+        {
+        TLex lex( token );
+        User::LeaveIfError( lex.Val( ret, EHex ) );
+        }
+    return STATIC_CAST( TInt32, ret );
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::SkipL
+// ---------------------------------------------------------
+//
+void CBookmarkFileImporter::SkipL( const TDesC& aStopCharSet )
+    {
+    // Note that EOF also can be a stop character; aStopChar check has
+    // precendence over EOF check. That is the 'expected EOF' case.
+    while( aStopCharSet.Locate( iCurCh ) == KErrNotFound )
+        {
+        if ( iCurCh == KEof )
+            {
+            // Unexpected EOF.
+            User::Leave( KErrEof );
+            }
+        GetCharL();
+        }
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::AttrsL
+// ---------------------------------------------------------
+//
+void CBookmarkFileImporter::AttrsL()
+    {
+    TPtrC token;
+    TInt num;
+    TBool readOnly( EFalse );
+    TBool factoryItem( ETrue );
+    TBool homePage( EFalse );
+    TBool lastVisited( EFalse );
+    TBool preferred( EFalse );
+
+    // Parse the line and fill item.
+    iItem->ClearL();
+
+    // Type (including special items).
+    token.Set( NextTokenL( KStopComma ) );
+    if ( !token.Compare( KFolder ) )
+        {
+        iItem->SetType( CFavouritesItem::EFolder );
+        }
+    else if ( !token.Compare( KItem ) )
+        {
+        iItem->SetType( CFavouritesItem::EItem );
+        }
+    else if ( !token.Compare( KHomepage ) )
+        {
+        iItem->SetType( CFavouritesItem::EItem );
+        homePage = ETrue;
+        }
+    else if ( !token.Compare( KLastVisited ) )
+        {
+        iItem->SetType( CFavouritesItem::EItem );
+        lastVisited = ETrue;
+        }
+    else
+        {
+        // Expected "Folder", "Item", "Homepage" or "LastVisited".
+        User::Leave( KErrCorrupt );
+        }
+    GetCharL();
+
+    // Name.
+    iItem->SetNameL( NextTokenL( KStopComma ) );
+    GetCharL();
+
+    // Parent folder.
+    iItem->SetParentFolder( FolderByNameL( NextTokenL( KStopComma ) ) );
+    GetCharL();
+
+    // URL.
+    iItem->SetUrlL( NextTokenL( KStopComma ) );
+    GetCharL();
+
+    // WAP AP.
+    num = NextIntTokenL( KStopComma );
+    if( num )
+        {
+        TFavouritesWapAp ap;
+        ap = num;
+        iItem->SetWapAp( ap );
+        }
+    GetCharL();
+
+    // User name.
+    iItem->SetUserNameL( NextTokenL( KStopComma ) );
+    GetCharL();
+
+    // Password.
+    iItem->SetPasswordL( NextTokenL( KStopComma ) );
+    GetCharL();
+
+    // Read-only flag.
+    num = NextIntTokenL( KStopComma );
+    if ( num == 0 )
+        {
+        readOnly = EFalse;
+        }
+    else if ( num == 1 )
+        {
+        readOnly = ETrue;
+        }
+    else
+        {
+        // Expected "0" or "1".
+        User::Leave( KErrCorrupt );
+        }
+    GetCharL();
+
+    // Factory item flag.
+    num = NextIntTokenL( KStopComma );
+    if ( num == 0 )
+        {
+        factoryItem = EFalse;
+        }
+    else if ( num == 1 )
+        {
+        factoryItem = ETrue;
+        }
+    else
+        {
+        // Expected "0" or "1".
+        User::Leave( KErrCorrupt );
+        }
+    GetCharL();
+
+    // Context id.
+    iItem->SetContextId( NextHexTokenL( KStopCommaLfEof ) );
+    // No GetCharL yet - PreferredUid is optional, so we need to investigate
+    // lookeahed character first.
+
+    // Preferred flag (optional).
+    if ( iCurCh == KComma )
+        {
+        GetCharL();
+        num = NextIntTokenL( KStopLfEof );
+        if ( num == 0 )
+            {
+            preferred = EFalse;
+            }
+        else if ( num == 1 )
+            {
+            preferred = ETrue;
+            }
+        else
+            {
+            // Expected "0" or "1".
+            User::Leave( KErrCorrupt );
+            }
+        }
+    GetCharL();
+
+    // Add item and set flags.
+    if ( homePage )
+        {
+        User::LeaveIfError( iDb.SetHomepage( *iItem ) );
+        }
+    else if ( lastVisited )
+        {
+        User::LeaveIfError( iDb.SetLastVisited( *iItem ) );
+        }
+    else
+        {
+        User::LeaveIfError( iDb.Add( *iItem, /*aAutoRename=*/EFalse ) );
+        }
+    User::LeaveIfError( iDb.SetReadOnly( iItem->Uid(), readOnly ) );
+    User::LeaveIfError( iDb.SetFactoryItem( iItem->Uid(), factoryItem ) );
+    if ( preferred )
+        {
+        User::LeaveIfError( iDb.SetPreferredUid
+            ( iItem->ParentFolder(), iItem->Uid() ) );
+        }
+    }
+
+// ---------------------------------------------------------
+// CBookmarkFileImporter::FolderByNameL
+// ---------------------------------------------------------
+//
+TInt CBookmarkFileImporter::FolderByNameL( const TDesC& aName )
+    {
+    TInt folder = KFavouritesRootUid;
+    if ( aName.Length() )
+        {
+        CArrayFix<TInt>* uids = new (ELeave) CArrayFixFlat<TInt>( 1 );
+        CleanupStack::PushL( uids );
+        User::LeaveIfError( iDb.GetUids
+            (
+            *uids,
+            KFavouritesNullUid,
+            CFavouritesItem::EFolder,
+            &aName,
+            KFavouritesNullContextId
+            ) );
+        if( uids->Count() == 0 )
+            {
+            User::Leave( KErrNotFound );
+            }
+        if( uids->Count() == 1 )
+            {
+            folder = uids->At( 0 );
+            }
+        else
+            {
+            // This would worth a panic - more folders with the same name?
+            User::Leave( KErrCorrupt );
+            }
+        CleanupStack::PopAndDestroy();  // uids
+        }
+    return folder;
+    }