idlefw/src/framework/aipluginactivitypstool.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/src/framework/aipluginactivitypstool.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,223 @@
+/*
+* 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:  Plugin activity PS tool
+*
+*/
+
+
+#include "aipluginactivitypstool.h"
+#include "aipropertyextension.h"
+#include <activeidle2domainpskeys.h>
+#include <e32std.h> // for User
+#include <e32property.h> // for RProperty
+#include <e32capability.h>
+
+// Unnamed namespace for local definitions
+namespace
+    {
+
+    const TInt KStartOrdinal( KAIActivePluginRangeStart );
+    
+    // All reads are allowed.
+    _LIT_SECURITY_POLICY_PASS( KPluginActivityRegistryReadPolicy );
+
+    // Write requires WriteDeviceData capability
+    _LIT_SECURITY_POLICY_C1( KPluginActivityRegistryWritePolicy, ECapabilityWriteDeviceData );
+
+    }
+
+CAiPluginActivityRegistry::CAiPluginActivityRegistry()
+  : iRegistryOrdinal( KStartOrdinal )
+    {
+    }
+
+CAiPluginActivityRegistry* CAiPluginActivityRegistry::NewL()
+    {
+    CAiPluginActivityRegistry* self = 
+        new (ELeave) CAiPluginActivityRegistry();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+void CAiPluginActivityRegistry::ConstructL()
+    {
+    }
+    
+CAiPluginActivityRegistry::~CAiPluginActivityRegistry()
+    {
+    CleanRegistry();
+    }
+        
+TInt CAiPluginActivityRegistry::SetPluginActive( const TAiPublisherInfo& aPubInfo )
+    {
+    TInt psErr = KErrArgument;
+    TInt uid = aPubInfo.iUid.iUid;
+    
+    // Make sure the keys are within their assigned ranges
+    if( uid >= KAIPluginNameRangeStart &&
+        uid <= KAIPluginNameRangeEnd &&
+        iRegistryOrdinal  >= KAIActivePluginRangeStart &&
+        iRegistryOrdinal  <= KAIActivePluginRangeEnd )
+        {
+        psErr = UpdateOrdinalRegister( uid );
+
+        ++iPluginCount; // now there is partial data in registry for next item
+                        // so update count allready here, so that
+                        // the data may be cleaned in case on error
+             
+        psErr |= UpdateNameRegister( uid, aPubInfo.iName );
+                        
+        psErr |= UpdateCountRegister();
+        
+        if( psErr != KErrNone )
+            {
+            CleanLastEntry( uid,
+                            iRegistryOrdinal,
+                            iPluginCount - 1 );
+            // Decrement only after rollback so failures may be cleaned properly
+            // in case there is interrupting error situations
+            --iPluginCount;
+            return psErr;
+            }
+                        
+        ++iRegistryOrdinal;
+        }
+    
+    return psErr;
+    }
+    
+void CAiPluginActivityRegistry::CleanRegistry()
+    {
+    // The count in p&s might not be updated before
+    // we end up here that why we use iPluginCount for count.
+    for( TInt i = 0; i < iPluginCount; ++i )
+        {
+        TInt categoryKey = i + KStartOrdinal;
+        TInt pluginUid = 0;
+        TInt err = RProperty::Get( 
+                    KPSUidActiveIdle2,
+                    categoryKey,
+                    pluginUid );
+        if( err == KErrNone )
+            {
+            // Delete name
+            RProperty::Delete( KPSUidActiveIdle2, pluginUid );
+            }
+        // Delete ordinal
+        RProperty::Delete( KPSUidActiveIdle2, categoryKey );
+        }
+    // Delete count
+    RProperty::Delete( KPSUidActiveIdle2, KAIActivePluginCount );
+    iRegistryOrdinal = KStartOrdinal;
+    }
+
+TInt CAiPluginActivityRegistry::UpdateCountRegister()
+    {
+    TInt err = RProperty::Define(
+                        KPSUidActiveIdle2,
+                        KAIActivePluginCount,
+                        RProperty::EInt,
+                        KPluginActivityRegistryReadPolicy,
+                        KPluginActivityRegistryWritePolicy );
+    if( err == KErrAlreadyExists &&
+        iRegistryOrdinal == KStartOrdinal )
+        {
+        // Some error has occured
+        CleanRegistry();
+        err = RProperty::Define(
+                        KPSUidActiveIdle2,
+                        KAIActivePluginCount,
+                        RProperty::EInt,
+                        KPluginActivityRegistryReadPolicy,
+                        KPluginActivityRegistryWritePolicy );
+        }
+    if( err != KErrAlreadyExists &&
+        err != KErrNone )
+        {
+        return err;
+        }
+        
+    // iRegistryOrdinal starts from 1, so it can be used as count, but only
+    // before incrementation.
+    err = RProperty::Set( 
+                    KPSUidActiveIdle2,
+                    KAIActivePluginCount,
+                    iPluginCount );
+    return err;
+    }
+
+TInt CAiPluginActivityRegistry::UpdateOrdinalRegister( TInt aPluginUid )
+    {
+    TInt categoryKey = iRegistryOrdinal;
+    TInt err = RProperty::Define(
+                KPSUidActiveIdle2,
+                categoryKey,
+                RProperty::EInt,
+                KPluginActivityRegistryReadPolicy,
+                KPluginActivityRegistryWritePolicy );
+    
+    if( err == KErrNone ||
+        err == KErrAlreadyExists )
+        {
+        // Set plugin uid to ordinal key
+        err = RProperty::Set( 
+                    KPSUidActiveIdle2,
+                    categoryKey,
+                    aPluginUid );
+        }
+    return err;
+    }
+
+TInt CAiPluginActivityRegistry::UpdateNameRegister( TInt aPluginUid,
+                                                    const TDesC& aName )
+    {
+    TInt err = RProperty::Define(
+                    KPSUidActiveIdle2,
+                    aPluginUid,
+                    RProperty::EText,
+                    KPluginActivityRegistryReadPolicy,
+                    KPluginActivityRegistryWritePolicy );
+                        
+    if( err == KErrNone ||
+        err == KErrAlreadyExists )
+        {
+        // Set plugin uid to ordinal key
+        err = RProperty::Set( 
+                        KPSUidActiveIdle2,
+                        aPluginUid,
+                        aName );
+        }
+    return err;
+    }
+
+void CAiPluginActivityRegistry::CleanLastEntry( TInt aPluginUid,
+                                                TInt aOrdinal,
+                                                TInt aLastCount )
+    {
+    RProperty::Delete( KPSUidActiveIdle2, aOrdinal );
+    RProperty::Delete( KPSUidActiveIdle2, aPluginUid );
+    if( aLastCount == 0 )
+        {
+        RProperty::Delete( KPSUidActiveIdle2, KAIActivePluginCount );
+        }
+    else
+        {
+        RProperty::Set( 
+                    KPSUidActiveIdle2,
+                    KAIActivePluginCount,
+                    aLastCount );
+        }
+    }