javauis/mmapi_qt/baseline/src/cmmaplayerproperties.cpp
changeset 23 98ccebc37403
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/src/cmmaplayerproperties.cpp	Fri May 14 15:47:24 2010 +0300
@@ -0,0 +1,381 @@
+/*
+* Copyright (c) 2002 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:  This class is used for storing and parsing properties
+*
+*/
+
+
+//  INCLUDE FILES
+#include <logger.h>
+#include "cmmaplayerproperties.h"
+
+const TInt KPropertyNameEndChar = '=';
+const TInt KPropertyEndChar = '&';
+const TInt KDefaultGranularity = 8;
+
+CMMAPlayerProperties* CMMAPlayerProperties::NewL(const TDesC& aProperties,
+        MMMAParameterRule& aRule)
+{
+    CMMAPlayerProperties* props = new(ELeave) CMMAPlayerProperties(aProperties, aRule);
+    return props;
+}
+
+CMMAPlayerProperties::~CMMAPlayerProperties()
+{
+}
+
+
+CMMAPlayerProperties::CMMAPlayerProperties(const TDesC& aProperties, MMMAParameterRule& aRule) :
+        iProperties(aProperties),
+        iRule(aRule)
+{
+}
+
+TBool CMMAPlayerProperties::GetProperty(const TDesC& aKey,
+                                        TInt& aValue) const
+{
+    return iRule.FindProperty(aKey, aValue);
+}
+
+TBool CMMAPlayerProperties::GetProperty(const TDesC& aKey, TPtrC& aValue) const
+{
+    return iRule.FindProperty(aKey, aValue);
+}
+
+TBool CMMAPlayerProperties::Compare(const TDesC& aKey, const TDesC& aValue) const
+{
+    return iRule.Compare(aKey, aValue);
+}
+
+TBool CMMAPlayerProperties::Compare(const TDesC& aKey, const TInt& aValue) const
+{
+    return iRule.Compare(aKey, aValue);
+}
+
+// Parse property values: "key=value&key2=value2&..."
+void CMMAPlayerProperties::ValidateL() const
+{
+    // Empty properties are valid
+    if (iProperties.Length() == 0)
+    {
+        return;
+    }
+    TInt pos = 0;
+    while (pos != KErrNotFound)
+    {
+        // Getting everything from 'pos' to end and finding '&'
+        TPtrC property = iProperties.Mid(pos);
+        TInt valueEndPos = property.Locate(KPropertyEndChar);
+
+        if (valueEndPos != KErrNotFound)
+        {
+            // This is not last property, clipping remaining chars
+            property.Set(iProperties.Mid(pos, valueEndPos));
+        }
+
+        TInt keyEndPos = property.Locate(KPropertyNameEndChar);
+        // if we are getting KErrNotFound then properties is not valid
+        if (keyEndPos == KErrNotFound)
+        {
+            User::Leave(KErrArgument);
+        }
+
+        // "key=value"
+        TPtrC propertyKey(property.Left(keyEndPos));
+        TPtrC propertyValue(property.Mid(keyEndPos + 1));
+
+        // check is the pair valid, leave if not
+        // check also that this key was expected, leave if not
+        TPtrC tmp;
+        TInt tmpInt;
+        if (!iRule.ValidateAndStoreL(propertyKey, propertyValue) ||
+                !(iRule.FindProperty(propertyKey, tmp) ||
+                  iRule.FindProperty(propertyKey, tmpInt)))
+        {
+            User::Leave(KErrArgument);
+        }
+
+        // prepare for next token or mark end
+        if (valueEndPos != KErrNotFound)
+        {
+            pos += valueEndPos + 1;
+        }
+        else
+        {
+            pos = valueEndPos;
+        }
+    }
+}
+
+
+CMMAParameterRuleSet* CMMAParameterRuleSet::NewLC()
+{
+    CMMAParameterRuleSet* self = new(ELeave)CMMAParameterRuleSet();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+CMMAParameterRuleSet::~CMMAParameterRuleSet()
+{
+    if (iRules)
+    {
+        iRules->Reset();
+        delete iRules;
+    }
+}
+
+CMMAParameterRuleSet::CMMAParameterRuleSet()
+{
+}
+
+void CMMAParameterRuleSet::ConstructL()
+{
+    iRules = new(ELeave)CArrayPtrSeg< MMMAParameterRule >(KDefaultGranularity);
+}
+
+#define LOOPUNTILRULE( endRule ) \
+    TInt rules = iRules->Count(); \
+    TInt i( 0 ); \
+    while( ( i < rules ) && \
+           endRule ) \
+        { \
+        i++; \
+        }
+
+TBool CMMAParameterRuleSet::ValidateAndStoreL(const TDesC& aKey, const TDesC& aValue)
+{
+    LOOPUNTILRULE(iRules->At(i)->ValidateAndStoreL(aKey, aValue));
+    // if loop has ended before end then some validation has failed.
+    return (i == rules);
+}
+
+TBool CMMAParameterRuleSet::Compare(const TDesC& aKey, const TDesC& aValue)
+{
+    LOOPUNTILRULE(!iRules->At(i)->Compare(aKey, aValue));
+    // if loop has ended before end then key-value pair has been found
+    return (i != rules);
+}
+
+TBool CMMAParameterRuleSet::Compare(const TDesC& aKey, const TInt aValue)
+{
+    LOOPUNTILRULE(!iRules->At(i)->Compare(aKey, aValue));
+    // if loop has ended before end then key-value pair has been found
+    return (i != rules);
+}
+
+TBool CMMAParameterRuleSet::FindProperty(const TDesC& aKey, TPtrC& aValue)
+{
+    LOOPUNTILRULE(!iRules->At(i)->FindProperty(aKey, aValue));
+    // if loop has ended before end then key has been found
+    return (i != rules);
+}
+
+TBool CMMAParameterRuleSet::FindProperty(const TDesC& aKey, TInt& aValue)
+{
+    LOOPUNTILRULE(!iRules->At(i)->FindProperty(aKey, aValue));
+    // if loop has ended before end then key has been found
+    return (i != rules);
+}
+
+void CMMAParameterRuleSet::AppendRuleL(MMMAParameterRule* aRule)
+{
+    iRules->AppendL(aRule);
+}
+
+TMMAParameterRuleBase::TMMAParameterRuleBase(const TDesC& aKey) :
+        iKey(aKey),
+        iAssigned(EFalse)
+{}
+
+TBool TMMAParameterRuleBase::ValidateAndStoreL(const TDesC& aKey, const TDesC& aValue)
+{
+    if ((aKey.Length() == 0) ||
+            (aValue.Length() == 0))
+    {
+        // key or value length is zero, fail
+        User::Leave(KErrArgument);
+    }
+
+    TBool isValid = ETrue;
+    // this is same key as in rule
+    if (iKey.Compare(aKey) == 0)
+    {
+        //if this key is already assigned then there is same key more than once
+        if (iAssigned)
+        {
+            User::Leave(KErrArgument);
+        }
+        isValid = ValidateValueL(aValue);
+
+        // if it was valid we mark this key as assigned
+        if (isValid)
+        {
+            iAssigned = ETrue;
+        }
+    }
+    return isValid;
+}
+
+TBool TMMAParameterRuleBase::Compare(const TDesC& /*aKey*/, const TDesC& /*aValue*/)
+{
+    // by default we do not found this key
+    return EFalse;
+}
+
+TBool TMMAParameterRuleBase::Compare(const TDesC& /*aKey*/, const TInt /*aValue*/)
+{
+    // by default we do not found this key
+    return EFalse;
+}
+
+TBool TMMAParameterRuleBase::FindProperty(const TDesC& /*aKey*/, TPtrC& /*aValue*/)
+{
+    // by default we do not found this key
+    return EFalse;
+}
+
+TBool TMMAParameterRuleBase::FindProperty(const TDesC& /*aKey*/, TInt& /*aValue*/)
+{
+    // by default we do not found this key
+    return EFalse;
+}
+
+TMMAParameterRuleInt::TMMAParameterRuleInt(const TDesC& aKey) :
+        TMMAParameterRuleBase(aKey),
+        iUpperLimit(KMaxTInt),
+        iLowerLimit(KMinTInt)
+{}
+
+TMMAParameterRuleInt::TMMAParameterRuleInt(const TDesC& aKey,
+        const TInt aLowerLimit) :
+        TMMAParameterRuleBase(aKey),
+        iUpperLimit(KMaxTInt),
+        iLowerLimit(aLowerLimit)
+{}
+
+TMMAParameterRuleInt::TMMAParameterRuleInt(const TDesC& aKey,
+        const TInt aLowerLimit,
+        const TInt aUpperLimit) :
+        TMMAParameterRuleBase(aKey),
+        iUpperLimit(aUpperLimit),
+        iLowerLimit(aLowerLimit)
+{}
+
+TBool TMMAParameterRuleInt::ValidateValueL(const TDesC& aValue)
+{
+    TLex lex(aValue);
+    TInt valueInt = 0;
+    if ((lex.Val(valueInt) != KErrNone) ||
+            !lex.Eos())
+    {
+        User::Leave(KErrArgument);
+    }
+    if ((valueInt < iLowerLimit) ||
+            (valueInt > iUpperLimit))
+    {
+        // value is not valid
+        return EFalse;
+    }
+    else
+    {
+        // value is valid, store it
+        iValue = valueInt;
+        return ETrue;
+    }
+}
+
+TBool TMMAParameterRuleInt::Compare(const TDesC& aKey, const TInt aValue)
+{
+    TBool match = EFalse;
+    if (iAssigned &&
+            (iKey.Compare(aKey) == 0) &&
+            (aValue == iValue))
+    {
+        match = ETrue;
+    }
+    return match;
+}
+
+TBool TMMAParameterRuleInt::FindProperty(const TDesC& aKey, TInt& aValue)
+{
+    TBool match = EFalse;
+    if (iAssigned &&
+            iKey.Compare(aKey) == 0)
+    {
+        aValue = iValue;
+        match = ETrue;
+    }
+    return match;
+}
+
+TMMAParameterRuleDes::TMMAParameterRuleDes(const TDesC& aKey) :
+        TMMAParameterRuleBase(aKey),
+        iValidValues(NULL),
+        iArraySize(0)
+{}
+
+TMMAParameterRuleDes::TMMAParameterRuleDes(const TDesC& aKey,
+        const TMMAStaticStrArray* aValidValues,
+        const TInt aArraySize) :
+        TMMAParameterRuleBase(aKey),
+        iValidValues(aValidValues),
+        iArraySize(aArraySize)
+{}
+
+TBool TMMAParameterRuleDes::ValidateValueL(const TDesC& aValue)
+{
+    TInt i = 0;
+    while ((i < iArraySize) &&
+            aValue.Compare(iValidValues[i]()) != 0)
+    {
+        i++;
+    }
+    // if there is not valid values then we treat every value as valid
+    if (iValidValues &&
+            (i == iArraySize))
+    {
+        // there was no hit
+        return EFalse;
+    }
+
+    // find match or every value is valid, storing
+    iValue.Set(aValue);
+    return ETrue;
+}
+
+TBool TMMAParameterRuleDes::Compare(const TDesC& aKey, const TDesC& aValue)
+{
+    TBool match = EFalse;
+    if (iAssigned &&
+            (iKey.Compare(aKey) == 0) &&
+            (iValue.Compare(aValue) == 0))
+    {
+        match = ETrue;
+    }
+    return match;
+}
+
+TBool TMMAParameterRuleDes::FindProperty(const TDesC& aKey, TPtrC& aValue)
+{
+    TBool match = EFalse;
+    if (iAssigned &&
+            iKey.Compare(aKey) == 0)
+    {
+        aValue.Set(iValue);
+        match = ETrue;
+    }
+    return match;
+}
+//  END OF FILE