summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2024-04-10 14:28:11 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2024-04-11 10:29:21 +0200
commitc342f12bfef9852f0a81bf2eb704a049a35fd01d (patch)
tree9865d46cbbda3fbf23553d602573fb156523b3b8 /src
parentb1501dd77e4cb4f46832b0d1fcaacb919fb8eaae (diff)
Fix conversions of QVariantList of strings
Prevent the check for a 2-dimensional array from triggering for QString/QByteArray which are convertible to QVariantList in Qt 6. Pick-to: 6.7 6.5 Fixes: QTBUG-122762 Change-Id: If698964c628d47226e116a685d3462cc968b6925 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/activeqt/shared/qaxtypes.cpp57
1 files changed, 31 insertions, 26 deletions
diff --git a/src/activeqt/shared/qaxtypes.cpp b/src/activeqt/shared/qaxtypes.cpp
index 0dfbe28..d9175ea 100644
--- a/src/activeqt/shared/qaxtypes.cpp
+++ b/src/activeqt/shared/qaxtypes.cpp
@@ -212,6 +212,19 @@ static QByteArray msgOutParameterNotSupported(const QByteArray &type)
} \
}
+static qsizetype columnCount2D(const QVariantList &list)
+{
+ if (!list.isEmpty()) {
+ const auto &firstElement = list.at(0);
+ const auto type = firstElement.typeId();
+ if (type != QMetaType::QString && type != QMetaType::QByteArray
+ && firstElement.canConvert<QVariantList>()) {
+ return firstElement.toList().size();
+ }
+ }
+ return 0;
+}
+
bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &typeName, bool out)
{
QVariant qvar = var;
@@ -429,36 +442,28 @@ bool QVariantToVARIANT(const QVariant &var, VARIANT &arg, const QByteArray &type
break;
}
SAFEARRAY *array = nullptr;
- bool is2D = false;
// If the first element in the array is a list the whole list is
// treated as a 2D array. The column count is taken from the 1st element.
- if (count) {
- QVariantList col = list.at(0).toList();
- qsizetype maxColumns = col.size();
- if (maxColumns) {
- is2D = true;
- SAFEARRAYBOUND rgsabound[2] = { {0, 0}, {0, 0} };
- rgsabound[0].cElements = count;
- rgsabound[1].cElements = maxColumns;
- array = SafeArrayCreate(VT_VARIANT, 2, rgsabound);
- LONG rgIndices[2];
- for (LONG i = 0; i < count; ++i) {
- rgIndices[0] = i;
- QVariantList columns = list.at(i).toList();
- qsizetype columnCount = qMin(maxColumns, columns.size());
- for (LONG j = 0; j < columnCount; ++j) {
- const QVariant &elem = columns.at(j);
- VariantInit(&variant);
- QVariantToVARIANT(elem, variant, elem.typeName());
- rgIndices[1] = j;
- SafeArrayPutElement(array, rgIndices, pElement);
- clearVARIANT(&variant);
- }
+ if (qsizetype maxColumns = columnCount2D(list)) {
+ SAFEARRAYBOUND rgsabound[2] = { {0, 0}, {0, 0} };
+ rgsabound[0].cElements = count;
+ rgsabound[1].cElements = maxColumns;
+ array = SafeArrayCreate(VT_VARIANT, 2, rgsabound);
+ LONG rgIndices[2];
+ for (LONG i = 0; i < count; ++i) {
+ rgIndices[0] = i;
+ QVariantList columns = list.at(i).toList();
+ qsizetype columnCount = qMin(maxColumns, columns.size());
+ for (LONG j = 0; j < columnCount; ++j) {
+ const QVariant &elem = columns.at(j);
+ VariantInit(&variant);
+ QVariantToVARIANT(elem, variant, elem.typeName());
+ rgIndices[1] = j;
+ SafeArrayPutElement(array, rgIndices, pElement);
+ clearVARIANT(&variant);
}
-
}
- }
- if (!is2D) {
+ } else {
array = SafeArrayCreateVector(vt, 0, count);
for (LONG index = 0; index < count; ++index) {
QVariant elem = list.at(index);