idlefw/plugins/shortcutplugin/src/caiscutplugin.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/shortcutplugin/src/caiscutplugin.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,467 @@
+/*
+* Copyright (c) 2005-2006 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:  Plug-in main class
+*
+*/
+
+
+#include <ecom/implementationproxy.h>
+#include <centralrepository.h>
+
+#include <aicontentobserver.h>
+#include <aipluginsettings.h>
+
+#include <platform/mw/aiscutuids.hrh>
+#include "aiscutpluginprivatecrkeys.h"
+#include "aiscutdefs.h"
+#include "aiscutcontentmodel.h"
+#include "caiscutplugin.h"
+#include "caiscutengine.h"
+#include "aiscutfactory.h"
+#include "caiscutshortcut.h"
+
+#include "debug.h"
+
+const TImplementationProxy KImplementationTable[] =
+{
+    IMPLEMENTATION_PROXY_ENTRY(KImplUidScutPlugin, CAiScutPlugin::NewL)
+};
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutPlugin::CAiScutPlugin()
+{
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::ConstructL()
+{
+    // Initialize the info which the fw uses to identify the plug-in.
+    // Fill in only the uid at this point, the fw will send this back with the
+    // name filled in later through SetPropertyL().
+    iInfo.iUid.iUid = AI_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_SCUTPLUGIN;
+
+    iContent = AiUtility::CreateContentItemArrayIteratorL(KAiScutContent);
+    iResources = AiUtility::CreateContentItemArrayIteratorL(KAiScutResources);
+    iEvents = AiUtility::CreateContentItemArrayIteratorL(KAiScutEvents);
+
+    CRepository* repository = NULL;
+    TRAP_IGNORE(repository = CRepository::NewL(KCRUidShortcutItems));
+    // No leaving code here since 'repository' is not in cleanup stack.
+    if (repository)
+    {
+        // A theme might not contain any publishable shortcuts at all, only
+        // locked ones. To take this into account we must always delete old
+        // theme-default settings to make sure the engine won't create any
+        // unwanted shortcut objects. Any errors that might happen during
+        // deletion are ignored to make sure the plug-in is kept alive.
+        TUint32 errorKey;
+
+        repository->Delete(KScutCenRepKeyThemeDefault, KScutCenRepKeyMask, errorKey);
+    }
+    delete repository;
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutPlugin* CAiScutPlugin::NewL()
+{
+    CAiScutPlugin* self = new (ELeave) CAiScutPlugin;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutPlugin::~CAiScutPlugin()
+{
+    TRAP_IGNORE( DeleteDefaultShortcutsL() );
+    Release(iContent);
+    Release(iResources);
+    Release(iEvents);
+    delete iEngine;
+    iObservers.Close();
+}
+
+// ---------------------------------------------------------------------------
+// Publishes the given shortcut.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::PublishShortcutsL(RAiShortcutArray& aShortcuts)
+{
+    TInt err = KErrNone;
+    TInt observers = iObservers.Count();
+    TInt shortcuts = aShortcuts.Count();
+    
+    for (TInt i = 0; i < observers; ++i)
+    {
+        MAiContentObserver* observer = iObservers[i];
+        TBool transactionStarted = EFalse;
+        TInt transactionId = reinterpret_cast<TInt>(this);
+        err = observer->StartTransaction(transactionId);
+
+        if (err != KErrNotSupported)
+        {
+            // The observer does not support transactions, check for real errors.
+            User::LeaveIfError(err);
+            transactionStarted = ETrue;
+        }
+        err = KErrAlreadyExists;
+        for (TInt j = 0; j < shortcuts; j++)
+        {
+            CAiScutShortcut* shortcut = aShortcuts[j];
+
+            if (shortcut->NeedsToBePublished())
+            {
+                shortcut->Publish(*this, *observer);
+                err = KErrNone;
+            }
+        }
+
+        if ( transactionStarted && err == KErrNone )
+            {
+            User::LeaveIfError(observer->Commit(transactionId));
+            }
+        else if ( transactionStarted )
+            {
+            User::LeaveIfError(observer->CancelTransaction(transactionId));
+            }
+    }
+}
+
+// ---------------------------------------------------------------------------
+// Is plug-in suspended or not.
+// ---------------------------------------------------------------------------
+//
+TBool CAiScutPlugin::IsAlive() const
+{
+    return iAlive;
+}
+
+// ---------------------------------------------------------------------------
+// Resume reason
+// ---------------------------------------------------------------------------
+//
+TAiTransitionReason CAiScutPlugin::ResumeReason() const
+    {
+    return iResumeReason;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher.
+// Resumes the plug-in.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::Resume(TAiTransitionReason aReason)
+{
+    TRAP_IGNORE(DoResumeL(aReason));    
+}
+
+// ---------------------------------------------------------------------------
+// Resumes the plug-in.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::DoResumeL(TAiTransitionReason aReason)
+{
+	__PRINT( __DBG_FORMAT( "XAI: CAiScutPlugin::Resume reason %d alive = %d"), aReason, iAlive);
+    iResumeReason = aReason;
+	// Reload the engine in case general theme changed or
+	// the engine has been suspended. 
+    if (aReason == EAiGeneralThemeChanged || !iAlive)
+    {
+        // if general theme changed, free engine so that is will be
+        // loaded again because shortcut icons must be re-created.
+        FreeEngine();
+    }
+
+    if (!iEngine)
+    {
+		iEngine = AiScutFactory::CreateAiScutEngineL(*this);
+    }
+
+    iEngine->ResumeL( (iAlive == EFalse) ||
+        (
+        aReason != EAiBacklightOn    &&
+        aReason != EAiBacklightOff   &&
+        aReason != EAiIdleBackground &&
+        aReason != EAiIdleForeground
+        ),
+        aReason
+    );
+    
+    iAlive = ETrue;
+}
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher.
+// Suspends the plug-in.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::Suspend(TAiTransitionReason aReason)
+{
+	__PRINT( __DBG_FORMAT( "XAI: CAiScutPlugin::Suspend reason %d"), aReason);
+
+    if (iEngine)
+    {
+        iEngine->Suspend();
+    }
+
+    iAlive = EFalse;
+}
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher.
+// Frees the plug-in engine.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::Stop(TAiTransitionReason aReason)
+{
+	__PRINT( __DBG_FORMAT( "XAI: CAiScutPlugin::Stop reason %d"), aReason);
+
+	if ( aReason == EAiBackupRestoreStarted )
+	    {
+	    Suspend( aReason );
+	    }
+	else
+	    {
+	    FreeEngine();
+	    }
+}
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher.
+// Adds the content observer / subscriber to plug-in.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::SubscribeL(MAiContentObserver& aObserver)
+{
+    iObservers.AppendL(&aObserver);
+}
+
+void CAiScutPlugin::DeleteDefaultShortcutsL()
+    {
+    // Ignore any errors that might occur when deleting
+    // the default keys
+    TUint32 errorKey;
+    CRepository* cr = CRepository::NewL(KCRUidShortcutItems);
+    cr->Delete(KScutCenRepKeyThemeDefault, KScutCenRepKeyMask, errorKey);
+    delete cr;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher.
+// Configures the plug-in.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::ConfigureL(RAiSettingsItemArray& aSettings)
+{
+    CRepository* repository = NULL;
+
+    TRAPD(err, repository = CRepository::NewL(KCRUidShortcutItems));
+
+    if (err == KErrNotFound)
+    {
+        // CenRep file is missing from the image, this is a serious error.
+        User::Leave(err);
+    }
+
+    // Write settings if repository was successfully opened. All other errors
+    // are ignored to ensure that the plug-in is up and running, even if
+    // crippled.
+
+    // No leaving code here since 'repository' is not in cleanup stack.
+    if (repository)
+    {
+        repository->StartTransaction(CRepository::EConcurrentReadWriteTransaction);
+
+        // A theme might not contain any publishable shortcuts at all, only
+        // locked ones. To take this into account we must always delete old
+        // theme-default settings to make sure the engine won't create any
+        // unwanted shortcut objects. Any errors that might happen during
+        // deletion are ignored to make sure the plug-in is kept alive.
+        TUint32 errorKey;
+
+        repository->Delete(KScutCenRepKeyThemeDefault, KScutCenRepKeyMask, errorKey);
+        
+		__PRINTS( "XAI: CAiScutPlugin::ConfigureL");
+
+        TInt count = aSettings.Count();
+        if (count > 0)
+        {
+            // Write new shortcut definitions.
+            for (TInt i = 0; i < count; ++i)
+            {
+                MAiPluginSettings* settings = aSettings[ i ];
+                
+                if( settings->AiPluginItemType() == EAiPluginSettingsItem )
+                    {
+                    MAiPluginSettingsItem& item = settings->AiPluginSettingsItem();
+                    TUint32 key = item.Key(); // implicit cast from TInt32 to TUint32.
+    
+    				__PRINT( __DBG_FORMAT( "XAI:   %d. key = 0x%x"), i+1, key);
+    
+                    // Add the bit that indicates this is a default shortcut setting.
+                    key |= KScutFlagBitThemeDefault;
+    
+                    // Ignore possible error and keep going.
+                    repository->Create(key, item.Value());
+                    }
+            }
+        }
+
+        TUint32 info = 0;
+        repository->CommitTransaction(info);
+
+        delete repository;
+        repository = NULL;
+        
+        if (iEngine)
+        {
+            iEngine->CreateShortcutsL();
+            iEngine->ResumeL( ETrue, EAiGeneralThemeChanged );
+        }
+    }
+
+    // We don't need to store the settings so clear the array.
+    aSettings.ResetAndDestroy();
+}
+
+// ---------------------------------------------------------------------------
+// From class CAiContentPublisher.
+// Returns the extension interface.
+// ---------------------------------------------------------------------------
+//
+TAny* CAiScutPlugin::Extension(TUid aUid)
+{
+    if (aUid == KExtensionUidProperty)
+    {
+        return static_cast<MAiPropertyExtension*>(this);
+    }
+    else if (aUid == KExtensionUidEventHandler)
+    {
+        return static_cast<MAiEventHandlerExtension*>(this);
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// From class MAiEventHandlerExtension.
+// Handles an event sent by the AI framework.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::HandleEvent(TInt aEvent, const TDesC& aParam)
+{
+    if (iEngine)
+    {
+        // We have no way of reporting errors to framework so just ignore them.
+        TRAP_IGNORE(iEngine->HandleAiEventL(aEvent, aParam));
+    }
+}
+
+// ---------------------------------------------------------------------------
+// CAiScutPlugin::HasMenuItem
+//
+// ---------------------------------------------------------------------------
+//
+TBool CAiScutPlugin::HasMenuItem(const TDesC16& /*aMenuItem*/)
+    {
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MAiPropertyExtension
+// Returns a plug-in property.
+// ---------------------------------------------------------------------------
+//
+TAny* CAiScutPlugin::GetPropertyL(TInt aProperty)
+{
+    switch (aProperty)
+    {
+    case EAiPublisherInfo:
+        return static_cast<TAiPublisherInfo*>(&iInfo);
+
+    case EAiPublisherContent:
+        return static_cast<MAiContentItemIterator*>(iContent);
+
+    case EAiPublisherResources:
+        return static_cast<MAiContentItemIterator*>(iResources);
+
+    case EAiPublisherEvents:
+        return static_cast<MAiContentItemIterator*>(iEvents);
+
+    default:
+        break;
+    }
+
+    return NULL;
+}
+
+// ---------------------------------------------------------------------------
+// From class MAiPropertyExtension
+// Sets a plug-in property to optimize the content model.
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::SetPropertyL(TInt aProperty, TAny* aValue)
+    {
+    if( aProperty == EAiPublisherInfo )
+        {
+        ASSERT( aValue );
+        
+        const TAiPublisherInfo* info( 
+                static_cast<const TAiPublisherInfo*>( aValue ) );
+        
+        iInfo = *info;               
+        }    
+    }
+
+// ---------------------------------------------------------------------------
+//
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutPlugin::FreeEngine()
+{
+    delete iEngine;
+    iEngine = NULL;
+    iAlive = EFalse;    
+}
+
+// ======== GLOBAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+{
+    aTableCount = sizeof(KImplementationTable) / sizeof(TImplementationProxy);
+    return KImplementationTable;
+}
+
+// End of File.