Skip to content

Commit

Permalink
Qt5cpp plug memleaks (#7695)
Browse files Browse the repository at this point in the history
* Small fixes to prevent crash when empty json body is provided.

* WIP: plug mem-leaks

* fixup: add the QJsonObject instance in toJsonArray instead of pointer

* fixup: simplify toJsonMap

Actually the original solution is incomplete, because "innerType" maps to a single C++ type. Have a look at Qt's builtin QJsonObject::fromVariantMap.

* Updates to antis81:patch-1 after tests.

* update to remove string allocation

* Updates due to address of members being passed

* Update PetStore Examples

* Small updates for Header includes
  • Loading branch information
etherealjoy authored and wing328 committed Mar 7, 2018
1 parent d5f3619 commit 12f3661
Show file tree
Hide file tree
Showing 27 changed files with 219 additions and 240 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ void {{prefix}}HttpRequestInput::add_file(QString variable_name, QString local_f
qsrand(QDateTime::currentDateTime().toTime_t());
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(on_manager_finished(QNetworkReply*)));
connect(manager, &QNetworkAccessManager::finished, this, &{{prefix}}HttpRequestWorker::on_manager_finished);
}

{{prefix}}HttpRequestWorker::~{{prefix}}HttpRequestWorker() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,10 @@ void

{{#bodyParams}}
{{#isContainer}}
auto {{paramName}}_jobj = new QJsonObject();
QJsonObject {{paramName}}_jobj;
toJsonArray((QList<void*>*){{paramName}}, {{paramName}}_jobj, QString("body"), QString("{{prefix}}User*"));

QJsonDocument doc(*{{paramName}}_jobj);
QJsonDocument doc({{paramName}}_jobj);
QByteArray bytes = doc.toJson();

input.request_body.append(bytes);
Expand Down Expand Up @@ -175,7 +175,7 @@ void

foreach(QString key, obj.keys()) {
qint32* val;
setValue(&val, obj[key], "{{returnBaseType}}", "");
setValue(&val, obj[key], "{{returnBaseType}}", QString());
output->insert(key, *val);
}
{{/isMapContainer}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ setValue(void* value, QJsonValue obj, QString type, QString complexType) {
}
else if(QStringLiteral("float").compare(type) == 0) {
float *val = static_cast<float*>(value);
*val = obj.toDouble();
*val = static_cast<float>(obj.toDouble());
}
else if(QStringLiteral("double").compare(type) == 0) {
double *val = static_cast<double*>(value);
Expand All @@ -42,20 +42,14 @@ setValue(void* value, QJsonValue obj, QString type, QString complexType) {
QString **val = static_cast<QString**>(value);
if(val != nullptr) {
if(!obj.isNull()) {
// create a new value and return
if(*val != nullptr) delete *val;
*val = new QString(obj.toString());
(*val)->clear();
(*val)->append(obj.toString());
return;
}
else {
// set target to nullptr
if(*val != nullptr) delete *val;
*val = nullptr;
(*val)->clear();
}
}
else {
qDebug() << "Can't set value because the target pointer is nullptr";
}
}
else if (QStringLiteral("QDateTime").compare(type) == 0) {
QDateTime **val = static_cast<QDateTime**>(value);
Expand Down Expand Up @@ -371,75 +365,74 @@ setValue(void* value, QJsonValue obj, QString type, QString complexType) {
}
void
toJsonValue(QString name, void* value, QJsonObject* output, QString type) {
toJsonValue(QString name, void* value, QJsonObject& output, QString type) {
if(value == nullptr) {
return;
}
if(type.startsWith("{{prefix}}")) {
{{prefix}}Object *{{prefix}}object = reinterpret_cast<{{prefix}}Object *>(value);
if({{prefix}}object != nullptr) {
QJsonObject* o = (*{{prefix}}object).asJsonObject();
if(name != nullptr) {
output->insert(name, *o);
if(o != nullptr) delete o;
QJsonObject o = {{prefix}}object->asJsonObject();
if(!name.isNull()) {
output.insert(name, o);
}
else {
output->empty();
for(QString key : o->keys()) {
output->insert(key, o->value(key));
output.empty();
for(QString key : o.keys()) {
output.insert(key, o.value(key));
}
}
}
}
else if(QStringLiteral("QString").compare(type) == 0) {
QString* str = static_cast<QString*>(value);
output->insert(name, QJsonValue(*str));
output.insert(name, QJsonValue(*str));
}
else if(QStringLiteral("qint32").compare(type) == 0) {
qint32* str = static_cast<qint32*>(value);
output->insert(name, QJsonValue(*str));
output.insert(name, QJsonValue(*str));
}
else if(QStringLiteral("qint64").compare(type) == 0) {
qint64* str = static_cast<qint64*>(value);
output->insert(name, QJsonValue(*str));
output.insert(name, QJsonValue(*str));
}
else if(QStringLiteral("bool").compare(type) == 0) {
bool* str = static_cast<bool*>(value);
output->insert(name, QJsonValue(*str));
output.insert(name, QJsonValue(*str));
}
else if(QStringLiteral("float").compare(type) == 0) {
float* str = static_cast<float*>(value);
output->insert(name, QJsonValue((double)*str));
output.insert(name, QJsonValue((double)*str));
}
else if(QStringLiteral("double").compare(type) == 0) {
double* str = static_cast<double*>(value);
output->insert(name, QJsonValue(*str));
output.insert(name, QJsonValue(*str));
}
else if(QStringLiteral("QDate").compare(type) == 0) {
QDate* date = static_cast<QDate*>(value);
output->insert(name, QJsonValue(date->toString(Qt::ISODate)));
output.insert(name, QJsonValue(date->toString(Qt::ISODate)));
}
else if(QStringLiteral("QDateTime").compare(type) == 0) {
QDateTime* datetime = static_cast<QDateTime*>(value);
output->insert(name, QJsonValue(datetime->toString(Qt::ISODate)));
output.insert(name, QJsonValue(datetime->toString(Qt::ISODate)));
}
else if(QStringLiteral("QByteArray").compare(type) == 0) {
QByteArray* byteArray = static_cast<QByteArray*>(value);
output->insert(name, QJsonValue(QString(byteArray->toBase64())));
output.insert(name, QJsonValue(QString(byteArray->toBase64())));
}
}
void
toJsonArray(QList<void*>* value, QJsonObject* output, QString innerName, QString innerType) {
if((value == nullptr) || (output == nullptr)) {
toJsonArray(QList<void*>* value, QJsonObject& output, QString innerName, QString innerType) {
if(value == nullptr) {
return;
}
QJsonArray outputarray;
if(innerType.startsWith("{{prefix}}")){
for(void* obj : *value) {
{{prefix}}Object *{{prefix}}object = reinterpret_cast<{{prefix}}Object *>(obj);
if({{prefix}}object != nullptr) {
outputarray.append(*({{prefix}}object->asJsonObject()));
outputarray.append({{prefix}}object->asJsonObject());
}
}
}
Expand Down Expand Up @@ -482,81 +475,81 @@ toJsonArray(QList<void*>* value, QJsonObject* output, QString innerName, QString
for(double obj : *(reinterpret_cast<QList<double>*>(value)))
outputarray.append(QJsonValue(obj));
}
output->insert(innerName, outputarray);
output.insert(innerName, outputarray);
}
void
toJsonMap(QMap<QString, void*>* value, QJsonObject* output, QString innerName, QString innerType) {
if((value == nullptr) || (output == nullptr)) {
toJsonMap(QMap<QString, void*>* value, QJsonObject& output, QString innerName, QString innerType) {
if(value == nullptr) {
return;
}
QJsonObject mapobj;
if(innerType.startsWith("{{prefix}}")){
auto items = reinterpret_cast< QMap<QString, {{prefix}}Object*> *>(value);
for(auto itemkey: items->keys()) {
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey),mapobj, innerType);
}
}
else if(QStringLiteral("QString").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, QString*> *>(value);
for(auto itemkey: items->keys()) {
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), mapobj, innerType);
}
}
else if(QStringLiteral("QDate").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, QDate*> *>(value);
for(auto itemkey: items->keys()) {
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), mapobj, innerType);
}
}
else if(QStringLiteral("QDateTime").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, QDateTime*> *>(value);
for(auto itemkey: items->keys()) {
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), mapobj, innerType);
}
}
else if(QStringLiteral("QByteArray").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, QByteArray*> *>(value);
for(auto itemkey: items->keys()) {
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, items->value(itemkey), mapobj, innerType);
}
}
else if(QStringLiteral("qint32").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, qint32> *>(value);
for(auto itemkey: items->keys()) {
auto val = items->value(itemkey);
::{{cppNamespace}}::toJsonValue(itemkey, &val, &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, &val, mapobj, innerType);
}
}
else if(QStringLiteral("qint64").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, qint64> *>(value);
for(auto itemkey: items->keys()) {
auto val = items->value(itemkey);
::{{cppNamespace}}::toJsonValue(itemkey, &val, &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, &val, mapobj, innerType);
}
}
else if(QStringLiteral("bool").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, bool> *>(value);
for(auto itemkey: items->keys()) {
auto val = items->value(itemkey);
::{{cppNamespace}}::toJsonValue(itemkey, &val, &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, &val, mapobj, innerType);
}
}
else if(QStringLiteral("float").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, float> *>(value);
for(auto itemkey: items->keys()) {
auto val = items->value(itemkey);
::{{cppNamespace}}::toJsonValue(itemkey, &val, &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, &val, mapobj, innerType);
}
}
else if(QStringLiteral("double").compare(innerType) == 0) {
auto items = reinterpret_cast< QMap<QString, double> *>(value);
for(auto itemkey: items->keys() ) {
auto val = items->value(itemkey);
::{{cppNamespace}}::toJsonValue(itemkey, &val, &mapobj, innerType);
::{{cppNamespace}}::toJsonValue(itemkey, &val, mapobj, innerType);
}
}
output->insert(innerName, mapobj);
output.insert(innerName, mapobj);
}
QString
Expand All @@ -582,4 +575,4 @@ stringValue(bool value) {
{{#cppNamespaceDeclarations}}
}
{{/cppNamespaceDeclarations}}
{{/cppNamespaceDeclarations}}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#ifndef {{prefix}}_HELPERS_H
#define {{prefix}}_HELPERS_H

#include <QJsonObject>
#include <QJsonValue>
#include <QList>
#include <QMap>
Expand All @@ -11,9 +12,9 @@ namespace {{this}} {
{{/cppNamespaceDeclarations}}

void setValue(void* value, QJsonValue obj, QString type, QString complexType);
void toJsonArray(QList<void*>* value, QJsonObject* output, QString innerName, QString innerType);
void toJsonValue(QString name, void* value, QJsonObject* output, QString type);
void toJsonMap(QMap<QString, void*>* value, QJsonObject* output, QString innerName, QString innerType);
void toJsonArray(QList<void*>* value, QJsonObject& output, QString innerName, QString innerType);
void toJsonValue(QString name, void* value, QJsonObject& output, QString type);
void toJsonMap(QMap<QString, void*>* value, QJsonObject& output, QString innerName, QString innerType);
bool isCompatibleJsonValue(QString type);
QString stringValue(QString* value);
QString stringValue(qint32 value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
namespace {{this}} {
{{/cppNamespaceDeclarations}}

{{classname}}::{{classname}}(QString* json) {
{{classname}}::{{classname}}(QString json) {
init();
this->fromJson(*json);
this->fromJson(json);
}

{{classname}}::{{classname}}() {
Expand Down Expand Up @@ -52,7 +52,7 @@ void
}

{{classname}}*
{{classname}}::fromJson(QString &json) {
{{classname}}::fromJson(QString json) {
QByteArray array (json.toStdString().c_str());
QJsonDocument doc = QJsonDocument::fromJson(array);
QJsonObject jsonObject = doc.object();
Expand All @@ -61,7 +61,7 @@ void
}

void
{{classname}}::fromJsonObject(QJsonObject &pJson) {
{{classname}}::fromJsonObject(QJsonObject pJson) {
{{#vars}}
{{^isContainer}}::{{cppNamespace}}::setValue(&{{name}}, pJson["{{baseName}}"], "{{baseType}}", "{{complexType}}");{{/isContainer}}
{{#isContainer}}{{^items.isContainer}}::{{cppNamespace}}::setValue(&{{name}}, pJson["{{baseName}}"], "{{baseType}}", "{{items.baseType}}");{{/items.isContainer}}{{#items.isContainer}}{{#isListContainer}}
Expand Down Expand Up @@ -94,16 +94,15 @@ void
QString
{{classname}}::asJson ()
{
QJsonObject* obj = this->asJsonObject();
QJsonDocument doc(*obj);
QJsonObject obj = this->asJsonObject();
QJsonDocument doc(obj);
QByteArray bytes = doc.toJson();
return QString(bytes);
}

QJsonObject*
QJsonObject
{{classname}}::asJsonObject() {
QJsonObject* obj = new QJsonObject();
QJsonObject obj;
{{#vars}}
{{^isContainer}}
{{#complexType}}
Expand All @@ -129,7 +128,7 @@ QJsonObject*
{{^isDate}}
{{^isByteArray}}
if(m_{{name}}_isSet){
obj->insert("{{baseName}}", QJsonValue({{name}}));
obj.insert("{{baseName}}", QJsonValue({{name}}));
}
{{/isByteArray}}
{{/isDate}}
Expand All @@ -142,7 +141,7 @@ QJsonObject*
{{/isDate}}
{{#isByteArray}}
if({{name}} != nullptr) {
obj->insert("{{name}}", QJsonValue(*{{name}}));
obj.insert("{{name}}", QJsonValue(*{{name}}));
}
{{/isByteArray}}
{{#isDateTime}}
Expand All @@ -162,14 +161,14 @@ QJsonObject*
for(auto items : *{{name}}){
QJsonObject jobj;
{{#items.isListContainer}}
toJsonArray((QList<void*>*)items, &jobj, "{{baseName}}", "{{items.items.baseType}}");
toJsonArray((QList<void*>*)items, jobj, "{{baseName}}", "{{items.items.baseType}}");
{{/items.isListContainer}}
{{#items.isMapContainer}}
toJsonMap((QMap<QString, void*>*)items, &jobj, "{{baseName}}", "{{items.items.baseType}}");
toJsonMap((QMap<QString, void*>*)items, jobj, "{{baseName}}", "{{items.items.baseType}}");
{{/items.isMapContainer}}
jarray.append(jobj.value("{{baseName}}"));
}
obj->insert("{{baseName}}", jarray);
obj.insert("{{baseName}}", jarray);
{{/items.isContainer}}
}
{{/isListContainer}}
Expand All @@ -180,14 +179,14 @@ QJsonObject*
for(auto itemkey : {{name}}->keys()){
QJsonObject jobj;
{{#items.isListContainer}}
toJsonArray((QList<void*>*){{name}}->value(itemkey), &jobj, itemkey, "{{items.items.baseType}}");
toJsonArray((QList<void*>*){{name}}->value(itemkey), jobj, itemkey, "{{items.items.baseType}}");
{{/items.isListContainer}}
{{#items.isMapContainer}}
toJsonMap((QMap<QString, void*>*){{name}}->value(itemkey), &jobj, itemkey, "{{items.items.baseType}}");
toJsonMap((QMap<QString, void*>*){{name}}->value(itemkey), jobj, itemkey, "{{items.items.baseType}}");
{{/items.isMapContainer}}
mapobj.insert(itemkey, jobj);
}
obj->insert("{{baseName}}", mapobj);{{/items.isContainer}}
obj.insert("{{baseName}}", mapobj);{{/items.isContainer}}
}
{{/isMapContainer}}
{{/isContainer}}
Expand Down
Loading

0 comments on commit 12f3661

Please sign in to comment.