/*
* Copyright (c) 2002-2005 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:  Providing open url functionality
*
*/


// INCLUDE FILES
#include "AiwBrowserProviderSaveUrl.h"

#include <AiwMenu.h>
//#include <AiwCommon.hrh>
#include <coemain.h>
#include <barsread.h>
#include <StringLoader.h>
#include <AiwBrowserProvider.rsg>
#include <data_caging_path_literals.hrh>  
#include <aknnotewrappers.h> 
#include <AknNoteDialog.h>
#include <favouritesdb.h>
#include <e32std.h>
#include <aiwbrowsercommands.hrh>

#include "logger.h"

// LOCAL CONSTANTS AND MACROS
_LIT( KResourceFileName, "AiwBrowserProvider.rsc");

// ============================= LOCAL FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// NewL 
// Constructor of CAiwBrowserProviderSaveUrl
// Returns:
// 
// -----------------------------------------------------------------------------
//
CAiwBrowserProviderSaveUrl* CAiwBrowserProviderSaveUrl::NewL()
    {
	CAiwBrowserProviderSaveUrl* self = new(ELeave) CAiwBrowserProviderSaveUrl;
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	return self;
    }

// -----------------------------------------------------------------------------
// CAiwBrowserProviderSaveUrl
// Constructor of CAiwBrowserProviderSaveUrl class
// Returns:
// 
// -----------------------------------------------------------------------------
//
CAiwBrowserProviderSaveUrl::CAiwBrowserProviderSaveUrl()
    {
    }

// -----------------------------------------------------------------------------
// ConstructL
// Constructor of CAiwBrowserProviderOpenUrl
// Returns:
// 
// -----------------------------------------------------------------------------
//
void CAiwBrowserProviderSaveUrl::ConstructL()
    {
    TFileName fName(  KNullDesC );
    iResourceOffset = -1;
    fName.Append( _L("Z:") );
    fName.Append( KDC_RESOURCE_FILES_DIR );
    fName.Append( KResourceFileName );
    iResourceOffset = CCoeEnv::Static()->AddResourceFileL( fName );
    LOG_WRITE("AIWBP: OpenUrl Resource file added.");    
    }

// -----------------------------------------------------------------------------
// ~CAiwBrowserProviderSaveUrl
// Destructor of CAiwBrowserProviderSaveUrl class
// Returns:
// 
// -----------------------------------------------------------------------------
//
CAiwBrowserProviderSaveUrl::~CAiwBrowserProviderSaveUrl()
    {
    if( iResourceOffset != -1 )
        {
    	CCoeEnv::Static()->DeleteResourceFile(iResourceOffset);
        iResourceOffset = -1;
        LOG_WRITE("AIWBP: Resource file deleted");
        }
    }


// -----------------------------------------------------------------------------
// InitialiseL 
// aiw initialization
// Returns: none
//                    
// -----------------------------------------------------------------------------
//
void CAiwBrowserProviderSaveUrl::InitialiseL(MAiwNotifyCallback& aFrameworkCallback, 
                                       const RCriteriaArray& aInterest)
    {
    iNotifyCallback = &aFrameworkCallback;
    iInterest = &aInterest;
    LOG_WRITE("AIWBP: Save Url Provider Initialised");       
    }

// -----------------------------------------------------------------------------
// HandleServiceCmdL 
// 
// Returns: 
//         
//         
// -----------------------------------------------------------------------------
//
void CAiwBrowserProviderSaveUrl::HandleServiceCmdL
        (const TInt& /*aCmdId*/, const CAiwGenericParamList& /*aInParamList*/,
         CAiwGenericParamList& /*aOutParamList*/, TUint /*aCmdOptions*/,
         const MAiwNotifyCallback* /*aCallback*/)
    {
    }

// -----------------------------------------------------------------------------
// InitializeMenuPaneL 
// initialization of menu pane 
// Returns: none
//          
// -----------------------------------------------------------------------------
//
//
void CAiwBrowserProviderSaveUrl::InitializeMenuPaneL
        (CAiwMenuPane& aMenuPane, TInt aIndex,
         TInt /*aCascadeId*/, const CAiwGenericParamList& /*aInParamList*/)
    {
    TResourceReader reader;    
    CCoeEnv::Static()->CreateResourceReaderLC
        (reader, R_AIW_BROWSER_PROVIDER_SAVE_URL_MENU);
    aMenuPane.AddMenuItemsL(reader, EBrowserAiwCmdSaveUrl, aIndex);//save url
    CleanupStack::PopAndDestroy(); // reader
    LOG_WRITE("AIWBP: Save Url Menu initialized");
    }

// -----------------------------------------------------------------------------
// HandleMenuCmdL
// handles menu commands
// Returns: none
//          
// -----------------------------------------------------------------------------
//

void CAiwBrowserProviderSaveUrl::HandleMenuCmdL
        (TInt /*aMenuCmdId*/, const CAiwGenericParamList& aInParamList,
         CAiwGenericParamList& /*aOutParamList*/, TUint /*aCmdOptions*/,
         const MAiwNotifyCallback* /*aCallback*/)
    {
    TInt index = 0;
    const TAiwGenericParam* aiwUrl = NULL;
    const TAiwGenericParam* aiwAccessPoint = NULL;
    const TAiwGenericParam* aiwPassword = NULL;
    const TAiwGenericParam* aiwUserName = NULL;
    const TAiwGenericParam* aiwBookmarkName = NULL;
    TUint32 accessPoint = 0;
    TPtrC pPassword;
    TPtrC pUserName;
    TPtrC pBookmarkName;
   
    TPtrC paramtext;
    aiwUrl = aInParamList.FindFirst( index, EGenericParamURL, EVariantTypeDesC);
    if( index == KErrNotFound )
        {
        return;
        }
    LOG_WRITE("AIWBP: aiwUrl set");
    index = 0;                    
    aiwAccessPoint = aInParamList.FindFirst( index, EGenericParamAccessPoint, EVariantTypeTInt32);
    if( index != KErrNotFound )
        {
        TInt32 aid;
        aid = aiwAccessPoint->Value().AsTInt32();
        if( aid > 0)
            {       
            accessPoint = (TUint32) aid;
            }
        }
    LOG_WRITE("AIWBP: accesspoint set");
    index = 0;            
    aiwPassword = aInParamList.FindFirst( index, EGenericParamPassword, EVariantTypeDesC);
    if( index != KErrNotFound )
        {
        pPassword.Set( aiwPassword->Value().AsDes() );
        }
    else
        {
        pPassword.Set( KNullDesC );
        }
    LOG_WRITE("AIWBP:  password set");  
    index = 0;            
    aiwUserName = aInParamList.FindFirst( index,EGenericParamUserName, EVariantTypeDesC);
    if( index != KErrNotFound )
        {
        pUserName.Set( aiwUserName->Value().AsDes() );
        }
    else
        {
        pUserName.Set( KNullDesC );
        }
    LOG_WRITE("AIWBP: username set");   
    index = 0;            
    aiwBookmarkName = aInParamList.FindFirst( index, EGenericParamBookmarkName, EVariantTypeDesC);
    if( index != KErrNotFound )
        {
        pBookmarkName.Set( aiwBookmarkName->Value().AsDes() );
        }
    else
        {
        pBookmarkName.Set( KNullDesC );
        }
    
    LOG_WRITE("AIWBP: bookmark set");
    SaveUrlL( aiwUrl->Value().AsDes(), 
             pBookmarkName, 
             pUserName, 
             pPassword,
             accessPoint );
    }

// -----------------------------------------------------------------------------
// SaveUrlL
// saves url
// Returns: none
//          
// -----------------------------------------------------------------------------
//

void CAiwBrowserProviderSaveUrl::SaveUrlL(
                const TDesC& aUrl, 
                const TDesC& aName,
                const TDesC& aUserName, 
                const TDesC& aPassword, 
                const TUint32 aApId )
{

    CFavouritesItem* item;
    TFavouritesWapAp ap;
    TInt err;
    
    RFavouritesSession sess;
    err = sess.Connect();
    if( err != KErrNone )
        {
        LOG_WRITE("AIWBP: Failed to open a favorites session.");
	    ErrorNoteL( 
					R_AIW_BROWSER_BOOKMARKS_TEXT_BM_NOT_SAVED );
        return;
        }
    CleanupClosePushL<RFavouritesSession>( sess );
    RFavouritesDb db;
    err = db.Open( sess, KBrowserBookmarks );
    if( err != KErrNone )
        {
        LOG_WRITE("AIWBP: Failed to open a favorites db.");
	    ErrorNoteL( 
					R_AIW_BROWSER_BOOKMARKS_TEXT_BM_NOT_SAVED );
        CleanupStack::PopAndDestroy( 1 );          
        return;
        }
    CleanupClosePushL<RFavouritesDb>( db );

    item = CFavouritesItem::NewLC();

    if( aUrl.Length() < 1 )
        {
        LOG_WRITE("AIWBP: Url is empty.");
	    ErrorNoteL( 
					R_AIW_BROWSER_BOOKMARKS_TEXT_BM_NOT_SAVED );
        return;
        }
    
    item->SetUrlL( aUrl.Left( KFavouritesMaxUrl ) );
    item->SetParentFolder( KFavouritesRootUid );
    
    if( aName.Length() < 1 )
        {
        item->SetNameL( aUrl.Left( KFavouritesMaxName ) );        
        LOG_WRITE("AIWBP: Name length is 0.");
        } 
    else
        {
        item->SetNameL( aName.Left( KFavouritesMaxName ) );
        }

    ap.SetApId( aApId );        
    item->SetWapAp( ap );
    LOG_WRITE("AIWBP: ap id is set.");
    if( aUserName.Length() > 0 )
        { 
        item->SetUserNameL( aUserName.Left( KFavouritesMaxUserName ));
        LOG_WRITE("AIWBP: UserName id is set.");
        }
    if( aPassword.Length() > 0 )
        {
        item->SetPasswordL( aPassword.Left( KFavouritesMaxPassword ) );
        LOG_WRITE("AIWBP: password is set.");
        }

    HBufC* prompt = StringLoader::LoadLC( R_AIW_WML_ENTER_BOOKMARK_NAME );
	TBuf<KFavouritesMaxName> retString;
	retString.Copy( item->Name() );
    LOG_WRITE("AIWBP: String loaded from resource.");

    TBool queryName = ETrue;
	while( queryName )
		{		
		err = DialogPromptReqL( 
			prompt->Des(), 
			&retString, 
            EFalse,
    		KFavouritesMaxName );
		if( err )
			{
			item->SetNameL(retString.Left(KFavouritesMaxName));
        // Add the item. The transaction is automatic.
            err = db.Add( *item, ETrue ) ;
			if ( !err )
				{
				InfoNoteL(
							R_BROWSER_OK_NOTE,
							R_AIW_BROWSER_BOOKMARKS_TEXT_BM_SAVED );
				queryName = EFalse;
                LOG_WRITE("AIWBP: saved to bookmarks.");
				}
			else if( KErrAlreadyExists == err )
				{
				InfoNoteL( 
						R_BROWSER_INFO_NOTE, R_AIW_WML_NAME_ALREADY_IN_USE );
                LOG_WRITE("AIWBP: allready exists");
                }
			else
				{
				ErrorNoteL( 
					R_AIW_BROWSER_BOOKMARKS_TEXT_BM_NOT_SAVED );
                LOG_WRITE("AIWBP: not saved error");
                }
			}
		else
            {
			queryName = EFalse;
            }
		}
	CleanupStack::PopAndDestroy( 4 );  // prompt, db, session, item
}

// -----------------------------------------------------------------------------
// ErrorNoteL 
// popups an error note
// Returns: none
//          
// -----------------------------------------------------------------------------
//

void CAiwBrowserProviderSaveUrl::ErrorNoteL( const TInt aPromptResourceId )
    {
    HBufC* prompt = StringLoader::LoadLC( aPromptResourceId );
    CAknErrorNote* note = new ( ELeave ) CAknErrorNote();
    note->ExecuteLD( *prompt );
    CleanupStack::PopAndDestroy();  // prompt
    }

// -----------------------------------------------------------------------------
// InfoNoteL 
// popups an info dialog
// Returns: none
//          
// -----------------------------------------------------------------------------
//

void CAiwBrowserProviderSaveUrl::InfoNoteL
( TInt aDialogResourceId, const TInt aPromptResourceId )
    {
    HBufC* prompt = StringLoader::LoadLC( aPromptResourceId );
    CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog
								( REINTERPRET_CAST( CEikDialog**, &dialog ) );
    dialog->PrepareLC( aDialogResourceId ) ;
    dialog->SetCurrentLabelL( EGeneralNote, *prompt );
    dialog->RunDlgLD( CAknNoteDialog::ELongTimeout, CAknNoteDialog::ENoTone );
    CleanupStack::PopAndDestroy();  // prompt
    }

// -----------------------------------------------------------------------------
// DialogPromptReqL
// popups an dialog
// Returns: errorcode
//          
// -----------------------------------------------------------------------------
//

TInt CAiwBrowserProviderSaveUrl::DialogPromptReqL( const TDesC& aMsg, 
                                        TDes* aResp, 
                                        TBool aLowerCase,
                                        TInt aMaxLength
                                        )
	{
	TPtrC msg( aMsg );

	CAknTextQueryDialog* dialog = new( ELeave )CAknTextQueryDialog( *aResp, msg );
	if( aMaxLength )
	    {
		dialog->SetMaxLength(aMaxLength);
	    }

    TInt resource;
    if ( aLowerCase )
        {
        resource = R_WB_SCRIPT_PROMPT_LOWERCASE;
        }
    else
        {
        resource = R_WB_SCRIPT_PROMPT_LINES;
        }
	return dialog->ExecuteLD( resource );
	}





