upnpsettings/upnpgsplugin/src/upnpappsettingitemhomeiap.cpp
author hgs
Mon, 04 Oct 2010 13:32:20 +0300
changeset 34 eab116a48b80
parent 0 7f85d04be362
permissions -rw-r--r--
201039_02

/*
* Copyright (c) 2008 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:      Implements home network IAP setting item class to home
*                network setting item list.
*
*/







// INCLUDE FILES
// System
#include <StringLoader.h>           // stringloader
#include <aknmessagequerydialog.h>  // caknmessagequerydialog
#include <aknradiobuttonsettingpage.h> // caknradiobuttonsettingpage
#include <WlanCdbCols.h>            // wlan_service
#include <wlanmgmtcommon.h>         // twlanssid
#include <agentdialog.h>            // rgenconagentdialogserver
#include <aknnotewrappers.h>        // cakninformationnote
#include <cmmanager.h>
#include <cmconnectionmethoddef.h>
#include <commdb.h>                 //CCommsDatabase          
#include "upnpavcontrollerfactory.h"
#include "upnpsettingsengine.h"
#include "upnpsettingsengine.hrh"

// internal
#include "upnpappsettingitemhomeiap.h"
#include "upnpappsettingslist.h"    // ewlanunsecured
#include "upnpfilesharingengine.h"  // cupnpfilesharingengine

#include <upnpgspluginrsc.rsg>

_LIT( KComponentLogfile, "upnpgsplugin.txt");
#include "upnplog.h"

// ================= MEMBER FUNCTIONS =======================

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::NewL()
// --------------------------------------------------------------------------
//
UPnPAppSettingItemHomeIAP* UPnPAppSettingItemHomeIAP::NewL(
    TInt aIdentifier,
    TInt& aIAPSetting,
    TInt& aIAPId,
    TInt& aWAPId,
    TBool& aSharingState )
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    UPnPAppSettingItemHomeIAP* self = new (ELeave) UPnPAppSettingItemHomeIAP(
        aIdentifier,
        aIAPSetting,
        aIAPId,
        aWAPId,
        aSharingState );

    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    return self;
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::UPnPAppSettingItemHomeIAP()
// --------------------------------------------------------------------------
//
UPnPAppSettingItemHomeIAP::UPnPAppSettingItemHomeIAP(
    TInt aIdentifier,
    TInt& aIAPSetting,
    TInt& aIAPId,
    TInt& aWAPId,
    TBool& aSharingState ) :
    CAknEnumeratedTextPopupSettingItem(aIdentifier, aIAPSetting),
    iIAPSetting(aIAPSetting),
    iIAPId(aIAPId),
    iWAPId(aWAPId),
    iSharingState( aSharingState )
    {
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::ConstructL()
// --------------------------------------------------------------------------
//
void UPnPAppSettingItemHomeIAP::ConstructL()
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );

    iCoeEnv = CCoeEnv::Static();
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::~UPnPAppSettingItemHomeIAP()
// --------------------------------------------------------------------------
//
UPnPAppSettingItemHomeIAP::~UPnPAppSettingItemHomeIAP()
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    delete iItemText;
    delete iIAPName;

    iIAPIdArray.Close();
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    }

// --------------------------------------------------------------------------
// UPnPAppSettingPageHomeIAP::CreateAndExecuteSettingPageL ()
// --------------------------------------------------------------------------
//
void UPnPAppSettingItemHomeIAP::CreateAndExecuteSettingPageL()
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    // if sharing is on, only information note is displayed
    UPnPAVControllerFactory::TAVControllerServerStatus status;
    UPnPAVControllerFactory::Status( status );
    if ( iSharingState || status == UPnPAVControllerFactory::EStatusActive )
        {
        CAknInformationNote* note = new (ELeave) CAknInformationNote;
        CleanupStack::PushL(note);
        HBufC* noteText = iCoeEnv->AllocReadResourceLC(
            R_QTN_IUPNP_IAP_TURN_SHARING_OFF);
        note->ExecuteLD(*noteText);
        CleanupStack::PopAndDestroy(noteText);
        CleanupStack::Pop(note);
        return;
        }

    // Resets the member array for iap ids.
    // Creates new array for iap names.
    iIAPIdArray.Reset();
    CDesCArray* array = new (ELeave) CDesCArrayFlat(5);
    CleanupStack::PushL(array);

    // adds static setting page items from resource
    // and stores the number of static items.
    AddStaticItemsL(array);
    TInt staticItemCount = array->Count();
    
    // adds wlan access points, array GETS the ownership
    CUPnPSettingsEngine::GetWLANAccessPointsL( array, iIAPIdArray );
    
    MAknQueryValue* qValue = QueryValue();
    User::LeaveIfNull(qValue);
    LoadL();
    StoreL();

    TInt idx = GetIAPIndex( staticItemCount );
    if ( idx >= array->MdcaCount() )
        {
        idx = array->MdcaCount() - 1;
        }
    // setting page is launched
    CAknSettingPage* dlg = new (ELeave) CAknRadioButtonSettingPage(
        SettingPageResourceId(),
        idx,
        array);

    if (dlg->ExecuteLD())
        {
        switch (idx)
            {
            case EUPnPSettingsEngineIAPItemNone:
                {
                DisplayInfoL(R_IBU_GALLERY_UPDATE_NOTE_TITLE_TEXT,
                             R_IBU_GALLERY_UPDATE_NOTAVAIL_NOTE_TEXT,
                             R_HOMECONNECT_INFO_QUERY);
                qValue->SetCurrentValueIndex(EUPnPSettingsEngineIAPItemNone);
                iIAPId = EUPnPSettingsEngineIAPIdNone;
                iIAPSetting = EUPnPSettingsEngineIAPItemNone;
                break;
                }
            case EUPnPSettingsEngineIAPItemAlwaysAsk:
                {
                qValue->SetCurrentValueIndex(EUPnPSettingsEngineIAPItemAlwaysAsk);
                iIAPId = EUPnPSettingsEngineIAPIdAlwaysAsk;
                iIAPSetting = EUPnPSettingsEngineIAPItemAlwaysAsk;
                DisplayInfoL(R_IBU_GALLERY_UPDATE_NOTE_TITLE_TEXT,
                             R_IBU_GALLERY_UPDATE_NOTE_TEXT,
                             R_HOMECONNECT_INFO_QUERY);
                break;
                }
            case EUPnPSettingsEngineIAPItemUserDefined: // Create new
                {
                // new iap wlan iap creation is started here
                
                TInt old_iap = iIAPId;
                
                CUPnPSettingsEngine::CreateAccessPointL();
                
                //We have to re-get all the wlan iaps again since
                //user may modify the iap list   
                RArray<TInt64> newArray;
                CleanupClosePushL( newArray );
                
                //We only are interested in the iap ids
                CUPnPSettingsEngine::GetWLANAccessPointsL(
                                                    NULL, 
                                                    newArray );
                
                if( newArray.Count() <= 0 ) //if no iap exisits
                    {
                    //if previous iap is not "None" or "Always ask"
                    if( old_iap > EUPnPSettingsEngineIAPIdAlwaysAsk )
                        {
                        DisplayInfoL(
                            R_IBU_GALLERY_UPDATE_NOTE_TITLE_TEXT,
                            R_IBU_GALLERY_UPDATE_NOTAVAIL_NOTE_TEXT,
                            R_HOMECONNECT_INFO_QUERY);
                        iIAPId = EUPnPSettingsEngineIAPIdNone;
                        
                        qValue->SetCurrentValueIndex(
                                            EUPnPSettingsEngineIAPItemNone );
                        iIAPSetting = EUPnPSettingsEngineIAPItemNone;
                        }
                    iIAPIdArray.Reset();
                    CleanupStack::PopAndDestroy( &newArray );
                    }
                else
                    {
                    TBool newiap = ETrue;
                    TInt lastItemIndex = newArray.Count() - 1;
                    //if the last item on the new iap list 
                    //is found in the old iap array
                    //then we think no new iap is created
                    for( TInt i = 0; i < iIAPIdArray.Count(); i++ )
                        {                        
                        if( newArray[lastItemIndex] == iIAPIdArray[i] )
                            {
                            newiap = EFalse; 
                            i = iIAPIdArray.Count();
                            }
                        }
                    
                    //get the new iap list
                    iIAPIdArray.Reset();
                    for( TInt i = 0; i < newArray.Count(); i++ )
                        {
                        iIAPIdArray.AppendL( newArray[i] );
                        }                        
                    CleanupStack::PopAndDestroy( &newArray );
                    
                    if( newiap )
                        {
                        iIAPId = iIAPIdArray[lastItemIndex];//get new iap
                        iIAPSetting = 
                                EUPnPSettingsEngineIAPItemUserDefined;
                        // show confirmation note if connection is 
                        // unsecured, the database store the value of
                        // the securitymode,such as EOpen,EWep,E802_1x,
                        // EWpa,if select other securitymode except 
                        // EOpen, the return value of the 
                        // CheckAPSecurityL fuction is not EWLanUnsecured
                        if ( CheckAPSecurityL(iIAPId) == EWLanUnsecured )
                            {
                            CAknQueryDialog* dlg = 
                                                CAknQueryDialog::NewL();
                            if (!(dlg->ExecuteLD(
                            R_UNSECURED_CONNECTIONS_CONFIRMATION_QUERY)))
                                {
                                //user cancels the dialog
                                UsePreviousIapL( old_iap ); 
                                }
                            }
                        else
                            {
                            // show 'Sharing Changed' note ( None -> sharing)
                            if(old_iap == EUPnPSettingsEngineIAPIdNone &&
                               iIAPId != old_iap )
                                {
                                DisplayInfoL(
                                     R_IBU_GALLERY_UPDATE_NOTE_TITLE_TEXT,
                                     R_IBU_GALLERY_UPDATE_NOTE_TEXT,
                                     R_HOMECONNECT_INFO_QUERY);
                                }  
                            }    
                        }
                    else 
                        {
                        UsePreviousIapL(old_iap);
                        } //if( newiap )
                    } //if( newArray.Count() <= 0 )
                break;
                }
            default: // Predefined iap is selected
                {
                TInt index;
                TInt old_iap = iIAPId;
                TBool iapchange = EFalse;
                // iap id is set
                if ( idx - staticItemCount >= 0 )
                    {
                    index = idx - staticItemCount;
                    if (CheckAPSecurityL(iIAPIdArray[index]) ==
                        EWLanUnsecured)
                        {
                        // show confirmation note if connection is unsecured
                        CAknQueryDialog* dlg = CAknQueryDialog::NewL();
                        if (dlg->ExecuteLD(
                            R_UNSECURED_CONNECTIONS_CONFIRMATION_QUERY))
                            {
                            //if "Continue"
                            iapchange = ETrue;
                            }
                        }
                    else
                        {
                        iapchange = ETrue;
                        }
                   
                    if( iapchange )
                        {
                        iIAPSetting = EUPnPSettingsEngineIAPItemUserDefined;
                        iIAPId = iIAPIdArray[index];
                        qValue->SetCurrentValueIndex(
                            EUPnPSettingsEngineIAPItemUserDefined);

                        // if previous iap was 'None' and current iap
                        // is not 'None'
                        if ( old_iap == EUPnPSettingsEngineIAPIdNone &&
                             iIAPId != old_iap )
                            {
                            DisplayInfoL(
                                R_IBU_GALLERY_UPDATE_NOTE_TITLE_TEXT,
                                R_IBU_GALLERY_UPDATE_NOTE_TEXT,
                                R_HOMECONNECT_INFO_QUERY);
                            }
                        }
                    }
                break;
                }
            }
        }
    LoadL();
    StoreL();

    CleanupStack::PopAndDestroy(array);
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::ChangeIAPNameL()
// --------------------------------------------------------------------------
//
void UPnPAppSettingItemHomeIAP::ChangeIAPNameL()
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    delete iIAPName;
    iIAPName = NULL;
    
    iIAPName = CUPnPSettingsEngine::GetCurrentIapNameL( iIAPId );
    
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::CheckAPSecurity
// Checks if selected access point is unsecured and shows warning note
// --------------------------------------------------------------------------
//
TInt UPnPAppSettingItemHomeIAP::CheckAPSecurityL(TInt aAccessPoint)
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    TUint32 serviceId = 0;
    TUint32 securityMode = 0;

    CCommsDatabase* db = CCommsDatabase::NewL( EDatabaseTypeIAP );
    CleanupStack::PushL( db );

    CCommsDbTableView* view = db->OpenViewMatchingUintLC(TPtrC(IAP),
                              TPtrC(COMMDB_ID), aAccessPoint);

    TInt error = view->GotoFirstRecord();

    if( error == KErrNone )
        {
        view->ReadUintL(TPtrC(IAP_SERVICE), serviceId);
        }

    CCommsDbTableView* wLanServiceTable = NULL;

    TRAPD(err,
    {// this leaves if the table is empty....
    wLanServiceTable = db->OpenViewMatchingUintLC(
        TPtrC( WLAN_SERVICE ),
        TPtrC( WLAN_SERVICE_ID ),
        serviceId );
    CleanupStack::Pop( wLanServiceTable );
    });

    if ( err == KErrNone )
        {
        CleanupStack::PushL( wLanServiceTable );

        TInt errorCode = wLanServiceTable->GotoFirstRecord();

        if ( errorCode == KErrNone )
            {//read securityMode value
            wLanServiceTable->ReadUintL(TPtrC( WLAN_SECURITY_MODE ),
                                        securityMode );
            }

        CleanupStack::PopAndDestroy(wLanServiceTable);
        }

    else if (err != KErrNotFound)
        {
        User::LeaveIfError(err);
        }

    CleanupStack::PopAndDestroy(2); // view, db
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );

    return securityMode;
    }

// --------------------------------------------------------------------------
// CUPnPAppSettingsList::DisplayInfoL();
// Shows message query to user
// --------------------------------------------------------------------------
//
void UPnPAppSettingItemHomeIAP::DisplayInfoL(TInt aHeaderResourceId,
                                             TInt aMessageResourceId,
                                             TInt aDialogResourceId)
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    HBufC* noteHeader = StringLoader::LoadL(
        aHeaderResourceId);
    CleanupStack::PushL(noteHeader);
    HBufC* noteMsg = StringLoader::LoadL(
        aMessageResourceId);
    CleanupStack::PushL(noteMsg);

    CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL(*noteMsg);

    dlg->PrepareLC(aDialogResourceId);
    dlg->QueryHeading()->SetTextL(*noteHeader);
    dlg->RunLD();

    CleanupStack::PopAndDestroy(noteMsg);
    CleanupStack::PopAndDestroy(noteHeader);
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::SettingTextL()
// --------------------------------------------------------------------------
//
const TDesC& UPnPAppSettingItemHomeIAP::SettingTextL()
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    delete iItemText;
    iItemText = NULL;
    LoadL();
    StoreL();

    switch ( iIAPSetting )
        {
        case EUPnPSettingsEngineIAPItemAlwaysAsk:
            {
            iItemText = iCoeEnv->AllocReadResourceL(
                R_QTN_IUPNP_ITEM_HOME_IAP_ALWAYS_ASK );
            break;
            }
        case EUPnPSettingsEngineIAPItemUserDefined:
            {
            // changes iap name according to iap id
            ChangeIAPNameL();

            if ( !iIAPName )
                {
                iItemText = iCoeEnv->AllocReadResourceL(
                    R_QTN_IUPNP_ITEM_HOME_IAP_USER_DEFINED );
                }
            else
                {
                iItemText = iIAPName->AllocL();
                }

            break;
            }
        case EUPnPSettingsEngineIAPItemNone:
            {
            iItemText = iCoeEnv->AllocReadResourceL(
                R_QTN_IUPNP_ITEM_HOME_IAP_NONE );
            break;
            }
        default:
            {
            break;
            }
        }
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    return *iItemText;
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::AddStaticItemsL()
// --------------------------------------------------------------------------
//
void UPnPAppSettingItemHomeIAP::AddStaticItemsL(CDesCArray* aArray)
    {
    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
    // None
    HBufC* buf = iCoeEnv->AllocReadResourceLC(
        R_QTN_IUPNP_HOME_IAP_NONE);
    aArray->AppendL(*buf);
    CleanupStack::PopAndDestroy(buf); // buf
    buf = NULL;

    // Always ask
    buf = iCoeEnv->AllocReadResourceLC(
        R_QTN_IUPNP_HOME_IAP_ALWAYS_ASK);
    aArray->AppendL(*buf);
    CleanupStack::PopAndDestroy(buf);
    buf = NULL;

    // Create new
    buf = iCoeEnv->AllocReadResourceLC(
        R_QTN_IUPNP_HOME_IAP_CREATE_NEW);
    aArray->AppendL(*buf);
    CleanupStack::PopAndDestroy(buf);
    buf = NULL;
    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
    }

// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::UsePreviousIapL()
// --------------------------------------------------------------------------
//
void UPnPAppSettingItemHomeIAP::UsePreviousIapL( TInt aOldIap )
    {
    // dialog cancelled, using old iap value
    iIAPId = aOldIap;
    
    if( iIAPId == EUPnPSettingsEngineIAPIdNone )
        {
        iIAPSetting = EUPnPSettingsEngineIAPItemNone;
        }
    else if( iIAPId == EUPnPSettingsEngineIAPIdAlwaysAsk )
        {
        iIAPSetting = EUPnPSettingsEngineIAPItemAlwaysAsk;
        }
    else //search for the old iap
        {
        TBool oldiapthere = EFalse;
        for( TInt i = 0; i < iIAPIdArray.Count(); i++ )
            {
            if( iIAPId == iIAPIdArray[i] )
                {
                oldiapthere = ETrue;
                i = iIAPIdArray.Count();
                }
            }
        if( !oldiapthere )
            {
            iIAPId = EUPnPSettingsEngineIAPIdNone;
            iIAPSetting = EUPnPSettingsEngineIAPItemNone;
            DisplayInfoL(R_IBU_GALLERY_UPDATE_NOTE_TITLE_TEXT,
                             R_IBU_GALLERY_UPDATE_NOTAVAIL_NOTE_TEXT,
                             R_HOMECONNECT_INFO_QUERY);
            }
        else
            {
            iIAPSetting = EUPnPSettingsEngineIAPItemUserDefined;
            }    
        }   
    }
    
// --------------------------------------------------------------------------
// UPnPAppSettingItemHomeIAP::GetIAPIndex()
// --------------------------------------------------------------------------
//
TInt UPnPAppSettingItemHomeIAP::GetIAPIndex( TInt aStaticCount )
    {
    __LOG("GetIAPIndex");  
    TInt iapIndex = KErrNotFound;
    if( iIAPId == EUPnPSettingsEngineIAPIdNone ) //NONE
        {
        iapIndex = EUPnPSettingsEngineIAPItemNone;
        }
    else if( iIAPId == EUPnPSettingsEngineIAPIdAlwaysAsk ) //ALWAYS ASK
        {
        iapIndex = EUPnPSettingsEngineIAPItemAlwaysAsk;
        }
    else //pre-defined iap, index should never be Create New
        {
        iapIndex+=aStaticCount;
        for( TInt i = 0; i < iIAPIdArray.Count(); i++ )
            {
            iapIndex++;
            __LOG1("iap %d", iIAPIdArray[i] );  
            if( iIAPId == iIAPIdArray[i] )
                {
                i = iIAPIdArray.Count();
                }
            }
        }
        
    return iapIndex;    
    }    
// End of File