upnpframework/upnpcommonui/src/upnpexternaldevicedialog.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpframework/upnpcommonui/src/upnpexternaldevicedialog.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,813 @@
+/*
+* Copyright (c) 2005 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:  Source file for UPnP External device dialog
+*                UI Implementation
+*
+*/
+
+
+// INCLUDE FILES
+// System
+#include <aknnavide.h> // CAknNavigationDecorator
+#include <barsread.h> // TResourceReader
+#include <AknIconArray.h>
+#include <eikclbd.h>
+#include <StringLoader.h>
+#include <featmgr.h>
+#include <hlplch.h>
+#include <upnpstring.h>
+#include <layoutmetadata.cdl.h>
+
+// upnpframework / avcontroller api
+#include "upnpavdevice.h"
+#include "upnpavcontroller.h"
+#include "upnpavbrowsingsession.h"
+#include "upnpavdevicelist.h"
+
+// upnpframework / internal api's
+#include "upnpcommonutils.h"
+
+// common ui internal
+#include "upnpadvfinddialog.h"
+#include "upnpcommonui.hrh"
+#include "upnpexternaldevicedialog.h"
+#include <upnpcommonui.rsg>
+#include <upnpcommonui.mbg> //for icons
+#include "upnpcommonui.h"
+#include "upnpnavipanecontainer.h"
+
+_LIT( KComponentLogfile, "commonui.txt");
+#include "upnplog.h"
+
+// CONSTANTS
+_LIT( KAknCommonUIMbmFileName, "\\resource\\apps\\upnpcommonui.mbm" );
+const TInt KLength = 100;
+_LIT(KUPNP_HLP_MAIN_EXTERNAL,"UPNP_HLP_MAIN_EXTERNAL"); 
+
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::CUPnPExternalDeviceDialog
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CUPnPExternalDeviceDialog::CUPnPExternalDeviceDialog(
+                                        MUPnPAVController& aAVControl,
+                                        CUPnPCommonUI& aCommonUI):
+                                        iAVControl(aAVControl),
+                                        iCommonUI(aCommonUI)
+    {
+    iPreDeviceObserver = iAVControl.DeviceObserver();
+    iAVControl.RemoveDeviceObserver();
+    iAVControl.SetDeviceObserver( *this );
+    }
+    
+// Destructor
+CUPnPExternalDeviceDialog::~CUPnPExternalDeviceDialog()
+    {
+    __LOG( "CUPnPExternalDeviceDialog::~CUPnPExternalDeviceDialog" );
+    
+    delete iDeviceArray;
+    iAVControl.RemoveDeviceObserver();
+    
+    if( iPreDeviceObserver )
+        {
+        iAVControl.SetDeviceObserver( *iPreDeviceObserver );
+        }
+    
+    if ( iNaviDecorator && iNaviPaneContainer )
+        {
+        iNaviPaneContainer->Pop( iNaviDecorator );
+        }
+    delete iNaviDecorator;
+    iNaviDecorator = NULL;
+    
+    __LOG( "CUPnPExternalDeviceDialog::~CUPnPExternalDeviceDialog End." );
+    }
+    
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::ConstructL
+// Symbian 2nd phase constructor can leave.
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::ConstructL( TInt aMenuResource )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::ConstructL" );
+    
+    iDeviceArray = CUpnpAVDeviceList::NewL();
+    
+    CAknDialog::ConstructL( aMenuResource );
+    __LOG( "CUPnPExternalDeviceDialog::ConstructL End" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::NewL
+// Two-phased constructor.
+// --------------------------------------------------------------------------
+//
+CUPnPExternalDeviceDialog* CUPnPExternalDeviceDialog::NewL(
+    TInt aMenuResource, 
+    MUPnPAVController& aAVControl,
+    CUPnPCommonUI& aCommonUI)
+    {
+    __LOG( "CUPnPExternalDeviceDialog::NewL" );
+
+    CUPnPExternalDeviceDialog* self = 
+                        new ( ELeave ) CUPnPExternalDeviceDialog( aAVControl,
+                                                                aCommonUI );
+    CleanupStack::PushL( self );
+    self->ConstructL( aMenuResource );
+    CleanupStack::Pop();
+    __LOG( "CUPnPExternalDeviceDialog::NewL End" );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::PreLayoutDynInitL();
+// called by framework before dialog is shown
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::PreLayoutDynInitL()
+    {
+    __LOG( "CUPnPExternalDeviceDialog::PreLayoutDynInitL" );
+
+    // Create dialog title text
+    CEikStatusPane* statusPane = 
+                    ( ( CAknAppUi* )iEikonEnv->EikAppUi() )->StatusPane();    
+    iTitlePane = ( CAknTitlePane* )statusPane->ControlL(
+                    TUid::Uid( EEikStatusPaneUidTitle ) );
+    iTitlePane->SetTextL( *StringLoader::LoadLC(
+                                R_UPNPCOMMONUI_EXTERNAL_MEDIA_TITLE ) );
+    CleanupStack::PopAndDestroy();
+    
+    iListBox = static_cast<CAknSingleGraphicStyleListBox*>
+              ( Control( EUPnPExternDevicesListBoxId ) );
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( 
+            CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+    
+    
+    CAknIconArray* icons = new ( ELeave ) CAknIconArray( 3 );
+    CleanupStack::PushL(icons);
+
+    // Mif icons
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    TFileName iconsPath( AknIconUtils::AvkonIconFileName( ) );
+    
+    // Folder icon
+    
+    TFileName mbmFileName( KAknCommonUIMbmFileName );
+    TFileName dllName;
+    Dll::FileName( dllName );
+    TBuf<2> drive = dllName.Left( 2 ); // Drive letter followed by ':' 
+    mbmFileName.Insert( 0, drive );
+    
+    AppendIconToArrayL( icons, skin, 
+                        mbmFileName, 
+                        KAknsIIDDefault, 
+                        EMbmUpnpcommonuiQgn_server_icon, 
+                        EMbmUpnpcommonuiQgn_server_icon_mask );
+   
+                                        
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons );
+        
+    CleanupStack::Pop( icons );
+
+    // Enable horizontal scrolling
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+
+    DisplayMediaServersL();
+
+    if ( !iDeviceArray->Count() )  
+        {
+        // show "Waiting devices" text
+        iListBox->View()->SetListEmptyTextL(
+            *StringLoader::LoadLC( R_UPNPCOMMONUI_EXTERNAL_WAITING_NOTE ) );
+        CleanupStack::PopAndDestroy(); 
+        }
+    else
+        {
+        CEikButtonGroupContainer* cba = &ButtonGroupContainer();
+        cba->SetCommandSetL( R_UPNPCOMMONUI_SOFTKEYS_OPTIONS_BACK__OPEN );
+        cba->DrawDeferred();
+        }
+    __LOG( "CUPnPExternalDeviceDialog::PreLayoutDynInitL End" );    
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::PostLayoutDynInitL();
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::PostLayoutDynInitL()
+    {
+    iNaviPaneActive = ETrue;
+    UpDateAnimationWindowL(iNaviPaneActive);//DateAnimationWindow();
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::OkToExitL(TInt aButtonId)
+// see upnpexternaldevicedialog.h
+// --------------------------------------------------------------------------
+//
+TBool CUPnPExternalDeviceDialog::OkToExitL( TInt aButtonId )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::OkToExitL" );
+    
+    TBool returnValue = EFalse;
+    iCommonUI.HandleCommonErrorL( aButtonId, NULL );
+    // Translate the button presses into commands for the appui & current
+    // view to handle
+    switch ( aButtonId )
+        {
+        case EAknSoftkeyOptions:
+            {
+            DisplayMenuL(); 
+            break;
+            }
+        case EAknSoftkeyOpen: //fall through
+        case EAknSoftkeyOk:
+            {
+            CTextListBoxModel *model = iListBox->Model();
+
+            if (model->NumberOfItems()) //browse only if list have items
+                {
+                iNaviPaneActive = EFalse;                
+                UpDateAnimationWindowL(iNaviPaneActive);
+
+                TInt ret = ExecuteBrowseL();
+                if (ret == EAknCmdExit || 
+                    ret == EEikCmdExit ||
+                    ret == KErrDisconnected ||
+                    ret == KErrSessionClosed
+                    )
+                    {
+                    TryExitL( ret );
+                    }
+                else
+                    {
+                    DisplayMediaServersL();
+                    iNaviPaneActive = ETrue;
+                    UpDateAnimationWindowL(iNaviPaneActive);
+                    }
+                }
+            break;
+            }
+        case EAknSoftkeyBack: // fall through
+        case EUPnPBackCmd: // fall through
+        case EAknSoftkeyCancel: // fall through
+        case EAknSoftkeyExit: // fall through
+        case EAknCmdExit: // fall through
+        case EEikCmdExit: // fall through
+        case KErrNotReady: // fall through
+        case KErrDisconnected:
+            {
+            if( iTitlePane )
+                {
+                iTitlePane->SetTextToDefaultL();
+                }
+            returnValue = ETrue; //back to previous dialog
+            break;
+            }
+        case KErrSessionClosed:
+            {
+            DisplayMediaServersL();
+            iNaviPaneActive = ETrue;
+            UpDateAnimationWindowL(iNaviPaneActive);
+
+            break;
+            }
+        default:
+            {
+            // ignore
+            }
+        }
+  
+    __LOG( "CUPnPExternalDeviceDialog::OkToExitL End." );
+    return returnValue;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDevice::DynInitMenuPaneL(TInt aResourceId, 
+// CEikMenuPane *aMenuPane)
+// called by framework before menu panel is shown
+// --------------------------------------------------------------------------
+void  CUPnPExternalDeviceDialog::DynInitMenuPaneL( TInt aResourceId,
+                                                   CEikMenuPane *aMenuPane )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::DynInitMenuPaneL" );
+
+    if( aResourceId ==  R_UPNPCOMMONUI_EXTERNAL_DEVICE_OPTION_MENU )
+        {
+        // Hide menu items if empty list
+        CTextListBoxModel *model = iListBox->Model();
+        if ( !model->NumberOfItems() ) 
+            {
+            aMenuPane->SetItemDimmed( EUPnPOpen, ETrue );
+            aMenuPane->SetItemDimmed( EUPnPFind, ETrue );
+            }
+
+        // Hide "Find" if the currently focused device does not support it
+        TInt selected_item = iListBox->CurrentItemIndex();
+        if( selected_item >= 0 &&
+            !( *iDeviceArray )[ selected_item ]->SearchCapability() )
+            {
+            aMenuPane->SetItemDimmed( EUPnPFind, ETrue );
+            }
+
+        // Hide "Help" if the help file is not available
+        if( !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+            {
+            aMenuPane->SetItemDimmed( EUPnPHelp, ETrue );
+            }
+        }
+    __LOG( "CUPnPExternalDeviceDialog::DynInitMenuPaneL End" );    
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::ProcessCommandL(TInt aCommand)
+// called by framework when menu item is selected
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::ProcessCommandL( TInt aCommand )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::ProcessCommandL" );
+    
+    TInt error = KErrNone;
+    HideMenu();
+    switch ( aCommand ) 
+        {
+        case EAknCmdExit:
+        case EEikCmdExit:
+            {
+            TryExitL( aCommand );
+            break;
+            }
+        case EUPnPOpen:
+            {
+            iNaviPaneActive = EFalse;
+            UpDateAnimationWindowL(iNaviPaneActive);
+
+            error = ExecuteBrowseL();
+            if ( error == EAknCmdExit ||
+                 error == EEikCmdExit ||
+                 error == KErrDisconnected ||
+                 error == KErrSessionClosed )
+                {
+                TryExitL( error );
+                }
+            else 
+                {
+                DisplayMediaServersL(); 
+                iNaviPaneActive = ETrue;
+                UpDateAnimationWindowL(iNaviPaneActive); 
+                }
+            break;
+            }
+        case EUPnPFind:
+            {
+            iNaviPaneActive = EFalse;
+            UpDateAnimationWindowL(iNaviPaneActive);  
+            
+            error = ExecuteFindL();
+            if ( error == EAknCmdExit ||
+                 error == EEikCmdExit ||
+                 error == KErrDisconnected || 
+                 error == KErrNotReady || 
+                 error == KErrSessionClosed )
+                {
+                TryExitL( error );
+                }
+            else
+                {
+                iNaviPaneActive = ETrue;
+                UpDateAnimationWindowL(iNaviPaneActive);
+                }
+            break;
+            }
+        case EUPnPHelp:
+            {
+            iNaviPaneActive = EFalse;
+            UpDateAnimationWindowL(iNaviPaneActive);
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+            iEikonEnv->EikAppUi()->AppHelpContextL() );
+            iNaviPaneActive = ETrue;
+            UpDateAnimationWindowL(iNaviPaneActive);
+            break;
+            }
+        default:
+            break;
+        }
+    __LOG( "CUPnPExternalDeviceDialog::ProcessCommandL End" );    
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::UPnPDeviceDiscovered
+// Returns discovered device from UPnP AV control point.
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::UPnPDeviceDiscovered(
+                                        const CUpnpAVDevice& aDevice )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::UPnPDeviceDiscovered" );
+    TInt error = KErrNone;
+    TRAP( error, UPnPDeviceDiscoveredL( aDevice ) );
+    
+    __LOG1( "CUPnPExternalDeviceDialog::UPnPDeviceDiscovered %d", error);
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::UPnPDeviceDiscoveredL
+// Returns discovered device from UPnP AV control point.
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::UPnPDeviceDiscoveredL(
+                                        const CUpnpAVDevice& aDevice )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::UPnPDeviceDiscovered" );
+              
+    // Display only Media servers
+    if( aDevice.DeviceType() == CUpnpAVDevice::EMediaServer )
+        {
+        CUpnpAVDevice* tempDevice = CUpnpAVDevice::NewL( aDevice ) ;
+                                      
+        CleanupStack::PushL( tempDevice );
+        iDeviceArray->AppendDeviceL( *tempDevice );
+        CleanupStack::Pop( tempDevice ); 
+        
+        // Get device friendly name and replace illegal characters.
+        HBufC8* tmpfriendlyname = 
+            UPnPCommonUtils::ReplaceIllegalFilenameCharactersL( 
+            ( ( CUpnpAVDevice* )tempDevice )->FriendlyName() );
+            
+        CleanupStack::PushL( tmpfriendlyname );
+        TPtrC8 friendlyname = *tmpfriendlyname;
+                
+        CTextListBoxModel* model = iListBox->Model();
+        MDesCArray* textArray = model->ItemTextArray();
+        CDesCArray* listBoxItems = static_cast<CDesCArray*>( textArray );
+        TBuf<256> item;
+        
+        HBufC *tmpbuf = UpnpString::ToUnicodeL( friendlyname.Left( KLength ) );
+        CleanupStack::PushL( tmpbuf ); 
+        
+        item.Format( _L( "%d\t%S\t\t" ),0, tmpbuf ); 
+        CleanupStack::PopAndDestroy( tmpbuf ); 
+        CleanupStack::PopAndDestroy( tmpfriendlyname );
+
+        listBoxItems->AppendL( item );
+        iListBox->HandleItemAdditionL(); // Update listbox
+
+        iListBox->ActivateL();
+        iListBox->DrawDeferred();
+        
+        //update menu pane
+        CEikButtonGroupContainer* cba = &ButtonGroupContainer();
+        
+        cba->SetCommandSetL( R_UPNPCOMMONUI_SOFTKEYS_OPTIONS_BACK__OPEN );
+        cba->DrawDeferred();
+        }
+    __LOG( "CUPnPExternalDeviceDialog::UPnPDeviceDiscovered End" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::UPnPDeviceDisappeared
+// Returns disappeared device from UPnP AV control point.
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::UPnPDeviceDisappeared(
+                                        const CUpnpAVDevice& aDevice )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::UPnPDeviceDisappeared" );
+    
+    TRAP_IGNORE( UPnPDeviceDisappearedL( aDevice ) );
+    
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::UPnPDeviceDisappearedL
+// Returns disappeared device from UPnP AV control point.
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::UPnPDeviceDisappearedL(
+                                               const CUpnpAVDevice& aDevice )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::UPnPDeviceDissapearedL" );
+    
+    CTextListBoxModel* model = iListBox->Model();
+    TInt currentItem = iListBox->CurrentItemIndex();
+    MDesCArray* textArray = model->ItemTextArray();
+    CDesCArray* listBoxItems = static_cast<CDesCArray*>( textArray );
+    TInt i = 0;
+    TPtrC8 ptr(aDevice.Uuid());
+    while( i < iDeviceArray->Count() &&
+        ptr.Compare( ( *iDeviceArray)[ i ]->Uuid() ) )
+        {
+        i++;
+        }
+    if ( i < iDeviceArray->Count() )
+        {
+        iDeviceArray->RemoveAndDestroy( i );
+        listBoxItems->Delete( i,1 );
+        AknListBoxUtils::HandleItemRemovalAndPositionHighlightL(
+            iListBox, currentItem, ETrue );
+        iListBox->DrawDeferred();
+        }
+            
+    if ( !iDeviceArray->Count() )
+        {
+        // show "Waiting devices" text
+        iListBox->View()->SetListEmptyTextL(
+            *StringLoader::LoadLC( R_UPNPCOMMONUI_EXTERNAL_WAITING_NOTE ) );
+        CleanupStack::PopAndDestroy(); // R_EXTERNAL_WAITING_NOTE
+        
+        CEikButtonGroupContainer* cba = &ButtonGroupContainer();
+        cba->SetCommandSetL( R_UPNPCOMMONUI_SOFTKEYS_EMPTY_BACK );
+        cba->DrawDeferred();
+        }
+   
+    __LOG( "CUPnPExternalDeviceDialog::UPnPDeviceDissapearedL-END" );
+    }
+    
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::AppendIconToArrayL
+// Load a possibly skinned icon (with mask) and append it to an 
+// icon array.
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::AppendIconToArrayL( CAknIconArray* aArray,
+                                           MAknsSkinInstance* aSkin,
+                                           const TDesC& aMbmFile,
+                                           const TAknsItemID& aID,
+                                           TInt aBitmapId,
+                                           TInt aMaskId )
+    {
+    __LOG( "CUPnPExternalDeviceDialog::AppendIconToArrayL" );
+    
+    __ASSERTD( aArray != NULL, __FILE__, __LINE__ );
+
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+
+    AknsUtils::CreateIconLC( aSkin, aID,
+        bitmap, mask, aMbmFile, aBitmapId, aMaskId );
+
+    CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
+    icon->SetBitmapsOwnedExternally( EFalse );
+
+    // icon now owns the bitmaps, no need to keep on cleanup stack.
+    CleanupStack::Pop( 2 ); // mask, bitmap
+    bitmap = NULL;
+    mask = NULL;
+
+    CleanupStack::PushL( icon );
+    aArray->AppendL( icon );
+
+    // aArray now owns the icon, no need to delete.
+    CleanupStack::Pop();
+    __LOG( "CUPnPExternalDeviceDialog::AppendIconToArrayL End" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPBrowseDialog::DisplayMediaServersL
+// Add visible Media Servers to Listbox of dialog
+// --------------------------------------------------------------------------
+void CUPnPExternalDeviceDialog::DisplayMediaServersL()
+    {
+    __LOG( "CUPnPExternalDeviceDialog::DisplayMediaServersL" );
+    
+    CTextListBoxModel* model = iListBox->Model();
+    MDesCArray* textArray = model->ItemTextArray();
+    CDesCArray* listBoxItems = static_cast<CDesCArray*>( textArray );
+    
+    //clear list        
+    delete iDeviceArray; iDeviceArray = NULL;
+    listBoxItems->Reset();
+    
+    TBuf<256> item;
+    
+    iDeviceArray=iAVControl.GetMediaServersL();
+    
+
+    if ( iDeviceArray->Count() )
+        {
+        for ( TInt i=0; i < iDeviceArray->Count(); i++ )
+            {
+            // Get device frienly name and replace illegal characters.
+            HBufC8* tmpfriendlyname = 
+            UPnPCommonUtils::ReplaceIllegalFilenameCharactersL( 
+                ( *iDeviceArray )[ i ]->FriendlyName() );
+
+            CleanupStack::PushL( tmpfriendlyname );
+            TPtrC8 friendlyname = *tmpfriendlyname;
+
+            HBufC* tmpbuf = UpnpString::ToUnicodeL( 
+                friendlyname.Left( KLength ) );
+            CleanupStack::PushL( tmpbuf ); 
+            item.Format( _L( "%d\t%S\t\t" ),0, tmpbuf ); 
+            CleanupStack::PopAndDestroy( tmpbuf );
+            CleanupStack::PopAndDestroy( tmpfriendlyname ); 
+            listBoxItems->AppendL( item );
+            }
+        
+        iListBox->HandleItemAdditionL(); // Update listbox
+        iListBox->SetCurrentItemIndexAndDraw( 0 ); // select new item        
+        }
+    __LOG( "CUPnPExternalDeviceDialog::DisplayMediaServersL End" );        
+    }
+
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::ExecuteBrowseL
+// see upnpexternaldevicedialog.h
+// --------------------------------------------------------------------------
+TInt CUPnPExternalDeviceDialog::ExecuteBrowseL()
+    {
+    __LOG( "CUPnPExternalDeviceDialog::ExecuteBrowseL" );
+    
+    TInt selected_item = iListBox->CurrentItemIndex();
+
+    const CUpnpAVDevice* selectedDevice = ( *iDeviceArray )[ selected_item ];
+    
+    TInt ret = iCommonUI.ExecuteBrowseDialogL(
+        iAVControl, *selectedDevice );
+    
+    iTitlePane->SetTextL( *StringLoader::LoadLC(
+        R_UPNPCOMMONUI_EXTERNAL_MEDIA_TITLE ) );
+    CleanupStack::PopAndDestroy();
+
+    
+    __LOG( "CUPnPExternalDeviceDialog::ExecuteBrowseL End" );
+    return ret;
+    }
+    
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::ExecuteFindL
+// see upnpexternaldevicedialog.h
+// --------------------------------------------------------------------------
+TInt CUPnPExternalDeviceDialog::ExecuteFindL()
+    {
+    __LOG( "CUPnPExternalDeviceDialog::ExecuteFindL" );
+    
+    TInt ret = KErrNone;
+    TInt selected_item = iListBox->CurrentItemIndex();
+    CUpnpAVDevice* selectedDevice = 
+                            ( *iDeviceArray )[ selected_item ];
+    
+    if( selectedDevice )
+        {
+        //create a browsessesion only for advFind dialog
+        
+        MUPnPAVBrowsingSession* browsingSession = NULL;    
+        browsingSession = &( iAVControl.StartBrowsingSessionL(
+                                                *selectedDevice ) );
+        
+        ret = iCommonUI.ExecuteAdvFindDialogL( iAVControl,
+                                               *browsingSession );
+        browsingSession->RemoveObserver();
+        iAVControl.StopBrowsingSession( *browsingSession );    
+        }
+    
+    if( KErrDisconnected != ret ) //if not WLAN lost
+        {
+        DisplayMediaServersL();    
+        }
+
+    __LOG( "CUPnPExternalDeviceDialog::ExecuteFindL End" );
+    return ret;
+    }
+    
+
+            
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::WLANConnectionLost
+// see upnpexternaldevicedialog.h
+// --------------------------------------------------------------------------
+void CUPnPExternalDeviceDialog::WLANConnectionLost() 
+    {
+    __LOG( "CUPnPExternalDeviceDialog::WLANConnectionLost" );
+    //if no dialog created in CUPnPExternalDeviceDialog, destory itself 
+    //Otherwise destory other dialogs like in normal by KErrAbort
+    if( !iCommonUI.PresenceOfDialog() )
+        {
+        TRAP_IGNORE( TryExitL( KErrDisconnected ) );
+        }
+    
+    }
+
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::GetHelpContext
+// see upnpexternaldevicedialog.h
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::GetHelpContext(
+                                        TCoeHelpContext& aContext ) const
+    {
+    __LOG( "CUPnPExternalDeviceDialog::GetHelpContext" );
+    
+//  aContext.iMajor = TUid::Uid( KMediaGalleryUID3 );    
+    aContext.iContext = KUPNP_HLP_MAIN_EXTERNAL;
+    
+    __LOG( "CUPnPExternalDeviceDialog::GetHelpContext End" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::UpDateAnimationWindowL
+// see upnpexternaldevicedialog.h
+// --------------------------------------------------------------------------
+//
+void CUPnPExternalDeviceDialog::UpDateAnimationWindowL(TBool aAnimationState)
+    {    
+    __LOG( "CUPnPExternalDeviceDialog::UpDateAnimationWindowL" );
+    if ( iNaviDecorator )
+        {
+        iNaviPaneContainer->Pop( iNaviDecorator );
+        }
+    
+    // destroy iNaviDecorator
+    delete iNaviDecorator;
+    iNaviDecorator = NULL;
+        
+    if ( ( !Layout_Meta_Data::IsLandscapeOrientation() )
+         && ( aAnimationState ) )
+        {
+        iStatusPane = iEikonEnv->AppUiFactory()->StatusPane();
+
+        TBool naviFaded = iStatusPane->IsFaded();
+
+        if (!naviFaded)
+            {
+            iNaviPaneContainer = ( CAknNavigationControlContainer* )
+                iStatusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) );
+        
+            TPoint screenPosition = iNaviPaneContainer->
+                PositionRelativeToScreen();
+            /**
+             * adjust the screen position so that the "Searching..." could be 
+             * exactly in that "blue" NaviPane
+             */                        
+            screenPosition.iY = screenPosition.iY+1;
+            iNaviContainer = CUPnPNaviPaneContainer::NewL(
+                                                 iNaviPaneContainer->Rect(),
+                                                 screenPosition,
+                                                 iNaviPaneContainer );
+        
+            iNaviDecorator = CAknNavigationDecorator::NewL(
+                iNaviPaneContainer, iNaviContainer );
+        iNaviDecorator->SetContainerWindowL( *iNaviPaneContainer );
+        iNaviDecorator->MakeScrollButtonVisible(EFalse);
+        iNaviDecorator->SetComponentsToInheritVisibility( ETrue );
+            iNaviPaneContainer->PushL( *iNaviDecorator );        
+            }
+        }
+    iListBox->ActivateL();
+    
+    __LOG( "CUPnPExternalDeviceDialog::UpDateAnimationWindowL End" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPExternalDeviceDialog::HandleResourceChange
+// --------------------------------------------------------------------------
+//    
+void CUPnPExternalDeviceDialog::HandleResourceChange(TInt aType)
+    {
+    __LOG("[UPnPCommonUI]\t CUPnPExternalDeviceDialog::HandleResourceChange");
+    CAknDialog::HandleResourceChange(aType);
+    
+    // Update Titlepane only if there is no other dialogs open
+    if( !iCommonUI.PresenceOfDialog() )
+        {
+        __LOG("[UPnPCommonUI]\t CUPnPExternalDeviceDialog::HandleResourceChange\
+updating iTitlePane");
+
+    TRAPD( err,
+            iTitlePane->SetTextL( *StringLoader::LoadLC(
+                R_UPNPCOMMONUI_EXTERNAL_MEDIA_TITLE ) );
+            CleanupStack::PopAndDestroy();
+            );
+            
+    if( err != KErrNone )
+        {
+        __LOG("[UPnPCommonUI]\t CUPnPExternalDeviceDialog::HandleResourceChange\
+iTitlePane->SetTextL failed");
+            }
+        }
+    
+    if (iNaviPaneActive)
+        {
+        TRAP_IGNORE( UpDateAnimationWindowL(iNaviPaneActive) );
+        }    
+    }         
+// end of file