uiacceltk/hitchcock/Client/src/alfpropertyowner.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/Client/src/alfpropertyowner.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,348 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Property object for Alfred
+*
+*/
+
+
+
+#include "alf/alfpropertyowner.h"
+
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C CAlfPropertyOwner::CAlfPropertyOwner()
+    {
+        
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C CAlfPropertyOwner::~CAlfPropertyOwner()
+    {
+    PropertyClear();    
+    }
+
+// ---------------------------------------------------------------------------
+// Remove property
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C TBool CAlfPropertyOwner::PropertyRemove(const TDesC8& aName)
+    {
+    TInt index;
+    
+    if (!Find(aName, &index))
+        {
+        return EFalse;            
+        }
+    
+    delete iProperties[index];
+    iProperties.Remove(index);
+    iProperties.Compress();
+    
+    return ETrue;
+    }
+    
+// ---------------------------------------------------------------------------
+// Clear property
+// ---------------------------------------------------------------------------
+//         
+EXPORT_C void CAlfPropertyOwner::PropertyClear()
+    {
+    iProperties.ResetAndDestroy();   
+    }
+
+
+// We have a different registration method for each property type.
+
+// ---------------------------------------------------------------------------
+// Set integer property
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C TBool CAlfPropertyOwner::PropertySetIntegerL(const TDesC8& aName, TInt aVal, TInt aMin, TInt aMax)
+    {
+    CAlfPropertyInteger* property;
+    TAlfPropertyType type;
+    TInt index;
+    
+    if (aName.Length() == 0)
+        {
+        // Cannot have zero-length name as an argument.
+        return EFalse;
+        }    
+
+    if (Find(aName, &index, &type))
+        {
+        // Property exists already.
+        if (type != EAlfPropertyTypeInteger)
+            {
+            // Wrong type. We have to exit without doing anything.
+            return EFalse;
+            }
+        
+        // Modify existing property.
+        property = static_cast<CAlfPropertyInteger*>(iProperties[index]);                
+        property->Set(TRangedValue(aVal, aMin, aMax));        
+        }
+    else
+        {
+        // Not found, so add new item to the property list.
+        property = new (ELeave) CAlfPropertyInteger();
+        CleanupStack::PushL(property);
+        property->ConstructL(aName);         
+        CleanupStack::Pop(property);
+        
+        property->Set(TRangedValue(aVal, aMin, aMax));        
+        
+        User::LeaveIfError(iProperties.Append(property));        
+        }
+    
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// Find integer property
+// ---------------------------------------------------------------------------
+//         
+EXPORT_C TBool CAlfPropertyOwner::PropertyFindInteger(const TDesC8& aName, TInt* aValue) const
+    {   
+    TInt index;
+
+    if (!FindOfType(aName, &index, EAlfPropertyTypeInteger))
+        {
+        return EFalse;            
+        }
+        
+    if (aValue)
+        {
+        // Clamp the value.
+        CAlfPropertyInteger* foundVal = static_cast<CAlfPropertyInteger*>(iProperties[index]);        
+        
+        *aValue = Min(foundVal->Data().iValue, foundVal->Data().iMax);
+        *aValue = Max(*aValue, foundVal->Data().iMin);
+        }
+    
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// Find complete ranged value
+// ---------------------------------------------------------------------------
+//         
+TBool CAlfPropertyOwner::PropertyFindInteger(const TDesC8& aName, TRangedValue& aValue) const
+    {   
+    TInt index;
+
+    if (FindOfType(aName, &index, EAlfPropertyTypeInteger))
+        {
+        CAlfPropertyInteger* foundVal = static_cast<CAlfPropertyInteger*>(iProperties[index]);        
+        
+        aValue = foundVal->Data();
+        return ETrue;
+        }
+    
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Set string property
+// ---------------------------------------------------------------------------
+//     
+EXPORT_C TBool CAlfPropertyOwner::PropertySetStringL(const TDesC8& aName, const TDesC& aValue)
+    {
+    CAlfPropertyString* property;
+    TAlfPropertyType type;
+    TInt index;
+    
+    if (aName.Length() == 0)
+        {
+        // Cannot have zero-length name as an argument.
+        return EFalse;
+        }    
+
+    if (Find(aName, &index, &type))
+        {
+        // Property exists already.
+        if (type != EAlfPropertyTypeString)
+            {
+            // Wrong type. We have to exit without doing anything.
+            return EFalse;
+            }
+        
+        // Modify existing property.
+        property = static_cast<CAlfPropertyString*>(iProperties[index]);                
+        property->SetL(aValue);        
+        }
+    else
+        {
+        // Not found, so add new item to the property list.
+        property = new (ELeave) CAlfPropertyString();
+        CleanupStack::PushL(property);
+        property->ConstructL(aName);         
+        CleanupStack::Pop(property);
+        
+        property->SetL(aValue);        
+        
+        User::LeaveIfError(iProperties.Append(property));        
+        }
+    
+    return ETrue;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// Find string property
+// ---------------------------------------------------------------------------
+//         
+EXPORT_C TBool CAlfPropertyOwner::PropertyFindString(const TDesC8& aName, TDesC** aValue) const
+    {   
+    TInt index;
+
+    if (!FindOfType(aName, &index, EAlfPropertyTypeString))
+        {
+        return EFalse;            
+        }
+    
+    CAlfPropertyString* foundVal = static_cast<CAlfPropertyString*>(iProperties[index]);
+    
+    if (aValue)
+        {
+        *aValue = foundVal->Data();
+        }
+    
+    return ETrue;
+    }    
+    
+    
+// Private methods
+
+// ---------------------------------------------------------------------------
+// Find property
+// ---------------------------------------------------------------------------
+//     
+TBool CAlfPropertyOwner::Find(const TDesC8& aName, TInt* aIndex, TAlfPropertyType* aType) const
+    {
+    TIdentityRelation<CAlfProperty> matchName( CAlfProperty::Matches );
+    
+    if (iProperties.Count() == 0)
+        {
+        // Array is empty, nothing to find.
+        return false;
+        }
+    
+    // Create a temporary property with the name we want to find.
+    CAlfProperty* toFind = new CAlfProperty();
+    if ( !toFind )
+        {
+        return EFalse;
+        }
+        
+    TRAPD( err, toFind->ConstructL(aName) );
+    if ( err != KErrNone )
+        {
+        delete toFind;
+        return EFalse;
+        }
+
+    TInt found = iProperties.Find(toFind, matchName);
+    delete toFind;
+
+    if (found == KErrNotFound)
+        {
+        return EFalse;
+        }
+       
+    CAlfProperty* foundProperty = iProperties[found];       
+       
+    if (aIndex)
+        {
+        *aIndex = found;
+        }
+    
+    if (aType)
+        {
+        *aType = foundProperty->Type();
+        }
+    
+    return ETrue;        
+    }
+
+// ---------------------------------------------------------------------------
+// Find property and check for the correct type
+// ---------------------------------------------------------------------------
+//     
+TBool CAlfPropertyOwner::FindOfType(const TDesC8& aName, TInt* aIndex, TAlfPropertyType aRequiredType) const
+    {
+    TAlfPropertyType foundType;
+    
+    if (!Find(aName, aIndex, &foundType))
+        {
+        return EFalse;            
+        }
+        
+    if (foundType != aRequiredType)
+        {
+        return EFalse;            
+        }
+
+    // Return, with find index stored in return parameter.
+    return ETrue;      
+    }
+
+    
+EXPORT_C TInt CAlfPropertyOwner::CopyProperty(const CAlfPropertyOwner& aOwner, const TDesC8& aPropertyName)
+    {
+    TInt index(0), result(KErrNone);
+    TAlfPropertyType propertyType;
+  
+    if (aOwner.Find(aPropertyName, &index, &propertyType))
+        {
+        switch (propertyType)
+            {
+            case EAlfPropertyTypeInteger:
+                {    
+                TRangedValue value;
+                aOwner.PropertyFindInteger(aPropertyName, value); // we know it exists
+                TRAP(result, PropertySetIntegerL(aPropertyName, value.iValue, value.iMin, value.iMax))
+                break;
+                }
+            case EAlfPropertyTypeString:
+                {
+                TDesC* string = 0;
+                aOwner.PropertyFindString(aPropertyName, &string); // we know it exists
+                TRAP(result, PropertySetStringL(aPropertyName, *string))
+                break;
+                }
+            default:
+                result = KErrNotSupported;
+                break;
+            }
+        }
+    else 
+        {
+        result = KErrNotFound;
+        } 
+        
+    return result;
+    }
+
+EXPORT_C void CAlfPropertyOwner::PropertyOwnerExtension(const TUid& /*aExtensionUid*/, TAny** /*aExtensionParams*/)
+    {
+    
+    }
+