forked from loafle/openapi-generator-original
added qt5 c++ templates
This commit is contained in:
parent
d6016757cb
commit
5a1fa6ee65
@ -0,0 +1,306 @@
|
||||
package com.wordnik.swagger.codegen.languages;
|
||||
|
||||
import com.wordnik.swagger.codegen.*;
|
||||
import com.wordnik.swagger.util.Json;
|
||||
import com.wordnik.swagger.models.properties.*;
|
||||
|
||||
import java.util.*;
|
||||
import java.io.File;
|
||||
|
||||
public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig {
|
||||
protected Set<String> foundationClasses = new HashSet<String>();
|
||||
|
||||
// source folder where to write the files
|
||||
protected String sourceFolder = "client";
|
||||
protected String apiVersion = "1.0.0";
|
||||
protected final String PREFIX = "SWG";
|
||||
protected Map<String, String> namespaces = new HashMap<String, String>();
|
||||
protected Set<String> systemIncludes = new HashSet<String>();
|
||||
|
||||
/**
|
||||
* Configures the type of generator.
|
||||
*
|
||||
* @return the CodegenType for this generator
|
||||
* @see com.wordnik.swagger.codegen.CodegenType
|
||||
*/
|
||||
public CodegenType getTag() {
|
||||
return CodegenType.CLIENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures a friendly name for the generator. This will be used by the generator
|
||||
* to select the library with the -l flag.
|
||||
*
|
||||
* @return the friendly name for the generator
|
||||
*/
|
||||
public String getName() {
|
||||
return "qt5cpp";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns human-friendly help for the generator. Provide the consumer with help
|
||||
* tips, parameters here
|
||||
*
|
||||
* @return A string value for the help message
|
||||
*/
|
||||
public String getHelp() {
|
||||
return "Generates a qt5 C++ client library.";
|
||||
}
|
||||
|
||||
public Qt5CPPGenerator() {
|
||||
super();
|
||||
|
||||
// set the output folder here
|
||||
outputFolder = "generated-code/qt5cpp";
|
||||
|
||||
/**
|
||||
* Models. You can write model files using the modelTemplateFiles map.
|
||||
* if you want to create one template for file, you can do so here.
|
||||
* for multiple files for model, just put another entry in the `modelTemplateFiles` with
|
||||
* a different extension
|
||||
*/
|
||||
modelTemplateFiles.put(
|
||||
"model-header.mustache",
|
||||
".h");
|
||||
|
||||
modelTemplateFiles.put(
|
||||
"model-body.mustache",
|
||||
".cpp");
|
||||
|
||||
/**
|
||||
* Api classes. You can write classes for each Api file with the apiTemplateFiles map.
|
||||
* as with models, add multiple entries with different extensions for multiple files per
|
||||
* class
|
||||
*/
|
||||
apiTemplateFiles.put(
|
||||
"api-header.mustache", // the template to use
|
||||
".h"); // the extension for each file to write
|
||||
|
||||
apiTemplateFiles.put(
|
||||
"api-body.mustache", // the template to use
|
||||
".cpp"); // the extension for each file to write
|
||||
|
||||
/**
|
||||
* Template Location. This is the location which templates will be read from. The generator
|
||||
* will use the resource stream to attempt to read the templates.
|
||||
*/
|
||||
templateDir = "qt5cpp";
|
||||
|
||||
/**
|
||||
* Reserved words. Override this with reserved words specific to your language
|
||||
*/
|
||||
reservedWords = new HashSet<String> (
|
||||
Arrays.asList(
|
||||
"sample1", // replace with static values
|
||||
"sample2")
|
||||
);
|
||||
|
||||
/**
|
||||
* Additional Properties. These values can be passed to the templates and
|
||||
* are available in models, apis, and supporting files
|
||||
*/
|
||||
additionalProperties.put("apiVersion", apiVersion);
|
||||
additionalProperties().put("prefix", PREFIX);
|
||||
|
||||
/**
|
||||
* Language Specific Primitives. These types will not trigger imports by
|
||||
* the client generator
|
||||
*/
|
||||
languageSpecificPrimitives = new HashSet<String>(
|
||||
Arrays.asList(
|
||||
"bool",
|
||||
"qint32",
|
||||
"qint64")
|
||||
);
|
||||
|
||||
supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, PREFIX + "Helpers.h"));
|
||||
supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder, PREFIX + "Helpers.cpp"));
|
||||
supportingFiles.add(new SupportingFile("HttpRequest.h", sourceFolder, PREFIX + "HttpRequest.h"));
|
||||
supportingFiles.add(new SupportingFile("HttpRequest.cpp", sourceFolder, PREFIX + "HttpRequest.cpp"));
|
||||
supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, PREFIX + "ModelFactory.h"));
|
||||
supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, PREFIX + "Object.h"));
|
||||
|
||||
super.typeMapping = new HashMap<String, String>();
|
||||
|
||||
typeMapping.put("Date", "QDate");
|
||||
typeMapping.put("DateTime", "QDateTime");
|
||||
typeMapping.put("string", "QString");
|
||||
typeMapping.put("integer", "qint32");
|
||||
typeMapping.put("long", "qint64");
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("array", "QList");
|
||||
typeMapping.put("map", "QMap");
|
||||
// typeMapping.put("number", "Long");
|
||||
typeMapping.put("object", PREFIX + "Object");
|
||||
|
||||
importMapping = new HashMap<String, String>();
|
||||
|
||||
namespaces = new HashMap<String, String> ();
|
||||
|
||||
foundationClasses.add("QString");
|
||||
|
||||
systemIncludes.add("QString");
|
||||
systemIncludes.add("QList");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toModelImport(String name) {
|
||||
if(namespaces.containsKey(name)) {
|
||||
return "using " + namespaces.get(name) + ";";
|
||||
}
|
||||
else if(systemIncludes.contains(name)) {
|
||||
return "#include <" + name + ">";
|
||||
}
|
||||
return "#include \"" + name + ".h\"";
|
||||
}
|
||||
|
||||
/**
|
||||
* Escapes a reserved word as defined in the `reservedWords` array. Handle escaping
|
||||
* those terms here. This logic is only called if a variable matches the reseved words
|
||||
*
|
||||
* @return the escaped term
|
||||
*/
|
||||
@Override
|
||||
public String escapeReservedWord(String name) {
|
||||
return "_" + name; // add an underscore to the name
|
||||
}
|
||||
|
||||
/**
|
||||
* Location to write model files. You can use the modelPackage() as defined when the class is
|
||||
* instantiated
|
||||
*/
|
||||
public String modelFileFolder() {
|
||||
return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar);
|
||||
}
|
||||
|
||||
/**
|
||||
* Location to write api files. You can use the apiPackage() as defined when the class is
|
||||
* instantiated
|
||||
*/
|
||||
@Override
|
||||
public String apiFileFolder() {
|
||||
return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toModelFilename(String name) {
|
||||
return PREFIX + initialCaps(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toApiFilename(String name) {
|
||||
return PREFIX + initialCaps(name) + "Api";
|
||||
}
|
||||
|
||||
/**
|
||||
* Optional - type declaration. This is a String which is used by the templates to instantiate your
|
||||
* types. There is typically special handling for different property types
|
||||
*
|
||||
* @return a string value used as the `dataType` field for model templates, `returnType` for api templates
|
||||
*/
|
||||
@Override
|
||||
public String getTypeDeclaration(Property p) {
|
||||
String swaggerType = getSwaggerType(p);
|
||||
|
||||
if(p instanceof ArrayProperty) {
|
||||
ArrayProperty ap = (ArrayProperty) p;
|
||||
Property inner = ap.getItems();
|
||||
return getSwaggerType(p) + "<" + getTypeDeclaration(inner) + ">*";
|
||||
}
|
||||
else if (p instanceof MapProperty) {
|
||||
MapProperty mp = (MapProperty) p;
|
||||
Property inner = mp.getAdditionalProperties();
|
||||
return getSwaggerType(p) + "<String, " + getTypeDeclaration(inner) + ">*";
|
||||
}
|
||||
if(foundationClasses.contains(swaggerType))
|
||||
return swaggerType + "*";
|
||||
else if(languageSpecificPrimitives.contains(swaggerType))
|
||||
return toModelName(swaggerType);
|
||||
else
|
||||
return swaggerType + "*";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toDefaultValue(Property p) {
|
||||
if(p instanceof StringProperty)
|
||||
return "new QString(\"\")";
|
||||
else if (p instanceof BooleanProperty)
|
||||
return "false";
|
||||
else if(p instanceof DateProperty)
|
||||
return "NULL";
|
||||
else if(p instanceof DateTimeProperty)
|
||||
return "NULL";
|
||||
else if (p instanceof DoubleProperty)
|
||||
return "0.0";
|
||||
else if (p instanceof FloatProperty)
|
||||
return "0.0f";
|
||||
else if (p instanceof IntegerProperty)
|
||||
return "0";
|
||||
else if (p instanceof LongProperty)
|
||||
return "0L";
|
||||
else if (p instanceof DecimalProperty)
|
||||
return "0.0";
|
||||
else if (p instanceof MapProperty) {
|
||||
MapProperty ap = (MapProperty) p;
|
||||
String inner = getSwaggerType(ap.getAdditionalProperties());
|
||||
return "NULL";
|
||||
}
|
||||
else if (p instanceof ArrayProperty) {
|
||||
ArrayProperty ap = (ArrayProperty) p;
|
||||
String inner = getSwaggerType(ap.getItems());
|
||||
if(!languageSpecificPrimitives.contains(inner)) {
|
||||
inner += "*";
|
||||
}
|
||||
return "new QList<" + inner + ">()";
|
||||
}
|
||||
// else
|
||||
if(p instanceof RefProperty) {
|
||||
RefProperty rp = (RefProperty) p;
|
||||
return "new " + toModelName(rp.getSimpleRef()) + "()";
|
||||
}
|
||||
return "NULL";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Optional - swagger type conversion. This is used to map swagger types in a `Property` into
|
||||
* either language specific types via `typeMapping` or into complex models if there is not a mapping.
|
||||
*
|
||||
* @return a string value of the type or complex model for this property
|
||||
* @see com.wordnik.swagger.models.properties.Property
|
||||
*/
|
||||
@Override
|
||||
public String getSwaggerType(Property p) {
|
||||
String swaggerType = super.getSwaggerType(p);
|
||||
String type = null;
|
||||
if(typeMapping.containsKey(swaggerType)) {
|
||||
type = typeMapping.get(swaggerType);
|
||||
if(languageSpecificPrimitives.contains(type))
|
||||
return toModelName(type);
|
||||
if(foundationClasses.contains(type))
|
||||
return type;
|
||||
}
|
||||
else
|
||||
type = swaggerType;
|
||||
return toModelName(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toModelName(String type) {
|
||||
if(typeMapping.keySet().contains(type) ||
|
||||
typeMapping.values().contains(type) ||
|
||||
importMapping.values().contains(type) ||
|
||||
defaultIncludes.contains(type) ||
|
||||
languageSpecificPrimitives.contains(type)) {
|
||||
return type;
|
||||
}
|
||||
else {
|
||||
return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toApiName(String type) {
|
||||
return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1) + "Api";
|
||||
}
|
||||
}
|
@ -0,0 +1,297 @@
|
||||
#include "SWGHttpRequest.h"
|
||||
#include <QDateTime>
|
||||
#include <QUrl>
|
||||
#include <QFileInfo>
|
||||
#include <QBuffer>
|
||||
|
||||
|
||||
HttpRequestInput::HttpRequestInput() {
|
||||
initialize();
|
||||
}
|
||||
|
||||
HttpRequestInput::HttpRequestInput(QString v_url_str, QString v_http_method) {
|
||||
initialize();
|
||||
url_str = v_url_str;
|
||||
http_method = v_http_method;
|
||||
}
|
||||
|
||||
void HttpRequestInput::initialize() {
|
||||
var_layout = NOT_SET;
|
||||
url_str = "";
|
||||
http_method = "GET";
|
||||
}
|
||||
|
||||
void HttpRequestInput::add_var(QString key, QString value) {
|
||||
vars[key] = value;
|
||||
}
|
||||
|
||||
void HttpRequestInput::add_file(QString variable_name, QString local_filename, QString request_filename, QString mime_type) {
|
||||
HttpRequestInputFileElement file;
|
||||
file.variable_name = variable_name;
|
||||
file.local_filename = local_filename;
|
||||
file.request_filename = request_filename;
|
||||
file.mime_type = mime_type;
|
||||
files.append(file);
|
||||
}
|
||||
|
||||
|
||||
HttpRequestWorker::HttpRequestWorker(QObject *parent)
|
||||
: QObject(parent), manager(NULL)
|
||||
{
|
||||
qsrand(QDateTime::currentDateTime().toTime_t());
|
||||
|
||||
manager = new QNetworkAccessManager(this);
|
||||
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(on_manager_finished(QNetworkReply*)));
|
||||
}
|
||||
|
||||
HttpRequestWorker::~HttpRequestWorker() {
|
||||
}
|
||||
|
||||
QString HttpRequestWorker::http_attribute_encode(QString attribute_name, QString input) {
|
||||
// result structure follows RFC 5987
|
||||
bool need_utf_encoding = false;
|
||||
QString result = "";
|
||||
QByteArray input_c = input.toLocal8Bit();
|
||||
char c;
|
||||
for (int i = 0; i < input_c.length(); i++) {
|
||||
c = input_c.at(i);
|
||||
if (c == '\\' || c == '/' || c == '\0' || c < ' ' || c > '~') {
|
||||
// ignore and request utf-8 version
|
||||
need_utf_encoding = true;
|
||||
}
|
||||
else if (c == '"') {
|
||||
result += "\\\"";
|
||||
}
|
||||
else {
|
||||
result += c;
|
||||
}
|
||||
}
|
||||
|
||||
if (result.length() == 0) {
|
||||
need_utf_encoding = true;
|
||||
}
|
||||
|
||||
if (!need_utf_encoding) {
|
||||
// return simple version
|
||||
return QString("%1=\"%2\"").arg(attribute_name, result);
|
||||
}
|
||||
|
||||
QString result_utf8 = "";
|
||||
for (int i = 0; i < input_c.length(); i++) {
|
||||
c = input_c.at(i);
|
||||
if (
|
||||
(c >= '0' && c <= '9')
|
||||
|| (c >= 'A' && c <= 'Z')
|
||||
|| (c >= 'a' && c <= 'z')
|
||||
) {
|
||||
result_utf8 += c;
|
||||
}
|
||||
else {
|
||||
result_utf8 += "%" + QString::number(static_cast<unsigned char>(input_c.at(i)), 16).toUpper();
|
||||
}
|
||||
}
|
||||
|
||||
// return enhanced version with UTF-8 support
|
||||
return QString("%1=\"%2\"; %1*=utf-8''%3").arg(attribute_name, result, result_utf8);
|
||||
}
|
||||
|
||||
void HttpRequestWorker::execute(HttpRequestInput *input) {
|
||||
|
||||
// reset variables
|
||||
|
||||
QByteArray request_content = "";
|
||||
response = "";
|
||||
error_type = QNetworkReply::NoError;
|
||||
error_str = "";
|
||||
|
||||
|
||||
// decide on the variable layout
|
||||
|
||||
if (input->files.length() > 0) {
|
||||
input->var_layout = MULTIPART;
|
||||
}
|
||||
if (input->var_layout == NOT_SET) {
|
||||
input->var_layout = input->http_method == "GET" || input->http_method == "HEAD" ? ADDRESS : URL_ENCODED;
|
||||
}
|
||||
|
||||
|
||||
// prepare request content
|
||||
|
||||
QString boundary = "";
|
||||
|
||||
if (input->var_layout == ADDRESS || input->var_layout == URL_ENCODED) {
|
||||
// variable layout is ADDRESS or URL_ENCODED
|
||||
|
||||
if (input->vars.count() > 0) {
|
||||
bool first = true;
|
||||
foreach (QString key, input->vars.keys()) {
|
||||
if (!first) {
|
||||
request_content.append("&");
|
||||
}
|
||||
first = false;
|
||||
|
||||
request_content.append(QUrl::toPercentEncoding(key));
|
||||
request_content.append("=");
|
||||
request_content.append(QUrl::toPercentEncoding(input->vars.value(key)));
|
||||
}
|
||||
|
||||
if (input->var_layout == ADDRESS) {
|
||||
input->url_str += "?" + request_content;
|
||||
request_content = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
// variable layout is MULTIPART
|
||||
|
||||
boundary = "__-----------------------"
|
||||
+ QString::number(QDateTime::currentDateTime().toTime_t())
|
||||
+ QString::number(qrand());
|
||||
QString boundary_delimiter = "--";
|
||||
QString new_line = "\r\n";
|
||||
|
||||
// add variables
|
||||
foreach (QString key, input->vars.keys()) {
|
||||
// add boundary
|
||||
request_content.append(boundary_delimiter);
|
||||
request_content.append(boundary);
|
||||
request_content.append(new_line);
|
||||
|
||||
// add header
|
||||
request_content.append("Content-Disposition: form-data; ");
|
||||
request_content.append(http_attribute_encode("name", key));
|
||||
request_content.append(new_line);
|
||||
request_content.append("Content-Type: text/plain");
|
||||
request_content.append(new_line);
|
||||
|
||||
// add header to body splitter
|
||||
request_content.append(new_line);
|
||||
|
||||
// add variable content
|
||||
request_content.append(input->vars.value(key));
|
||||
request_content.append(new_line);
|
||||
}
|
||||
|
||||
// add files
|
||||
for (QList<HttpRequestInputFileElement>::iterator file_info = input->files.begin(); file_info != input->files.end(); file_info++) {
|
||||
QFileInfo fi(file_info->local_filename);
|
||||
|
||||
// ensure necessary variables are available
|
||||
if (
|
||||
file_info->local_filename == NULL || file_info->local_filename.isEmpty()
|
||||
|| file_info->variable_name == NULL || file_info->variable_name.isEmpty()
|
||||
|| !fi.exists() || !fi.isFile() || !fi.isReadable()
|
||||
) {
|
||||
// silent abort for the current file
|
||||
continue;
|
||||
}
|
||||
|
||||
QFile file(file_info->local_filename);
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
// silent abort for the current file
|
||||
continue;
|
||||
}
|
||||
|
||||
// ensure filename for the request
|
||||
if (file_info->request_filename == NULL || file_info->request_filename.isEmpty()) {
|
||||
file_info->request_filename = fi.fileName();
|
||||
if (file_info->request_filename.isEmpty()) {
|
||||
file_info->request_filename = "file";
|
||||
}
|
||||
}
|
||||
|
||||
// add boundary
|
||||
request_content.append(boundary_delimiter);
|
||||
request_content.append(boundary);
|
||||
request_content.append(new_line);
|
||||
|
||||
// add header
|
||||
request_content.append(QString("Content-Disposition: form-data; %1; %2").arg(
|
||||
http_attribute_encode("name", file_info->variable_name),
|
||||
http_attribute_encode("filename", file_info->request_filename)
|
||||
));
|
||||
request_content.append(new_line);
|
||||
|
||||
if (file_info->mime_type != NULL && !file_info->mime_type.isEmpty()) {
|
||||
request_content.append("Content-Type: ");
|
||||
request_content.append(file_info->mime_type);
|
||||
request_content.append(new_line);
|
||||
}
|
||||
|
||||
request_content.append("Content-Transfer-Encoding: binary");
|
||||
request_content.append(new_line);
|
||||
|
||||
// add header to body splitter
|
||||
request_content.append(new_line);
|
||||
|
||||
// add file content
|
||||
request_content.append(file.readAll());
|
||||
request_content.append(new_line);
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
// add end of body
|
||||
request_content.append(boundary_delimiter);
|
||||
request_content.append(boundary);
|
||||
request_content.append(boundary_delimiter);
|
||||
}
|
||||
|
||||
if(input->request_body.size() > 0) {
|
||||
qDebug() << "got a request body";
|
||||
request_content.clear();
|
||||
request_content.append(input->request_body);
|
||||
}
|
||||
// prepare connection
|
||||
|
||||
QNetworkRequest request = QNetworkRequest(QUrl(input->url_str));
|
||||
request.setRawHeader("User-Agent", "Swagger-Client");
|
||||
foreach(QString key, input->headers.keys()) {
|
||||
request.setRawHeader(key.toStdString().c_str(), input->headers.value(key).toStdString().c_str());
|
||||
}
|
||||
|
||||
if (request_content.size() > 0) {
|
||||
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
}
|
||||
else if (input->var_layout == URL_ENCODED) {
|
||||
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
|
||||
}
|
||||
else if (input->var_layout == MULTIPART) {
|
||||
request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary);
|
||||
}
|
||||
|
||||
if (input->http_method == "GET") {
|
||||
manager->get(request);
|
||||
}
|
||||
else if (input->http_method == "POST") {
|
||||
manager->post(request, request_content);
|
||||
}
|
||||
else if (input->http_method == "PUT") {
|
||||
manager->put(request, request_content);
|
||||
}
|
||||
else if (input->http_method == "HEAD") {
|
||||
manager->head(request);
|
||||
}
|
||||
else if (input->http_method == "DELETE") {
|
||||
manager->deleteResource(request);
|
||||
}
|
||||
else {
|
||||
QBuffer buff(&request_content);
|
||||
manager->sendCustomRequest(request, input->http_method.toLatin1(), &buff);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void HttpRequestWorker::on_manager_finished(QNetworkReply *reply) {
|
||||
error_type = reply->error();
|
||||
if (error_type == QNetworkReply::NoError) {
|
||||
response = reply->readAll();
|
||||
}
|
||||
else {
|
||||
error_str = reply->errorString();
|
||||
}
|
||||
|
||||
reply->deleteLater();
|
||||
|
||||
emit on_execution_finished(this);
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
/**
|
||||
* Based on http://www.creativepulse.gr/en/blog/2014/restful-api-requests-using-qt-cpp-for-linux-mac-osx-ms-windows
|
||||
* By Alex Stylianos
|
||||
*
|
||||
**/
|
||||
|
||||
#ifndef HTTPREQUESTWORKER_H
|
||||
#define HTTPREQUESTWORKER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QMap>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
|
||||
|
||||
enum HttpRequestVarLayout {NOT_SET, ADDRESS, URL_ENCODED, MULTIPART};
|
||||
|
||||
|
||||
class HttpRequestInputFileElement {
|
||||
|
||||
public:
|
||||
QString variable_name;
|
||||
QString local_filename;
|
||||
QString request_filename;
|
||||
QString mime_type;
|
||||
|
||||
};
|
||||
|
||||
|
||||
class HttpRequestInput {
|
||||
|
||||
public:
|
||||
QString url_str;
|
||||
QString http_method;
|
||||
HttpRequestVarLayout var_layout;
|
||||
QMap<QString, QString> vars;
|
||||
QMap<QString, QString> headers;
|
||||
QList<HttpRequestInputFileElement> files;
|
||||
QByteArray request_body;
|
||||
|
||||
HttpRequestInput();
|
||||
HttpRequestInput(QString v_url_str, QString v_http_method);
|
||||
void initialize();
|
||||
void add_var(QString key, QString value);
|
||||
void add_file(QString variable_name, QString local_filename, QString request_filename, QString mime_type);
|
||||
|
||||
};
|
||||
|
||||
|
||||
class HttpRequestWorker : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QByteArray response;
|
||||
QNetworkReply::NetworkError error_type;
|
||||
QString error_str;
|
||||
|
||||
explicit HttpRequestWorker(QObject *parent = 0);
|
||||
virtual ~HttpRequestWorker();
|
||||
|
||||
QString http_attribute_encode(QString attribute_name, QString input);
|
||||
void execute(HttpRequestInput *input);
|
||||
|
||||
signals:
|
||||
void on_execution_finished(HttpRequestWorker *worker);
|
||||
|
||||
private:
|
||||
QNetworkAccessManager *manager;
|
||||
|
||||
private slots:
|
||||
void on_manager_finished(QNetworkReply *reply);
|
||||
|
||||
};
|
||||
|
||||
#endif // HTTPREQUESTWORKER_H
|
@ -0,0 +1,107 @@
|
||||
#include "{{classname}}.h"
|
||||
#include "{{prefix}}Helpers.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
|
||||
namespace Swagger {
|
||||
{{classname}}::{{classname}}() {}
|
||||
|
||||
{{classname}}::~{{classname}}() {}
|
||||
|
||||
{{classname}}::{{classname}}(QString host, QString basePath) {
|
||||
this->host = host;
|
||||
this->basePath = basePath;
|
||||
}
|
||||
|
||||
{{#operations}}
|
||||
{{#operation}}
|
||||
void
|
||||
{{classname}}::{{nickname}}({{#allParams}}{{dataType}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {
|
||||
QString fullPath;
|
||||
fullPath.append(this->host).append(this->basePath).append("{{path}}");
|
||||
|
||||
{{#pathParams}}
|
||||
QString {{paramName}}PathParam("{"); {{paramName}}PathParam.append("{{paramName}}").append("}");
|
||||
fullPath.replace({{paramName}}PathParam, stringValue({{paramName}}));
|
||||
{{/pathParams}}
|
||||
|
||||
{{#queryParams}}if(fullPath.compare("?") > 0) fullPath.append("?");
|
||||
else fullPath.append("&");
|
||||
fullPath.append(QUrl::toPercentEncoding("{{paramName}}"))
|
||||
.append("=")
|
||||
.append(QUrl::toPercentEncoding(stringValue({{paramName}})));
|
||||
{{/queryParams}}
|
||||
|
||||
// qDebug() << fullPath;
|
||||
|
||||
HttpRequestWorker *worker = new HttpRequestWorker();
|
||||
HttpRequestInput input(fullPath, "{{httpMethod}}");
|
||||
|
||||
{{#bodyParams}}
|
||||
// body
|
||||
input.request_body.append({{paramName}}.asJson());
|
||||
{{/bodyParams}}
|
||||
|
||||
{{#headerParams}}
|
||||
input.headers
|
||||
{{/headerParams}}
|
||||
|
||||
connect(worker,
|
||||
&HttpRequestWorker::on_execution_finished,
|
||||
this,
|
||||
&{{classname}}::{{nickname}}Callback);
|
||||
|
||||
worker->execute(&input);
|
||||
}
|
||||
|
||||
void
|
||||
{{classname}}::{{nickname}}Callback(HttpRequestWorker * worker) {
|
||||
QString msg;
|
||||
if (worker->error_type == QNetworkReply::NoError) {
|
||||
msg = QString("Success! %1 bytes").arg(worker->response.length());
|
||||
}
|
||||
else {
|
||||
msg = "Error: " + worker->error_str;
|
||||
}
|
||||
|
||||
// return type: {{{returnType}}}
|
||||
|
||||
{{#returnType}}
|
||||
{{#isListContainer}}
|
||||
{{{returnType}}} output = {{{defaultResponse}}};
|
||||
QString json(worker->response);
|
||||
QByteArray array (json.toStdString().c_str());
|
||||
QJsonDocument doc = QJsonDocument::fromJson(array);
|
||||
QJsonArray jsonArray = doc.array();
|
||||
|
||||
foreach(QJsonValue obj, jsonArray) {
|
||||
{{returnBaseType}}* o = new {{returnBaseType}}();
|
||||
QJsonObject jv = obj.toObject();
|
||||
QJsonObject * ptr = (QJsonObject*)&jv;
|
||||
o->fromJsonObject(*ptr);
|
||||
output->append(o);
|
||||
}
|
||||
|
||||
|
||||
// void toJsonArray(QList<void*>* value, QJsonArray* output, QString innerName, QString innerType);
|
||||
{{/isListContainer}}
|
||||
|
||||
{{^isListContainer}}{{#returnTypeIsPrimitive}}
|
||||
{{returnType}} output; // TODO
|
||||
|
||||
{{/returnTypeIsPrimitive}}
|
||||
{{^returnTypeIsPrimitive}}QString json(worker->response);
|
||||
{{returnType}} output = new {{returnBaseType}}(&json);
|
||||
|
||||
{{/returnTypeIsPrimitive}}
|
||||
{{/isListContainer}}{{/returnType}}
|
||||
|
||||
worker->deleteLater();
|
||||
|
||||
{{#returnType}}emit {{nickname}}Signal(output);{{/returnType}}
|
||||
{{^returnType}}emit {{nickname}}Signal();{{/returnType}}
|
||||
}
|
||||
{{/operation}}
|
||||
{{/operations}}
|
||||
} /* namespace Swagger */
|
@ -0,0 +1,34 @@
|
||||
#ifndef _SWG_{{classname}}_H_
|
||||
#define _SWG_{{classname}}_H_
|
||||
|
||||
#include "{{prefix}}HttpRequest.h"
|
||||
|
||||
{{#imports}}{{{import}}}
|
||||
{{/imports}}
|
||||
|
||||
#include <QObject>
|
||||
|
||||
namespace Swagger {
|
||||
|
||||
class {{classname}}: public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
{{classname}}();
|
||||
{{classname}}(QString host, QString basePath);
|
||||
~{{classname}}();
|
||||
|
||||
QString host;
|
||||
QString basePath;
|
||||
|
||||
{{#operations}}{{#operation}}void {{nickname}}({{#allParams}}{{dataType}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
|
||||
{{/operation}}{{/operations}}
|
||||
private:
|
||||
{{#operations}}{{#operation}}void {{nickname}}Callback (HttpRequestWorker * worker);
|
||||
{{/operation}}{{/operations}}
|
||||
signals:
|
||||
{{#operations}}{{#operation}}void {{nickname}}Signal({{#returnType}}{{{returnType}}} summary{{/returnType}});
|
||||
{{/operation}}{{/operations}}
|
||||
};
|
||||
}
|
||||
#endif
|
@ -0,0 +1,161 @@
|
||||
#include "SWGHelpers.h"
|
||||
#include "SWGModelFactory.h"
|
||||
#include "SWGObject.h"
|
||||
#import <QDebug>
|
||||
#import <QJsonArray>
|
||||
#import <QJsonValue>
|
||||
|
||||
namespace Swagger {
|
||||
|
||||
void
|
||||
setValue(void* value, QJsonValue obj, QString type, QString complexType) {
|
||||
if(value == NULL) {
|
||||
// can't set value with a null pointer
|
||||
return;
|
||||
}
|
||||
if(QStringLiteral("bool").compare(type) == 0) {
|
||||
bool * val = static_cast<bool*>(value);
|
||||
*val = obj.toBool();
|
||||
}
|
||||
else if(QStringLiteral("qint32").compare(type) == 0) {
|
||||
qint32 *val = static_cast<qint32*>(value);
|
||||
*val = obj.toInt();
|
||||
}
|
||||
else if(QStringLiteral("qint64").compare(type) == 0) {
|
||||
qint64 *val = static_cast<qint64*>(value);
|
||||
*val = obj.toVariant().toLongLong();
|
||||
}
|
||||
else if (QStringLiteral("QString").compare(type) == 0) {
|
||||
QString **val = static_cast<QString**>(value);
|
||||
|
||||
if(val != NULL) {
|
||||
if(!obj.isNull()) {
|
||||
// create a new value and return
|
||||
delete *val;
|
||||
*val = new QString(obj.toString());
|
||||
return;
|
||||
}
|
||||
else {
|
||||
// set target to NULL
|
||||
delete *val;
|
||||
*val = NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
qDebug() << "Can't set value because the target pointer is NULL";
|
||||
}
|
||||
}
|
||||
else if(type.startsWith("SWG") && obj.isObject()) {
|
||||
// complex type
|
||||
QJsonObject jsonObj = obj.toObject();
|
||||
SWGObject * so = (SWGObject*)Swagger::create(type);
|
||||
if(so != NULL) {
|
||||
so->fromJsonObject(jsonObj);
|
||||
SWGObject **val = static_cast<SWGObject**>(value);
|
||||
delete *val;
|
||||
*val = so;
|
||||
}
|
||||
}
|
||||
else if(type.startsWith("QList") && QString("").compare(complexType) != 0 && obj.isArray()) {
|
||||
// list of values
|
||||
QList<void*>* output = new QList<void*>();
|
||||
QJsonArray arr = obj.toArray();
|
||||
foreach (const QJsonValue & jval, arr) {
|
||||
if(complexType.startsWith("SWG")) {
|
||||
// it's an object
|
||||
SWGObject * val = (SWGObject*)create(complexType);
|
||||
QJsonObject t = jval.toObject();
|
||||
|
||||
val->fromJsonObject(t);
|
||||
output->append(val);
|
||||
}
|
||||
else {
|
||||
// primitives
|
||||
if(QStringLiteral("qint32").compare(complexType) == 0) {
|
||||
qint32 val;
|
||||
setValue(&val, jval, QStringLiteral("qint32"), QStringLiteral(""));
|
||||
output->append((void*)&val);
|
||||
}
|
||||
else if(QStringLiteral("qint64").compare(complexType) == 0) {
|
||||
qint64 val;
|
||||
setValue(&val, jval, QStringLiteral("qint64"), QStringLiteral(""));
|
||||
output->append((void*)&val);
|
||||
}
|
||||
else if(QStringLiteral("bool").compare(complexType) == 0) {
|
||||
bool val;
|
||||
setValue(&val, jval, QStringLiteral("bool"), QStringLiteral(""));
|
||||
output->append((void*)&val);
|
||||
}
|
||||
}
|
||||
}
|
||||
QList<void*> **val = static_cast<QList<void*>**>(value);
|
||||
delete *val;
|
||||
*val = output;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
toJsonValue(QString name, void* value, QJsonObject* output, QString type) {
|
||||
if(value == NULL) {
|
||||
return;
|
||||
}
|
||||
if(type.startsWith("SWG")) {
|
||||
SWGObject *swgObject = reinterpret_cast<SWGObject *>(value);
|
||||
if(swgObject != NULL) {
|
||||
QJsonObject* o = (*swgObject).asJsonObject();
|
||||
if(name != NULL) {
|
||||
output->insert(name, *o);
|
||||
delete o;
|
||||
}
|
||||
else {
|
||||
output->empty();
|
||||
foreach(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));
|
||||
}
|
||||
else if(QStringLiteral("qint32").compare(type) == 0) {
|
||||
qint32* str = static_cast<qint32*>(value);
|
||||
output->insert(name, QJsonValue(*str));
|
||||
}
|
||||
else if(QStringLiteral("qint64").compare(type) == 0) {
|
||||
qint64* str = static_cast<qint64*>(value);
|
||||
output->insert(name, QJsonValue(*str));
|
||||
}
|
||||
else if(QStringLiteral("bool").compare(type) == 0) {
|
||||
bool* str = static_cast<bool*>(value);
|
||||
output->insert(name, QJsonValue(*str));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
toJsonArray(QList<void*>* value, QJsonArray* output, QString innerName, QString innerType) {
|
||||
foreach(void* obj, *value) {
|
||||
QJsonObject element;
|
||||
|
||||
toJsonValue(NULL, obj, &element, innerType);
|
||||
output->append(element);
|
||||
}
|
||||
}
|
||||
|
||||
QString
|
||||
stringValue(QString* value) {
|
||||
QString* str = static_cast<QString*>(value);
|
||||
return QString(*str);
|
||||
}
|
||||
|
||||
QString
|
||||
stringValue(qint32 value) {
|
||||
return QString::number(value);
|
||||
}
|
||||
|
||||
QString
|
||||
stringValue(bool value) {
|
||||
return QString(value ? "true" : "false");
|
||||
}
|
||||
} /* namespace Swagger */
|
@ -0,0 +1,16 @@
|
||||
#ifndef SWGHELPERS_H
|
||||
#define SWGHELPERS_H
|
||||
|
||||
#include <QJsonValue>
|
||||
|
||||
namespace Swagger {
|
||||
void setValue(void* value, QJsonValue obj, QString type, QString complexType);
|
||||
void toJsonArray(QList<void*>* value, QJsonArray* output, QString innerName, QString innerType);
|
||||
void toJsonValue(QString name, void* value, QJsonObject* output, QString type);
|
||||
bool isCompatibleJsonValue(QString type);
|
||||
QString stringValue(QString* value);
|
||||
QString stringValue(qint32 value);
|
||||
QString stringValue(bool value);
|
||||
}
|
||||
|
||||
#endif // SWGHELPERS_H
|
@ -0,0 +1,109 @@
|
||||
{{#models}}{{#model}}
|
||||
#include "{{classname}}.h"
|
||||
|
||||
#include "SWGHelpers.h"
|
||||
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonArray>
|
||||
#include <QObject>
|
||||
#include <QDebug>
|
||||
|
||||
namespace Swagger {
|
||||
|
||||
|
||||
{{classname}}::{{classname}}(QString* json) {
|
||||
init();
|
||||
this->fromJson(*json);
|
||||
}
|
||||
|
||||
{{classname}}::{{classname}}() {
|
||||
init();
|
||||
}
|
||||
|
||||
{{classname}}::~{{classname}}() {
|
||||
this->cleanup();
|
||||
}
|
||||
|
||||
void
|
||||
{{classname}}::init() {
|
||||
{{#vars}}{{name}} = {{{defaultValue}}};
|
||||
{{/vars}}
|
||||
}
|
||||
|
||||
void
|
||||
{{classname}}::cleanup() {
|
||||
{{#vars}}{{#complexType}}if({{name}} != NULL) {
|
||||
{{#isContainer}}QList<{{complexType}}*>* arr = {{name}};
|
||||
foreach({{complexType}}* o, *arr) {
|
||||
delete o;
|
||||
}
|
||||
{{/isContainer}}delete {{name}};
|
||||
}{{/complexType}}
|
||||
{{/vars}}
|
||||
}
|
||||
|
||||
{{classname}}*
|
||||
{{classname}}::fromJson(QString &json) {
|
||||
QByteArray array (json.toStdString().c_str());
|
||||
QJsonDocument doc = QJsonDocument::fromJson(array);
|
||||
QJsonObject jsonObject = doc.object();
|
||||
this->fromJsonObject(jsonObject);
|
||||
return this;
|
||||
}
|
||||
|
||||
void
|
||||
{{classname}}::fromJsonObject(QJsonObject &pJson) {
|
||||
{{#vars}}setValue(&{{name}}, pJson["{{name}}"], "{{baseType}}", "{{complexType}}");
|
||||
{{/vars}}
|
||||
}
|
||||
|
||||
QString
|
||||
{{classname}}::asJson ()
|
||||
{
|
||||
QJsonObject* obj = this->asJsonObject();
|
||||
|
||||
QJsonDocument doc(*obj);
|
||||
QByteArray bytes = doc.toJson();
|
||||
return QString(bytes);
|
||||
}
|
||||
|
||||
QJsonObject*
|
||||
{{classname}}::asJsonObject() {
|
||||
QJsonObject* obj = new QJsonObject();
|
||||
{{#vars}}{{#complexType}}
|
||||
{{^isContainer}}{{#complexType}}
|
||||
toJsonValue(QString("{{name}}"), {{name}}, obj, QString("{{complexType}}"));
|
||||
{{/complexType}}{{^complexType}}
|
||||
else if({{name}} != NULL && *{{name}} != NULL) {
|
||||
obj->insert("{{name}}", QJsonValue(*{{name}}));
|
||||
}{{/complexType}}
|
||||
{{/isContainer}}{{#isContainer}}
|
||||
QList<{{complexType}}*>* {{name}}List = {{name}};
|
||||
QJsonArray {{name}}JsonArray;
|
||||
toJsonArray((QList<void*>*){{name}}, &{{name}}JsonArray, "{{name}}", "{{complexType}}");
|
||||
|
||||
obj->insert("{{name}}", {{name}}JsonArray);
|
||||
{{/isContainer}}
|
||||
{{/complexType}}{{^complexType}}obj->insert("{{name}}", QJsonValue({{name}}));{{/complexType}}
|
||||
{{/vars}}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
{{#vars}}
|
||||
{{{datatype}}}
|
||||
{{classname}}::{{getter}}() {
|
||||
return {{name}};
|
||||
}
|
||||
void
|
||||
{{classname}}::{{setter}}({{{datatype}}} {{name}}) {
|
||||
this->{{name}} = {{name}};
|
||||
}
|
||||
|
||||
{{/vars}}
|
||||
|
||||
|
||||
} /* namespace Swagger */
|
||||
|
||||
{{/model}}
|
||||
{{/models}}
|
@ -0,0 +1,47 @@
|
||||
{{#models}}{{#model}}/*
|
||||
* {{classname}}.h
|
||||
*
|
||||
* {{description}}
|
||||
*/
|
||||
|
||||
#ifndef {{classname}}_H_
|
||||
#define {{classname}}_H_
|
||||
|
||||
#include <QJsonObject>
|
||||
|
||||
{{/model}}{{/models}}
|
||||
{{#imports}}{{{import}}}
|
||||
{{/imports}}
|
||||
|
||||
#include "SWGObject.h"
|
||||
|
||||
{{#models}}{{#model}}
|
||||
namespace Swagger {
|
||||
|
||||
class {{classname}}: public SWGObject {
|
||||
public:
|
||||
{{classname}}();
|
||||
{{classname}}(QString* json);
|
||||
virtual ~{{classname}}();
|
||||
void init();
|
||||
void cleanup();
|
||||
|
||||
QString asJson ();
|
||||
QJsonObject* asJsonObject();
|
||||
void fromJsonObject(QJsonObject &json);
|
||||
{{classname}}* fromJson(QString &jsonString);
|
||||
|
||||
{{#vars}}{{{datatype}}} {{getter}}();
|
||||
void {{setter}}({{{datatype}}} {{name}});
|
||||
{{/vars}}
|
||||
|
||||
private:
|
||||
{{#vars}}{{{datatype}}} {{name}};
|
||||
{{/vars}}
|
||||
};
|
||||
|
||||
} /* namespace Swagger */
|
||||
|
||||
#endif /* {{classname}}_H_ */
|
||||
{{/model}}
|
||||
{{/models}}
|
@ -0,0 +1,58 @@
|
||||
{{#models}}{{#model}}/*
|
||||
* {{classname}}.h
|
||||
*
|
||||
* {{description}}
|
||||
*/
|
||||
|
||||
#ifndef {{classname}}_H_
|
||||
#define {{classname}}_H_
|
||||
|
||||
#include <FApp.h>
|
||||
#include <FBase.h>
|
||||
#include <FSystem.h>
|
||||
#include <FWebJson.h>
|
||||
#include "{{prefix}}Helpers.h"
|
||||
#include "{{prefix}}Object.h"
|
||||
|
||||
using namespace Tizen::Web::Json;
|
||||
|
||||
{{/model}}{{/models}}
|
||||
{{#imports}}{{{import}}}
|
||||
{{/imports}}
|
||||
|
||||
{{#models}}{{#model}}
|
||||
namespace Swagger {
|
||||
|
||||
class {{classname}}: public {{prefix}}Object {
|
||||
public:
|
||||
{{classname}}();
|
||||
{{classname}}(String* json);
|
||||
virtual ~{{classname}}();
|
||||
|
||||
void init();
|
||||
|
||||
void cleanup();
|
||||
|
||||
String asJson ();
|
||||
|
||||
JsonObject* asJsonObject();
|
||||
|
||||
void fromJsonObject(IJsonValue* json);
|
||||
|
||||
{{classname}}* fromJson(String* obj);
|
||||
|
||||
{{#vars}}
|
||||
{{datatype}} {{getter}}();
|
||||
void {{setter}}({{datatype}} {{name}});
|
||||
{{/vars}}
|
||||
|
||||
private:
|
||||
{{#vars}}{{datatype}} {{name}};
|
||||
{{/vars}}
|
||||
};
|
||||
|
||||
} /* namespace Swagger */
|
||||
|
||||
#endif /* {{classname}}_H_ */
|
||||
{{/model}}
|
||||
{{/models}}
|
@ -0,0 +1,18 @@
|
||||
#ifndef ModelFactory_H_
|
||||
#define ModelFactory_H_
|
||||
|
||||
{{#models}}{{#model}}
|
||||
#include "{{classname}}.h"{{/model}}{{/models}}
|
||||
|
||||
namespace Swagger {
|
||||
void*
|
||||
create(QString type) {
|
||||
{{#models}}{{#model}}if(QString("{{classname}}").compare(type) == 0) {
|
||||
return new {{classname}}();
|
||||
}
|
||||
{{/model}}{{/models}}
|
||||
return NULL;
|
||||
}
|
||||
} /* namespace Swagger */
|
||||
|
||||
#endif /* ModelFactory_H_ */
|
@ -0,0 +1,24 @@
|
||||
#ifndef _{{prefix}}_OBJECT_H_
|
||||
#define _{{prefix}}_OBJECT_H_
|
||||
|
||||
#include <QJsonValue>
|
||||
|
||||
class {{prefix}}Object {
|
||||
public:
|
||||
virtual QJsonObject* asJsonObject() {
|
||||
return NULL;
|
||||
}
|
||||
virtual ~SWGObject() {}
|
||||
virtual SWGObject* fromJson(QString &jsonString) {
|
||||
Q_UNUSED(jsonString);
|
||||
return NULL;
|
||||
}
|
||||
virtual void fromJsonObject(QJsonObject &json) {
|
||||
Q_UNUSED(json);
|
||||
}
|
||||
virtual QString asJson() {
|
||||
return QString("");
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* _{{prefix}}_OBJECT_H_ */
|
Loading…
x
Reference in New Issue
Block a user