emailservices/emailserver/cmailhandlerplugin/src/cmailcpsif.cpp
branchRCL_3
changeset 64 3533d4323edc
child 80 726fba06891a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpsif.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,1203 @@
+/*
+* Copyright (c) 2008 - 2010 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:  handles interface to LIW and Content Publishing Service
+*
+*/
+
+#include <cmailhandlerplugin.mbg>
+#include <AknUtils.h>
+#include <gulicon.h>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <emailwidget.rsg>
+
+#include "emailtrace.h"
+#include "cfsmailclient.h"
+#include "cmailcpsif.h"
+#include "cmailcpsifconsts.h"
+#include "FreestyleEmailUiConstants.h"
+#include "cmailwidgetcenrepkeysinternal.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::NewL
+// ---------------------------------------------------------------------------
+//
+CMailCpsIf* CMailCpsIf::NewL( CMailCpsHandler* aMailCpsHandler )
+    {
+    FUNC_LOG;
+    CMailCpsIf* self = new(ELeave) CMailCpsIf( aMailCpsHandler );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::CMailCpsIf
+// ---------------------------------------------------------------------------
+//
+CMailCpsIf::CMailCpsIf( CMailCpsHandler* aMailCpsHandler ) :
+    iMailCpsHandler( aMailCpsHandler ),
+    iMsgInterface ( NULL ),
+    iIgnoreHsNotifications( EFalse )
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::ConstructL()
+    {
+    FUNC_LOG;
+    for (TInt i=0; i<KMaxMailboxCount; i++)
+        {
+        iAllowedToPublish[i] = EFalse;
+        }
+    
+    AllocateResourcesL();
+    iMsgInterface = GetMessagingInterfaceL();
+    RegisterForObserverL();
+    PublisherRegisteryActionL();
+    
+    ResetPublishedDataL( KCPAll );
+    
+    iContentControlClient = CHsCcApiClient::NewL( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::~CMailCpsIf
+// ---------------------------------------------------------------------------
+//
+CMailCpsIf::~CMailCpsIf()
+    {
+    FUNC_LOG;
+
+    TRAP_IGNORE(UnRegisterForObserverL());
+    
+    if ( iMsgInterface )
+        {
+        iMsgInterface->Close();
+        iMsgInterface = NULL;
+        }
+    delete iServiceHandler;
+    for ( TInt i = 0; i < iInstIdList.Count(); i++ )
+        {
+        iInstIdList.Remove(i);
+        }
+    CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset );
+    if ( iContentControlClient ) 
+        {
+        delete iContentControlClient;
+        }
+    }
+
+// ---------------------------------------------------------
+// CMailCpsIf::AllocateResourcesL
+// ---------------------------------------------------------
+//
+void CMailCpsIf::AllocateResourcesL()
+    {
+    FUNC_LOG;
+    // create resourcefile 
+    CCoeEnv* env = CCoeEnv::Static();
+    
+    // Load resource file from the same drive where this dll is loaded from
+    TFileName dllFileName;
+    Dll::FileName( dllFileName );
+    TParse parse;
+    User::LeaveIfError( parse.Set( KResourceFile, &dllFileName, NULL ) );
+    TFileName resourceFile( parse.FullName() );
+    
+    BaflUtils::NearestLanguageFile( env->FsSession(), resourceFile );
+    iResourceFileOffset = env->AddResourceFileL( resourceFile );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::GetMessagingInterfaceL
+// ---------------------------------------------------------------------------
+//
+MLiwInterface* CMailCpsIf::GetMessagingInterfaceL()
+    {
+    FUNC_LOG;
+    if ( !iServiceHandler )
+        {
+        iServiceHandler = CLiwServiceHandler::NewL();
+        }
+
+    CLiwGenericParamList* inParam = CLiwGenericParamList::NewL();
+    CleanupStack::PushL( inParam );
+    CLiwGenericParamList* outParam = CLiwGenericParamList::NewL();
+    CleanupStack::PushL( outParam );
+    CLiwCriteriaItem* crit = CLiwCriteriaItem::NewL( KLiwCmdAsStr, KCPInterface,
+        KCPService  );
+    crit->SetServiceClass( TUid::Uid(KLiwClassBase) );
+
+    RCriteriaArray criteriaArray;
+    criteriaArray.AppendL( crit );
+
+    iServiceHandler->AttachL( criteriaArray );
+    iServiceHandler->ExecuteServiceCmdL( *crit, *inParam, *outParam );
+
+    delete crit;
+    crit = NULL;
+    criteriaArray.Reset();
+
+    // find service interface
+    TInt pos = 0;
+    MLiwInterface* msgInterface = NULL;
+    outParam->FindFirst( pos, KCPInterface );
+    if ( pos != KErrNotFound )
+        {
+        msgInterface = (*outParam)[pos].Value().AsInterface(); // indexing should be safe
+        }
+    outParam->Reset();
+    inParam->Reset();
+
+    if( !msgInterface )
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    CleanupStack::PopAndDestroy( outParam );
+    CleanupStack::PopAndDestroy( inParam );
+    return msgInterface;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishSetupWizardL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishSetupWizardL(TInt aInstance)
+    {
+    FUNC_LOG;
+    if (!iInstIdList[aInstance].iWizardPublished)
+        {
+        TFSMailMsgId mailBoxId;
+        TFSMailMsgId folderId;
+    
+       HBufC* setupEmail = StringLoader::LoadLC(R_EMAILWIDGET_TEXT_SETUP_EMAIL);
+    
+        iSetupUid = PublishDescriptorL(
+            KPubId, KContTypeSetupText,
+            iInstIdList[aInstance].iCid,
+            *setupEmail, 
+            KKeySetupText, KTriggerWizard8);
+
+        PublishImageL(
+            iInstIdList[aInstance].iCid,
+            KContTypeSetupIcon,
+            KKeySetupIcon,
+            EMbmCmailhandlerpluginQgn_prop_cmail_new_mailbox,
+            EMbmCmailhandlerpluginQgn_prop_cmail_new_mailbox_mask,
+            mailBoxId,
+            KNullDes);
+            
+        PublishImageL(
+            iInstIdList[aInstance].iCid,
+            KContTypeSetupBrandIcon1,
+            KKeySetupBrandIcon1,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account_mask,
+            mailBoxId,
+            KSetupBrand1);
+
+        PublishImageL(
+            iInstIdList[aInstance].iCid,
+            KContTypeSetupBrandIcon2,
+            KKeySetupBrandIcon2,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account_mask,
+            mailBoxId,
+            KSetupBrand2);
+
+        PublishImageL(
+            iInstIdList[aInstance].iCid,
+            KContTypeSetupBrandIcon3,
+            KKeySetupBrandIcon3,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account_mask,
+            mailBoxId,
+            KSetupBrand3);
+
+        PublishImageL(
+            iInstIdList[aInstance].iCid,
+            KContTypeSetupBrandIcon4,
+            KKeySetupBrandIcon4,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account,
+            EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account_mask,
+            mailBoxId,
+            KSetupBrand4);
+        iInstIdList[aInstance].iWizardPublished = ETrue;
+        CleanupStack::PopAndDestroy(setupEmail);
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishActiveMailboxNameL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishActiveMailboxNameL(
+    const TInt aInstance,
+    const TInt aRowNumber, 
+    const TDesC& aMailboxName)
+    {
+    FUNC_LOG;
+
+    TBuf<KMaxDescLen> row;
+    row.Num(aRowNumber);
+
+    TBuf<KMaxDescLen> contentType;
+    contentType.Copy(KContTypeBodyText);        
+    contentType.Append(row);
+    
+    TBuf<KMaxDescLen> textKey;
+    textKey.Copy(KKeyBodyText);
+    textKey.Append(row);
+		
+    iMailboxNameUid = PublishDescriptorL(
+        KPubId, contentType, 
+        iInstIdList[aInstance].iCid,        
+        aMailboxName,
+        textKey, KTriggerEmailUi8);
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishActiveMailboxNameL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishMailboxNameL(
+    const TInt aInstance, 
+    const TDesC& aMailboxName,
+    const TDesC8& aAction )
+    {
+    FUNC_LOG;
+    
+    TBuf<KMaxDescLen> contentType;
+    contentType.Copy(KContTypeBodyText);        
+    contentType.Append(_L("1"));
+    
+    TBuf<KMaxDescLen> textKey;
+    textKey.Copy(KKeyBodyText);
+    textKey.Append(_L("1"));
+
+    TFSMailMsgId dummy;
+    
+    PublishDescriptorL( KPubId, contentType, iInstIdList[aInstance].iCid,
+        aMailboxName, textKey, aAction);        
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishIndicatorIconL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishIndicatorIconL( const TInt aInstance, 
+                                        const TInt aRowNumber,
+                                        const TInt aIcon )
+    {
+    FUNC_LOG;
+    TFSMailMsgId mailBoxId;
+    
+    TBuf<KMaxDescLen> row;
+    row.Num(aRowNumber);
+
+    TBuf<KMaxDescLen> contentType;
+    contentType.Copy(KContTypeIndicatorIcon);        
+    contentType.Append(row);
+
+    TBuf8<KMaxDescLen> row8;
+    row8.Num(aRowNumber);
+    
+    TBuf8<KMaxDescLen> key;
+    key.Copy(KKeyIndicatorIcon);     
+    key.Append(row8);
+
+    PublishImageL(
+              iInstIdList[aInstance].iCid,
+              contentType,
+              key,
+              aIcon,
+              aIcon + 1,
+              mailBoxId,
+              KNullDes);
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishMailboxIconL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishMailboxIconL( const TInt aInstance,
+                                      const TInt aRowNumber, 
+                                      const TInt aIcon,
+                                      TFSMailMsgId aMailBoxId )
+    {
+    FUNC_LOG;
+
+    TBuf<KMaxDescLen> row;
+    row.Num(aRowNumber);
+
+    TBuf<KMaxDescLen> contentType;
+    contentType.Copy(KContTypeMailboxIcons);        
+    contentType.Append(row);
+
+    TBuf8<KMaxDescLen> row8;
+    row8.Num(aRowNumber);
+    
+    TBuf8<KMaxDescLen> key;
+    key.Copy(KKeyMailboxIcons);     
+    key.Append(row8);
+
+    PublishImageL(
+              iInstIdList[aInstance].iCid,
+              contentType,
+              key,
+              aIcon,
+              aIcon + 1,
+              aMailBoxId,
+              KNullDes);
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishMailboxIconL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishMailboxIconL( const TInt aInstance, const TDesC& aIconPath )
+    {
+    FUNC_LOG;
+
+    TBuf<KMaxDescLen> contentType;
+    contentType.Copy(KContTypeMailboxIcons);        
+    contentType.Append(_L("1"));
+
+    TBuf8<KMaxDescLen> key;
+    key.Copy(KKeyMailboxIcons);     
+    key.Append(_L8("1"));
+
+    if ( GetWidgetInstanceCount() <= aInstance ) User::LeaveIfError( KErrNotFound );
+
+    PublishIconReferenceL(
+        iInstIdList[aInstance].iCid,
+        contentType,
+        key,
+        aIconPath );
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishIconReferenceL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishIconReferenceL(
+    const TDesC& aContentId,
+    const TDesC& aContentType,
+    const TDesC8& aKey,
+    const TDesC& aIconPath )
+    {
+    FUNC_LOG;
+    CLiwGenericParamList* inparam = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outparam = &(iServiceHandler->OutParamListL());
+
+    TLiwGenericParam type( KType, TLiwVariant( KCpData ) );
+    inparam->AppendL( type );
+
+    CLiwDefaultMap* pdatamap = CLiwDefaultMap::NewLC();
+    CLiwDefaultMap* datamap = CLiwDefaultMap::NewLC();
+
+    pdatamap->InsertL( KPublisherId, TLiwVariant( KPubId ) );
+    pdatamap->InsertL( KContentType, TLiwVariant( aContentType ) );
+    pdatamap->InsertL( KContentId, TLiwVariant( aContentId ) );
+    
+    datamap->InsertL( aKey, TLiwVariant( aIconPath ) );
+
+    pdatamap->InsertL( KDataMap, TLiwVariant(datamap) );
+    TLiwGenericParam item( KItem, TLiwVariant( pdatamap ) );       
+    inparam->AppendL( item );
+    
+    iMsgInterface->ExecuteCmdL( KAdd, *inparam, *outparam );
+    
+    CleanupStack::PopAndDestroy( datamap );
+    CleanupStack::PopAndDestroy( pdatamap );    
+    
+    item.Reset();
+    type.Reset();
+    outparam->Reset();
+    inparam->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishMailDetailL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublishMailDetailL( const TInt aInstance,        
+                                     const TInt aRowNumber, 
+                                     const TDesC& aText,
+                                     TWidgetMailDetails aDetail)
+    {
+    FUNC_LOG;
+
+    TBuf<KMaxDescLen> row;
+    row.Num(aRowNumber);
+
+    TBuf<KMaxDescLen> contentType;
+    if (aDetail == ETime)
+        {    
+        contentType.Copy(KContTypeTime);
+        }
+    else if (aDetail == ESubject)
+        {
+        contentType.Copy(KContTypeSubjectText);
+        }        
+    else //aDetail == ESender
+        {
+        contentType.Copy(KContTypeBodyText);
+        }
+    contentType.Append(row);
+    
+    TBuf<KMaxDescLen> textKey;
+    if (aDetail == ETime)
+        {
+        textKey.Copy(KKeyTime);
+        }
+    else if (aDetail == ESubject)
+        {
+        textKey.Copy(KKeySubjectText);
+        }     
+    else
+        {
+        textKey.Copy(KKeyBodyText);
+        }
+    textKey.Append(row);
+
+    TFSMailMsgId mailBoxId;
+    TFSMailMsgId folderId;
+
+    iMailboxNameUid = PublishDescriptorL(
+        KPubId, contentType, 
+        iInstIdList[aInstance].iCid,
+        aText,
+        textKey, KNullDes8);  
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::ResetMessageL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::ResetMessageL( TInt /*aRowNumber*/ )
+    {
+    FUNC_LOG;
+    RemoveL( iMsgUid );
+    iMsgUid = 0;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::ExtractItemId
+// ---------------------------------------------------------------------------
+//
+TUint CMailCpsIf::ExtractItemId( 
+    const CLiwGenericParamList& aInParamList )
+    {
+    FUNC_LOG;
+    TUint result ( 0 );
+    TInt pos( 0 );
+    aInParamList.FindFirst( pos, KItemId );
+    if ( pos != KErrNotFound )
+        {
+        // item id present - extract and return
+        aInParamList[pos].Value().Get( result ); // indexing should be safe
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublishDescriptorL
+// ---------------------------------------------------------------------------
+//
+TUint CMailCpsIf::PublishDescriptorL(
+    const TDesC& aPublisherId, 
+    const TDesC& aContentType,
+    const TDesC& aContentId, 
+    const TDesC& aTextToAdd,
+    const TDesC& aKey,
+    const TDesC8& aTrigger)
+    {
+    FUNC_LOG;
+
+    CLiwGenericParamList* inparam = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outparam = &(iServiceHandler->OutParamListL());
+    TUint id(0);
+    TBuf8<KMaxDescLen> key;
+    key.Copy(aKey);
+    if ( iMsgInterface )
+        {
+        TLiwGenericParam cptype( KType, TLiwVariant( KCpData ));
+        inparam->AppendL( cptype );
+        CLiwDefaultMap* cpdatamap = CLiwDefaultMap::NewLC();
+        CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
+        map->InsertL( key,  TLiwVariant( aTextToAdd ) );
+        cpdatamap->InsertL( KPublisherId, TLiwVariant( aPublisherId ));
+        cpdatamap->InsertL( KContentType, TLiwVariant( aContentType ));
+        cpdatamap->InsertL( KContentId, TLiwVariant( aContentId ));
+        cpdatamap->InsertL( KDataMap, TLiwVariant( map ) );
+
+        if( aTrigger.Length() > 0 )
+            {
+            CLiwDefaultMap* mapAction = CLiwDefaultMap::NewLC();
+            CLiwDefaultMap* mapInterface  = CLiwDefaultMap::NewLC();
+            CLiwDefaultMap* mapPlugin = CLiwDefaultMap::NewLC();
+            mapInterface ->InsertL( KDataForActionHandler, TLiwVariant( mapPlugin )  );
+            mapAction->InsertL( aTrigger, TLiwVariant(  mapInterface  ) ); 
+            cpdatamap->InsertL( KActionMap, TLiwVariant(mapAction) );
+            }
+
+        TLiwGenericParam item( KItem, TLiwVariant( cpdatamap ));
+        inparam->AppendL( item );
+
+        // Execute command
+        iMsgInterface->ExecuteCmdL( KAdd , *inparam, *outparam );
+
+        id = ExtractItemId(*outparam );
+
+        if( aTrigger.Length() > 0 )
+            {
+            CleanupStack::PopAndDestroy( 3 ); // action
+            }
+
+        CleanupStack::PopAndDestroy( map );
+        CleanupStack::PopAndDestroy( cpdatamap );
+        item.Reset();
+        cptype.Reset();
+        }
+    outparam->Reset();
+    inparam->Reset();
+    return id;
+    }
+
+// ---------------------------------------------------------
+// CMailCpsIf::PublishImageL
+// ---------------------------------------------------------
+//
+void CMailCpsIf::PublishImageL(
+        const TDesC& aContentId,
+        const TDesC& aContentType,
+        const TDesC8& aKey,
+        TInt aBitmapId,
+        TInt aBitmapMaskId,
+        TFSMailMsgId aMailBoxId,
+        const TDesC& aBrandId )
+    {
+    FUNC_LOG;
+
+    TBuf<KMaxDescLen> iconIds(KNullDesC);
+    
+    if ( aBitmapId == EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account )   
+        {
+        // This is mailbox icon. Try finding branded mailbox icon.
+        TInt error(KErrNone);
+        TBuf<KMaxDescLen> brandedIconIds(KNullDesC);
+        
+        MFSMailBrandManager& brandManager = iMailCpsHandler->MailClient().GetBrandManagerL();
+        TInt err2(KErrNone);
+        if (aBrandId.Length() > 0)
+            {
+            TRAPD( err, error = brandManager.GetGraphicIdsL( EFSMailboxIcon,  aBrandId, brandedIconIds ) );
+            err2 = err;
+            }
+        else
+            {
+            TRAPD( err, error = brandManager.GetGraphicIdsL( EFSMailboxIcon,  aMailBoxId, brandedIconIds ) );
+            err2 = err;
+            }
+
+        if ( err2 == KErrNone && error == KErrNone )
+            {            
+            iconIds.Copy(KMifPrefix);
+            iconIds.Append(brandedIconIds);
+            }
+        }
+
+    // Parse mif file full path by own dll drive letter
+    TFileName dllFileName;
+    Dll::FileName( dllFileName );
+    TParse mifParse;
+    User::LeaveIfError( mifParse.Set( KMifPath, &dllFileName, NULL ) );
+
+    if (!iconIds.Length())
+        {
+        TBuf<KMaxDescLen> id;    
+        if ( aBitmapId == EMbmCmailhandlerpluginQgn_indi_cmail_unseen_msg )
+            {
+            iconIds.Append( KSkinPrefix );
+            id.Num( EAknsMajorGeneric );
+            iconIds.Append( id );
+            iconIds.Append( KSpace );
+            id.Num( EAknsMinorGenericQgnIndiCmailUnseenMsg );
+            iconIds.Append( id );
+            iconIds.Append( KSkinPostfix );                    
+            }
+        else if ( aBitmapId == EMbmCmailhandlerpluginQgn_indi_cmail_outbox_msg )
+            {
+            iconIds.Append( KSkinPrefix );
+            id.Num( EAknsMajorGeneric );
+            iconIds.Append( id );
+            iconIds.Append( KSpace );
+            id.Num( EAknsMinorGenericQgnIndiCmailOutboxMsg );
+            iconIds.Append( id );
+            iconIds.Append( KSkinPostfix );
+            }
+        iconIds.Append( KMifPrefix );
+        iconIds.Append( mifParse.FullName() );
+        iconIds.Append( KSpace );
+        id.Num( aBitmapId );
+        iconIds.Append( id );
+        iconIds.Append( KSpace );
+        id.Num( aBitmapMaskId );
+        iconIds.Append( id );
+        iconIds.Append( _L(")") );        
+        }
+
+    // The actual image publishing part starts here   
+    CLiwGenericParamList* inparam = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outparam = &(iServiceHandler->OutParamListL());
+
+    TLiwGenericParam type( KType, TLiwVariant( KCpData ) );
+    inparam->AppendL( type );
+
+    CLiwDefaultMap* pdatamap = CLiwDefaultMap::NewLC();
+    CLiwDefaultMap* datamap = CLiwDefaultMap::NewLC();
+
+    pdatamap->InsertL( KPublisherId, TLiwVariant( KPubId ) );
+    pdatamap->InsertL( KContentType, TLiwVariant( aContentType ) );
+    pdatamap->InsertL( KContentId, TLiwVariant( aContentId ) );
+    
+    datamap->InsertL( aKey, TLiwVariant(iconIds) );
+
+    pdatamap->InsertL( KDataMap, TLiwVariant(datamap) );
+    TLiwGenericParam item( KItem, TLiwVariant( pdatamap ) );       
+    inparam->AppendL( item );
+    
+    // Publish icon ( or remove it from widget when no id provided )
+    if ( aBitmapId == KNullIcon )
+        {
+        iMsgInterface->ExecuteCmdL( KDelete, *inparam, *outparam );    
+        }
+    else
+        {
+        iMsgInterface->ExecuteCmdL( KAdd, *inparam, *outparam );
+        }
+    
+    CleanupStack::PopAndDestroy( datamap );
+    CleanupStack::PopAndDestroy( pdatamap );    
+    
+    item.Reset();
+    type.Reset();
+    outparam->Reset();
+    inparam->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::RemoveL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::RemoveL( TUint aId )
+    {
+    FUNC_LOG;
+    CLiwGenericParamList* inparam = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outparam = &(iServiceHandler->OutParamListL());
+    if ( iMsgInterface )
+        {
+        TLiwGenericParam cptype( KType, TLiwVariant( KCpData ));
+        inparam->AppendL( cptype );
+        CLiwDefaultMap* cpdatamap = CLiwDefaultMap::NewLC();
+        cpdatamap->InsertL( KId, TLiwVariant( aId ));
+
+        TLiwGenericParam item( KFilter, TLiwVariant( cpdatamap ));
+        inparam->AppendL( item );
+
+        iMsgInterface->ExecuteCmdL( KDelete , *inparam, *outparam);
+
+        CleanupStack::PopAndDestroy( cpdatamap );
+        item.Reset();
+        cptype.Reset();
+        }
+    outparam->Reset();
+    inparam->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::PublisherRegisteryActionL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::PublisherRegisteryActionL()
+    {
+    FUNC_LOG;
+    CLiwGenericParamList* inparam = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outparam = &(iServiceHandler->OutParamListL());
+    
+    TLiwGenericParam type( KType, TLiwVariant( KPubData ));
+    inparam->AppendL( type );
+    
+    CLiwDefaultMap* publishermap = CLiwDefaultMap::NewLC();
+
+    // Create the map for publisher registry
+    publishermap->InsertL( KPublisherId, TLiwVariant( KPubId ));
+    publishermap->InsertL( KContentId, TLiwVariant( KCPAll ));
+    publishermap->InsertL( KContentType, TLiwVariant( KCPAll ));
+
+    // Create the action map for publisher registry
+    CLiwDefaultMap* mapAction = CLiwDefaultMap::NewLC();
+    mapAction->InsertL(KPluginStartup, TLiwVariant( KData ));
+    mapAction->InsertL(KPluginShutdown, TLiwVariant( KData ));
+    mapAction->InsertL(KSuspend, TLiwVariant( KData ));
+    mapAction->InsertL(KResume, TLiwVariant( KData ));
+
+    publishermap->InsertL( KActionMap, TLiwVariant(mapAction));
+    CleanupStack::PopAndDestroy(mapAction);
+
+    TLiwGenericParam item( KItem, TLiwVariant( publishermap ));
+    inparam->AppendL( item );
+
+    iMsgInterface->ExecuteCmdL( KAdd, *inparam, *outparam);
+
+    CleanupStack::PopAndDestroy( publishermap );
+
+    item.Reset();
+    type.Reset();   
+
+    outparam->Reset();
+    inparam->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::RegisterForObserverL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::RegisterForObserverL()
+    {
+    FUNC_LOG;
+    CLiwGenericParamList* inParamList = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outParamList = &(iServiceHandler->OutParamListL());
+
+    CLiwDefaultMap* filter = CLiwDefaultMap::NewLC();
+
+    filter->InsertL( KPublisherId, TLiwVariant( KPubId ) );
+    filter->InsertL( KContentId, TLiwVariant( KCPAll ) );
+    filter->InsertL( KContentType, TLiwVariant( KCPAll ) );
+    filter->InsertL( KOperation, TLiwVariant( KExecute ));
+
+    // Fill in input list for RequestNotification command
+    inParamList->AppendL(TLiwGenericParam(KType,TLiwVariant( KContentAndPublisher_Registry )));
+    inParamList->AppendL(TLiwGenericParam(KFilter ,TLiwVariant( filter )));
+
+    TInt errori(KErrNone);
+    TRAP(errori, iMsgInterface->ExecuteCmdL(  KRequestNotification, *inParamList,
+                *outParamList, 0, this ));
+
+    CleanupStack::PopAndDestroy( filter );
+    outParamList->Reset();
+    inParamList->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::UnRegisterForObserverL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::UnRegisterForObserverL()
+    {
+    FUNC_LOG;
+    CLiwGenericParamList* inparam = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outparam = &(iServiceHandler->OutParamListL());
+    // Un Register for notification 
+
+    TInt err;
+    err = KErrNone;
+    
+    // Un Register all the reuqest notification registered in this session
+    TRAP( err, iMsgInterface->ExecuteCmdL( 
+            KRequestNotification,
+                *inparam,
+                *outparam,
+                KLiwOptCancel,
+                this ) ); 
+    
+    outparam->Reset();
+    inparam->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// Notification handling
+// ---------------------------------------------------------------------------
+//
+TInt CMailCpsIf::HandleNotifyL(
+        TInt /*aCmdId*/,
+        TInt /*aEventId*/,
+        CLiwGenericParamList& aEventParamList,
+        const CLiwGenericParamList& /*aInParamList*/ )
+    {
+    FUNC_LOG;
+    PublisherStatusL  ( aEventParamList);
+    return KErrNone;
+    }
+   
+// ---------------------------------------------------------------------------
+// Check if Publisher was activeated or deactivated
+// ---------------------------------------------------------------------------
+//
+TBool CMailCpsIf::PublisherStatusL(const CLiwGenericParamList& aEventParamList)
+    {
+    FUNC_LOG;
+    TBool result(EFalse);
+    TInt pos(0);
+    const TInt KSAPIContentNameMaxLength = 255;
+    TBuf<300> text;
+    aEventParamList.FindFirst(pos, KChangeInfo);
+    if (pos != KErrNotFound)
+        {
+        // Get list of maps
+        TLiwVariant variant = (aEventParamList)[pos].Value();
+        variant.PushL();
+        const CLiwList* changeMapsList = variant.AsList();
+
+        TBuf<KSAPIContentNameMaxLength> contentid;
+        TBuf<KSAPIContentNameMaxLength> operation;        
+        TBuf<KSAPIContentNameMaxLength> trigger;
+                       
+        // Iter through list content
+
+        TInt mapslistcount (changeMapsList->Count());
+
+        for (TInt i = 0; i < mapslistcount; ++i)
+            {
+             if ( changeMapsList->AtL(i, variant) ) 
+                 {
+                 const CLiwMap* map  = variant.AsMap();
+                 
+                 // Check what triggered a notification
+                 if ( map->FindL(KOperation, variant) )
+                     {
+                     variant.Get(operation);
+                     variant.Reset();
+                     if( map->FindL( KContentId, variant) )
+                         {
+                         variant.Get(contentid );
+                         variant.Reset();                         
+                         if( map->FindL( KActionTrigger, variant) )
+                             {
+                             variant.Get(trigger );
+                             }
+                         if (trigger.Compare(KSuspend16) == 0)
+                             {
+                             // Publishing to homescreen suspended.
+                             HBufC* cid = contentid.AllocLC();
+                             TInt widgetInstance = GetWidgetInstanceId(cid->Des());
+							 if(widgetInstance>=0)
+                             	iAllowedToPublish[widgetInstance] = EFalse;
+                             CleanupStack::PopAndDestroy( cid );
+                             }
+                         else if (trigger.Compare(KResume16) == 0)
+                             {
+                             HBufC* cid = contentid.AllocLC();
+                             if ( GetWidgetInstanceId(cid->Des()) < 0 )
+                                 {
+                                 TInstIdInfo instIdInfo;
+                                 instIdInfo.iCid.Copy(cid->Des());                           
+                                 instIdInfo.iUpdateNeeded = ETrue;
+                                 instIdInfo.iWizardPublished = EFalse;
+                                 iInstIdList.AppendL(instIdInfo);
+                                 }
+                             TInt widgetInstance = GetWidgetInstanceId(cid->Des()); 
+                             if(widgetInstance>=0)// coverity fix, index can be negativ, allowed 0, since it is valid index
+                                 {
+                                 iMailCpsHandler->UpdateMailboxesL(widgetInstance, cid->Des());
+                                 PublishSetupWizardL(widgetInstance);                                 
+                                 // Widget visible on the homescreen. Publishing allowed.
+                                 iAllowedToPublish[widgetInstance] = ETrue;
+                                 }
+                             CleanupStack::PopAndDestroy( cid );
+                             }
+                         else if (trigger.Compare(KPluginStartup16) == 0)
+                             {
+                             // Widget added to homescreen
+                             HBufC* cid = contentid.AllocLC();
+                             if ( cid->Length() > 0 )
+                                 {
+                                 TInstIdInfo instIdInfo;
+                                 instIdInfo.iCid.Copy(cid->Des());                           
+                                 instIdInfo.iUpdateNeeded = ETrue;
+                                 instIdInfo.iWizardPublished = EFalse;
+                                 iInstIdList.AppendL(instIdInfo);
+                                 TFSMailMsgId mailBox( iMailCpsHandler->WaitingForNewWidget() );
+                                 if ( mailBox.Id() > 0 )
+                                     {
+                                     // Associate new mailbox to widget setting
+                                     iMailCpsHandler->AssociateWidgetToSetting( 
+                                             cid->Des(),
+                                             mailBox );
+                                     iMailCpsHandler->CleanWaitingForNewWidget();
+                                     }
+                                 else if ( iMailCpsHandler->TotalMailboxCountL() )
+                                     {
+                                     iMailCpsHandler->LaunchWidgetSettingsL(cid->Des());
+                                     }
+                                 else
+                                     {
+                                     iMailCpsHandler->LaunchEmailWizardL(cid->Des());
+                                     }
+                                 }
+                             CleanupStack::PopAndDestroy( cid );
+                             }
+                         else if (trigger.Compare(KPluginShutdown16) == 0)
+                             {
+                             // Widget removed from homescreen.
+                             HBufC* cid = contentid.AllocLC();                             
+                             ResetPublishedDataL( cid->Des() );							 
+                             iMailCpsHandler->DissociateWidgetFromSettingL( cid->Des() );
+                             TInt widgetInstance = GetWidgetInstanceId( cid->Des() );
+                             if (widgetInstance != KErrNotFound )
+                                 {
+                                 iInstIdList.Remove(widgetInstance);
+                                 }
+                             CleanupStack::PopAndDestroy( cid );
+                             }
+                         else if (trigger.Compare(KTriggerEmailUi) == 0)
+                             {
+                             HBufC* cid = contentid.AllocLC();
+                             iMailCpsHandler->LaunchEmailUIL(cid->Des());
+                             CleanupStack::PopAndDestroy( cid );
+                             }
+                         else if ((trigger.Compare(KTriggerWizard) == 0) ||
+                                 ( trigger.Compare(KSettings16) == 0))
+                             {
+                             // If no accounts are created launch email wizard
+                             // otherwice launch widget settings app
+                             HBufC* cid = contentid.AllocLC();
+                             if ( iMailCpsHandler->TotalMailboxCountL() )
+                                 {
+                                 iMailCpsHandler->LaunchWidgetSettingsL(cid->Des());
+                                 }
+                             else
+                                 {
+                                 iMailCpsHandler->LaunchEmailWizardL(cid->Des());
+                                 }
+                             CleanupStack::PopAndDestroy( cid );
+                             }
+                         }
+                     }
+                 }
+            }
+        CleanupStack::PopAndDestroy(1);
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::AllowedToPublish
+// ---------------------------------------------------------------------------
+//
+TBool CMailCpsIf::AllowedToPublish( TInt aWidgetInstance )
+    {
+    FUNC_LOG;
+    if ( !iAllowedToPublish[aWidgetInstance] && !iIgnoreHsNotifications )
+        {
+        return EFalse;
+        }
+    else
+        {
+        return ETrue;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::SetConfiguration
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::SetConfiguration( const TInt32 aConfigData )
+    {
+    FUNC_LOG;
+    iIgnoreHsNotifications = aConfigData & KCMailIgnoreHsEvents;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::GetWidgetInstanceCount
+// ---------------------------------------------------------------------------
+//
+TInt CMailCpsIf::GetWidgetInstanceCount()
+    {
+    FUNC_LOG;    
+    return iInstIdList.Count();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::GetWidgetInstanceId
+// ---------------------------------------------------------------------------
+//
+TInt CMailCpsIf::GetWidgetInstanceId( const TDesC& aContentId )
+    {
+    FUNC_LOG;
+    TInt instance(KErrNotFound);
+    for (TInt i = 0; i < iInstIdList.Count(); i++)    
+        {
+        TInt val = aContentId.Compare(iInstIdList[i].iCid);
+        if (!val)
+            {
+            instance = i;
+            break;
+            }
+        }
+    return instance;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::ResetPublishedDataL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::ResetPublishedDataL( const TDesC& aContentId )
+    {
+    FUNC_LOG;
+    // Clean up all published data
+    if( iMsgInterface == NULL) GetMessagingInterfaceL(); // Coverity fix, it does not like !iMsgInterface comparison
+    CLiwGenericParamList* inParam = &(iServiceHandler->InParamListL());
+    CLiwGenericParamList* outParam = &(iServiceHandler->OutParamListL());
+
+    // Fill input param
+    TLiwGenericParam cptype( KType, TLiwVariant( KCpData ));
+    inParam->AppendL( cptype );
+
+    CLiwDefaultMap* cpData = CLiwDefaultMap::NewLC();
+    cpData->InsertL( KPublisherId, TLiwVariant( KPubId ) );
+    cpData->InsertL( KContentType, TLiwVariant( KCPAll ) );
+    cpData->InsertL( KContentId, TLiwVariant( aContentId ) );
+    TLiwGenericParam item( KData8, TLiwVariant( cpData ) );
+    inParam->AppendL( item );
+
+    // Execute command
+    if ( iMsgInterface )
+    	{
+		iMsgInterface->ExecuteCmdL( KDelete , *inParam, *outParam );
+    	}
+    
+    CleanupStack::PopAndDestroy( cpData );
+    item.Reset();
+    cptype.Reset();
+    outParam->Reset();
+    inParam->Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::AddWidgetToHomescreenL
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::AddWidgetToHomescreenL( const TFSMailMsgId aMailbox )
+    {
+    FUNC_LOG;
+    
+    for ( TInt i = 0; i < iInstIdList.Count(); i++ )
+        {
+        if ( !iMailCpsHandler->Associated(iInstIdList[i].iCid) )
+            {
+            // Empty e-mail widget found. Associate new account to it.
+            iMailCpsHandler->AssociateWidgetToSetting( 
+                    iInstIdList[i].iCid,
+                    aMailbox );
+            return;
+            }
+        }
+    
+    CHsContentInfoArray* widgets = CHsContentInfoArray::NewL();
+    CleanupStack::PushL( widgets );
+    iContentControlClient->WidgetListL( *widgets );   
+    CHsContentInfo* widgetContentInfo( NULL );
+
+    for ( TInt i = 0; i < widgets->Array().Count(); i++ )
+        {
+        widgetContentInfo = widgets->Array()[i];
+        if (!widgetContentInfo->Uid().Compare(KConfId8))
+            {
+            // E-mail widget found
+            widgetContentInfo->SetCanBeRemoved( ETrue );
+            if ( iContentControlClient->AddWidgetL( *widgetContentInfo ) == KErrNone )
+                {
+                // Widget added succesfully. Wait PluginStartup event from HS.
+                iMailCpsHandler->SetWaitingForNewWidget( aMailbox );
+                }
+            else
+                {
+                iMailCpsHandler->DisplayHSPageFullNoteL();
+                }
+            break;
+            }
+        }
+    CleanupStack::PopAndDestroy();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::NotifyWidgetListChanged
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::NotifyWidgetListChanged()
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::NotifyViewListChanged
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::NotifyViewListChanged()
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::NotifyAppListChanged
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::NotifyAppListChanged()
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::SetUpdateNeeded
+// ---------------------------------------------------------------------------
+//
+void CMailCpsIf::SetUpdateNeeded( const TInt aInstance, const TBool aValue )
+    {
+    FUNC_LOG;
+    if ( aInstance >= 0 && aInstance < GetWidgetInstanceCount() )
+        {
+        iInstIdList[aInstance].iUpdateNeeded = aValue;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMailCpsIf::UpdateNeeded
+// ---------------------------------------------------------------------------
+//
+TBool CMailCpsIf::UpdateNeeded( const TInt aInstance )
+    {
+    FUNC_LOG;
+    TBool rVal( EFalse );
+    if ( aInstance >= 0 && aInstance < GetWidgetInstanceCount() )
+        {
+        rVal = iInstIdList[aInstance].iUpdateNeeded;
+        }
+    INFO_1("CMAIL CMailCpsIf::UpdateNeeded(): ret = %d",rVal);
+    return rVal;
+    }
+