mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-12 20:50:55 +00:00
[qt5cpp] delete callback data allocated before signal emission (#7840)
* Small fixes to prevent crash when empty json body is provided. * Add deleteLater wrapper for pointers passed to user code to prevent memory leak. * Updates to move Object Wrapper to separate file * Add Prefix to class name
This commit is contained in:
parent
d1850091a7
commit
3b031ed2b8
@ -117,6 +117,7 @@ public class Qt5CPPGenerator extends AbstractCppCodegen implements CodegenConfig
|
||||
supportingFiles.add(new SupportingFile("HttpRequest.cpp.mustache", sourceFolder, PREFIX + "HttpRequest.cpp"));
|
||||
supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, PREFIX + "ModelFactory.h"));
|
||||
supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, PREFIX + "Object.h"));
|
||||
supportingFiles.add(new SupportingFile("QObjectWrapper.h.mustache", sourceFolder, PREFIX + "QObjectWrapper.h"));
|
||||
if (optionalProjectFileFlag) {
|
||||
supportingFiles.add(new SupportingFile("Project.mustache", sourceFolder, "client.pri"));
|
||||
}
|
||||
@ -176,6 +177,7 @@ public class Qt5CPPGenerator extends AbstractCppCodegen implements CodegenConfig
|
||||
supportingFiles.add(new SupportingFile("HttpRequest.cpp.mustache", sourceFolder, modelNamePrefix + "HttpRequest.cpp"));
|
||||
supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, modelNamePrefix + "ModelFactory.h"));
|
||||
supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, modelNamePrefix + "Object.h"));
|
||||
supportingFiles.add(new SupportingFile("QObjectWrapper.h.mustache", sourceFolder, modelNamePrefix + "QObjectWrapper.h"));
|
||||
|
||||
typeMapping.put("object", modelNamePrefix + "Object");
|
||||
typeMapping.put("file", modelNamePrefix + "HttpRequestInputFileElement");
|
||||
|
@ -19,7 +19,8 @@ HEADERS += \
|
||||
$${PWD}/{{prefix}}Helpers.h \
|
||||
$${PWD}/{{prefix}}HttpRequest.h \
|
||||
$${PWD}/{{prefix}}ModelFactory.h \
|
||||
$${PWD}/{{prefix}}Object.h
|
||||
$${PWD}/{{prefix}}Object.h \
|
||||
$${PWD}/{{prefix}}QObjectWrapper.h
|
||||
|
||||
SOURCES += \
|
||||
# Models
|
||||
|
@ -0,0 +1,28 @@
|
||||
{{>licenseInfo}}
|
||||
#ifndef {{prefix}}_QOBJECT_WRAPPER_H
|
||||
#define {{prefix}}_QOBJECT_WRAPPER_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
{{#cppNamespaceDeclarations}}
|
||||
namespace {{this}} {
|
||||
{{/cppNamespaceDeclarations}}
|
||||
|
||||
template <typename ObjectPtrT>
|
||||
class {{prefix}}QObjectWrapper : public QObject {
|
||||
public:
|
||||
{{prefix}}QObjectWrapper(ObjectPtrT ptr){
|
||||
data = ptr;
|
||||
}
|
||||
~{{prefix}}QObjectWrapper(){
|
||||
delete data;
|
||||
}
|
||||
private :
|
||||
ObjectPtrT data;
|
||||
};
|
||||
|
||||
{{#cppNamespaceDeclarations}}
|
||||
}
|
||||
{{/cppNamespaceDeclarations}}
|
||||
|
||||
#endif // {{prefix}}_QOBJECT_WRAPPER_H
|
@ -2,6 +2,7 @@
|
||||
#include "{{classname}}.h"
|
||||
#include "{{prefix}}Helpers.h"
|
||||
#include "{{prefix}}ModelFactory.h"
|
||||
#include "{{prefix}}QObjectWrapper.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
@ -150,20 +151,30 @@ void
|
||||
QByteArray array (json.toStdString().c_str());
|
||||
QJsonDocument doc = QJsonDocument::fromJson(array);
|
||||
QJsonArray jsonArray = doc.array();
|
||||
|
||||
auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
|
||||
wrapper->deleteLater();
|
||||
foreach(QJsonValue obj, jsonArray) {
|
||||
{{{returnBaseType}}}* o = new {{returnBaseType}}();
|
||||
QJsonObject jv = obj.toObject();
|
||||
QJsonObject * ptr = (QJsonObject*)&jv;
|
||||
o->fromJsonObject(*ptr);
|
||||
auto objwrapper = new {{prefix}}QObjectWrapper<{{{returnBaseType}}}*> (o);
|
||||
objwrapper->deleteLater();
|
||||
output->append(o);
|
||||
}
|
||||
{{/isListContainer}}
|
||||
|
||||
{{^isListContainer}}
|
||||
{{^isMapContainer}}
|
||||
{{#returnTypeIsPrimitive}}
|
||||
{{{returnType}}} output; // TODO add primitive output support
|
||||
{{#isByteArray}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
|
||||
wrapper->deleteLater();{{/isByteArray}}
|
||||
{{#isDateTime}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
|
||||
wrapper->deleteLater();{{/isDateTime}}
|
||||
{{#isDate}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
|
||||
wrapper->deleteLater();{{/isDate}}
|
||||
{{#isString}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
|
||||
wrapper->deleteLater();{{/isString}}
|
||||
{{/returnTypeIsPrimitive}}
|
||||
{{/isMapContainer}}
|
||||
{{#isMapContainer}}
|
||||
@ -183,6 +194,8 @@ void
|
||||
{{^returnTypeIsPrimitive}}
|
||||
QString json(worker->response);
|
||||
{{{returnType}}} output = static_cast<{{{returnType}}}>(create(json, QString("{{{returnBaseType}}}")));
|
||||
auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
|
||||
wrapper->deleteLater();
|
||||
{{/returnTypeIsPrimitive}}
|
||||
{{/isMapContainer}}
|
||||
{{/isListContainer}}
|
||||
|
@ -185,7 +185,7 @@ void PetApiTests::updatePetWithFormTest() {
|
||||
static SWGPetApi* api = getApi();
|
||||
|
||||
SWGPet* pet = createRandomPet();
|
||||
static SWGPet* petToCheck;
|
||||
SWGPet* petToCheck;
|
||||
qint64 id = pet->getId();
|
||||
static QEventLoop loop;
|
||||
QTimer timer;
|
||||
@ -209,7 +209,7 @@ void PetApiTests::updatePetWithFormTest() {
|
||||
timer.setInterval(1000);
|
||||
timer.setSingleShot(true);
|
||||
|
||||
auto fetchPet = [](SWGPet* pet) {
|
||||
auto fetchPet = [&](SWGPet* pet) {
|
||||
petToCheck = pet;
|
||||
loop.quit();
|
||||
};
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "SWGPetApi.h"
|
||||
#include "SWGHelpers.h"
|
||||
#include "SWGModelFactory.h"
|
||||
#include "SWGQObjectWrapper.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
@ -220,15 +221,17 @@ SWGPetApi::findPetsByStatusCallback(SWGHttpRequestWorker * worker) {
|
||||
QByteArray array (json.toStdString().c_str());
|
||||
QJsonDocument doc = QJsonDocument::fromJson(array);
|
||||
QJsonArray jsonArray = doc.array();
|
||||
|
||||
auto wrapper = new SWGQObjectWrapper<QList<SWGPet*>*> (output);
|
||||
wrapper->deleteLater();
|
||||
foreach(QJsonValue obj, jsonArray) {
|
||||
SWGPet* o = new SWGPet();
|
||||
QJsonObject jv = obj.toObject();
|
||||
QJsonObject * ptr = (QJsonObject*)&jv;
|
||||
o->fromJsonObject(*ptr);
|
||||
auto objwrapper = new SWGQObjectWrapper<SWGPet*> (o);
|
||||
objwrapper->deleteLater();
|
||||
output->append(o);
|
||||
}
|
||||
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
@ -325,15 +328,17 @@ SWGPetApi::findPetsByTagsCallback(SWGHttpRequestWorker * worker) {
|
||||
QByteArray array (json.toStdString().c_str());
|
||||
QJsonDocument doc = QJsonDocument::fromJson(array);
|
||||
QJsonArray jsonArray = doc.array();
|
||||
|
||||
auto wrapper = new SWGQObjectWrapper<QList<SWGPet*>*> (output);
|
||||
wrapper->deleteLater();
|
||||
foreach(QJsonValue obj, jsonArray) {
|
||||
SWGPet* o = new SWGPet();
|
||||
QJsonObject jv = obj.toObject();
|
||||
QJsonObject * ptr = (QJsonObject*)&jv;
|
||||
o->fromJsonObject(*ptr);
|
||||
auto objwrapper = new SWGQObjectWrapper<SWGPet*> (o);
|
||||
objwrapper->deleteLater();
|
||||
output->append(o);
|
||||
}
|
||||
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
@ -385,9 +390,10 @@ SWGPetApi::getPetByIdCallback(SWGHttpRequestWorker * worker) {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
|
||||
QString json(worker->response);
|
||||
SWGPet* output = static_cast<SWGPet*>(create(json, QString("SWGPet")));
|
||||
auto wrapper = new SWGQObjectWrapper<SWGPet*> (output);
|
||||
wrapper->deleteLater();
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
@ -554,9 +560,10 @@ SWGPetApi::uploadFileCallback(SWGHttpRequestWorker * worker) {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
|
||||
QString json(worker->response);
|
||||
SWGApiResponse* output = static_cast<SWGApiResponse*>(create(json, QString("SWGApiResponse")));
|
||||
auto wrapper = new SWGQObjectWrapper<SWGApiResponse*> (output);
|
||||
wrapper->deleteLater();
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
|
35
samples/client/petstore/qt5cpp/client/SWGQObjectWrapper.h
Normal file
35
samples/client/petstore/qt5cpp/client/SWGQObjectWrapper.h
Normal file
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Swagger Petstore
|
||||
* This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.
|
||||
*
|
||||
* OpenAPI spec version: 1.0.0
|
||||
* Contact: apiteam@swagger.io
|
||||
*
|
||||
* NOTE: This class is auto generated by the swagger code generator program.
|
||||
* https://github.com/swagger-api/swagger-codegen.git
|
||||
* Do not edit the class manually.
|
||||
*/
|
||||
|
||||
#ifndef SWG_QOBJECT_WRAPPER_H
|
||||
#define SWG_QOBJECT_WRAPPER_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
namespace Swagger {
|
||||
|
||||
template <typename ObjectPtrT>
|
||||
class SWGQObjectWrapper : public QObject {
|
||||
public:
|
||||
SWGQObjectWrapper(ObjectPtrT ptr){
|
||||
data = ptr;
|
||||
}
|
||||
~SWGQObjectWrapper(){
|
||||
delete data;
|
||||
}
|
||||
private :
|
||||
ObjectPtrT data;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // SWG_QOBJECT_WRAPPER_H
|
@ -13,6 +13,7 @@
|
||||
#include "SWGStoreApi.h"
|
||||
#include "SWGHelpers.h"
|
||||
#include "SWGModelFactory.h"
|
||||
#include "SWGQObjectWrapper.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
@ -118,7 +119,6 @@ SWGStoreApi::getInventoryCallback(SWGHttpRequestWorker * worker) {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
|
||||
QMap<QString, qint32>* output = new QMap<QString, qint32>();
|
||||
QString json(worker->response);
|
||||
QByteArray array (json.toStdString().c_str());
|
||||
@ -181,9 +181,10 @@ SWGStoreApi::getOrderByIdCallback(SWGHttpRequestWorker * worker) {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
|
||||
QString json(worker->response);
|
||||
SWGOrder* output = static_cast<SWGOrder*>(create(json, QString("SWGOrder")));
|
||||
auto wrapper = new SWGQObjectWrapper<SWGOrder*> (output);
|
||||
wrapper->deleteLater();
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
@ -236,9 +237,10 @@ SWGStoreApi::placeOrderCallback(SWGHttpRequestWorker * worker) {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
|
||||
QString json(worker->response);
|
||||
SWGOrder* output = static_cast<SWGOrder*>(create(json, QString("SWGOrder")));
|
||||
auto wrapper = new SWGQObjectWrapper<SWGOrder*> (output);
|
||||
wrapper->deleteLater();
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "SWGUserApi.h"
|
||||
#include "SWGHelpers.h"
|
||||
#include "SWGModelFactory.h"
|
||||
#include "SWGQObjectWrapper.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
@ -284,9 +285,10 @@ SWGUserApi::getUserByNameCallback(SWGHttpRequestWorker * worker) {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
|
||||
QString json(worker->response);
|
||||
SWGUser* output = static_cast<SWGUser*>(create(json, QString("SWGUser")));
|
||||
auto wrapper = new SWGQObjectWrapper<SWGUser*> (output);
|
||||
wrapper->deleteLater();
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
@ -352,9 +354,10 @@ SWGUserApi::loginUserCallback(SWGHttpRequestWorker * worker) {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
|
||||
QString json(worker->response);
|
||||
QString* output = static_cast<QString*>(create(json, QString("QString")));
|
||||
auto wrapper = new SWGQObjectWrapper<QString*> (output);
|
||||
wrapper->deleteLater();
|
||||
worker->deleteLater();
|
||||
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
|
@ -16,7 +16,8 @@ HEADERS += \
|
||||
$${PWD}/SWGHelpers.h \
|
||||
$${PWD}/SWGHttpRequest.h \
|
||||
$${PWD}/SWGModelFactory.h \
|
||||
$${PWD}/SWGObject.h
|
||||
$${PWD}/SWGObject.h \
|
||||
$${PWD}/SWGQObjectWrapper.h
|
||||
|
||||
SOURCES += \
|
||||
# Models
|
||||
|
Loading…
x
Reference in New Issue
Block a user