omaprovisioning/provisioning/WAPAdapter/Src/CWPWAPBrowserItem.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:27:42 +0100
branchRCL_3
changeset 26 19bba8228ff0
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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:  One browser setting item.
*
*/



// INCLUDE FILES
#include <e32base.h>
#include <msvapi.h>
#include <ApDataHandler.h>
#include <ApAccessPointItem.h>
#include <CWPCharacteristic.h>
#include <CWPParameter.h>
#include <CWPAdapter.h>
#include <centralrepository.h>
#include <browseruisdkcrkeys.h>
#include "CWPWAPBrowserItem.h"
#include "WPWAPItemFactory.h"
#include "ProvisioningDebug.h"

// CONSTANTS
/// Delay to wait for WmlBrowser to catch up with changes in CommsDb. Microseconds.
const TInt KWmlDelay = 4*500000;
// Force browser to use User Defined AP
const TInt KUserDefined = 0;

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::CWPWAPBrowserItem
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CWPWAPBrowserItem::CWPWAPBrowserItem( TBool aFirst,
                                      const TDesC& aTitle,
                                      const TDesC& aBookmarkTitle,
                                      const TDesC& aDefaultName, 
                                      const TDesC& aDefaultBookmarkName,
                                      CWPCharacteristic& aCharacteristic, 
                                      CCommsDatabase*& aCommsDb, 
                                      CApDataHandler*& aAPHandler,
                                      RFavouritesDb aBookmarkDb 
                                    )
                                    : CWPWAPItemBase( aTitle,
                                                      aDefaultName, 
                                                      aCharacteristic, 
                                                      aCommsDb, 
                                                      aAPHandler ), 
                                    iDefaultBookmarkName( aDefaultBookmarkName ),
                                    iBookmarkTitle( aBookmarkTitle ), 
                                    iDb( aBookmarkDb ),
                                    iFirst( aFirst )
    {
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CWPWAPBrowserItem::ConstructL()
    {
    BaseConstructL();
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CWPWAPBrowserItem* CWPWAPBrowserItem::NewL( TBool aFirst,
                                            const TDesC& aTitle, 
                                            const TDesC& aBookmarkTitle,
                                            const TDesC& aDefaultName,  
                                            const TDesC& aDefaultBookmarkName,
                                            CWPCharacteristic& aCharacteristic, 
                                            CCommsDatabase*& aCommsDb, 
                                            CApDataHandler*& aAPHandler,
                                            RFavouritesDb aBookmarkDb
                                            )
    {
    CWPWAPBrowserItem* self = new(ELeave) CWPWAPBrowserItem( aFirst,
                                                             aTitle, 
                                                             aBookmarkTitle, 
                                                             aDefaultName, 
                                                             aDefaultBookmarkName,
                                                             aCharacteristic, 
                                                             aCommsDb, 
                                                             aAPHandler, 
                                                             aBookmarkDb ); 
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }

// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
CWPWAPBrowserItem::~CWPWAPBrowserItem()
    {
    iBookmarks.ResetAndDestroy();
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::SaveL
// -----------------------------------------------------------------------------
//
void CWPWAPBrowserItem::SaveL()
    {
    CreateDbL();

    TPckg<TUint32> uid( iUID );
    // Check if the iLink->Data() contains an item of the same size as uid. 
    // This is an extra check to ensure that iLink->Data() contains a packaged
    // TUin32.
    if( iLink && iLink->Data().Length() == uid.MaxLength() )
        {
        uid.Copy( iLink->Data() );
        }
    
    CApAccessPointItem* apItem = CApAccessPointItem::NewLC();
    // will leave if AP does not exists
    iAPHandler->AccessPointDataL( iUID, *apItem );
    if( iAddr )
        {
        // Update the access point startpage
        WriteHomePageL( *apItem );
        }
    CleanupStack::PopAndDestroy(); // apItem
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::CanSetAsDefault
// -----------------------------------------------------------------------------
//
TBool CWPWAPBrowserItem::CanSetAsDefault() const
    {
    return iUID != KWPWAPNoUID;
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::SetAsDefaultL
// -----------------------------------------------------------------------------
//
void CWPWAPBrowserItem::SetAsDefaultL()
    {
    FLOG( _L( "[Provisioning] CWPWAPBrowserItem::SetAsDefaultL:" ) );
    
    CreateDbL();
    TRAPD( err, iAPHandler->SetAsDefaultL( (TInt)iUID, EIspTypeWAPOnly) );
    if( err == KErrLocked )
        {
        err = EWPCommsDBLocked;
        }
    // This function need to leave at the end of the function
    // otherwise we dont set the default AP when db is locked
    //User::LeaveIfError( err );
    
    // There's some delay before the WmlBrowser can find the stored 
    // accesspoint from CommsDb so therefore we wait for a while before
    // telling the WmlBrowser that default accesspoint should be changed.
    // The value 500000 is chosen just by trying out.
    User::After( KWmlDelay );

    CRepository* repository = CRepository::NewLC( KCRUidBrowser );
    FTRACE(RDebug::Print(
                _L("[Provisioning] CWPWAPBrowserItem::SetAsDefaultL: AP:(%d)"),
                                                                  (TInt)iUID));
    
    // Force the browser to use the User Defined AP selection mode.
    User::LeaveIfError( repository->Set( KBrowserAccessPointSelectionMode,
                                         KUserDefined ) );
    // This sets the accesspoint default for browser.
    User::LeaveIfError( repository->Set( KBrowserDefaultAccessPoint,
                                         (TInt)iUID ) );

    //Set the HomePage to default
    if(iUID)
        {
        User::LeaveIfError( repository->Set( KBrowserNGHomepageType, EBrowserCenRepAccessPoint) );
        }

    CleanupStack::PopAndDestroy(); // repository
    FLOG( _L( "[Provisioning] CWPWAPBrowserItem::SetAsDefaultL: Set Done" ) );

    User::LeaveIfError( err );
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::ValidateL
// -----------------------------------------------------------------------------
//
TBool CWPWAPBrowserItem::ValidateL()
    {
    return iLink != NULL;
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::ResourceL
// -----------------------------------------------------------------------------
//
void CWPWAPBrowserItem::ResourceL( CWPCharacteristic& aResource )
    {
    MWPWAPItemBase* item = WPWAPItemFactory::CreateBookmarkLC( 
                                                          iBookmarkTitle, 
                                                          iDefaultBookmarkName,
                                                          aResource, 
                                                          iLink, 
                                                          iDb );

    if( item->CanSetAsDefault() && !iAddr )
        {
        iAddr = item->Address().AllocL();
        CleanupStack::PopAndDestroy(); // item
        }
    else
        {
        User::LeaveIfError( iBookmarks.Append( item ) );
        CleanupStack::Pop(); // item
        }
    }

// -----------------------------------------------------------------------------
// CWPWAPBrowserItem::AddL
// -----------------------------------------------------------------------------
//
void CWPWAPBrowserItem::AddL( RPointerArray<MWPWAPItemBase>& aShownItems,
                              RPointerArray<MWPWAPItemBase>& aHiddenItems )
    {
    for( TInt i( iBookmarks.Count()-1 ); i >= 0 ; i-- )
        {
        MWPWAPItemBase* item = iBookmarks[i];

        if( item->ValidateL() )
            {
            // Transfer ownership of iBookmarks[i] to aItems
            iBookmarks[i]->AddL( aShownItems, aHiddenItems );
            }
        else
            {
            // invalid items get deleted
            delete item;
            }
        iBookmarks.Remove( i );
        }

    // Only first browser item is shown to the user.
    if( iFirst )
        {
        User::LeaveIfError( aShownItems.Append( this ) );
        }
    else
        {
        User::LeaveIfError( aHiddenItems.Append( this ) );
        }
    }

//  End of File