idlehomescreen/xmluirendering/uiengine/src/xnplugindata.cpp
changeset 0 f72a12da539e
child 2 08c6ee43b396
equal deleted inserted replaced
-1:000000000000 0:f72a12da539e
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Data class to hold widget info
       
    15 *
       
    16 */
       
    17 
       
    18 // System includes
       
    19 #include <utf.h>
       
    20 
       
    21 // User includes
       
    22 #include "xnappuiadapter.h"
       
    23 #include "xncomposer.h"
       
    24 #include "xnodtparser.h"
       
    25 #include "xnresource.h"
       
    26 #include "xnodt.h"
       
    27 #include "xnnode.h"
       
    28 #include "xnplugindata.h"
       
    29 #include "xnviewdata.h"
       
    30 #include "xnviewmanager.h"
       
    31 #include "xnoomsyshandler.h"
       
    32 
       
    33 // Constants
       
    34 _LIT8( KStateWaitConfirmation, "WaitForConfirmation" );
       
    35 _LIT8( KStateConfirmed, "Confirmed" );
       
    36 _LIT8( KStateError, "Error" );
       
    37 
       
    38 // ============================ LOCAL FUNCTIONS ================================
       
    39 
       
    40 // ============================ MEMBER FUNCTIONS ===============================
       
    41 // -----------------------------------------------------------------------------
       
    42 // CXnPluginData::NewL()
       
    43 // Two-phased constructor.
       
    44 // -----------------------------------------------------------------------------
       
    45 //
       
    46 CXnPluginData* CXnPluginData::NewL( CXnPluginData& aParent )    
       
    47     {
       
    48     CXnPluginData* self = CXnPluginData::NewLC( aParent );
       
    49     CleanupStack::Pop( self );
       
    50     return self;
       
    51     }
       
    52 
       
    53 // -----------------------------------------------------------------------------
       
    54 // CXnPluginData::NewLC()
       
    55 // Two-phased constructor.
       
    56 // -----------------------------------------------------------------------------
       
    57 //
       
    58 CXnPluginData* CXnPluginData::NewLC( CXnPluginData& aParent )    
       
    59     {
       
    60     CXnPluginData* self = new ( ELeave ) CXnPluginData( aParent );
       
    61     CleanupStack::PushL( self );
       
    62     self->ConstructL();
       
    63     return self;
       
    64     }
       
    65 
       
    66 // -----------------------------------------------------------------------------
       
    67 // CXnPluginData::CXnPluginData()
       
    68 // C++ constructor
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 CXnPluginData::CXnPluginData( CXnPluginData& aParent )     
       
    72     : iParent( &aParent ), iManager( iParent->ViewManager() )       
       
    73     {
       
    74     // Plugin data is removable by default    
       
    75     iFlags.Set( EIsRemovable );
       
    76     // Assume plugins ready
       
    77     iFlags.Set( EIsDataPluginsReady );
       
    78     }
       
    79 
       
    80 // -----------------------------------------------------------------------------
       
    81 // CXnPluginData::CXnPluginData()
       
    82 // C++ constructor
       
    83 // -----------------------------------------------------------------------------
       
    84 //
       
    85 CXnPluginData::CXnPluginData( CXnViewManager& aManager )     
       
    86     : iParent( NULL ), iManager( aManager )
       
    87     {
       
    88     // This constructor overload is used by CXnRootData
       
    89     // Assume plugins are ready
       
    90     iFlags.Set( EIsDataPluginsReady );    
       
    91     }
       
    92 
       
    93 // -----------------------------------------------------------------------------
       
    94 // CXnPluginData::~CXnPluginData()
       
    95 // C++ default destructor.
       
    96 // -----------------------------------------------------------------------------
       
    97 //
       
    98 CXnPluginData::~CXnPluginData()
       
    99     {
       
   100     RevertPluginState();
       
   101         
       
   102     if ( iLoader )
       
   103         {
       
   104         iLoader->Cancel();
       
   105         }
       
   106 
       
   107     delete iLoader;
       
   108                
       
   109     Flush();
       
   110     }
       
   111 
       
   112 // -----------------------------------------------------------------------------
       
   113 // CXnPluginData::ConstructL()
       
   114 // 2nd phase constructor
       
   115 // -----------------------------------------------------------------------------
       
   116 //
       
   117 void CXnPluginData::ConstructL()
       
   118     {    
       
   119     iLoader = CPeriodic::NewL( CActive::EPriorityUserInput );    
       
   120     }
       
   121 
       
   122 // -----------------------------------------------------------------------------
       
   123 // CXnPluginData::LoadL()
       
   124 // -----------------------------------------------------------------------------
       
   125 //
       
   126 void CXnPluginData::LoadL()
       
   127     {        
       
   128     if ( Occupied() || PluginState().CompareF( KStateError ) == 0 )
       
   129         {
       
   130         return;
       
   131         }
       
   132    
       
   133     if ( !CXnOomSysHandler::HeapAvailable( WIDGET_MIN_MEM ) )
       
   134         {
       
   135         ViewManager().OomSysHandler().HandlePotentialOomL();        
       
   136         return;
       
   137         }
       
   138 
       
   139     iFlags.Clear( EIsEmpty );
       
   140     iFlags.Set( EIsRemovable );
       
   141     
       
   142     TRAPD( error,    
       
   143             
       
   144         if ( iManager.Composer().ComposeWidgetL( *this ) == KErrNone )
       
   145             {
       
   146             iManager.Parser().LoadWidgetL( *this );
       
   147             }                 
       
   148         );
       
   149 
       
   150     if ( Empty() )
       
   151         {
       
   152         // All done
       
   153         return;
       
   154         }
       
   155     
       
   156     if ( error || !Occupied() )
       
   157         {
       
   158         if( error == KErrNoMemory )
       
   159             {
       
   160             ViewManager().OomSysHandler().HandlePotentialOomL();
       
   161             }
       
   162         
       
   163         // Mark this plugin ready, View Manager will remove it
       
   164         DataPluginsLoadCompletedL( KErrGeneral );
       
   165         }    
       
   166     else
       
   167         {        
       
   168         if ( Active() )
       
   169             {
       
   170             // Load data plugins will set confirmation state to "wait"
       
   171             LoadDataPluginsL();  
       
   172             }
       
   173         else
       
   174             {
       
   175             // Composed succesfully to inactive page. Set confirmed
       
   176             SetPluginStateL( KStateConfirmed );
       
   177             }        
       
   178         }
       
   179     }
       
   180 
       
   181 // -----------------------------------------------------------------------------
       
   182 // CXnPluginData::Destroy()
       
   183 // -----------------------------------------------------------------------------
       
   184 //
       
   185 void CXnPluginData::Destroy()
       
   186     {       
       
   187     if ( Occupied() )
       
   188         {
       
   189         TRAP_IGNORE( 
       
   190                 DestroyDataPluginsL();
       
   191                 iManager.Parser().DestroyWidgetL( *this );
       
   192                 );
       
   193         }
       
   194     
       
   195     Flush();
       
   196     }
       
   197 
       
   198 // -----------------------------------------------------------------------------
       
   199 // CXnPluginData::LoadDataPluginsL
       
   200 // Loads data plugins associated to the plugin
       
   201 // -----------------------------------------------------------------------------
       
   202 //
       
   203 void CXnPluginData::LoadDataPluginsL()
       
   204     {                     
       
   205     if ( !Active() || !Occupied() )
       
   206         {
       
   207         iFlags.Set( EIsDataPluginsReady );
       
   208         
       
   209         return;
       
   210         }
       
   211                          
       
   212     if ( iContentSourceNodes.Count() == 0 )
       
   213         {        
       
   214         DataPluginsLoadCompletedL( KErrNone );
       
   215         }
       
   216     else
       
   217         {
       
   218         iLoader->Cancel();
       
   219         
       
   220         iFlags.Clear( EIsDataPluginsReady );
       
   221         
       
   222         iLoadIndex = 0;               
       
   223                        
       
   224         iLoader->Start( TTimeIntervalMicroSeconds32( 0 ),
       
   225                         TTimeIntervalMicroSeconds32( 0 ),
       
   226                         TCallBack( RunL, this ) );       
       
   227         }        
       
   228     }
       
   229 
       
   230 // -----------------------------------------------------------------------------
       
   231 // CXnPluginData::DataPluginsLoadCompletedL
       
   232 // Indicates that all data plugins are loaded
       
   233 // -----------------------------------------------------------------------------
       
   234 //
       
   235 void CXnPluginData::DataPluginsLoadCompletedL( TInt aStatus )
       
   236     {
       
   237     iFlags.Set( EIsDataPluginsReady );    
       
   238 
       
   239     const TDesC8& state( aStatus == KErrNone 
       
   240             ? KStateConfirmed() : KStateError() ); 
       
   241     
       
   242     SetPluginStateL( state );
       
   243             
       
   244     iManager.SetDataPluginLoadCompleteL( *this );          
       
   245     }
       
   246 
       
   247 // -----------------------------------------------------------------------------
       
   248 // CXnPluginData::DataPluginsLoaded
       
   249 // Queries whether all data plugins are loaded
       
   250 // -----------------------------------------------------------------------------
       
   251 //
       
   252 TBool CXnPluginData::DataPluginsLoaded() const
       
   253     {
       
   254     return ( iFlags.IsSet( EIsDataPluginsReady ) ? ETrue : EFalse );
       
   255     }
       
   256 
       
   257 // -----------------------------------------------------------------------------
       
   258 // CXnPluginData::DestroyDataPluginsL
       
   259 // Remove data plugins associated to the plugin
       
   260 // -----------------------------------------------------------------------------
       
   261 //
       
   262 void CXnPluginData::DestroyDataPluginsL()
       
   263     {              
       
   264     if ( Occupied() )
       
   265         {
       
   266         iFlags.Set( EIsDataPluginsReady );
       
   267         
       
   268         if ( iLoader->IsActive() )
       
   269             {
       
   270             // Not all plugins loaded yet               
       
   271             iLoader->Cancel();
       
   272             
       
   273             RevertPluginState();            
       
   274             }
       
   275         
       
   276         // Create list of data plugins to be removed
       
   277         RPointerArray< CXnNodeAppIf > list;
       
   278         CleanupClosePushL( list );
       
   279         
       
   280         for ( TInt i = 0; i < iContentSourceNodes.Count(); i++ )
       
   281             {
       
   282             list.AppendL( &iContentSourceNodes[i]->AppIfL() );
       
   283             }
       
   284         
       
   285         // Destruction is synchronous
       
   286         iManager.AppUiAdapter().DestroyDataPluginsL( list );
       
   287         
       
   288         CleanupStack::PopAndDestroy( &list );
       
   289         
       
   290         User::Heap().Compress();
       
   291         }    
       
   292     }
       
   293 
       
   294 // -----------------------------------------------------------------------------
       
   295 // CXnPluginData::SetConfigurationIdL()
       
   296 // -----------------------------------------------------------------------------
       
   297 //
       
   298 void CXnPluginData::SetConfigurationIdL( const TDesC8& aConfigurationId )
       
   299     {
       
   300     delete iConfigurationId;
       
   301     iConfigurationId = NULL;
       
   302 
       
   303     iConfigurationId = aConfigurationId.AllocL();
       
   304     }
       
   305 
       
   306 // -----------------------------------------------------------------------------
       
   307 // CXnPluginData::SetPluginIdL()
       
   308 // -----------------------------------------------------------------------------
       
   309 //
       
   310 void CXnPluginData::SetPluginIdL( const TDesC8& aPluginId )
       
   311     {
       
   312     delete iPluginId;
       
   313     iPluginId = NULL;
       
   314 
       
   315     iPluginId = aPluginId.AllocL();
       
   316     }
       
   317 
       
   318 // -----------------------------------------------------------------------------
       
   319 // CXnPluginData::SetPluginUidL()
       
   320 // -----------------------------------------------------------------------------
       
   321 //
       
   322 void CXnPluginData::SetPluginUidL( const TDesC8& aPluginUid )
       
   323     {
       
   324     delete iPluginUid;
       
   325     iPluginUid = NULL;
       
   326 
       
   327     iPluginUid = aPluginUid.AllocL();
       
   328     }
       
   329 
       
   330 // -----------------------------------------------------------------------------
       
   331 // CXnPluginData::SetPluginNameL()
       
   332 // -----------------------------------------------------------------------------
       
   333 //
       
   334 void CXnPluginData::SetPluginNameL( const TDesC8& aPluginName )
       
   335     {
       
   336     delete iPluginName;
       
   337     iPluginName = NULL;
       
   338 
       
   339     iPluginName = aPluginName.AllocL();
       
   340     }
       
   341 
       
   342 // -----------------------------------------------------------------------------
       
   343 // CXnPluginData::SetPublisherName ()
       
   344 // Set the publisher name
       
   345 // -----------------------------------------------------------------------------
       
   346 //
       
   347 void CXnPluginData::SetPublisherNameL( const TDesC8& aPublisherName )
       
   348     {
       
   349     delete iPublisherName;
       
   350     iPublisherName = NULL;
       
   351     
       
   352     iPublisherName = 
       
   353         CnvUtfConverter::ConvertToUnicodeFromUtf8L( aPublisherName );
       
   354     }
       
   355 
       
   356 // -----------------------------------------------------------------------------
       
   357 // CXnPluginData::SetPublisherName()
       
   358 // Set the publisher name
       
   359 // -----------------------------------------------------------------------------
       
   360 //
       
   361 void CXnPluginData::SetPublisherNameL( const TDesC& aPublisherName )
       
   362     {
       
   363     delete iPublisherName;
       
   364     iPublisherName = NULL;
       
   365     
       
   366     iPublisherName = aPublisherName.AllocL();
       
   367     }
       
   368 
       
   369 // -----------------------------------------------------------------------------
       
   370 // CXnPluginData::SetPluginTypeL()
       
   371 // -----------------------------------------------------------------------------
       
   372 //
       
   373 void CXnPluginData::SetPluginTypeL( const TDesC8& aPluginType )
       
   374     {
       
   375     delete iPluginType;
       
   376     iPluginType = NULL;
       
   377 
       
   378     iPluginType = aPluginType.AllocL();
       
   379     }
       
   380 
       
   381 // -----------------------------------------------------------------------------
       
   382 // CXnPluginData::SetPluginStateL()
       
   383 // -----------------------------------------------------------------------------
       
   384 //
       
   385 void CXnPluginData::SetPluginStateL( const TDesC8& aPluginState )     
       
   386     {    
       
   387     if ( PluginState().CompareF( aPluginState ) != 0 )
       
   388         {
       
   389         delete iPluginState;
       
   390         iPluginState = NULL;
       
   391 
       
   392         iPluginState = aPluginState.AllocL();
       
   393 
       
   394         // Tell new state to HSPS as well
       
   395         iManager.UpdatePluginStateL( *this );                           
       
   396         }
       
   397     }
       
   398 
       
   399 // -----------------------------------------------------------------------------
       
   400 // CXnPluginData::RevertPluginState()
       
   401 // -----------------------------------------------------------------------------
       
   402 //
       
   403 void CXnPluginData::RevertPluginState()
       
   404     {
       
   405     // Need to change state if it is not error
       
   406     if ( Occupied() && PluginState().CompareF( KStateError ) != 0 )
       
   407         {
       
   408         // For now on it is confirmed
       
   409         TRAP_IGNORE( SetPluginStateL( KStateConfirmed ) );                
       
   410         }                
       
   411     }
       
   412 
       
   413 // -----------------------------------------------------------------------------
       
   414 // CXnPluginData::SetResources()
       
   415 // -----------------------------------------------------------------------------
       
   416 //
       
   417 void CXnPluginData::SetResources( CArrayPtrSeg< CXnResource >* aResources )
       
   418     {    
       
   419     if ( iResources )
       
   420         {
       
   421         iResources->ResetAndDestroy();
       
   422         
       
   423         delete iResources;
       
   424         iResources = NULL;
       
   425         }
       
   426     
       
   427     iResources = aResources;    
       
   428     }
       
   429 
       
   430 // -----------------------------------------------------------------------------
       
   431 // CXnPluginData::ResourcesL()
       
   432 // -----------------------------------------------------------------------------
       
   433 //
       
   434 void CXnPluginData::ResourcesL( CArrayPtrSeg< CXnResource >& aList ) const
       
   435     {    
       
   436     for ( TInt i = 0; iResources && i < iResources->Count(); i++ )
       
   437         {
       
   438         aList.AppendL( iResources->At(i) );
       
   439         }
       
   440     }
       
   441 
       
   442 // -----------------------------------------------------------------------------
       
   443 // CXnPluginData::SetControlL()
       
   444 // -----------------------------------------------------------------------------
       
   445 //
       
   446 void CXnPluginData::SetControlL( CXnNode* aNode )
       
   447     {
       
   448     CXnControlAdapter* control( aNode->Control() );
       
   449 
       
   450     if ( control )
       
   451         {
       
   452         User::LeaveIfError( iControls.InsertInAddressOrder( control ) );
       
   453         }
       
   454     }
       
   455 
       
   456 // -----------------------------------------------------------------------------
       
   457 // CXnPluginData::ControlsL()
       
   458 // -----------------------------------------------------------------------------
       
   459 //
       
   460 void CXnPluginData::ControlsL( RPointerArray< CXnControlAdapter >& aList ) const
       
   461     {
       
   462     for ( TInt i = 0; i < iControls.Count(); i++ )
       
   463         {
       
   464         aList.AppendL( iControls[i] );
       
   465         }
       
   466     }
       
   467 
       
   468 // -----------------------------------------------------------------------------
       
   469 // CXnPluginData::SetContentSourceNodeL()
       
   470 // -----------------------------------------------------------------------------
       
   471 //
       
   472 void CXnPluginData::SetContentSourceNodeL( CXnNode* aNode )
       
   473     {
       
   474     User::LeaveIfError( iContentSourceNodes.InsertInAddressOrder( aNode ) );
       
   475     }
       
   476 
       
   477 // -----------------------------------------------------------------------------
       
   478 // CXnPluginData::ContentSourceNodesL()
       
   479 // -----------------------------------------------------------------------------
       
   480 //
       
   481 void CXnPluginData::ContentSourceNodesL( RPointerArray< CXnNode >& aList ) const
       
   482     {
       
   483     for ( TInt i = 0; i < iContentSourceNodes.Count(); i++ )
       
   484         {
       
   485         aList.AppendL( iContentSourceNodes[i] );
       
   486         }
       
   487     }
       
   488 
       
   489 // -----------------------------------------------------------------------------
       
   490 // CXnPluginData::SetAppearanceNodeL()
       
   491 // -----------------------------------------------------------------------------
       
   492 //
       
   493 void CXnPluginData::SetAppearanceNodeL( CXnNode* aNode )
       
   494     {
       
   495     User::LeaveIfError( iAppearanceNodes.InsertInAddressOrder( aNode ) );
       
   496     }
       
   497 
       
   498 // -----------------------------------------------------------------------------
       
   499 // CXnPluginData::AppearanceNodesL()
       
   500 // -----------------------------------------------------------------------------
       
   501 //
       
   502 void CXnPluginData::AppearanceNodesL( RPointerArray< CXnNode >& aList ) const
       
   503     {
       
   504     for ( TInt i = 0; i < iAppearanceNodes.Count(); i++ )
       
   505         {
       
   506         aList.AppendL( iAppearanceNodes[i] );
       
   507         }
       
   508     }
       
   509 
       
   510 // -----------------------------------------------------------------------------
       
   511 // CXnPluginData::SetInitialFocusNodeL()
       
   512 // -----------------------------------------------------------------------------
       
   513 //
       
   514 void CXnPluginData::SetInitialFocusNodeL( CXnNode* aNode )
       
   515     {
       
   516     User::LeaveIfError( iInitialFocusNodes.InsertInAddressOrder( aNode ) );
       
   517     }
       
   518 
       
   519 // -----------------------------------------------------------------------------
       
   520 // CXnPluginData::InitialFocusNodesL()
       
   521 // -----------------------------------------------------------------------------
       
   522 //
       
   523 void CXnPluginData::InitialFocusNodesL( RPointerArray< CXnNode >& aList ) const
       
   524     {
       
   525     for ( TInt i = 0; i < iInitialFocusNodes.Count(); i++ )
       
   526         {
       
   527         aList.AppendL( iInitialFocusNodes[i] );
       
   528         }
       
   529     }
       
   530 
       
   531 // -----------------------------------------------------------------------------
       
   532 // CXnPluginData::Flush()
       
   533 // Flushes this plugins data
       
   534 // -----------------------------------------------------------------------------
       
   535 //
       
   536 void CXnPluginData::Flush()
       
   537     {
       
   538     // Don't touch to iOwner, because this plugin might be reused later
       
   539            
       
   540     iFlags.ClearAll();
       
   541     
       
   542     // This is default
       
   543     iFlags.Set( EIsRemovable );
       
   544     iFlags.Set( EIsDataPluginsReady );
       
   545            
       
   546     iNode = NULL;
       
   547 
       
   548     iLoadIndex = 0;
       
   549     
       
   550     delete iConfigurationId;
       
   551     iConfigurationId = NULL;
       
   552 
       
   553     delete iPluginId;
       
   554     iPluginId = NULL;
       
   555 
       
   556     delete iPluginUid;
       
   557     iPluginUid = NULL;
       
   558 
       
   559     delete iPluginName;
       
   560     iPluginName = NULL;
       
   561 
       
   562     delete iPluginType;
       
   563     iPluginType = NULL;
       
   564 
       
   565     delete iPluginState;
       
   566     iPluginState = NULL;
       
   567 
       
   568     delete iPublisherName;
       
   569     iPublisherName = NULL;
       
   570 
       
   571     if ( iResources )
       
   572         {
       
   573         iResources->ResetAndDestroy();
       
   574         delete iResources;
       
   575         iResources = NULL;
       
   576         }
       
   577         
       
   578     iControls.Reset();
       
   579     iContentSourceNodes.Reset();
       
   580     iAppearanceNodes.Reset();
       
   581     iInitialFocusNodes.Reset();
       
   582     iPopupNodes.Reset();
       
   583     iPluginsData.ResetAndDestroy();
       
   584     
       
   585     User::Heap().Compress();
       
   586     }
       
   587 
       
   588 // -----------------------------------------------------------------------------
       
   589 // CXnPluginData::Empty()
       
   590 // 
       
   591 // -----------------------------------------------------------------------------
       
   592 //
       
   593 TBool CXnPluginData::Empty() const
       
   594     {       
       
   595     return ( iFlags.IsSet( EIsEmpty ) ? ETrue : EFalse );    
       
   596     }
       
   597 
       
   598 // -----------------------------------------------------------------------------
       
   599 // CXnPluginData::SetEmpty()
       
   600 // 
       
   601 // -----------------------------------------------------------------------------
       
   602 //
       
   603 void CXnPluginData::SetEmptyL( const TDesC8& aPluginId ) 
       
   604     {       
       
   605     if ( Occupied() )
       
   606         {
       
   607         User::Leave( KErrInUse );
       
   608         }
       
   609     
       
   610     HBufC8* id( aPluginId.AllocL() );
       
   611     
       
   612     Flush();
       
   613 
       
   614     // Takes ownership
       
   615     iPluginId = id;
       
   616            
       
   617     iFlags.Set( EIsEmpty );
       
   618     iFlags.Clear( EIsRemovable );
       
   619     }
       
   620     
       
   621 // -----------------------------------------------------------------------------
       
   622 // CXnPluginData::SetIsDisplayingPopup()
       
   623 // 
       
   624 // -----------------------------------------------------------------------------
       
   625 //
       
   626 void CXnPluginData::SetIsDisplayingPopup ( TBool aVisible, CXnNode* aNode )
       
   627     {
       
   628     
       
   629     if ( aVisible )
       
   630         {
       
   631         iPopupNodes.InsertInAddressOrder( aNode );
       
   632         }
       
   633     else
       
   634         {
       
   635         TInt index( iPopupNodes.Find( aNode ) );
       
   636         if ( index != KErrNotFound )
       
   637             {
       
   638             iPopupNodes.Remove( index );
       
   639             }
       
   640         }
       
   641     }
       
   642 
       
   643 
       
   644 //------------------------------------------------------------------------------
       
   645 // CXnPluginData::IsDisplayingPopup()      
       
   646 //
       
   647 //------------------------------------------------------------------------------
       
   648 //    
       
   649 TBool CXnPluginData::IsDisplayingPopup() const
       
   650     {
       
   651     return ( iPopupNodes.Count() > 0 );
       
   652     }
       
   653 
       
   654 // -----------------------------------------------------------------------------
       
   655 // CXnPluginData::RunL()
       
   656 // 
       
   657 // -----------------------------------------------------------------------------
       
   658 //
       
   659 /* static */ TInt CXnPluginData::RunL( TAny* aAny )
       
   660     {
       
   661     CXnPluginData* self = static_cast< CXnPluginData* >( aAny );
       
   662     
       
   663     self->iLoader->Cancel();
       
   664     
       
   665     RPointerArray< CXnNodeAppIf >list;
       
   666     CleanupClosePushL( list );
       
   667 
       
   668     for ( TInt i = 0; i < self->iContentSourceNodes.Count(); i++ )
       
   669         {
       
   670         list.AppendL( &self->iContentSourceNodes[i]->AppIfL() );
       
   671         }
       
   672         
       
   673     // State is "wait" until data plugins are loaded
       
   674     self->SetPluginStateL( KStateWaitConfirmation );
       
   675        
       
   676     TRAPD( err, self->iManager.AppUiAdapter().LoadDataPluginsL( list ) );
       
   677 
       
   678     if ( err && self->Removable() )
       
   679         {               
       
   680         self->DataPluginsLoadCompletedL( err );            
       
   681         }
       
   682     else
       
   683         {
       
   684         self->DataPluginsLoadCompletedL( KErrNone );                 
       
   685         }
       
   686     
       
   687     CleanupStack::PopAndDestroy( &list );
       
   688         
       
   689     return KErrNone;       
       
   690     }
       
   691 
       
   692 // End of file