idlefw/plugins/wrtdataplugin/src/wrtdataplugin.cpp
changeset 0 79c6a41cd166
child 1 844b978f8d5e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/wrtdataplugin/src/wrtdataplugin.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,766 @@
+/*
+* Copyright (c) 2005-2007 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:
+* Profile plug-in publisher
+*
+*/
+
+#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>
+#include <AknsSkinInstance.h> 
+#include <AknsUtils.h> 
+#include <AknsConstants.h>
+#include <e32property.h>
+#include <activeidle2domainpskeys.h>
+
+#include "wrtdatapluginconst.h"
+#include "wrtdatapluginuids.hrh"
+#include "wrtdataplugin.h"
+#include "wrtdata.h"
+
+// CONST CLASS VARIABLES
+const TImplementationProxy KImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY( KImplUidDataPlugin, CWrtDataPlugin::NewL ) 
+    };
+
+// ======== MEMBER FUNCTIONS ========
+// ---------------------------------------------------------------------------
+// Constructs and returns an application object.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount )
+    {
+    aTableCount = sizeof( KImplementationTable ) /
+        sizeof( TImplementationProxy );
+    return KImplementationTable;
+    }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave
+// ---------------------------------------------------------------------------
+//
+CWrtDataPlugin* CWrtDataPlugin::NewL()
+    {
+    CWrtDataPlugin* self = new (ELeave) CWrtDataPlugin;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CWrtDataPlugin::CWrtDataPlugin()
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::ConstructL()
+    { 
+    iInfo.iUid.iUid = WRTDP_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_DATAPLUGIN; 
+    iPluginState = ENone;
+    iHSForeGround = EFalse;
+    iNetworkStatus = EUnknown;
+    iData = CWrtData::NewL(this);
+
+    }
+    
+// ---------------------------------------------------------------------------
+// Destructor
+// Deletes all data created to heap
+// ---------------------------------------------------------------------------
+//
+CWrtDataPlugin::~CWrtDataPlugin()
+    {
+    // deactivate the publishers
+    if( iData )
+        {
+        if ( iPluginState != EInActive )
+        	{
+        	TRAP_IGNORE(iData->DeActivateL());
+        	}
+        delete iData;
+        }
+    iObservers.Close();
+    Release( iContent );
+    iDataArray.ResetAndDestroy();
+
+    if( iContentModel)
+        {
+        for( TInt i = iDataCount-1;i>=0  ; i-- )
+            {
+            User::Free((TAny*)iContentModel[i].cid);   
+            }
+        delete []iContentModel;
+        }
+    iIconArray.Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// Publishes widget's texts and images
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::PublishL()
+    {
+    TInt err( KErrNone );
+    User::LeaveIfError( iRfs.Connect() );
+
+    TInt observers( iObservers.Count() );        
+    TInt transactionId = reinterpret_cast<TInt>( this );
+
+    for ( int i = 0; i < observers; i++ )
+        {
+        MAiContentObserver* observer = iObservers[i];
+                
+        if ( observer->StartTransaction( transactionId ) == KErrNone )        	 
+        	{// Publish all the data
+            iData->PublishAllL(observer);
+            observer->Commit( transactionId );
+            }
+
+        // Release memory of the published text
+        iDataArray.ResetAndDestroy();
+        // Release memory of the published icons
+        iIconArray.Reset();
+        }
+    iRfs.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// Publish a specific text of the widget  
+// ---------------------------------------------------------------------------
+//
+/*
+void CWrtDataPlugin::PublishTextL(MAiContentObserver* aObserver, 
+        TInt& aContentId, TDesC16& aContentValue)
+    {
+    if ( aObserver->CanPublish( *this,  aContentId  ,  aContentId  ) )
+        {
+        if( aContentValue.Length() > 0 )
+            {
+            HBufC* contentText = HBufC::NewLC(aContentValue.Size());
+            TPtr16 cDes = contentText->Des();
+            cDes.Copy(aContentValue);
+            aObserver->Publish( *this, aContentId, cDes, aContentId );  
+            iDataArray.AppendL( contentText );
+            CleanupStack::Pop( contentText );
+            }
+        else
+            {
+            aObserver->Clean( *this, aContentId, aContentId );
+            }
+        }
+    }*/
+
+// ---------------------------------------------------------------------------
+// Publish a specific image of the widget  
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::PublishImageL(MAiContentObserver* aObserver,
+		TContentItem aContentId, TDesC16& aPath )
+    {
+    TInt err = KErrNone;
+    TAknsItemID iconId;
+    iconId.iMajor=0;
+    iconId.iMinor=0;
+    TInt bitmapId(0);
+    TInt maskId(0);
+    TFileName fileName;
+    CGulIcon* icon = NULL;
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+    
+    if ( aObserver->CanPublish( *this, aContentId , aContentId ) )
+      {
+      TBool inSkin = iData->ResolveSkinIdAndMifId( aPath, iconId, bitmapId, maskId, fileName  );
+      if ( inSkin )
+          {
+          // Load from skin 
+          MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+          if ( iconId.iMajor != 0 && iconId.iMajor!=0 )
+              {
+              // Create icon with fall back 
+              TRAP_IGNORE(AknsUtils::CreateIconL(
+                      skin,
+                      iconId,
+                      bitmap,
+                      mask,
+                      fileName,  /* backup filename */
+                      bitmapId,  /* backup bit map id */
+                      maskId));   /* backup mask id */
+              }
+          else if( bitmapId !=0 )
+              {
+              if ( maskId!=0 )
+                  {
+                  // Create icon from Mif filename , bitmap id and mask id
+                  TRAP_IGNORE(icon = AknsUtils::CreateGulIconL(
+                          skin,
+                          iconId,
+                          fileName,
+                          bitmapId,
+                          maskId) );
+                  }
+              else
+                  {
+                  TRAP_IGNORE(AknsUtils::CreateIconL(
+                          skin,
+                          iconId,
+                          bitmap,
+                          fileName,  /* backup filename */
+                          bitmapId)); /* backup bit map id */
+                  }
+              }
+          
+          if ( icon == NULL && bitmap !=  NULL )
+              {
+              icon = CGulIcon::NewL( bitmap, mask );
+              }
+
+          if ( icon != NULL ) // Syntax correct but icon not found
+              {
+              aObserver->PublishPtr( *this, aContentId, icon , aContentId );
+              iIconArray.Append(icon);
+              } 
+          else
+              {
+              err = KErrNotFound;   
+              aObserver->Clean( *this, aContentId, aContentId );
+              }
+          }
+      else  // Interpret as File path
+          {
+          RFile* iconFile = new (ELeave) RFile();
+          err = iconFile->Open( iRfs, aPath, EFileShareReadersOnly |  EFileRead );
+          if( err == KErrNone )
+            {
+             aObserver->Publish( *this, aContentId, *iconFile, aContentId );
+            }
+          else
+              {
+              aObserver->Clean( *this, aContentId, aContentId );
+              }
+          iconFile->Close();
+          delete iconFile;
+          iconFile = NULL;
+          }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Publish a image of the widget  
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::PublishImageL(MAiContentObserver* aObserver, 
+		TContentItem aContentId, TInt aHandle, TInt aMaskHandle )
+    {
+    if ( aObserver->CanPublish( *this, aContentId , aContentId ) )
+        {
+        if( aHandle != KErrBadHandle  )
+            {
+            CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
+            if( KErrNone == bitmap->Duplicate( aHandle) )
+                {
+                // Take the ownership
+                CGulIcon* icon = CGulIcon::NewL(bitmap);
+                if( aMaskHandle != KErrBadHandle )
+                    {
+                    CFbsBitmap* mask = new (ELeave) CFbsBitmap();
+                    if (KErrNone == mask->Duplicate( aMaskHandle) )
+                        {
+                        icon->SetMask( mask );            
+                        }
+                    }
+                aObserver->PublishPtr( *this, aContentId, icon , aContentId );
+                iIconArray.Append(icon);
+                }
+            else
+                {
+                delete bitmap;
+                bitmap = NULL;
+                aObserver->Clean( *this, aContentId, aContentId );
+                }
+            }
+          }
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the id of a content  
+// ---------------------------------------------------------------------------
+//
+TInt CWrtDataPlugin::GetIdL( TDesC16& aObjectId)
+	{
+    TInt id = KErrNotFound;
+    HBufC16* objectId = HBufC16::NewLC( KAiContentIdMaxLength );
+	for( TInt i = 0;i<  iDataCount; i++ )
+		{
+		 objectId->Des().Copy((TUint16*)iContentModel[i].cid);
+		 if( aObjectId == objectId->Des() )
+			 {
+			 id = iContentModel[i].id;
+			 break;
+			 }
+		}
+	CleanupStack::PopAndDestroy( objectId );
+	return id;
+	}
+ 
+
+// ---------------------------------------------------------------------------
+// Gets type of a content
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::GetTypeL(TDesC16& aObjectId, TDes16& aType )
+	{
+	HBufC16* objectId = HBufC16::NewLC( KAiContentIdMaxLength );
+	for( TInt i = 0;i<  iDataCount; i++ )
+		{
+		objectId->Des().Copy((TUint16*)iContentModel[i].cid);
+		 if( aObjectId == objectId->Des() )
+			 {
+			 if( iContentModel[i].type ==  KAiContentTypeText)
+				 {
+				 aType.Copy( KText );
+				 }
+			 else if( iContentModel[i].type == KAiContentTypeBitmap)
+				 {
+				 aType.Copy( KImage );
+				 }
+			 break;
+			 }
+		}
+	CleanupStack::PopAndDestroy( objectId );
+	}
+
+// ---------------------------------------------------------------------------
+//Refresh a specific image of text in the widget
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::RefreshL(TDesC16& aOperation)
+    {
+    TInt err( KErrNone );
+    User::LeaveIfError( iRfs.Connect() );
+    TInt observers( iObservers.Count() );        
+    TInt transactionId = reinterpret_cast<TInt>( this );
+   
+    for ( TInt obsIndex = 0; obsIndex < observers; obsIndex++ )
+        {
+        MAiContentObserver* observer = iObservers[obsIndex];
+    
+        if ( observer->StartTransaction( transactionId ) == KErrNone )    	 
+            {
+            if( aOperation != KOperationDelete)
+                {
+                iData->PublishL( observer );
+                }
+            else
+                {
+                Clean( observer , EImage1 ) ;
+                }
+            
+            observer->Commit( transactionId );
+            }
+     
+        // Relese memory of the published text
+        iDataArray.ResetAndDestroy();
+        // Release memory of the published icons
+        iIconArray.Reset();
+        }
+    
+    iRfs.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// Cleans a data from the widget
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::Clean(MAiContentObserver* aObserver, 
+        TInt aContentId )
+	{
+	 if ( aObserver->CanPublish( *this, aContentId, aContentId ) )
+		{
+		aObserver->Clean( *this, aContentId, aContentId );		
+		}
+
+	}
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher
+// Plug-in is requested to unload its engines due backup operation
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::Stop( TAiTransitionReason aReason )
+    {
+    if( iPluginState == EResume )
+        {
+        Suspend( aReason );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher
+// Plug-in is instructed that it is allowed to consume CPU resources
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::Resume( TAiTransitionReason aReason )
+    {
+    TRAP_IGNORE( DoResumeL( aReason ) ); 
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher
+// Plug-in is instructed that it is not allowed to consume CPU resources
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::Suspend( TAiTransitionReason aReason )
+    {
+    switch( aReason )
+		{
+		case EAiKeylockDisabled:
+        case EAiKeylockEnabled:
+        	{
+        	// handled in resume 
+        	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 CWrtDataPlugin::SubscribeL( MAiContentObserver& aObserver )
+    { 
+    iObservers.AppendL( &aObserver );
+    }
+ 
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher
+// Plug-ins take ownership of the settings array, so it must either
+// store it in a member or free it.
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::ConfigureL( RAiSettingsItemArray& aSettings )
+    {
+    if( iDataCount > 0 )
+        {
+        // We own the array so destroy it
+         aSettings.ResetAndDestroy();
+         return;
+        }
+    
+    RAiSettingsItemArray contentItemsArr;
+    RAiSettingsItemArray configurationItemsArr;
+    RAiSettingsItemArray settingItemsArr;
+    
+    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);
+            }
+        else 
+            {
+            settingItemsArr.Append(pluginSetting);
+            }
+        }
+    
+    iDataCount = contentItemsArr.Count();
+    if(iDataCount > 0 )
+        {
+        // Create the content Model
+        HBufC16* contentId = HBufC16::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);
+
+        iPluginState = ESuspend;
+        // Register for notifications
+        iData->RegisterL();
+        
+        // Activate the publisher 
+        iData->ActivateL();
+        }
+    
+    settingItemsArr.Reset();
+    contentItemsArr.Reset();
+    configurationItemsArr.Reset();
+       // We own the array so destroy it
+    aSettings.ResetAndDestroy();
+    // publish the initial data
+    PublishL();
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher
+// Returns the extension interface. Actual type depends on the passed 
+// aUid argument.
+// ---------------------------------------------------------------------------
+//
+TAny* CWrtDataPlugin::Extension( TUid aUid )
+    {    
+    if ( aUid == KExtensionUidProperty )
+   		{
+        return static_cast<MAiPropertyExtension*>( this );
+    	}
+    else if (aUid == KExtensionUidEventHandler)
+    	{
+        return static_cast<MAiEventHandlerExtension*>( this );
+    	}
+    else
+    	{	
+        return NULL;
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// From class MAiPropertyExtension
+// Read property of publisher plug-in.
+// ---------------------------------------------------------------------------
+//
+TAny* CWrtDataPlugin::GetPropertyL( TInt aProperty )
+    {
+    TAny* property = NULL;
+    
+    switch ( aProperty )
+        {
+    case EAiPublisherInfo:
+        {
+         property = static_cast<TAiPublisherInfo*>( &iInfo );
+        break;  
+        }       
+
+    case EAiPublisherContent:
+        {
+        property = static_cast<MAiContentItemIterator*>( iContent );
+        break;    
+        }        
+    default:
+        break;
+        }
+
+    return property;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MAiPropertyExtension
+// Write property value to optimize the content model.
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::SetPropertyL( TInt aProperty, TAny* aValue )
+    {  
+    switch ( aProperty )
+        {
+		case EAiPublisherInfo:
+			{
+			if( aValue )
+			    {
+    		    const TAiPublisherInfo* info = static_cast<const TAiPublisherInfo*>( aValue );
+	    	    iInfo.iName.Copy( info->iName );
+	    	    iInfo.iNamespace.Copy( info->iNamespace );
+			    }
+		    break;
+		    }
+		default:
+		    break;         
+        }
+    }
+ 
+// ---------------------------------------------------------------------------
+// From class MAiEventHandlerExtension.
+// Handles an event sent by the AI framework.
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::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 CWrtDataPlugin::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 ) );
+    }
+
+// ---------------------------------------------------------------------------
+// From class MAiEventHandlerExtension.
+// Invoked by the framework for querying if plugin has menu item
+// ---------------------------------------------------------------------------
+//
+TBool CWrtDataPlugin::HasMenuItem( const TDesC16& aMenuItem )
+	{ 
+	return iData->HasMenuItem ( aMenuItem );  
+	}
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher
+// framework instructs plug-in that it is allowed to consume CPU resources
+// ---------------------------------------------------------------------------
+//
+void CWrtDataPlugin::DoResumeL( TAiTransitionReason aReason )
+    {
+	//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 )
+				{
+				iPluginState = EResume;
+				iData->ResumeL();
+				}
+    		break;
+			}
+    	case EAiKeylockDisabled:
+        	{
+        	// Key lock events considered only if HS is in foreground  
+        	if ( iHSForeGround && iPluginState == ESuspend )
+        		{
+        		iPluginState = EResume;
+				iData->ResumeL();
+        		}
+        	break;
+        	}
+    	case EAiKeylockEnabled:
+        	{
+        	// 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;
+        	}
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// Is plugin active to publish the data 
+// ---------------------------------------------------------------------------
+//
+TBool CWrtDataPlugin::IsActive()
+    {
+    return (iPluginState == EResume );
+    }