idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp
branchRCL_3
changeset 30 a5a39a295112
child 31 8baec10861af
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp	Wed Sep 01 12:22:09 2010 +0100
@@ -0,0 +1,765 @@
+/*
+* 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:  SAPI data plug-in publisher
+*
+*/
+
+// System includes
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include <PUAcodes.hrh>
+#include <badesca.h>
+#include <fbs.h>
+#include <gulicon.h>
+#include <AknsSkinInstance.h> 
+#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 <debug.h>
+
+#include "sapidatapluginconst.h"
+#include "sapidatapluginuids.hrh"
+#include "sapidataplugin.h"
+#include "sapidata.h"
+
+// Constants
+const TImplementationProxy KImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY( KImplUidDataPlugin, CSapiDataPlugin::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
+// ---------------------------------------------------------------------------
+//
+CSapiDataPlugin* CSapiDataPlugin::NewL()
+    {
+    CSapiDataPlugin* self = new (ELeave) CSapiDataPlugin;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CSapiDataPlugin::CSapiDataPlugin()
+    : iNetworkStatus( EUnknown ), iPluginState( EStopped )
+    {
+    }
+    
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::ConstructL()
+    {     
+    User::LeaveIfError( iRfs.Connect() );
+    
+    iData = CSapiData::NewL( this );   
+    }
+    
+// ---------------------------------------------------------------------------
+// Destructor
+// Deletes all data created to heap
+// ---------------------------------------------------------------------------
+//
+CSapiDataPlugin::~CSapiDataPlugin()
+    {
+    // deactivate the publishers
+    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();
+    iRfs.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// Publishes widget's texts and images
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::PublishL()
+    {    
+    TInt observers( iObservers.Count() );        
+    TInt transactionId = reinterpret_cast<TInt>( this );
+
+    for ( TInt i = 0; i < observers; i++ )
+        {
+        MAiContentObserver* observer = iObservers[i];
+        
+		if ( observer->StartTransaction( transactionId ) == KErrNone ) 				
+            {
+            // Publish all the data
+    		iData->PublishL(observer, KAll );
+    	    observer->Commit( transactionId );
+            }
+
+		// Release memory of the published text
+        iDataArray.ResetAndDestroy();
+        // Release memory of the published icons
+        iIconArray.Reset();        
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// Publish a specific text to the widget  
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::PublishTextL(MAiContentObserver* aObserver, 
+        TInt& aContentId, TDesC& aContentValue)
+    {
+    if ( aObserver->CanPublish( *this,  aContentId  ,  aContentId  ) )
+        {
+        if( aContentValue.Length() > 0 )
+            {
+            HBufC* contentText = HBufC::NewLC(aContentValue.Size());
+            TPtr 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 to the widget  
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::PublishImageL(MAiContentObserver* aObserver,
+        TInt aContentId, TDesC& 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;
+          
+          err = iconFile.Open( iRfs, aPath, EFileShareReadersOnly |  EFileRead );
+
+          if( err == KErrNone )
+            {
+             aObserver->Publish( *this, aContentId, iconFile, aContentId );
+            }
+          else
+              {
+              aObserver->Clean( *this, aContentId, aContentId );
+              }
+          
+          iconFile.Close();
+          }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Publish a image to the widget  
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::PublishImageL(MAiContentObserver* aObserver, 
+    TInt& 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 );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Publish a data to the widget  
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::PublishData( MAiContentObserver* aObserver, 
+    TInt& aContentId, const TDesC8& aData )
+    {
+    if ( aObserver->CanPublish( *this, aContentId, aContentId ) )
+        {                
+        aObserver->Publish( *this, aContentId, aData, aContentId );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the id of a content  
+// ---------------------------------------------------------------------------
+//
+TInt CSapiDataPlugin::GetIdL( TDesC& aObjectId)
+	{
+    TInt id = KErrNotFound;
+	for( TInt i = 0;i<  iDataCount; i++ )
+		{
+		 if( aObjectId == ContentCid(iContentModel[i] ) )
+			 {
+			 id = iContentModel[i].id;
+			 break;
+			 }
+		}
+	return id;
+	}
+ 
+// ---------------------------------------------------------------------------
+// Gets type of a content
+// ---------------------------------------------------------------------------
+//
+const TDesC& CSapiDataPlugin::GetTypeL(TDesC& aObjectId )
+	{
+	for( TInt i = 0;i<  iDataCount; i++ )
+		{
+		 if( aObjectId ==  ContentCid(iContentModel[i]) )
+			 {
+			 if( iContentModel[i].type ==  KAiContentTypeText)
+				 {
+				 return KText();
+				 }
+			 else if( iContentModel[i].type == KAiContentTypeBitmap)
+				 {
+				 return KImage();
+				 }
+			 else if ( iContentModel[i].type == KAiContentTypeData )
+			     {
+                 return KData();
+			     }
+			 }
+		}
+	
+	return KNullDesC();
+	}
+
+// ---------------------------------------------------------------------------
+//Refresh a specific image or text in the widget
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::RefreshL( TDesC& aContentType,
+                                TDesC& aOperation,
+                                CLiwDefaultMap* aDataMap )
+    {
+    __PRINTS("*** CSapiDataPlugin::RefreshL ***");
+    
+    __PRINT( __DBG_FORMAT( "* Publisher name: %S, uid: 0x%x, content type: %S, operation: %S" ),          
+        &PublisherInfo().Name(), PublisherInfo().Uid().iUid, &aContentType, &aOperation ); 
+        
+    const TInt observerCount( iObservers.Count() );    
+    const TInt transactionId = reinterpret_cast<TInt>( this );
+    
+    for( TInt obsIndex = 0; obsIndex < observerCount; obsIndex++ )
+        {
+        MAiContentObserver* observer = iObservers[obsIndex];
+    
+        if( observer->StartTransaction( transactionId ) == KErrNone ) 				
+            {
+            if ( aOperation != KOperationDelete )
+                {
+                if( aDataMap )
+                    {
+                    iData->PublishDataL( observer, aDataMap );
+                    }
+                else
+                    {
+                    iData->PublishL( observer, aContentType );
+                    }            
+                }
+            else
+                {
+                iData->RemoveL( observer, aContentType  );
+                }
+    
+            observer->Commit( transactionId );
+            }
+    
+        // Relese memory of the published text
+        iDataArray.ResetAndDestroy();
+        iIconArray.Reset();
+        }
+    
+    __PRINTS("*** CSapiDataPlugin::RefreshL - done ***");
+    }
+
+// ---------------------------------------------------------------------------
+// Cleans a data from the widget
+// ---------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Clean(MAiContentObserver* aObserver, 
+        TInt& aContentId )
+	{
+	 if ( aObserver->CanPublish( *this, aContentId, aContentId ) )
+		{
+		aObserver->Clean( *this, aContentId, aContentId );		
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Start
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Start( TStartReason aReason )
+    {
+    iPluginState = EStarted;
+    
+    TRAP_IGNORE( StartL( aReason ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::StartL
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::StartL( TStartReason aReason )
+    {       
+    // Activate the publisher
+    iData->ChangePublisherStatusL( KActive );
+    
+    if ( aReason == ESystemStartup )
+        {
+        PublishL();
+        iData->SetStartupReasonL( KSystemStartup );
+        }
+    else if ( aReason == EPageStartup )
+        {
+        iData->SetStartupReasonL( KPageStartup );
+        }
+    else if ( aReason == EPluginStartup )
+        {
+        PublishL();
+        iData->SetStartupReasonL( KPluginStartup );
+        }
+
+    if ( !iPubObsRegistered )
+        {
+        // Listen for publisher registration to resend the events 
+        iData->RegisterPublisherObserverL() ;
+
+        // Execute the active trigger 
+        iData->TriggerActiveL();    
+        
+        iPubObsRegistered = ETrue;
+        }    
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Stop
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Stop( TStopReason aReason )
+    {
+    TRAP_IGNORE( StopL( aReason ) );
+    
+    iPluginState = EStopped;
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::StopL
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::StopL( TStopReason aReason )
+    {
+    if ( aReason == ESystemShutdown )
+        {
+        iData->ChangePublisherStatusL( KSystemShutdown );
+        }
+    else if ( aReason == EPageShutdown )
+        {
+        iData->ChangePublisherStatusL( KPageShutdown );
+        }
+    else if ( aReason == EPluginShutdown )
+        {
+        iData->ChangePublisherStatusL( KPluginShutdown );
+        }
+
+    if ( iData )
+        {
+        iData->ChangePublisherStatusL( KDeActive );
+        }          
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Resume
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Resume( TResumeReason aReason )
+    {
+    if ( aReason == EForeground && iPluginState != EStopped )
+        {
+        iPluginState = EResume;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KResume ));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Suspend
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::Suspend( TSuspendReason aReason )
+    {
+    if ( aReason == EBackground && iPluginState != EStopped )
+        {
+        iPluginState = ESuspend;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KSuspend ));
+        }    
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::SetOnline
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::SetOnline()
+    {
+    if ( iNetworkStatus != EOnline && iPluginState != EStopped )
+        {
+        iNetworkStatus = EOnline;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KOnLine ));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::SetOffline
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::SetOffline()
+    {
+    if ( iNetworkStatus != EOffline && iPluginState != EStopped )
+        {
+        iNetworkStatus = EOffline;
+        TRAP_IGNORE( iData->ChangePublisherStatusL( KOffLine ));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::SubscribeL
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::SubscribeL( MAiContentObserver& aObserver )
+    {
+    iObservers.AppendL( &aObserver );
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::ConfigureL
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::ConfigureL( RAiSettingsItemArray& aSettings )
+    {
+    RAiSettingsItemArray contentItemsArr;    
+    CleanupClosePushL( contentItemsArr );
+    
+    RAiSettingsItemArray configurationItemsArr;
+    CleanupClosePushL( 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();
+    
+    // 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;
+        
+        const TDesC& type( contentItem.Type() );
+        
+        if ( type == KText() || type == KNewsTicker() ||                 
+            type == KTextEditor() )            
+            {
+            // text
+            iContentModel[i].type = KAiContentTypeText;
+            }
+        else if ( type == KImage() )
+            {
+            // image
+            iContentModel[i].type = KAiContentTypeBitmap;
+            }
+        else if ( type == KData() )
+            {
+            // data stream 
+            iContentModel[i].type = KAiContentTypeData;
+            }
+        
+        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 );
+
+    // Listen the publisher content update
+    iData->RegisterContentObserverL();              
+
+    CleanupStack::PopAndDestroy( 2, &contentItemsArr ); // configurationItemsArr
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::SetProperty
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::SetProperty( TProperty aProperty, TAny* aAny )
+    {
+    if ( aProperty == ECpsCmdBuffer )
+        {
+        iData->SetCommandBuffer( aAny );
+        }
+    }
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::GetProperty
+//
+// ----------------------------------------------------------------------------
+//
+TAny* CSapiDataPlugin::GetProperty( TProperty aProperty )
+    {    
+    if ( aProperty == EPublisherContent )
+        {
+        return static_cast< MAiContentItemIterator* >( iContent );
+        }
+    
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::HandleEvent
+//
+// ----------------------------------------------------------------------------
+//
+void CSapiDataPlugin::HandleEvent( const TDesC& aEventName, const TDesC& aParam )
+    {
+    TRAP_IGNORE( iData->ExecuteActionL( aEventName , aParam ) );    
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::HasMenuItem
+//
+// ----------------------------------------------------------------------------
+//
+TBool CSapiDataPlugin::HasMenuItem( const TDesC16& aMenuItem )
+    {
+    return iData->HasMenuItem ( aMenuItem );    
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::IsActive
+//
+// ----------------------------------------------------------------------------
+//
+TBool CSapiDataPlugin::IsActive() const
+    {
+    return iPluginState == EResume;
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::IsStopped
+//
+// ----------------------------------------------------------------------------
+//
+TBool CSapiDataPlugin::IsStopped() const
+    {
+    return iPluginState == EStopped;
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::Data
+//
+// ----------------------------------------------------------------------------
+//
+CSapiData* CSapiDataPlugin::Data() const
+    {
+    return iData;
+    }
+
+// ----------------------------------------------------------------------------
+// CSapiDataPlugin::NetworkStatus
+//
+// ----------------------------------------------------------------------------
+//
+CSapiDataPlugin::TPluginNetworkStatus CSapiDataPlugin::NetworkStatus() const
+    {
+    return iNetworkStatus;
+    }
+
+// End of file
+