idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp
branchRCL_3
changeset 9 d0529222e3f0
parent 1 844b978f8d5e
child 18 bd874ee5e5e2
--- a/idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp	Tue Feb 02 00:23:10 2010 +0200
+++ b/idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp	Fri Feb 19 23:07:29 2010 +0200
@@ -11,18 +11,14 @@
 *
 * Contributors:
 *
-* Description:  Profile plug-in publisher
+* Description:  SAPI data plug-in publisher
 *
 */
 
-
+// System includes
 #include <ecom/ecom.h>
 #include <ecom/implementationproxy.h>
-#include <aicontentobserver.h>
-#include <aiutility.h>
-#include <aipspropertyobserver.h>
 #include <PUAcodes.hrh>
-#include <aipluginsettings.h>
 #include <badesca.h>
 #include <fbs.h>
 #include <gulicon.h>
@@ -30,6 +26,13 @@
 #include <AknsUtils.h> 
 #include <AknsConstants.h>
 #include <e32property.h>
+
+// User includes
+#include <hspublisherinfo.h>
+#include <aicontentobserver.h>
+#include <aiutility.h>
+#include <aipspropertyobserver.h>
+#include <aipluginsettings.h>
 #include <activeidle2domainpskeys.h>
 
 #include "sapidatapluginconst.h"
@@ -37,7 +40,7 @@
 #include "sapidataplugin.h"
 #include "sapidata.h"
 
-// CONST CLASS VARIABLES
+// Constants
 const TImplementationProxy KImplementationTable[] =
     {
     IMPLEMENTATION_PROXY_ENTRY( KImplUidDataPlugin, CSapiDataPlugin::NewL ) 
@@ -75,6 +78,7 @@
 // ---------------------------------------------------------------------------
 //
 CSapiDataPlugin::CSapiDataPlugin()
+    : iNetworkStatus( EUnknown ), iPluginState( ENone ) 
     {
     }
     
@@ -83,14 +87,10 @@
 // ---------------------------------------------------------------------------
 //
 void CSapiDataPlugin::ConstructL()
-    { 
-    iInfo.iUid.iUid = SAPIDP_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_DATAPLUGIN; 
-    iPluginState = ENone;
-    iHSForeGround = EFalse;
-    iKeyLockOn = EFalse;
-    iNetworkStatus = EUnknown;
-    iData = CSapiData::NewL(this);
-
+    {     
+    User::LeaveIfError( iRfs.Connect() );
+    
+    iData = CSapiData::NewL( this );   
     }
     
 // ---------------------------------------------------------------------------
@@ -101,123 +101,44 @@
 CSapiDataPlugin::~CSapiDataPlugin()
     {
     // deactivate the publishers
-    if( iData )
+    if ( iData )
         {
-        TRAP_IGNORE(iData->DeActivateL());
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KDeActive ));
+        
         delete iData;
         }
+    
     iObservers.Close();
     Release( iContent );
+
     iDataArray.ResetAndDestroy();
 
-    if( iContentModel)
+    if ( iContentModel )
         {
-        for( TInt i = iDataCount-1;i>=0  ; i-- )
+        for ( TInt i = iDataCount - 1; i >= 0  ; i-- )
             {
             User::Free((TAny*)iContentModel[i].cid);   
             }
-        delete []iContentModel;
-        }
-    iIconArray.Reset();
-    }
-
-// ---------------------------------------------------------------------------
-// From class CAiContentPublisher
-// Plug-ins take ownership of the settings array, so it must either
-// store it in a member or free it.
-// ---------------------------------------------------------------------------
-//
-void CSapiDataPlugin::ConfigureL( RAiSettingsItemArray& aSettings )
-    {
-    if( iDataCount > 0 )
-        {
-        // We own the array so destroy it
-         aSettings.ResetAndDestroy();
-         return;
+        
+        delete [] iContentModel;
         }
     
-    RAiSettingsItemArray contentItemsArr;
-    RAiSettingsItemArray configurationItemsArr;
+    iIconArray.Reset();
     
-    TInt count = aSettings.Count();
-    for(TInt i = 0; i < count; i++ )
-        {
-        MAiPluginSettings* pluginSetting = aSettings[i];
-        if( pluginSetting->AiPluginItemType() == EAiPluginContentItem )
-            {
-            contentItemsArr.Append(pluginSetting);
-            }
-        else if( pluginSetting->AiPluginItemType() == EAiPluginConfigurationItem )
-            {
-            configurationItemsArr.Append(pluginSetting);
-            }
-        }
-    iDataCount = contentItemsArr.Count();
-    if(iDataCount > 0 )
-        {
-        // Create the content Model
-        HBufC* contentId = HBufC::NewLC( KAiContentIdMaxLength + KAiPluginNameMaxLength );
-        iContentModel = new TAiContentItem[iDataCount];
-        for(TInt i = 0; i < iDataCount; i++)
-            {
-            MAiPluginContentItem& contentItem = (contentItemsArr[i])->AiPluginContentItem();
-            iContentModel[i].id = i;
-            if( contentItem.Type() == KText() || contentItem.Type() == KNewsTicker() )
-                {
-                // text
-                iContentModel[i].type = KAiContentTypeText;
-                }
-            if( contentItem.Type() == KImage() )
-                {
-                // image
-                iContentModel[i].type = KAiContentTypeBitmap;
-                }
-            
-            contentId->Des().Copy(contentItem.Name());
-            contentId->Des().Delete(0, contentId->Des().LocateReverse(KPluginNameSeprator) +1);
-  
-            TInt sizeOfContentId = contentId->Des().Size()+sizeof(wchar_t);
-            iContentModel[i].cid = static_cast<const wchar_t*>( User::Alloc( sizeOfContentId ) );
-            Mem::Copy((TAny*)iContentModel[i].cid, contentId->Des().PtrZ(), sizeOfContentId);
-            
-            contentId->Des().Delete( 0, contentId->Des().Length());
-            }    
-        
-        CleanupStack::PopAndDestroy( contentId );
-        iContent = AiUtility::CreateContentItemArrayIteratorL( iContentModel, iDataCount );
-        // Configurations 
-        iData->ConfigureL(configurationItemsArr);
-        
-        // Activate the publisher
-        iData->ActivateL();
-                
-        // Register for notifications
-        iData->RegisterPublisherObserverL();
-      
-        PublishL();
-        
-        iPluginState = ESuspend;
-        iData->RegisterContentObserverL();
-        }
-    contentItemsArr.Reset();
-    configurationItemsArr.Reset();
-       // We own the array so destroy it
-    aSettings.ResetAndDestroy();
-    // publish the initial data
+    iRfs.Close();
     }
 
+
 // ---------------------------------------------------------------------------
 // Publishes widget's texts and images
 // ---------------------------------------------------------------------------
 //
 void CSapiDataPlugin::PublishL()
-    {
-    User::LeaveIfError( iRfs.Connect() );
-
+    {    
     TInt observers( iObservers.Count() );        
     TInt transactionId = reinterpret_cast<TInt>( this );
 
-    for ( int i = 0; i < observers; i++ )
+    for ( TInt i = 0; i < observers; i++ )
         {
         MAiContentObserver* observer = iObservers[i];
         
@@ -233,8 +154,7 @@
         // Release memory of the published icons
         iIconArray.Reset();
         
-        }
-    iRfs.Close();
+        }    
     }
 
 // ---------------------------------------------------------------------------
@@ -340,19 +260,20 @@
           }
       else  // Interpret as File path
           {
-          RFile* iconFile = new (ELeave) RFile();
-          err = iconFile->Open( iRfs, aPath, EFileShareReadersOnly |  EFileRead );
+          RFile iconFile;
+          
+          err = iconFile.Open( iRfs, aPath, EFileShareReadersOnly |  EFileRead );
+
           if( err == KErrNone )
             {
-             aObserver->Publish( *this, aContentId, *iconFile, aContentId );
+             aObserver->Publish( *this, aContentId, iconFile, aContentId );
             }
           else
               {
               aObserver->Clean( *this, aContentId, aContentId );
               }
-          iconFile->Close();
-          delete iconFile;
-          iconFile = NULL;
+          
+          iconFile.Close();
           }
         }
     }
@@ -442,8 +363,7 @@
 // ---------------------------------------------------------------------------
 //
 void CSapiDataPlugin::RefreshL(TDesC& aContentType, TDesC& aOperation)
-    {
-     User::LeaveIfError( iRfs.Connect() );
+    {     
 	 TInt observers( iObservers.Count() );        
 	 TInt transactionId = reinterpret_cast<TInt>( this );
 	 
@@ -468,8 +388,7 @@
 		 // Relese memory of the published text
          iDataArray.ResetAndDestroy();
 		 iIconArray.Reset();
-		}
-	 iRfs.Close();
+		}	 
     }
 
 // ---------------------------------------------------------------------------
@@ -483,269 +402,287 @@
 		{
 		aObserver->Clean( *this, aContentId, aContentId );		
 		}
+	}
 
-	}
-// ---------------------------------------------------------------------------
-// From class CAiContentPublisher
-// Plug-in is requested to unload its engines due backup operation
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Start
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Start( TStartReason aReason )
+    {
+    if( aReason == ESystemStartup )
+        {
+        TRAP_IGNORE( iData->SetStartupReasonL( KSystemStartup ));
+        }
+    else if( aReason == EPageStartup )
+        {
+        TRAP_IGNORE( iData->SetStartupReasonL( KPageStartup ));
+        }
+    else if( aReason == EPluginStartup )
+        {
+        TRAP_IGNORE( iData->SetStartupReasonL( KPluginStartup));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Stop
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Stop( TStopReason aReason )
+    {
+    if( aReason == ESystemShutdown )
+        {
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KSystemShutdown ));
+        }
+    else if( aReason == EPageShutdown )
+        {
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KPageShutdown ));
+        }
+    else if( aReason == EPluginShutdown )
+        {
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KPluginShutdown ));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Resume
+//
+// ----------------------------------------------------------------------------
 //
-void CSapiDataPlugin::Stop( TAiTransitionReason aReason )
+void CSapiDataPlugin::Resume( TResumeReason aReason )
+    {
+    if ( aReason == EForeground )
+        {
+        iPluginState = EResume;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KResume ));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Suspend
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Suspend( TSuspendReason aReason )
     {
-    if( iPluginState == EResume )
+    if ( aReason == EBackground )
+        {
+        iPluginState = ESuspend;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KSuspend ));
+        }    
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::SetOnline
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::SetOnline()
+    {
+    if ( iNetworkStatus != EOnline )
         {
-        Suspend( aReason );
+        iNetworkStatus = EOnline;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KOnLine ));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::SetOffline
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::SetOffline()
+    {
+    if ( iNetworkStatus != EOffline )
+        {
+        iNetworkStatus = EOffline;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KOffLine ));
         }
     }
 
-// ---------------------------------------------------------------------------
-// From class CAiContentPublisher
-// Plug-in is instructed that it is allowed to consume CPU resources
-// ---------------------------------------------------------------------------
-//
-void CSapiDataPlugin::Resume( TAiTransitionReason aReason )
-    {
-    TRAP_IGNORE( DoResumeL( aReason ) ); 
-    }
-    
-// ---------------------------------------------------------------------------
-// From class CAiContentPublisher
-// Plug-in is instructed that it is not allowed to consume CPU resources
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::SubscribeL
 //
-void CSapiDataPlugin::Suspend( TAiTransitionReason aReason )
-    {
-    switch( aReason )
-		{
-		case EAiKeylockDisabled:
-        case EAiKeylockEnabled:
-        	{
-        	// handled in resume 
-        	TRAP_IGNORE( DoResumeL( aReason ) ); 
-        	break;
-        	}
-        default :
-        	{
-        	iPluginState = ESuspend;
-        	TRAP_IGNORE ( iData->SuspendL() );
-        	}
-		}
-    }
-
-// ---------------------------------------------------------------------------
-// From class CAiContentPublisher
-// The plug-in MUST maintain a registry of subscribers and send 
-// notification to all of them whenever the state changes or new content
-// is available
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
 //
 void CSapiDataPlugin::SubscribeL( MAiContentObserver& aObserver )
-    { 
+    {
     iObservers.AppendL( &aObserver );
     }
- 
 
-// ---------------------------------------------------------------------------
-// From class CAiContentPublisher
-// Returns the extension interface. Actual type depends on the passed 
-// aUid argument.
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::ConfigureL
+//
+// ----------------------------------------------------------------------------
 //
-TAny* CSapiDataPlugin::Extension( TUid aUid )
-    {    
-    if ( aUid == KExtensionUidProperty )
-   		{
-        return static_cast<MAiPropertyExtension*>( this );
-    	}
-    else if (aUid == KExtensionUidEventHandler)
-    	{
-        return static_cast<MAiEventHandlerExtension*>( this );
-    	}
-    else
-    	{	
-        return NULL;
-    	}
+void CSapiDataPlugin::ConfigureL( RAiSettingsItemArray& aSettings )
+    {
+    if ( iDataCount > 0 )
+        {
+        // We own the array so destroy it
+        aSettings.ResetAndDestroy();
+        return;
+        }
+    
+    RAiSettingsItemArray contentItemsArr;    
+    RAiSettingsItemArray configurationItemsArr;
+    
+    TInt count( aSettings.Count() );
+    
+    for ( TInt i = 0; i < count; i++ )
+        {
+        MAiPluginSettings* setting( aSettings[i] );
+        
+        if ( setting->AiPluginItemType() == EAiPluginContentItem )
+            {
+            contentItemsArr.Append( setting );
+            }
+        else if ( setting->AiPluginItemType() == EAiPluginConfigurationItem )
+            {
+            configurationItemsArr.Append( setting );
+            }
+        }
+    
+    iDataCount = contentItemsArr.Count();
+    
+    if ( iDataCount > 0 )
+        {
+        // Create the content Model
+        HBufC* contentId = HBufC::NewLC( 
+            KAiContentIdMaxLength + KAiPluginNameMaxLength );
+        
+        iContentModel = new TAiContentItem[iDataCount];
+        
+        for ( TInt i = 0; i < iDataCount; i++ )
+            {
+            MAiPluginContentItem& contentItem( 
+                contentItemsArr[i]->AiPluginContentItem() );
+            
+            iContentModel[i].id = i;
+            
+            if( contentItem.Type() == KText() || 
+                contentItem.Type() == KNewsTicker() ||
+                contentItem.Type() == KTextEditor() )            
+                {
+                // text
+                iContentModel[i].type = KAiContentTypeText;
+                }
+            if( contentItem.Type() == KImage() )
+                {
+                // image
+                iContentModel[i].type = KAiContentTypeBitmap;
+                }
+            
+            contentId->Des().Copy( contentItem.Name() );
+            contentId->Des().Delete( 0, 
+                contentId->Des().LocateReverse( KPluginNameSeprator ) + 1 );
+  
+            TInt sizeOfContentId( contentId->Des().Size() + sizeof( wchar_t ) );
+            
+            iContentModel[i].cid = 
+                static_cast< const wchar_t* >( User::Alloc( sizeOfContentId ) );
+                
+            Mem::Copy( ( TAny* )iContentModel[i].cid, 
+                contentId->Des().PtrZ(), sizeOfContentId );
+            
+            contentId->Des().Delete( 0, contentId->Des().Length() );
+            }    
+        
+        CleanupStack::PopAndDestroy( contentId );
+
+        iContent = AiUtility::CreateContentItemArrayIteratorL( 
+            iContentModel, iDataCount );
+    
+        iData->SetContentIdL( PublisherInfo().Namespace() );
+        
+        // Configurations 
+        iData->ConfigureL( configurationItemsArr );
+        
+        // Activate the publisher
+        iData->ChangePublisherStatusL( KActive );
+                
+        // Register for notifications
+        iData->RegisterPublisherObserverL();
+      
+        PublishL();
+        
+        iPluginState = ESuspend;
+        
+        iData->RegisterContentObserverL();
+        }
+    
+    contentItemsArr.Reset();
+    configurationItemsArr.Reset();
+   
+    // We own the array so destroy it
+    aSettings.ResetAndDestroy();    
     }
 
-// ---------------------------------------------------------------------------
-// From class MAiPropertyExtension
-// Read property of publisher plug-in.
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::GetProperty
 //
-TAny* CSapiDataPlugin::GetPropertyL( TInt aProperty )
-    {
-    TAny* property = NULL;
-    
-    switch ( aProperty )
-        {
-    case EAiPublisherInfo:
+// ----------------------------------------------------------------------------
+//
+TAny* CSapiDataPlugin::GetProperty( TProperty aProperty )
+    {    
+    if ( aProperty == EPublisherContent )
         {
-         property = static_cast<TAiPublisherInfo*>( &iInfo );
-        break;  
-        }       
-
-    case EAiPublisherContent:
-        {
-        property = static_cast<MAiContentItemIterator*>( iContent );
-        break;    
-        }        
-    default:
-        break;
+        return static_cast< MAiContentItemIterator* >( iContent );
         }
-
-    return property;
+    
+    return NULL;
     }
 
-// ---------------------------------------------------------------------------
-// From class MAiPropertyExtension
-// Write property value to optimize the content model.
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::HandleEvent
 //
-void CSapiDataPlugin::SetPropertyL( TInt aProperty, TAny* aValue )
-    {  
-    if( aProperty == EAiPublisherInfo )
-        {
-        ASSERT( aValue );
-        
-        const TAiPublisherInfo* info( 
-                static_cast<const TAiPublisherInfo*>( aValue ) );
-        
-        iInfo = *info;
-        
-        iData->SetContentIdL( info->iNamespace );
-        }
-    }
- 
-// ---------------------------------------------------------------------------
-// From class MAiEventHandlerExtension.
-// Handles an event sent by the AI framework.
-// ---------------------------------------------------------------------------
-//
-void CSapiDataPlugin::HandleEvent( TInt /*aEvent*/, const TDesC& /*aParam*/ )
-	{
-    // This is not as there is no event id to retrieve in this dynamic plugin. 
-	} 
-    
-// ---------------------------------------------------------------------------
-// From class MAiEventHandlerExtension.
-// Handles an event sent by the AI framework.
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
 //
 void CSapiDataPlugin::HandleEvent( const TDesC& aEventName, const TDesC& aParam )
     {
-    // We have no way of reporting errors to framework so just ignore them.
-    TRAP_IGNORE(iData->ExecuteActionL( aEventName , aParam ) );
+    TRAP_IGNORE( iData->ExecuteActionL( aEventName , aParam ) );    
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::HasMenuItem
+//
+// ----------------------------------------------------------------------------
+//
+TBool CSapiDataPlugin::HasMenuItem( const TDesC16& aMenuItem )
+    {
+    return iData->HasMenuItem ( aMenuItem );    
     }
 
-// ---------------------------------------------------------------------------
-// From class MAiEventHandlerExtension.
-// Invoked by the framework for querying if plugin has menu item
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::IsActive
 //
-TBool CSapiDataPlugin::HasMenuItem( const TDesC& aMenuItem )
-	{ 
-	return iData->HasMenuItem ( aMenuItem );  
-	}
-
-// ---------------------------------------------------------------------------
-// From class CAiContentPublisher
-// framework instructs plug-in that it is allowed to consume CPU resources
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
 //
-void CSapiDataPlugin::DoResumeL( TAiTransitionReason aReason )
+TBool CSapiDataPlugin::IsActive() const
     {
-	//update in startup phase and idle is on foreground.
-    switch ( aReason )
-    	{
-        case EAiIdleOnLine:
-        	{
-        	iNetworkStatus = EOnline;
-			iData->OnLineL();
-			break;
-        	}
-        case EAiIdleOffLine:
-        	{
-			iNetworkStatus = EOffline;
-			iData->OffLineL();
-			break;
-			}
-        case EAiIdlePageSwitch:
-        	{
-        	if ( iPluginState == EResume )
-				{
-				iData->SuspendL();
-				}
-        	iPluginState = EInActive;
-        	iData->InActiveL();
-        	}
-        	break;
-        case EAiSystemStartup:
-    	case EAiIdleForeground:
-    		{
-			iHSForeGround = ETrue;
-    		}
-    	case EAiBacklightOn:    		
-    		{
-    		if ( iPluginState == ESuspend  && !iKeyLockOn )
-				{
-				iPluginState = EResume;
-				iData->ResumeL();
-				}
-    		break;
-			}
-    	case EAiKeylockDisabled:
-        	{
-        	iKeyLockOn = EFalse;
-        	// Key lock events considered only if HS is in foreground  
-        	if ( iHSForeGround && iPluginState == ESuspend )
-        		{
-        		iPluginState = EResume;
-				iData->ResumeL();
-        		}
-        	break;
-        	}
-    	case EAiKeylockEnabled:
-        	{
-        	iKeyLockOn = ETrue;
-        	// Key lock events considered only if HS is in foreground
-        	if ( iHSForeGround && iPluginState == EResume )
-        		{
-				iPluginState = ESuspend ;
-				iData->SuspendL();
-        		}
-        	break;
-        	}
-    	case EAiScreenLayoutChanged:
-        	{
-        	// ignore events
-        	break;
-        	}
-      case EAiGeneralThemeChanged:
-          {
-          // ignore event
-          break;
-          }
-    	case EAiIdleBackground: 
-        	{
-			iHSForeGround = EFalse;
-        	}
-        default :
-        	{
-			if ( iPluginState == EResume )
-				{
-				iPluginState = ESuspend;
-				iData->SuspendL();
-				}
-        	break;
-        	}
-    	}
+    return iPluginState == EResume;
     }
 
-// ---------------------------------------------------------------------------
-// Is plugin active to publish the data 
-// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Data
+//
+// ----------------------------------------------------------------------------
 //
-TBool CSapiDataPlugin::IsActive()
+CSapiData* CSapiDataPlugin::Data() const
     {
-    return (iPluginState == EResume );
+    return iData;
     }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::NetworkStatus
+//
+// ----------------------------------------------------------------------------
+//
+CSapiDataPlugin::TPluginNetworkStatus CSapiDataPlugin::NetworkStatus() const
+    {
+    return iNetworkStatus;
+    }
+
+// End of file