idlefw/plugins/sapidataplugin/src/sapidataplugin.cpp
branchRCL_3
changeset 114 a5a39a295112
child 118 8baec10861af
equal deleted inserted replaced
113:0efa10d348c0 114:a5a39a295112
       
     1 /*
       
     2 * Copyright (c) 2005-2007 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:  SAPI data plug-in publisher
       
    15 *
       
    16 */
       
    17 
       
    18 // System includes
       
    19 #include <ecom/ecom.h>
       
    20 #include <ecom/implementationproxy.h>
       
    21 #include <PUAcodes.hrh>
       
    22 #include <badesca.h>
       
    23 #include <fbs.h>
       
    24 #include <gulicon.h>
       
    25 #include <AknsSkinInstance.h> 
       
    26 #include <AknsUtils.h> 
       
    27 #include <AknsConstants.h>
       
    28 #include <e32property.h>
       
    29 
       
    30 // User includes
       
    31 #include <hspublisherinfo.h>
       
    32 #include <aicontentobserver.h>
       
    33 #include <aiutility.h>
       
    34 #include <aipspropertyobserver.h>
       
    35 #include <aipluginsettings.h>
       
    36 #include <activeidle2domainpskeys.h>
       
    37 #include <debug.h>
       
    38 
       
    39 #include "sapidatapluginconst.h"
       
    40 #include "sapidatapluginuids.hrh"
       
    41 #include "sapidataplugin.h"
       
    42 #include "sapidata.h"
       
    43 
       
    44 // Constants
       
    45 const TImplementationProxy KImplementationTable[] =
       
    46     {
       
    47     IMPLEMENTATION_PROXY_ENTRY( KImplUidDataPlugin, CSapiDataPlugin::NewL ) 
       
    48     };
       
    49 
       
    50 // ======== MEMBER FUNCTIONS ========
       
    51 // ---------------------------------------------------------------------------
       
    52 // Constructs and returns an application object.
       
    53 // ---------------------------------------------------------------------------
       
    54 //
       
    55 EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount )
       
    56     {
       
    57     aTableCount = sizeof( KImplementationTable ) /
       
    58         sizeof( TImplementationProxy );
       
    59     return KImplementationTable;
       
    60     }
       
    61 
       
    62 // ======== MEMBER FUNCTIONS ========
       
    63 
       
    64 // ---------------------------------------------------------------------------
       
    65 // Symbian 2nd phase constructor can leave
       
    66 // ---------------------------------------------------------------------------
       
    67 //
       
    68 CSapiDataPlugin* CSapiDataPlugin::NewL()
       
    69     {
       
    70     CSapiDataPlugin* self = new (ELeave) CSapiDataPlugin;
       
    71     CleanupStack::PushL( self );
       
    72     self->ConstructL();
       
    73     CleanupStack::Pop( self );
       
    74     return self;
       
    75     }
       
    76     
       
    77 // ---------------------------------------------------------------------------
       
    78 // Default constructor
       
    79 // ---------------------------------------------------------------------------
       
    80 //
       
    81 CSapiDataPlugin::CSapiDataPlugin()
       
    82     : iNetworkStatus( EUnknown ), iPluginState( EStopped )
       
    83     {
       
    84     }
       
    85     
       
    86 // ---------------------------------------------------------------------------
       
    87 // Symbian 2nd phase constructor can leave
       
    88 // ---------------------------------------------------------------------------
       
    89 //
       
    90 void CSapiDataPlugin::ConstructL()
       
    91     {     
       
    92     User::LeaveIfError( iRfs.Connect() );
       
    93     
       
    94     iData = CSapiData::NewL( this );   
       
    95     }
       
    96     
       
    97 // ---------------------------------------------------------------------------
       
    98 // Destructor
       
    99 // Deletes all data created to heap
       
   100 // ---------------------------------------------------------------------------
       
   101 //
       
   102 CSapiDataPlugin::~CSapiDataPlugin()
       
   103     {
       
   104     // deactivate the publishers
       
   105     delete iData;
       
   106     iObservers.Close();
       
   107     Release( iContent );
       
   108     iDataArray.ResetAndDestroy();
       
   109 
       
   110     if ( iContentModel )
       
   111         {
       
   112         for ( TInt i = iDataCount - 1; i >= 0  ; i-- )
       
   113             {
       
   114             User::Free((TAny*)iContentModel[i].cid);   
       
   115             }
       
   116         
       
   117         delete [] iContentModel;
       
   118         }
       
   119     
       
   120     iIconArray.Reset();
       
   121     iRfs.Close();
       
   122     }
       
   123 
       
   124 // ---------------------------------------------------------------------------
       
   125 // Publishes widget's texts and images
       
   126 // ---------------------------------------------------------------------------
       
   127 //
       
   128 void CSapiDataPlugin::PublishL()
       
   129     {    
       
   130     TInt observers( iObservers.Count() );        
       
   131     TInt transactionId = reinterpret_cast<TInt>( this );
       
   132 
       
   133     for ( TInt i = 0; i < observers; i++ )
       
   134         {
       
   135         MAiContentObserver* observer = iObservers[i];
       
   136         
       
   137 		if ( observer->StartTransaction( transactionId ) == KErrNone ) 				
       
   138             {
       
   139             // Publish all the data
       
   140     		iData->PublishL(observer, KAll );
       
   141     	    observer->Commit( transactionId );
       
   142             }
       
   143 
       
   144 		// Release memory of the published text
       
   145         iDataArray.ResetAndDestroy();
       
   146         // Release memory of the published icons
       
   147         iIconArray.Reset();        
       
   148         }        
       
   149     }
       
   150 
       
   151 // ---------------------------------------------------------------------------
       
   152 // Publish a specific text to the widget  
       
   153 // ---------------------------------------------------------------------------
       
   154 //
       
   155 void CSapiDataPlugin::PublishTextL(MAiContentObserver* aObserver, 
       
   156         TInt& aContentId, TDesC& aContentValue)
       
   157     {
       
   158     if ( aObserver->CanPublish( *this,  aContentId  ,  aContentId  ) )
       
   159         {
       
   160         if( aContentValue.Length() > 0 )
       
   161             {
       
   162             HBufC* contentText = HBufC::NewLC(aContentValue.Size());
       
   163             TPtr cDes = contentText->Des();
       
   164             cDes.Copy(aContentValue);
       
   165             aObserver->Publish( *this, aContentId, cDes, aContentId );  
       
   166             iDataArray.AppendL( contentText );
       
   167             CleanupStack::Pop( contentText );
       
   168             }
       
   169         else
       
   170             {
       
   171             aObserver->Clean( *this, aContentId, aContentId );
       
   172             }
       
   173         }
       
   174     }
       
   175 
       
   176 // ---------------------------------------------------------------------------
       
   177 // Publish a specific image to the widget  
       
   178 // ---------------------------------------------------------------------------
       
   179 //
       
   180 void CSapiDataPlugin::PublishImageL(MAiContentObserver* aObserver,
       
   181         TInt aContentId, TDesC& aPath )
       
   182     {
       
   183     TInt err = KErrNone;
       
   184     TAknsItemID iconId;
       
   185     iconId.iMajor=0;
       
   186     iconId.iMinor=0;
       
   187     TInt bitmapId(0);
       
   188     TInt maskId(0);
       
   189     TFileName fileName;
       
   190     CGulIcon* icon = NULL;
       
   191     CFbsBitmap* bitmap = NULL;
       
   192     CFbsBitmap* mask = NULL;
       
   193     
       
   194     if ( aObserver->CanPublish( *this, aContentId , aContentId ) )
       
   195       {
       
   196       TBool inSkin = iData->ResolveSkinIdAndMifId( aPath, iconId, bitmapId, maskId, fileName  );
       
   197       if ( inSkin )
       
   198           {
       
   199           // Load from skin 
       
   200           MAknsSkinInstance* skin = AknsUtils::SkinInstance();
       
   201           if ( iconId.iMajor != 0 && iconId.iMajor!=0 )
       
   202               {
       
   203               // Create icon with fall back 
       
   204               TRAP_IGNORE(AknsUtils::CreateIconL(
       
   205                       skin,
       
   206                       iconId,
       
   207                       bitmap,
       
   208                       mask,
       
   209                       fileName,  /* backup filename */
       
   210                       bitmapId,  /* backup bit map id */
       
   211                       maskId));   /* backup mask id */
       
   212               }
       
   213           else if( bitmapId !=0 )
       
   214               {
       
   215               if ( maskId!=0 )
       
   216                   {
       
   217                   // Create icon from Mif filename , bitmap id and mask id
       
   218                   TRAP_IGNORE(icon = AknsUtils::CreateGulIconL(
       
   219                           skin,
       
   220                           iconId,
       
   221                           fileName,
       
   222                           bitmapId,
       
   223                           maskId) );
       
   224                   }
       
   225               else
       
   226                   {
       
   227                   TRAP_IGNORE(AknsUtils::CreateIconL(
       
   228                           skin,
       
   229                           iconId,
       
   230                           bitmap,
       
   231                           fileName,  /* backup filename */
       
   232                           bitmapId)); /* backup bit map id */
       
   233                   }
       
   234               }
       
   235           
       
   236           if ( icon == NULL && bitmap !=  NULL )
       
   237               {
       
   238               icon = CGulIcon::NewL( bitmap, mask );
       
   239               }
       
   240 
       
   241           if ( icon != NULL ) // Syntax correct but icon not found
       
   242               {
       
   243               aObserver->PublishPtr( *this, aContentId, icon , aContentId );
       
   244               iIconArray.Append(icon);
       
   245               } 
       
   246           else
       
   247               {
       
   248               err = KErrNotFound;   
       
   249               aObserver->Clean( *this, aContentId, aContentId );
       
   250               }
       
   251           }
       
   252       else  // Interpret as File path
       
   253           {
       
   254           RFile iconFile;
       
   255           
       
   256           err = iconFile.Open( iRfs, aPath, EFileShareReadersOnly |  EFileRead );
       
   257 
       
   258           if( err == KErrNone )
       
   259             {
       
   260              aObserver->Publish( *this, aContentId, iconFile, aContentId );
       
   261             }
       
   262           else
       
   263               {
       
   264               aObserver->Clean( *this, aContentId, aContentId );
       
   265               }
       
   266           
       
   267           iconFile.Close();
       
   268           }
       
   269         }
       
   270     }
       
   271 
       
   272 // ---------------------------------------------------------------------------
       
   273 // Publish a image to the widget  
       
   274 // ---------------------------------------------------------------------------
       
   275 //
       
   276 void CSapiDataPlugin::PublishImageL(MAiContentObserver* aObserver, 
       
   277     TInt& aContentId, TInt aHandle, TInt aMaskHandle )
       
   278     {
       
   279     if ( aObserver->CanPublish( *this, aContentId , aContentId ) )
       
   280         {
       
   281         if( aHandle != KErrBadHandle  )
       
   282             {
       
   283             CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
       
   284             if( KErrNone == bitmap->Duplicate( aHandle) )
       
   285                 {
       
   286                 // Take the ownership
       
   287                 CGulIcon* icon = CGulIcon::NewL(bitmap);
       
   288                 if( aMaskHandle != KErrBadHandle )
       
   289                     {
       
   290                     CFbsBitmap* mask = new (ELeave) CFbsBitmap();
       
   291                     if (KErrNone == mask->Duplicate( aMaskHandle) )
       
   292                         {
       
   293                         icon->SetMask( mask );            
       
   294                         }
       
   295                     }
       
   296                 aObserver->PublishPtr( *this, aContentId, icon , aContentId );
       
   297                 iIconArray.Append(icon);
       
   298                 }
       
   299             else
       
   300                 {
       
   301                 delete bitmap;
       
   302                 bitmap = NULL;
       
   303                 aObserver->Clean( *this, aContentId, aContentId );
       
   304                 }
       
   305             }
       
   306         }
       
   307     }
       
   308 
       
   309 // ---------------------------------------------------------------------------
       
   310 // Publish a data to the widget  
       
   311 // ---------------------------------------------------------------------------
       
   312 //
       
   313 void CSapiDataPlugin::PublishData( MAiContentObserver* aObserver, 
       
   314     TInt& aContentId, const TDesC8& aData )
       
   315     {
       
   316     if ( aObserver->CanPublish( *this, aContentId, aContentId ) )
       
   317         {                
       
   318         aObserver->Publish( *this, aContentId, aData, aContentId );
       
   319         }    
       
   320     }
       
   321 
       
   322 // ---------------------------------------------------------------------------
       
   323 // Gets the id of a content  
       
   324 // ---------------------------------------------------------------------------
       
   325 //
       
   326 TInt CSapiDataPlugin::GetIdL( TDesC& aObjectId)
       
   327 	{
       
   328     TInt id = KErrNotFound;
       
   329 	for( TInt i = 0;i<  iDataCount; i++ )
       
   330 		{
       
   331 		 if( aObjectId == ContentCid(iContentModel[i] ) )
       
   332 			 {
       
   333 			 id = iContentModel[i].id;
       
   334 			 break;
       
   335 			 }
       
   336 		}
       
   337 	return id;
       
   338 	}
       
   339  
       
   340 // ---------------------------------------------------------------------------
       
   341 // Gets type of a content
       
   342 // ---------------------------------------------------------------------------
       
   343 //
       
   344 const TDesC& CSapiDataPlugin::GetTypeL(TDesC& aObjectId )
       
   345 	{
       
   346 	for( TInt i = 0;i<  iDataCount; i++ )
       
   347 		{
       
   348 		 if( aObjectId ==  ContentCid(iContentModel[i]) )
       
   349 			 {
       
   350 			 if( iContentModel[i].type ==  KAiContentTypeText)
       
   351 				 {
       
   352 				 return KText();
       
   353 				 }
       
   354 			 else if( iContentModel[i].type == KAiContentTypeBitmap)
       
   355 				 {
       
   356 				 return KImage();
       
   357 				 }
       
   358 			 else if ( iContentModel[i].type == KAiContentTypeData )
       
   359 			     {
       
   360                  return KData();
       
   361 			     }
       
   362 			 }
       
   363 		}
       
   364 	
       
   365 	return KNullDesC();
       
   366 	}
       
   367 
       
   368 // ---------------------------------------------------------------------------
       
   369 //Refresh a specific image or text in the widget
       
   370 // ---------------------------------------------------------------------------
       
   371 //
       
   372 void CSapiDataPlugin::RefreshL( TDesC& aContentType,
       
   373                                 TDesC& aOperation,
       
   374                                 CLiwDefaultMap* aDataMap )
       
   375     {
       
   376     __PRINTS("*** CSapiDataPlugin::RefreshL ***");
       
   377     
       
   378     __PRINT( __DBG_FORMAT( "* Publisher name: %S, uid: 0x%x, content type: %S, operation: %S" ),          
       
   379         &PublisherInfo().Name(), PublisherInfo().Uid().iUid, &aContentType, &aOperation ); 
       
   380         
       
   381     const TInt observerCount( iObservers.Count() );    
       
   382     const TInt transactionId = reinterpret_cast<TInt>( this );
       
   383     
       
   384     for( TInt obsIndex = 0; obsIndex < observerCount; obsIndex++ )
       
   385         {
       
   386         MAiContentObserver* observer = iObservers[obsIndex];
       
   387     
       
   388         if( observer->StartTransaction( transactionId ) == KErrNone ) 				
       
   389             {
       
   390             if ( aOperation != KOperationDelete )
       
   391                 {
       
   392                 if( aDataMap )
       
   393                     {
       
   394                     iData->PublishDataL( observer, aDataMap );
       
   395                     }
       
   396                 else
       
   397                     {
       
   398                     iData->PublishL( observer, aContentType );
       
   399                     }            
       
   400                 }
       
   401             else
       
   402                 {
       
   403                 iData->RemoveL( observer, aContentType  );
       
   404                 }
       
   405     
       
   406             observer->Commit( transactionId );
       
   407             }
       
   408     
       
   409         // Relese memory of the published text
       
   410         iDataArray.ResetAndDestroy();
       
   411         iIconArray.Reset();
       
   412         }
       
   413     
       
   414     __PRINTS("*** CSapiDataPlugin::RefreshL - done ***");
       
   415     }
       
   416 
       
   417 // ---------------------------------------------------------------------------
       
   418 // Cleans a data from the widget
       
   419 // ---------------------------------------------------------------------------
       
   420 //
       
   421 void CSapiDataPlugin::Clean(MAiContentObserver* aObserver, 
       
   422         TInt& aContentId )
       
   423 	{
       
   424 	 if ( aObserver->CanPublish( *this, aContentId, aContentId ) )
       
   425 		{
       
   426 		aObserver->Clean( *this, aContentId, aContentId );		
       
   427 		}
       
   428 	}
       
   429 
       
   430 // ----------------------------------------------------------------------------
       
   431 // CSapiDataPlugin::Start
       
   432 //
       
   433 // ----------------------------------------------------------------------------
       
   434 //
       
   435 void CSapiDataPlugin::Start( TStartReason aReason )
       
   436     {
       
   437     iPluginState = EStarted;
       
   438     
       
   439     TRAP_IGNORE( StartL( aReason ) );
       
   440     }
       
   441 
       
   442 // ----------------------------------------------------------------------------
       
   443 // CSapiDataPlugin::StartL
       
   444 //
       
   445 // ----------------------------------------------------------------------------
       
   446 //
       
   447 void CSapiDataPlugin::StartL( TStartReason aReason )
       
   448     {       
       
   449     // Activate the publisher
       
   450     iData->ChangePublisherStatusL( KActive );
       
   451     
       
   452     if ( aReason == ESystemStartup )
       
   453         {
       
   454         PublishL();
       
   455         iData->SetStartupReasonL( KSystemStartup );
       
   456         }
       
   457     else if ( aReason == EPageStartup )
       
   458         {
       
   459         iData->SetStartupReasonL( KPageStartup );
       
   460         }
       
   461     else if ( aReason == EPluginStartup )
       
   462         {
       
   463         PublishL();
       
   464         iData->SetStartupReasonL( KPluginStartup );
       
   465         }
       
   466 
       
   467     if ( !iPubObsRegistered )
       
   468         {
       
   469         // Listen for publisher registration to resend the events 
       
   470         iData->RegisterPublisherObserverL() ;
       
   471 
       
   472         // Execute the active trigger 
       
   473         iData->TriggerActiveL();    
       
   474         
       
   475         iPubObsRegistered = ETrue;
       
   476         }    
       
   477     }
       
   478 
       
   479 // ----------------------------------------------------------------------------
       
   480 // CSapiDataPlugin::Stop
       
   481 //
       
   482 // ----------------------------------------------------------------------------
       
   483 //
       
   484 void CSapiDataPlugin::Stop( TStopReason aReason )
       
   485     {
       
   486     TRAP_IGNORE( StopL( aReason ) );
       
   487     
       
   488     iPluginState = EStopped;
       
   489     }
       
   490 
       
   491 // ----------------------------------------------------------------------------
       
   492 // CSapiDataPlugin::StopL
       
   493 //
       
   494 // ----------------------------------------------------------------------------
       
   495 //
       
   496 void CSapiDataPlugin::StopL( TStopReason aReason )
       
   497     {
       
   498     if ( aReason == ESystemShutdown )
       
   499         {
       
   500         iData->ChangePublisherStatusL( KSystemShutdown );
       
   501         }
       
   502     else if ( aReason == EPageShutdown )
       
   503         {
       
   504         iData->ChangePublisherStatusL( KPageShutdown );
       
   505         }
       
   506     else if ( aReason == EPluginShutdown )
       
   507         {
       
   508         iData->ChangePublisherStatusL( KPluginShutdown );
       
   509         }
       
   510 
       
   511     if ( iData )
       
   512         {
       
   513         iData->ChangePublisherStatusL( KDeActive );
       
   514         }          
       
   515     }
       
   516 
       
   517 // ----------------------------------------------------------------------------
       
   518 // CSapiDataPlugin::Resume
       
   519 //
       
   520 // ----------------------------------------------------------------------------
       
   521 //
       
   522 void CSapiDataPlugin::Resume( TResumeReason aReason )
       
   523     {
       
   524     if ( aReason == EForeground && iPluginState != EStopped )
       
   525         {
       
   526         iPluginState = EResume;
       
   527         TRAP_IGNORE( iData->ChangePublisherStatusL( KResume ));
       
   528         }
       
   529     }
       
   530 
       
   531 // ----------------------------------------------------------------------------
       
   532 // CSapiDataPlugin::Suspend
       
   533 //
       
   534 // ----------------------------------------------------------------------------
       
   535 //
       
   536 void CSapiDataPlugin::Suspend( TSuspendReason aReason )
       
   537     {
       
   538     if ( aReason == EBackground && iPluginState != EStopped )
       
   539         {
       
   540         iPluginState = ESuspend;
       
   541         TRAP_IGNORE( iData->ChangePublisherStatusL( KSuspend ));
       
   542         }    
       
   543     }
       
   544 
       
   545 // ----------------------------------------------------------------------------
       
   546 // CSapiDataPlugin::SetOnline
       
   547 //
       
   548 // ----------------------------------------------------------------------------
       
   549 //
       
   550 void CSapiDataPlugin::SetOnline()
       
   551     {
       
   552     if ( iNetworkStatus != EOnline && iPluginState != EStopped )
       
   553         {
       
   554         iNetworkStatus = EOnline;
       
   555         TRAP_IGNORE( iData->ChangePublisherStatusL( KOnLine ));
       
   556         }
       
   557     }
       
   558 
       
   559 // ----------------------------------------------------------------------------
       
   560 // CSapiDataPlugin::SetOffline
       
   561 //
       
   562 // ----------------------------------------------------------------------------
       
   563 //
       
   564 void CSapiDataPlugin::SetOffline()
       
   565     {
       
   566     if ( iNetworkStatus != EOffline && iPluginState != EStopped )
       
   567         {
       
   568         iNetworkStatus = EOffline;
       
   569         TRAP_IGNORE( iData->ChangePublisherStatusL( KOffLine ));
       
   570         }
       
   571     }
       
   572 
       
   573 // ----------------------------------------------------------------------------
       
   574 // CSapiDataPlugin::SubscribeL
       
   575 //
       
   576 // ----------------------------------------------------------------------------
       
   577 //
       
   578 void CSapiDataPlugin::SubscribeL( MAiContentObserver& aObserver )
       
   579     {
       
   580     iObservers.AppendL( &aObserver );
       
   581     }
       
   582 
       
   583 // ----------------------------------------------------------------------------
       
   584 // CSapiDataPlugin::ConfigureL
       
   585 //
       
   586 // ----------------------------------------------------------------------------
       
   587 //
       
   588 void CSapiDataPlugin::ConfigureL( RAiSettingsItemArray& aSettings )
       
   589     {
       
   590     RAiSettingsItemArray contentItemsArr;    
       
   591     CleanupClosePushL( contentItemsArr );
       
   592     
       
   593     RAiSettingsItemArray configurationItemsArr;
       
   594     CleanupClosePushL( configurationItemsArr );
       
   595     
       
   596     TInt count( aSettings.Count() );
       
   597     
       
   598     for ( TInt i = 0; i < count; i++ )
       
   599         {
       
   600         MAiPluginSettings* setting( aSettings[i] );
       
   601         
       
   602         if ( setting->AiPluginItemType() == EAiPluginContentItem )
       
   603             {
       
   604             contentItemsArr.Append( setting );
       
   605             }
       
   606         else if ( setting->AiPluginItemType() == EAiPluginConfigurationItem )
       
   607             {
       
   608             configurationItemsArr.Append( setting );
       
   609             }
       
   610         }
       
   611     
       
   612     iDataCount = contentItemsArr.Count();
       
   613     
       
   614     // Create the content Model
       
   615     HBufC* contentId = HBufC::NewLC( 
       
   616         KAiContentIdMaxLength + KAiPluginNameMaxLength );
       
   617     
       
   618     iContentModel = new TAiContentItem[iDataCount];
       
   619     
       
   620     for ( TInt i = 0; i < iDataCount; i++ )
       
   621         {
       
   622         MAiPluginContentItem& contentItem( 
       
   623             contentItemsArr[i]->AiPluginContentItem() );
       
   624         
       
   625         iContentModel[i].id = i;
       
   626         
       
   627         const TDesC& type( contentItem.Type() );
       
   628         
       
   629         if ( type == KText() || type == KNewsTicker() ||                 
       
   630             type == KTextEditor() )            
       
   631             {
       
   632             // text
       
   633             iContentModel[i].type = KAiContentTypeText;
       
   634             }
       
   635         else if ( type == KImage() )
       
   636             {
       
   637             // image
       
   638             iContentModel[i].type = KAiContentTypeBitmap;
       
   639             }
       
   640         else if ( type == KData() )
       
   641             {
       
   642             // data stream 
       
   643             iContentModel[i].type = KAiContentTypeData;
       
   644             }
       
   645         
       
   646         contentId->Des().Copy( contentItem.Name() );
       
   647         contentId->Des().Delete( 0, 
       
   648             contentId->Des().LocateReverse( KPluginNameSeprator ) + 1 );
       
   649 
       
   650         TInt sizeOfContentId( contentId->Des().Size() + sizeof( wchar_t ) );
       
   651         
       
   652         iContentModel[i].cid = 
       
   653             static_cast< const wchar_t* >( User::Alloc( sizeOfContentId ) );
       
   654             
       
   655         Mem::Copy( ( TAny* )iContentModel[i].cid, 
       
   656             contentId->Des().PtrZ(), sizeOfContentId );
       
   657         
       
   658         contentId->Des().Delete( 0, contentId->Des().Length() );
       
   659         }    
       
   660     
       
   661     CleanupStack::PopAndDestroy( contentId );
       
   662 
       
   663     iContent = AiUtility::CreateContentItemArrayIteratorL( 
       
   664         iContentModel, iDataCount );
       
   665 
       
   666     iData->SetContentIdL( PublisherInfo().Namespace() );
       
   667     
       
   668     // Configurations 
       
   669     iData->ConfigureL( configurationItemsArr );
       
   670 
       
   671     // Listen the publisher content update
       
   672     iData->RegisterContentObserverL();              
       
   673 
       
   674     CleanupStack::PopAndDestroy( 2, &contentItemsArr ); // configurationItemsArr
       
   675     }
       
   676 
       
   677 // ----------------------------------------------------------------------------
       
   678 // CSapiDataPlugin::SetProperty
       
   679 //
       
   680 // ----------------------------------------------------------------------------
       
   681 //
       
   682 void CSapiDataPlugin::SetProperty( TProperty aProperty, TAny* aAny )
       
   683     {
       
   684     if ( aProperty == ECpsCmdBuffer )
       
   685         {
       
   686         iData->SetCommandBuffer( aAny );
       
   687         }
       
   688     }
       
   689 // ----------------------------------------------------------------------------
       
   690 // CSapiDataPlugin::GetProperty
       
   691 //
       
   692 // ----------------------------------------------------------------------------
       
   693 //
       
   694 TAny* CSapiDataPlugin::GetProperty( TProperty aProperty )
       
   695     {    
       
   696     if ( aProperty == EPublisherContent )
       
   697         {
       
   698         return static_cast< MAiContentItemIterator* >( iContent );
       
   699         }
       
   700     
       
   701     return NULL;
       
   702     }
       
   703 
       
   704 // ----------------------------------------------------------------------------
       
   705 // CSapiDataPlugin::HandleEvent
       
   706 //
       
   707 // ----------------------------------------------------------------------------
       
   708 //
       
   709 void CSapiDataPlugin::HandleEvent( const TDesC& aEventName, const TDesC& aParam )
       
   710     {
       
   711     TRAP_IGNORE( iData->ExecuteActionL( aEventName , aParam ) );    
       
   712     }
       
   713 
       
   714 // ----------------------------------------------------------------------------
       
   715 // CSapiDataPlugin::HasMenuItem
       
   716 //
       
   717 // ----------------------------------------------------------------------------
       
   718 //
       
   719 TBool CSapiDataPlugin::HasMenuItem( const TDesC16& aMenuItem )
       
   720     {
       
   721     return iData->HasMenuItem ( aMenuItem );    
       
   722     }
       
   723 
       
   724 // ----------------------------------------------------------------------------
       
   725 // CSapiDataPlugin::IsActive
       
   726 //
       
   727 // ----------------------------------------------------------------------------
       
   728 //
       
   729 TBool CSapiDataPlugin::IsActive() const
       
   730     {
       
   731     return iPluginState == EResume;
       
   732     }
       
   733 
       
   734 // ----------------------------------------------------------------------------
       
   735 // CSapiDataPlugin::IsStopped
       
   736 //
       
   737 // ----------------------------------------------------------------------------
       
   738 //
       
   739 TBool CSapiDataPlugin::IsStopped() const
       
   740     {
       
   741     return iPluginState == EStopped;
       
   742     }
       
   743 
       
   744 // ----------------------------------------------------------------------------
       
   745 // CSapiDataPlugin::Data
       
   746 //
       
   747 // ----------------------------------------------------------------------------
       
   748 //
       
   749 CSapiData* CSapiDataPlugin::Data() const
       
   750     {
       
   751     return iData;
       
   752     }
       
   753 
       
   754 // ----------------------------------------------------------------------------
       
   755 // CSapiDataPlugin::NetworkStatus
       
   756 //
       
   757 // ----------------------------------------------------------------------------
       
   758 //
       
   759 CSapiDataPlugin::TPluginNetworkStatus CSapiDataPlugin::NetworkStatus() const
       
   760     {
       
   761     return iNetworkStatus;
       
   762     }
       
   763 
       
   764 // End of file
       
   765