--- a/src/hbcore/core/hbvariant_p.cpp Fri Sep 17 08:32:10 2010 +0300
+++ b/src/hbcore/core/hbvariant_p.cpp Mon Oct 04 00:38:12 2010 +0300
@@ -38,7 +38,7 @@
HbVariant::HbVariantData::HbVariantData() :
stringSize(0),
- stringListCount(0),
+ listCount(0),
mRef(1),
mDataType(Invalid)
{
@@ -58,7 +58,7 @@
mDataType = dataType;
#ifdef HB_BIN_CSS
// Types that allocate memory from memory manager
- if (mDataType == String || mDataType == StringList || mDataType == Color) {
+ if (mDataType == String || mDataType == StringList || mDataType == Color || mDataType == IntList) {
// Does not matter if register same offset holder many times
HbCssConverterUtils::registerOffsetHolder(&mData.offset);
} else {
@@ -214,6 +214,20 @@
}
/*
+* C'tor taking intlist
+*/
+HbVariant::HbVariant(const QList<int> &val, HbMemoryManager::MemoryType type)
+ : mMemoryType( type ), mShared( false )
+{
+ initializeData();
+ fillIntListData(val);
+
+#ifdef HB_BIN_CSS
+ HbCssConverterUtils::registerOffsetHolder(&mDataOffset);
+#endif
+}
+
+/*
* copy C'tor
*/
HbVariant::HbVariant( const HbVariant &other )
@@ -279,6 +293,13 @@
case HbVariant::Color:
case HbVariant::StringList:
return 0;
+ case HbVariant::IntList:
+ if (data->listCount == 1) {
+ const char *address = getAddress<char>(mMemoryType, data->mData.offset, mShared);
+ return *((int*)address);
+ }
+ return 0;
+
default:
return 0;
}
@@ -301,12 +322,17 @@
case HbVariant::Color:
return getColor().name();
case HbVariant::StringList:
- if (data->stringListCount == 1) {
+ if (data->listCount == 1) {
const char *address = getAddress<char>(mMemoryType, data->mData.offset, mShared);
int length = *((int*)address);
return QString((const QChar *)(address + sizeof(int)), length);
- }
-
+ }
+ return QString();
+ case HbVariant::IntList:
+ if (data->listCount == 1) {
+ const char *address = getAddress<char>(mMemoryType, data->mData.offset, mShared);
+ return QString::number(*((int*)address));
+ }
return QString();
default:
return QString();
@@ -346,6 +372,7 @@
case HbVariant::StringList:
case HbVariant::Int:
case HbVariant::Double:
+ case HbVariant::IntList:
return QColor();
default:
return QColor();
@@ -384,6 +411,11 @@
list.append(string);
address += sizeof(QChar) * length;
}
+ } else if (data->dataType() == HbVariant::IntList) {
+ QList<int> intList = toIntList();
+ for (int i=0; i<intList.count(); i++) {
+ list.append(QString::number(intList.at(i)));
+ }
} else {
list.append(toString());
}
@@ -409,12 +441,43 @@
case HbVariant::Color:
case HbVariant::StringList:
return double();
+ case HbVariant::IntList:
+ if (data->listCount == 1) {
+ return double(toInt());
+ }
+ return double();
default:
return double();
}
}
/*
+* to get int list
+*/
+QList<int> HbVariant::toIntList() const
+{
+ HbVariantData *data = getAddress<HbVariantData>(mMemoryType, mDataOffset, mShared);
+ QList<int> list;
+
+ if (data) {
+ if (data->dataType() == HbVariant::IntList) {
+ const char *address = getAddress<char>(mMemoryType, data->mData.offset, mShared);
+ const char *end = address + data->listCount * sizeof(int);
+
+ // Append strings to stringlist
+ while (address < end) {
+ list.append(*(int *)address);
+ address += sizeof(int);
+ }
+ } else {
+ list.append(toInt());
+ }
+ }
+
+ return list;
+}
+
+/*
* initializeData
*/
HbVariant::HbVariantData * HbVariant::initializeData()
@@ -488,7 +551,7 @@
// In stringlist case, set stringSize to indicate size allocated for the whole stringlist buffer
data->stringSize = allocBytes;
- data->stringListCount = stringList.count();
+ data->listCount = stringList.count();
data->setDataType(StringList);
if (oldOffset != -1) {
@@ -520,6 +583,40 @@
}
/*
+* fillIntListData
+*/
+void HbVariant::fillIntListData(const QList<int> &intList)
+{
+ GET_MEMORY_MANAGER(mMemoryType);
+ HbVariantData *data = getAddress<HbVariantData>(mMemoryType, mDataOffset, mShared);
+ qptrdiff oldOffset = reservesMemory(data) ? data->mData.offset : -1;
+
+ if (intList.isEmpty()) {
+ data->mData.offset = -1;
+ } else {
+ // allocate memory and copy data.
+ data->mData.offset = manager->alloc(intList.count() * sizeof(int));
+ char *address = getAddress<char>(mMemoryType, data->mData.offset, mShared);
+
+ for (int j=0; j<intList.count(); ++j) {
+ *((int*)address) = intList.at(j);
+ address += sizeof(int);
+ }
+ }
+
+ data->stringSize = 0;
+ data->listCount = intList.count();
+
+ data->setDataType(IntList);
+ if (oldOffset != -1) {
+ // Free old memory block
+ HbMemoryUtils::freeMemory(mMemoryType, oldOffset);
+ }
+}
+
+
+
+/*
* = operator taking int
*/
HbVariant & HbVariant::operator=(int val)
@@ -587,6 +684,15 @@
}
/*
+* = operator taking QList<int>
+*/
+HbVariant& HbVariant::operator=(const QList<int>& intList)
+{
+ fillIntListData(intList);
+ return *this;
+}
+
+/*
* = operator taking HbVariant
*/
HbVariant &HbVariant::operator=(const HbVariant &other)
@@ -636,22 +742,38 @@
}
switch(uint(t)) {
case HbVariant::Int:
- return data->dataType() == HbVariant::Double
- || data->dataType() == HbVariant::String;
+ if (data->dataType() == HbVariant::IntList) {
+ return data->listCount <= 1;
+ } else {
+ return data->dataType() == HbVariant::Double
+ || data->dataType() == HbVariant::String;
+ }
case HbVariant::Double:
- return data->dataType() == HbVariant::Int
- || data->dataType() == HbVariant::String;
+ if (data->dataType() == HbVariant::IntList) {
+ return data->listCount <= 1;
+ } else {
+ return data->dataType() == HbVariant::Int
+ || data->dataType() == HbVariant::String;
+ }
case HbVariant::String:
- if (data->dataType() == HbVariant::StringList) {
- return data->stringListCount <= 1;
+ if (data->dataType() == HbVariant::StringList
+ || data->dataType() == HbVariant::IntList) {
+ return data->listCount <= 1;
} else {
return data->dataType() == HbVariant::Int
|| data->dataType() == HbVariant::Double
|| data->dataType() == HbVariant::Color;
}
case HbVariant::StringList:
+ return data->dataType() == HbVariant::String
+ || data->dataType() == HbVariant::IntList;
case HbVariant::Color:
return data->dataType() == HbVariant::String;
+ case HbVariant::IntList:
+ return data->dataType() == HbVariant::Int
+ || data->dataType() == HbVariant::Double
+ || data->dataType() == HbVariant::String
+ || data->dataType() == HbVariant::IntList;
default :
return false;
}
@@ -670,6 +792,7 @@
QColor col;
QString str;
QStringList strList;
+ QList<int> intList;
if(data->dataType() == t) {
return true;
@@ -728,7 +851,7 @@
}
case HbVariant::StringList:
// canConvert checks that there is max 1 string in the stringlist
- if (data->stringListCount == 0) {
+ if (data->listCount == 0) {
fillStringData(0, 0);
} else {
QString string = toString();
@@ -766,6 +889,15 @@
default:
return false;
}
+ case HbVariant::IntList:
+ switch(data->dataType()) {
+ case HbVariant::Int:
+ intList.append(data->mData.i);
+ fillIntListData(intList);
+ return true;
+ default:
+ return false;
+ }
default:
return false;
@@ -792,6 +924,14 @@
QVariant var = getColor();
return var;
}
+ case HbVariant::IntList : {
+ QList<int> intList = toIntList();
+ QList<QVariant> variantList;
+ for (int i=0; i<intList.count(); i++) {
+ variantList.append(intList.at(i));
+ }
+ return QVariant(variantList);
+ }
default:
return QVariant();
}
@@ -815,6 +955,7 @@
case HbVariant::String :
case HbVariant::Color :
case HbVariant::StringList :
+ case HbVariant::IntList :
HbMemoryUtils::freeMemory(mMemoryType, data->mData.offset);
break;
default:
@@ -847,6 +988,8 @@
break;
case HbVariant::StringList:
qDebug() << toStringList();
+ case HbVariant::IntList:
+ qDebug() << toIntList();
default:
qDebug() << "Invalid Type";
}