upnpsettings/appwizard/src/cupnpappwizard.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsettings/appwizard/src/cupnpappwizard.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,1314 @@
+/*
+* 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:      Implementation of setup Wizard
+ *
+*/
+
+
+
+
+
+
+// INCLUDE FILES
+#include <AknUtils.h>
+#include <featmgr.h>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <eikspmod.h>
+#include <eikclb.h>
+#include <aknview.h>
+#include <aknViewAppUi.h>
+#include <eikprogi.h>
+#include <aknmessagequerydialog.h>  //CAknMessageQueryDialog
+#include <aknlistquerydialog.h>     //CAknListQueryDialog
+#include <es_sock.h> //RSocketServ
+#include <commdb.h>
+#include <cdbcols.h>
+#include <WlanCdbCols.h>
+#include <wlanmgmtinterface.h>
+#include <aknnotewrappers.h> //CAknWaitDialog
+#include <AknWaitDialog.h>
+#include <cupnpappwizard.rsg>
+#include <commdb.h> // COMMS DB - for checking AP validity
+
+// upnp stack
+#include "upnpstring.h" //String::ToUnicodeL
+
+// ADO internal interfaces
+#include "upnpsettingsengine.h" //Friendly name, AP
+#include "upnpsettingsengine.hrh" //AP
+#include "cupnpmultiselectionui.h" //CUPnPMultiSelectionUi
+
+// this component
+#include "cupnpappwizard.h"
+
+// logging facility
+_LIT( KComponentLogfile, "upnpsetupwizard.txt");
+#include "upnplog.h"
+
+// CONSTANTS
+// Filename of rsc file
+_LIT( KUPnPSetupWizardRscFile, "\\resource\\cupnpappwizard.rsc" );
+
+// ============================ MEMBER FUNCTIONS ============================
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::CUPnPAppWizard
+// --------------------------------------------------------------------------
+//
+CUPnPAppWizard::CUPnPAppWizard()
+    {
+    __LOG("CUPnPAppWizard::CUPnPAppWizard");
+    iDialogDismissed = ETrue;
+    iFeatureManagerInitialized = EFalse;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::ConstructL( const TDesC& aFirstStepText,
+                                 CUPnPFileSharingEngine* aEng )
+    {
+    __LOG("CUPnPAppWizard::ConstructL begin");
+
+    iShareImgAndVideoArray = new (ELeave) CArrayFixFlat<TInt>(3);
+    iShareMusicArray = new (ELeave) CArrayFixFlat<TInt>(3);
+    
+    iCoeEnv = CEikonEnv::Static();
+    RFs& fileSession = iCoeEnv->FsSession();
+
+
+    // Load resource file
+    TFileName rscFileName( KUPnPSetupWizardRscFile );
+    TFileName dllName;
+    Dll::FileName( dllName );
+    TBuf<2> drive = dllName.Left( 2 ); // Drive letter followed by ':' 
+    rscFileName.Insert( 0, drive );
+    
+    // Get the exact filename of the resource file
+    BaflUtils::NearestLanguageFile( fileSession, rscFileName );
+    // Check if the resource file exists or not
+    if ( !BaflUtils::FileExists( fileSession, rscFileName ) )
+        {
+        User::Leave( KErrNotFound );
+        }
+    TInt err( KErrNone );
+    TRAP( err, iResFileOffset = iCoeEnv->AddResourceFileL( rscFileName ) );
+
+    FeatureManager::InitializeLibL();
+    iFeatureManagerInitialized = ETrue;
+
+    // Get AppUI pointer
+    iAppUi = static_cast<CAknViewAppUi*>( iCoeEnv->EikAppUi() );
+
+    iSetEng = CUPnPSettingsEngine::NewL();
+    if ( aEng )
+        {
+        iFileEng = aEng;
+        }
+    else
+        {
+        User::Leave( KErrArgument);
+        }
+    iFileEng->SetObserver( this );
+    iFirstStepText = aFirstStepText.AllocL();
+
+    iSharingState = iFileEng->SharingStateL();
+    iSelections = new (ELeave) CSelectionStorage( iSetEng, iFileEng );
+    __LOG("CUPnPAppWizard::ConstructL end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::NewL()
+// Two-phased constructor.
+// --------------------------------------------------------------------------
+//
+EXPORT_C CUPnPAppWizard* CUPnPAppWizard::NewL( const TDesC& aFirstStepText,
+                                               CUPnPFileSharingEngine* aEng )
+    {
+    __LOG("CUPnPAppWizard::NewL begin");
+
+    CUPnPAppWizard* self = new ( ELeave) CUPnPAppWizard();
+    CleanupStack::PushL( self );
+
+    self->ConstructL( aFirstStepText, aEng );
+
+    CleanupStack::Pop();
+    __LOG("CUPnPAppWizard::NewL end");
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// Destructor
+// --------------------------------------------------------------------------
+//
+CUPnPAppWizard::~CUPnPAppWizard()
+    {
+    __LOG("CUPnPAppWizard::~CUPnPAppWizard begin");
+
+    if ( iFeatureManagerInitialized )
+        {
+        FeatureManager::UnInitializeLib();
+        }
+
+    // Un-Load resource file
+    if ( iResFileOffset )
+        {
+        CEikonEnv::Static()->DeleteResourceFile( iResFileOffset );
+        iResFileOffset = 0;
+        }
+
+    delete iSetEng;
+
+    delete iSelections;
+    delete iIapNameArr;
+    delete iFirstStepText;
+
+    if ( iWait.IsStarted() )
+        {
+        if ( iWait.CanStopNow() )
+            {
+            iWait.AsyncStop();
+            }
+        else
+            {
+            __LOG("CUPnPAppWizard: \
+Error cant stop iWait");
+            }
+        }
+
+    if ( iFileEng )
+        {
+        iFileEng->SetObserver( NULL );
+        }
+
+    delete iShareImgAndVideoArray;
+    delete iShareMusicArray;
+    
+    __LOG("CUPnPAppWizard::~CUPnPAppWizard end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::StartL
+// The main loop of setup wizard
+// --------------------------------------------------------------------------
+//
+
+EXPORT_C TInt CUPnPAppWizard::StartL( )
+    {
+    __LOG("CUPnPAppWizard::StartL begin");
+    TInt ret(KErrNone);
+    do
+        {
+        switch ( iStep )
+            {
+        case EInfo1:
+            {
+            ret = ShowFirstStepL( R_UPNP_WIZARD_POPUP_DIALOG_1 );
+            }
+            break;
+        case EInfo2:
+            {
+            ret = ShowInfoStepL( R_UPNP_WIZARD_POPUP_DIALOG_2 );
+            }
+            break;
+        case EDeviceName:
+            {
+            ret = ShowTextStepL( R_UPNP_WIZARD_POPUP_DIALOG_3 );
+            }
+            break;
+        case EInfo4:
+            {
+            ret = ShowInfoStepL( R_UPNP_WIZARD_POPUP_DIALOG_4 );
+            }
+            break;
+        case EAccessPoint:
+            {
+            ret = ShowListStepL( R_UPNP_WIZARD_POPUP_DIALOG_5 );
+            }
+            break;
+        case EInfo6:
+            {
+            ret = ShowInfoStepL( R_UPNP_WIZARD_POPUP_DIALOG_6 );
+            }
+            break;
+        case EShareImages:
+            {
+            ret = ShowMultiselectionStepL( R_UPNP_WIZARD_HEAD_7_TEXT );
+            }
+            break;
+        case EShareMusic:
+            {
+            ret = ShowMultiselectionStepL(R_UPNP_WIZARD_HEAD_8_TEXT );
+            }
+            break;
+        case EInfo9:
+            {
+            if ( iSelections->HasSomethingToShare() )
+                {
+                ret = ShowInfoStepL( R_UPNP_WIZARD_POPUP_DIALOG_9A );
+                }
+            else
+                {
+				iFileEng->SetObserver( this );
+                ret = ShowInfoStepL( R_UPNP_WIZARD_POPUP_DIALOG_9B );
+                }
+            }
+            break;
+        case EStoreSettings:
+            {
+            iSelections->StoreSettingsL();
+            if ( !iSharingState && iSelections->HasSomethingToShare() )
+                {
+                __LOG("CUPnPAppWizard::StartL: \
+Staring sharing..");
+                // need to wait for DialogDismissed()
+                iDialogDismissed = EFalse;
+                ShowWaitNoteL( R_UPNP_WIZARD_STARTING_FILE_SHARING_NOTE );
+                DisplayInfoL( R_UPNP_WIZARD_UPDATING_CONTENT_HEADER,
+                              R_UPNP_WIZARD_UPDATING_CONTENT_NOTE_TEXT,
+                              R_UPNP_WIZARD_INFO_QUERY );
+                }
+            else if ( iSharingState && !iSelections->HasSomethingToShare() )
+                {
+                __LOG("CUPnPAppWizard::StartL: \
+Stopping sharing..");
+                iFileEng->SetSharingStateL( EFalse );
+                iWait.Start();
+                }
+
+            // Stores also videofiles
+            iSelections->ImageStoreSharedFilesL();
+
+
+            }
+            break;
+        default :
+            {
+            __LOG("CUPnPAppWizard::StartL: default!");
+            _LIT(KUser, "USER");
+            User::Panic(KUser, 0);
+            }
+            break;
+            }
+        SetNextStep( ret );
+        }
+    while ( iStep != EFinished );
+    __LOG("CUPnPAppWizard::StartL end");
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ShowListStepL
+// Show the UI dialog with selection list
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::ShowListStepL( TInt aMain )
+    {
+    __LOG("CUPnPAppWizard::ShowListStepL begin");
+    TInt returnValue(KErrNone);
+    TInt currentSel(0);
+    TInt selectedIap(1);
+    TInt oldIap;
+    iSelections->GetIapId( oldIap );
+    TBool sharingCheck;
+    RArray<TInt64> iapIdArr;
+    TInt oldIapCount(0);
+
+    if ( !iIapNameArr )
+        {
+        iIapNameArr = new (ELeave) CDesCArrayFlat(3);
+        }
+
+    do
+        {
+        sharingCheck = ETrue;// ok to exit
+        currentSel = 0;
+        iSelections->InitializeIapArraysL( iIapNameArr, iapIdArr );
+        CUPnPSettingsEngine::GetWLANAccessPointsL( iIapNameArr, iapIdArr );
+        
+        // Set correct initial selection for ui
+        if ( currentSel != KUPnPCreateNewInd )
+            {
+            iSelections->GetCurrentSelection( currentSel, iapIdArr );
+            }
+        else
+            {
+            // ..in case user has selected "Create new"
+            if ( !iSharingState &&
+                 returnValue &&
+                 oldIapCount )
+                {
+                if ( oldIapCount != iapIdArr.Count() )
+                    {
+                    currentSel = iapIdArr.Count() - 1;
+                    }
+                }
+            }
+        CAknListQueryDialog* dlg = new
+            ( ELeave ) CAknListQueryDialog( &currentSel );
+
+        if ( !dlg )
+            {
+            User::Leave( KErrNoMemory );
+            }
+        dlg->PrepareLC( aMain );
+        
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_5_TEXT );
+        dlg->SetHeaderTextL( *head );
+        CleanupStack::PopAndDestroy( head );
+    
+        dlg->SetItemTextArray( iIapNameArr );
+        dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+        CListBoxView* listBoxView = dlg->ListBox()->View();
+        listBoxView->SetCurrentItemIndex( currentSel );
+
+        returnValue = dlg->RunLD();
+
+        TInt c( iapIdArr.Count() );
+
+        if ( currentSel == KUPnPCreateNewInd )
+            {
+            /* call to Wlan creator API */
+            
+            __LOG("CUPnPAppWizard::ShowListStepL:\
+Create new IAP..");
+            CUPnPSettingsEngine::CreateAccessPointL();
+            oldIapCount = iapIdArr.Count();
+            }
+        else if ( currentSel-1 < c )
+            {
+            // set last iap as selected if user succesfully created new iap
+            selectedIap = iapIdArr[ currentSel ];
+            }
+        if ( iSharingState &&
+             ( selectedIap != oldIap ) &&
+             returnValue )
+            {
+            // show info note if sharing is on and user pressed ok
+            sharingCheck = EFalse;
+            ShowInfoNoteL( R_UPNP_WIZARD_IAP_TURN_SHARING_OFF );
+            }
+        iapIdArr.Reset();
+        iIapNameArr->Reset();
+        }
+    while ( currentSel == KUPnPCreateNewInd ||
+            ! sharingCheck );
+
+    iSelections->SetIapId( selectedIap, currentSel );
+
+    iapIdArr.Reset();
+    __LOG("CUPnPAppWizard::ShowListStepL end");
+    return returnValue;
+    }
+
+// ---------------------------------------------------------
+// CUPnPAppWizard::ShowTextStepL( TInt aMain )
+// Shows popup with text and header
+// ---------------------------------------------------------
+//
+TInt CUPnPAppWizard::ShowTextStepL( TInt aMain )
+    {
+    __LOG("CUPnPAppWizard::ShowTextStepL");
+    TInt returnValue(KErrNone);
+
+    TBuf<64> data;
+    TBool sharingCheck( ETrue );
+    iSelections->GetDeviceNameL( data );
+    HBufC16* oldName16 = HBufC16::NewL( data.Size() );
+    CleanupStack::PushL( oldName16 );
+    *oldName16 = data;
+
+    do
+        {
+        sharingCheck = ETrue;
+        CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL( data );
+
+        dlg->PrepareLC( aMain );
+        
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_3_TEXT );
+        dlg->SetPromptL( *head );
+        CleanupStack::PopAndDestroy( head );    
+    
+        returnValue = dlg->RunLD();
+
+        if ( iSharingState &&
+             returnValue )
+            {
+            TInt compRes = oldName16->CompareF( data );
+            if ( compRes )
+                {
+                // show info note if sharing is on
+                sharingCheck = EFalse;
+                ShowInfoNoteL( R_UPNP_WIZARD_IAP_TURN_SHARING_OFF );
+                data = *oldName16;
+                }
+            }
+        }
+    while ( !sharingCheck );
+    CleanupStack::PopAndDestroy( oldName16 );
+    if ( returnValue )
+        {
+        iSelections->SetDeviceNameL( data );
+        }
+    return returnValue;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ShowInfoNoteL
+// Show the information note without buttons
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::ShowInfoNoteL( TInt aMain ) const
+    {
+    __LOG("CUPnPAppWizard::ShowInfoNoteL");
+
+    CAknInformationNote* note = new (ELeave) CAknInformationNote(ETrue);
+    HBufC* noteText = CCoeEnv::Static()->AllocReadResourceLC(
+        aMain);
+    note->ExecuteLD(*noteText);
+    CleanupStack::PopAndDestroy(noteText);
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ShowInfoStepL
+// Show the information note with OK BACK buttons
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::ShowInfoStepL( TInt aMain ) const
+    {
+    __LOG("CUPnPAppWizard::ShowInfoStepL");
+    TInt returnValue(KErrNone);
+    HBufC* messageText;
+
+    CAknMessageQueryDialog* dlg = new (ELeave)
+        CAknMessageQueryDialog( CAknQueryDialog::ENoTone );
+
+    dlg->PrepareLC( aMain );
+
+    switch( aMain )
+        {
+    case R_UPNP_WIZARD_POPUP_DIALOG_2:
+        {
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_2_TEXT );
+        dlg->SetHeaderTextL( *head );
+        CleanupStack::PopAndDestroy( head );
+        
+        HBufC* body = StringLoader::LoadLC( R_UPNP_WIZARD_2_TEXT );
+        dlg->SetMessageTextL( *body );
+        CleanupStack::PopAndDestroy( body );
+        
+        break;
+        }
+    case R_UPNP_WIZARD_POPUP_DIALOG_5:
+        {
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_5_TEXT );
+        dlg->SetHeaderTextL( *head );
+        CleanupStack::PopAndDestroy( head );
+        break;
+        }    
+    case R_UPNP_WIZARD_POPUP_DIALOG_6:
+        {
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_6_TEXT );
+        dlg->SetHeaderTextL( *head );
+        CleanupStack::PopAndDestroy( head );
+    
+        messageText = StringLoader::LoadLC( R_UPNP_WIZARD_6_2_TEXT );
+        dlg->SetMessageTextL( messageText->Des() );
+        CleanupStack::PopAndDestroy( );
+        break;
+        }
+    case R_UPNP_WIZARD_POPUP_DIALOG_9A:
+        {
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_9_TEXT );
+        dlg->SetHeaderTextL( *head );
+        CleanupStack::PopAndDestroy( head );
+        
+        messageText = StringLoader::LoadLC( R_UPNP_WIZARD_9A_TEXT );
+        dlg->SetMessageTextL( messageText->Des() );
+        CleanupStack::PopAndDestroy( );
+        break;
+        }
+    case R_UPNP_WIZARD_POPUP_DIALOG_9B:
+        {
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_9_TEXT );
+        dlg->SetHeaderTextL( *head );
+        CleanupStack::PopAndDestroy( head );
+        
+        messageText = StringLoader::LoadLC( R_UPNP_WIZARD_9B_TEXT );
+        dlg->SetMessageTextL( messageText->Des() );
+        CleanupStack::PopAndDestroy( );
+        break;
+        }
+    default:
+        break;
+        }
+
+    if ( iStep == EInfo4 )
+        {
+        HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_4_TEXT );
+        dlg->SetHeaderTextL( *head );
+        CleanupStack::PopAndDestroy( head );
+        
+        HBufC* itemText2 = StringLoader::LoadLC( R_UPNP_WIZARD_ALWAYS_ASK_TEXT );
+        HBufC* itemText1 = StringLoader::LoadLC( R_UPNP_WIZARD_4_TEXT,
+                                                 *itemText2 );
+
+        dlg->SetMessageTextL( itemText1->Des() );
+        CleanupStack::PopAndDestroy( 2 ); //itemText 1 & 2
+        }
+    returnValue = dlg->RunLD();
+
+    return returnValue;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ShowFirstStepL
+// Show the first information note with OK BACK buttons and given text
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::ShowFirstStepL( TInt aMain ) const
+    {
+    __LOG("CUPnPAppWizard::ShowFirstStepL");
+    TInt returnValue( KErrNone );
+
+    CAknMessageQueryDialog* dlg = new (ELeave)
+        CAknMessageQueryDialog( CAknQueryDialog::ENoTone );
+
+    dlg->PrepareLC( aMain );
+    HBufC* head = StringLoader::LoadLC( R_UPNP_WIZARD_HEAD_1_TEXT );
+    dlg->SetHeaderTextL( *head );
+    CleanupStack::PopAndDestroy( head );
+    
+    if ( iFirstStepText->Length() )
+        {
+        // if the text for first step is given use it insted of default
+        __LOG( "Setting text" );
+        dlg->SetMessageTextL( *iFirstStepText );
+        }       
+    else
+        {
+        __LOG( " StringLoader::LoadLC" );
+        HBufC* body = StringLoader::LoadLC(R_UPNP_WIZARD_1_TEXT);
+        __LOG( "SetMessageTextL" );
+        dlg->SetMessageTextL( *body );
+        __LOG( "PopAndDestroy" );
+        CleanupStack::PopAndDestroy();
+        }
+    returnValue = dlg->RunLD();
+
+    return returnValue;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ShowInfoStepL
+// Show the multiselection popup dialog for setting content to share
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::ShowMultiselectionStepL( TInt aText )
+    {
+    __LOG("CUPnPAppWizard::ShowMultiselectionStepL");
+
+    TInt returnValue(KErrNone);
+
+    THomeConnectMediaType mediaType( EImageAndVideo );
+
+    CArrayFix<TInt>* resArr = new (ELeave) CArrayFixFlat<TInt>(5);
+    CleanupStack::PushL( resArr );
+
+    if ( iStep == EShareMusic )
+        {
+        mediaType = EPlaylist;
+        }
+    TInt visualSharingState;
+    HBufC* head = StringLoader::LoadLC( aText );
+    
+    // no ownership transfers
+    CUPnPMultiselectionUi* uiDlg = CUPnPMultiselectionUi::
+        NewL(mediaType,
+             iFileEng,
+             visualSharingState,
+             resArr,
+             CUPnPMultiselectionUi::EPopup,
+             head );
+    CleanupStack::PushL( uiDlg );
+
+    ModifyMarkedArrayL(ESetMarked,NULL,uiDlg);
+    
+    returnValue = uiDlg->ExecutePopupLD();
+
+    CleanupStack::PopAndDestroy( uiDlg );
+    
+    CleanupStack::PopAndDestroy( head );    
+
+    if ( returnValue )
+        {
+        ModifyMarkedArrayL(EResetArray);
+        for( TInt i = 0 ; i < resArr->Count() ; ++i )
+            {
+            TInt tmp = resArr->At(i);
+            ModifyMarkedArrayL(EAddToArray,tmp);
+            }
+        // Transfer ownership of all dynamic variables( resARr )
+        iSelections->SetSharedContent( mediaType,
+                                       resArr );
+        iFileEng->SetSelectionIndexesL( mediaType, *resArr );
+        }
+
+    CleanupStack::PopAndDestroy( resArr );
+    return returnValue;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ModifyMarkedArrayL
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::ModifyMarkedArrayL( TShareArrayState aArrayState 
+                                       , TInt aValue 
+                                       , CUPnPMultiselectionUi* aUiDlg )
+    {
+    CArrayFix<TInt>* array = NULL;
+    if( iStep == EShareMusic )
+        {
+        array = iShareMusicArray;
+        }
+    else if( EShareImages == iStep )
+        {
+        array = iShareImgAndVideoArray;
+        }
+    if( array )
+        {
+        switch(aArrayState)
+            {
+            case ESetMarked:
+                {
+                if( aUiDlg )
+                    {
+                    aUiDlg->SetMarkedItemsL( *array );
+                    }
+                break;
+                }
+            case EResetArray:
+                {
+                array->Reset();
+                break;
+                }
+            case EAddToArray:
+                {
+                array->AppendL(aValue);
+                break;
+                }
+            default:
+            	break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::SetNextStep
+// Calculates the next step in wizard
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::SetNextStep( const TInt& aSelection )
+    {
+    __LOG("CUPnPAppWizard::SetNextStep");
+
+    switch ( iStep )
+        {
+    case EInfo1:
+        {
+        if ( aSelection )
+            {
+            iStep++;
+            }
+        else
+            {
+            iStep = EFinished;
+            }
+        }
+        break;
+    case EInfo2:
+        // fall through
+    case EDeviceName:
+        // fall through
+    case EInfo4:
+        // fall through
+    case EAccessPoint:
+        // fall through
+    case EInfo6:
+        // fall through
+    case EShareImages:
+        // fall through
+    case EShareMusic:
+        // fall through
+    case EInfo9:
+        // fall through
+    case EStoreSettings:
+        {
+        if ( aSelection )
+            {
+            iStep++;
+            }
+        else
+            {
+            iStep--;
+            }
+        }
+        break;
+    default :
+        {
+        __LOG("CUPnPAppWizard::SetNextStep: default!");
+        _LIT(KUser, "USER");
+        User::Panic(KUser, 0);
+        }
+        break;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ShowErrorNoteL
+// Shows note with error message
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::ShowErrorNoteL( TInt aMain ) const
+    {
+    __LOG("CUPnPAppWizard::ShowErrorNoteL begin");
+
+    // show error note
+    HBufC* errorNote = StringLoader::LoadLC( aMain );
+    CAknErrorNote* note = new (ELeave) CAknErrorNote(ETrue);
+    note->ExecuteLD(*errorNote);
+    CleanupStack::PopAndDestroy(); //errorNote
+    __LOG("CUPnPAppWizard::ShowErrorNoteL end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::ShowWaitNoteL
+// Shows standard wait note
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::ShowWaitNoteL( TInt aMain )
+    {
+    __LOG("CUPnPAppWizard::ShowWaitNoteL begin");
+
+    CAknWaitNoteWrapper* waitNoteWrapper = CAknWaitNoteWrapper::NewL();
+    CleanupStack::PushL(reinterpret_cast<CBase*>(waitNoteWrapper));
+    waitNoteWrapper->ExecuteL(
+        aMain,      // TInt aResId,
+        *this,            // MAknBackgroundProcess& aBackgroundProcess
+        ETrue);
+    CleanupStack::PopAndDestroy();
+    __LOG("CUPnPAppWizard::ShowWaitNoteL end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::StepL
+// Step done during wait note
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::StepL(void)
+    {
+    if ( iStartingSharing == ENotActive )
+        {
+        iStartingSharing = EStartingSharing;
+        }
+
+    }
+
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::IsProcessDone
+// Returns ETrue if process finished
+// --------------------------------------------------------------------------
+//
+TBool CUPnPAppWizard::IsProcessDone(void) const
+    {
+
+    TBool ret(EFalse);
+    if ( iStartingSharing == ENotActive )
+        {
+        TRAPD( err, iFileEng->SetSharingStateL( ETrue ) );
+        if( err != KErrNone )
+            {
+            return ETrue;
+            }
+        }
+    else if ( iStartingSharing == ESharingStarted )
+        {
+        ret = ETrue;
+        }
+    else
+        {
+        __LOG( "CUPnPAppWizard::IsProcessDone: else branch");
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::HandleSharingStatus
+// Function informs when file sharing was enabled or disabled
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::HandleSharingStatus( 
+        CUPnPFileSharingEngine& /*aEngine*/, 
+        TInt aError, 
+        TBool aPhase )
+    {
+    __LOG("CUPnPAppWizard::HandleSharingStatus begin");
+
+    if ( aPhase )
+        {
+        __LOG("CUPnPAppWizard::HandleSharingStatus:\
+ activating sharing");
+        iStartingSharing = ESharingStarted;
+        if ( aError )
+            {
+            // If there domtree wasn't able to be written due to disk full
+            // situation, send leave to kernel to inform user
+            if( aError == KErrDiskFull ||
+                aError == KErrNoMemory ||
+                aError == KErrInUse )
+                {
+                //show some critical errors using
+                //default symbian error notes
+                CActiveScheduler::Current()->Error( aError );
+                }
+            else
+                {
+                if ( !iDialogDismissed )
+                    {
+                    // must ensure that wait note is gone, see DialogDismissed
+                    iWait.Start();
+                    }
+                TRAP_IGNORE( 
+                    ShowErrorNoteL( 
+                        R_UPNP_WIZARD_START_SHARING_ERROR_TEXT ) );
+                }
+            }
+        if ( iWait.IsStarted() )
+            {
+            if ( iWait.CanStopNow() )
+                {
+                iWait.AsyncStop();
+                }
+            else
+                {
+                __LOG("CUPnPAppWizard: \
+Error cant stop iWait");
+                }
+            }
+        }
+    else
+        {
+        __LOG("CUPnPAppWizard::HandleSharingStatus:\
+ deactivating sharing");
+        // stop showing wait note
+        if ( iWait.IsStarted() )
+            {
+            iWait.AsyncStop();
+            }
+        }
+
+    __LOG("CUPnPAppWizard::HandleSharingStatus end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::HandleSharingConnectionLost
+// Callback to inform if connection has been lost
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::HandleSharingConnectionLost( 
+    CUPnPFileSharingEngine& /*aEngine*/ )
+    {
+    __LOG( "[CUPnPAppWizard]\t CUPnPAppWizard::HandleSharingConnectionLost\
+ begin" );
+
+    iSharingState = EFalse;
+
+    __LOG( "[CUPnPAppWizard]\t CUPnPAppWizard::HandleSharingConnectionLost\
+ end" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::DialogDismissedL
+// Callback for dialog disappearing
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::DialogDismissedL( TInt /*aButtonId*/ )
+    {
+    __LOG( "[CUPnPAppWizard]\t DialogDismissedL begin" );
+
+    iDialogDismissed = ETrue;
+    if ( iWait.IsStarted())
+        {
+        iWait.AsyncStop();
+        }
+
+    __LOG( "[CUPnPAppWizard]\t DialogDismissedL end" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::DisplayInfoL()
+// Shows message query to user
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::DisplayInfoL(
+    TInt aHeaderResourceId,
+    TInt aMessageResourceId,
+    TInt aDialogResourceId )
+    {
+    __LOG("CUPnPAppWizard::DisplayInfoL begin");
+    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);
+    __LOG("CUPnPAppWizard::DisplayInfoL end");
+    }
+
+
+// --------------------------------------------------------------------------
+// CUPnPAppWizard::CSelectionStorage functions
+//
+// --------------------------------------------------------------------------
+//
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::CSelectionStorage
+// Destructor
+// --------------------------------------------------------------------------
+//
+CUPnPAppWizard::CSelectionStorage::~CSelectionStorage()
+    {
+    __LOG("[UPnPAppWizard]\tCSelectionStorage::~CSelectionStorage() begin");
+    delete iDeviceName;
+    delete iMusicSelectionArray;
+    delete iImageSelectionArray;
+    __LOG("CSelectionStorage::~CSelectionStorage() end");
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::CSelectionStorage
+// Constructor
+// --------------------------------------------------------------------------
+//
+CUPnPAppWizard::CSelectionStorage::CSelectionStorage(
+    CUPnPSettingsEngine* aSetEng,
+    CUPnPFileSharingEngine* aFileEng )
+    {
+    __LOG("CSelectionStorage::CSelectionStorage() begin");
+    iSetEng = aSetEng;
+    iFileEng = aFileEng;
+    __LOG("CSelectionStorage::CSelectionStorage() end");
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::SetDeviceNameL
+// Function for setting the device name to local storage
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::CSelectionStorage::SetDeviceNameL( TDes& aDeviceName )
+    {
+    __LOG("CSelectionStorage::SetDeviceNameL begin");
+    delete iDeviceName;
+    iDeviceName = NULL;
+    iDeviceName = HBufC::NewL(aDeviceName.Length());
+
+    *iDeviceName = aDeviceName;
+    __LOG("CSelectionStorage::SetDeviceNameL end");
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::GetDeviceNameL
+// Function for getting the device name from local storage or from cenrep
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::CSelectionStorage::GetDeviceNameL( TDes& aDeviceName )
+    {
+    __LOG("CSelectionStorage::GetDeviceNameL begin");
+    TInt err(0);
+    if ( iDeviceName )
+        {
+        aDeviceName = iDeviceName->Des();
+        }
+    else
+        {
+        THostName data;
+        TBuf8<65> deviceName8;
+        err = iSetEng->GetLocalFriendlyName( deviceName8 );
+
+        HBufC* deviceName16 = UpnpString::ToUnicodeL( deviceName8 );
+        CleanupStack::PushL( deviceName16 );
+        aDeviceName = deviceName16->Des();
+        CleanupStack::PopAndDestroy( deviceName16 );
+        }
+    __LOG("CSelectionStorage::GetDeviceNameL end");
+    return err;
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::GetIapId
+// Function for getting the iapid from local storage or from cenrep
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::CSelectionStorage::GetIapId( TInt& aIapId )
+    {
+    __LOG("CSelectionStorage::GetIapId begin");
+    TInt err( KErrNone );
+    if ( iIapId )
+        {
+        aIapId = iIapId;
+        }
+    else
+        {
+        err = iSetEng->GetAccessPoint( iIapId );
+        aIapId = iIapId;
+        }
+    __LOG("CSelectionStorage::GetIapId end");
+    return err;
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::SetIapId
+// Function for setting the iapid to local storage
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::CSelectionStorage::SetIapId( const TInt aIapId,
+                                                  const TInt aIndexForUi )
+    {
+    __LOG("CSelectionStorage::SetIapId begin");
+
+    iIapId = aIapId;
+    iIndexForUi = aIndexForUi;
+
+    __LOG("CSelectionStorage::SetIapId end");
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::StoreSettingsL
+// Function for storing devicename and iapid to cenrep
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::CSelectionStorage::StoreSettingsL()
+    {
+    __LOG("CSelectionStorage::StoreSettingsL begin");
+    TInt err(0);
+    if ( iDeviceName )
+        {
+        HBufC8* name8 = UpnpString::FromUnicodeL( iDeviceName->Des() );
+        CleanupStack::PushL( name8 );
+        err = iSetEng->SetLocalFriendlyName( name8->Des() );
+        CleanupStack::PopAndDestroy( name8 );
+        }
+    if ( iIapId >= EUPnPSettingsEngineIAPIdAlwaysAsk )
+        {
+        // Stores iap id.
+        iSetEng->SetAccessPoint( iIapId );
+        
+        // Stores iap selection type.
+        TInt iapForHomeNetworkUi( EUPnPSettingsEngineIAPItemUserDefined );
+        if ( iIapId == EUPnPSettingsEngineIAPIdAlwaysAsk )
+            {
+            iapForHomeNetworkUi = EUPnPSettingsEngineIAPItemAlwaysAsk;
+            }
+        iSetEng->SetAccessPointSetting( iapForHomeNetworkUi );
+        
+        // index for HN ui?
+        iSetEng->SetWapId( iIndexForUi+1 );
+        }
+
+    __LOG("CSelectionStorage::StoreSettingsL end");
+    return err;
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::ImageStoreSharedFilesL
+// Function for storing image and video
+// --------------------------------------------------------------------------
+//
+TInt CUPnPAppWizard::CSelectionStorage::ImageStoreSharedFilesL( )
+    {
+    /* Save Images and Videos */
+    __LOG( "CSelectionStorage::Sharing image and video .." );
+    if ( iFileEng )
+        {
+        iFileEng->ShareMediaL( EImageAndVideo );
+        iFileEng->ShareMediaL( EPlaylist );
+        }   
+    __LOG( "CSelectionStorage::ImageStoreSharedFilesL end" );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::InitializeIapArraysL
+// Add default items to iap name array
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::CSelectionStorage::InitializeIapArraysL(
+    CDesCArray* aIapNameArr,
+    RArray<TInt64>& aIapIdArr ) const
+    {
+    __LOG("[UPnPAppWizard]\tCSelectionStorage::InitializeIapArraysL begin");
+
+    HBufC* itemText1 = StringLoader::LoadLC( R_UPNP_WIZARD_ALWAYS_ASK_TEXT );
+    HBufC* itemText2 = StringLoader::LoadLC( R_UPNP_WIZARD_CREATE_NEW_TEXT );
+
+    aIapNameArr->AppendL( itemText1->Des() );
+    aIapIdArr.AppendL( EUPnPSettingsEngineIAPIdAlwaysAsk );
+    aIapNameArr->AppendL( itemText2->Des() );
+    aIapIdArr.AppendL( EUPnPSettingsEngineIAPIdCreateNew );
+
+    //aIapNameArr does not own the items
+    CleanupStack::PopAndDestroy(2);
+
+    __LOG("[UPnPAppWizard]\tCSelectionStorage::InitializeIapArraysL end");
+    }
+
+// -------------------------------------------------------------
+// CSelectionStorage::SetSharedContent()
+// Sets the users sharing selections to local storage
+// -------------------------------------------------------------
+//
+void CUPnPAppWizard::CSelectionStorage::SetSharedContent(
+    THomeConnectMediaType aMedia,
+    CArrayFix<TInt>* aSelections )
+    {
+    __LOG("CSelectionStorage::SetSharedContent begin");
+
+    if ( aMedia == EImageAndVideo )
+        {
+        // determine the users selections from UI
+        // if there is only one item selected and its value is not 0
+        // -> Share all is selected
+        if ( ! (aSelections->Count() == 1 && aSelections->At(0) == 0 ) )
+            {
+            iVisualImageSelection = ETrue;
+            }
+        }
+    else
+        {
+
+        if ( ! (aSelections->Count() == 1 && aSelections->At(0) == 0 ) )
+            {
+            // no difference between EShareAll and EShareMany
+            iVisualMusicSelection = ETrue;
+            }
+
+        }
+
+    __LOG("CSelectionStorage::SetSharedContent end");
+    }
+
+
+// -------------------------------------------------------------
+// CSelectionStorage::SetSharedContent()
+// Gets the users sharing selections from local storage
+// -------------------------------------------------------------
+//
+void CUPnPAppWizard::CSelectionStorage::GetSelectionsL(
+    THomeConnectMediaType aMedia,
+    CArrayFix<TInt>* aSelections )
+    {
+    __LOG("CSelectionStorage::GetSelectionsL begin");
+
+    if ( aMedia == EImageAndVideo )
+        {
+        if ( iImageSelectionArray )
+            {
+            for ( TInt i = 0; i < iImageSelectionArray->Count(); i++ )
+                {
+                TInt tmp = iImageSelectionArray->At( i );
+                aSelections->AppendL( tmp );
+                }
+            }
+        }
+    else
+        {
+        if ( iMusicSelectionArray )
+            {
+            for ( TInt i = 0; i < iMusicSelectionArray->Count(); i++ )
+                {
+                TInt tmp = iMusicSelectionArray->At( i );
+                aSelections->AppendL( tmp );
+                }
+            }
+        }
+    __LOG("CSelectionStorage::GetSelectionsL end");
+    }
+
+// -------------------------------------------------------------
+// CSelectionStorage::HasSomethingToShare()
+// Determines if the user has selected content to share
+// -------------------------------------------------------------
+//
+TBool CUPnPAppWizard::CSelectionStorage::HasSomethingToShare() const
+    {
+    __LOG("CSelectionStorage::HasSomethingToShare begin");
+    TBool retVal( EFalse );
+    if ( iVisualImageSelection || iVisualMusicSelection )
+        {
+        retVal = ETrue;
+        }
+    __LOG("CSelectionStorage::HasSomethingToShare end");
+    return retVal;
+    }
+
+// --------------------------------------------------------------------------
+// CSelectionStorage::GetCurrentSelection
+// Gets the user selected iapid or iapid from cenrep
+// --------------------------------------------------------------------------
+//
+void CUPnPAppWizard::CSelectionStorage::GetCurrentSelection(
+    TInt& aCurrentSelection, RArray<TInt64>& aIapIdArr )
+    {
+    __LOG("CSelectionStorage::GetCurrentSelection begin");
+    // Get the current selection
+    TInt userIapId( 0 );
+    GetIapId( userIapId );
+
+    if ( userIapId < 1 ||
+         userIapId == aIapIdArr[ KUPnPAlwaysAskInd ] )
+        {
+        aCurrentSelection = 0;
+        }
+    else
+        {
+        aCurrentSelection = aIapIdArr.Find( userIapId );
+
+        if ( aCurrentSelection <= KUPnPCreateNewInd )
+            {
+            /* Current iap is not in the list or it is Always Ask */
+            aCurrentSelection = 0;
+            }
+        }
+    __LOG("CSelectionStorage::GetCurrentSelection end");
+    }
+
+
+// End of File