--- 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;
}