diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/Client/src/alfpropertyowner.cpp --- /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(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(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(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(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(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 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*/) + { + + } +