--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsettings/upnpgsplugin/src/upnpappsettingitemhomeiap.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,616 @@
+/*
+* 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;
+ HBufC* noteText = iCoeEnv->AllocReadResourceLC(
+ R_QTN_IUPNP_IAP_TURN_SHARING_OFF);
+ note->ExecuteLD(*noteText);
+ CleanupStack::PopAndDestroy(noteText);
+ 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