src/hbcore/utils/hbxmlloaderabstractsyntax_p.cpp
changeset 28 b7da29130b0e
parent 7 923ff622b8b9
child 30 80e4d18b72f5
--- a/src/hbcore/utils/hbxmlloaderabstractsyntax_p.cpp	Thu Sep 02 20:44:51 2010 +0300
+++ b/src/hbcore/utils/hbxmlloaderabstractsyntax_p.cpp	Fri Sep 17 08:32:10 2010 +0300
@@ -24,6 +24,7 @@
 ****************************************************************************/
 
 #include "hbxmlloaderabstractsyntax_p.h"
+#include "hbhash_p.h"
 
 #include <QColor>
 #include <QDataStream>
@@ -194,7 +195,13 @@
             break;
             }
         case HbXmlLengthValue::Variable:
+        case HbXmlLengthValue::VariableNegative:
+            {
+            stream << value.mHashValue;
+            break;
+            }
         case HbXmlLengthValue::Expression:
+        case HbXmlLengthValue::ExpressionNegative:
             stream << value.mString;
             break;
         default:
@@ -222,7 +229,11 @@
             break;
             }
         case HbXmlLengthValue::Variable:
+        case HbXmlLengthValue::VariableNegative:
+            stream >> value.mHashValue;
+            break;
         case HbXmlLengthValue::Expression:
+        case HbXmlLengthValue::ExpressionNegative:
             stream >> value.mString;
             break;
         default:
@@ -594,33 +605,50 @@
 bool HbXmlLoaderAbstractSyntax::toLengthValue(const QString &value, HbXmlLengthValue& lengthVal) const
 {
     bool retVal(true);
-    QString val = value;
-    val.reserve(val.length());
+    quint32 hashValue(0);
     HbXmlLengthValue::Type type = HbXmlLengthValue::PlainNumber;
-    if ( val.endsWith(lexemValue(UNIT_UNIT), Qt::CaseInsensitive) ) {
+    if ( value.endsWith(lexemValue(UNIT_UNIT), Qt::CaseInsensitive) ) {
         type = HbXmlLengthValue::Unit;
-    } else if ( val.endsWith(lexemValue(UNIT_PIXEL), Qt::CaseInsensitive) ) {
+    } else if ( value.endsWith(lexemValue(UNIT_PIXEL), Qt::CaseInsensitive) ) {
         type = HbXmlLengthValue::Pixel;
-    } else if ( val.endsWith(lexemValue(UNIT_MILLIMETER), Qt::CaseInsensitive) ) {
+    } else if ( value.endsWith(lexemValue(UNIT_MILLIMETER), Qt::CaseInsensitive) ) {
         type = HbXmlLengthValue::Millimeter;
-    } else if ( (val.startsWith( lexemValue(UNIT_VAR_START) ) ||
-                val.startsWith( lexemValue(UNIT_VAR_NEG_START) ) ) && val.endsWith( lexemValue(UNIT_VAR_END) ) ) {
+    } else if ( value.startsWith( lexemValue(UNIT_VAR_START) ) && value.endsWith( lexemValue(UNIT_VAR_END) ) ) {
         type = HbXmlLengthValue::Variable;
-    } else if ( (val.startsWith( lexemValue(UNIT_EXPR_START) ) ||
-                val.startsWith( lexemValue(UNIT_EXPR_NEG_START) )) && val.endsWith( lexemValue(UNIT_EXPR_END) ) ) {
+        hashValue = hbHash(value.midRef(4,value.length()-5));
+    } else if ( value.startsWith( lexemValue(UNIT_VAR_NEG_START) ) && value.endsWith( lexemValue(UNIT_VAR_END) ) ) {
+        type = HbXmlLengthValue::VariableNegative;
+        hashValue = hbHash(value.midRef(5,value.length()-6));
+    } else if ( value.startsWith( lexemValue(UNIT_EXPR_START) ) && value.endsWith( lexemValue(UNIT_EXPR_END) ) ) {
         type = HbXmlLengthValue::Expression;
+    } else if ( value.startsWith( lexemValue(UNIT_EXPR_NEG_START) ) && value.endsWith( lexemValue(UNIT_EXPR_END) ) ) {
+        type = HbXmlLengthValue::ExpressionNegative;
     }
     lengthVal.mType = type;
-    if ( type == HbXmlLengthValue::Variable || type == HbXmlLengthValue::Expression ) {
-        lengthVal.mString = value;
-        lengthVal.mValue = 0;
-    } else {
-        lengthVal.mString = QString();
-        if (type != HbXmlLengthValue::PlainNumber) {
-            // Assuming all unit identifiers have two characters
-            val.chop(2);
-        }
-        retVal = toReal( val, lengthVal.mValue );
+    lengthVal.mString = QString();
+
+    switch ( type ) {
+        case HbXmlLengthValue::None:
+            break;
+        case HbXmlLengthValue::PlainNumber:
+            retVal = toReal( value, lengthVal.mValue );
+            break;
+        case HbXmlLengthValue::Pixel:
+        case HbXmlLengthValue::Unit:
+        case HbXmlLengthValue::Millimeter:
+            retVal = toReal( QString::fromRawData( value.constData(), value.length()-2 ), lengthVal.mValue );
+            break;
+        case HbXmlLengthValue::Variable:
+        case HbXmlLengthValue::VariableNegative:
+            lengthVal.mHashValue = hashValue;
+            break;
+        case HbXmlLengthValue::Expression:
+        case HbXmlLengthValue::ExpressionNegative:
+            lengthVal.mString = value;
+            lengthVal.mValue = 0;
+            break;
+        default:
+            break;
     }
     return retVal;
 }