import uhttpd-rest-api

This commit is contained in:
jbnadal
2018-04-24 17:36:36 +02:00
parent 60da11013f
commit 551d8f5769
11 changed files with 91 additions and 82 deletions

View File

@@ -0,0 +1,10 @@
menuconfig BR2_PACKAGE_UHTTPD_REST_API_PLUGIN
bool "uhttpd rest api plugin"
select BR2_PACKAGE_UHTTPD_3P
select BR2_PACKAGE_UBUS
select BR2_PACKAGE_JSON_C
select BR2_PACKAGE_LIBFMT
select BR2_PACKAGE_LIBUBUS_CPP
default n
help
Enable the rest api uhttpd plugin.

View File

@@ -0,0 +1,19 @@
################################################################################
#
# UHTTPD REST API PLUGIN
#
################################################################################
UHTTPD_REST_API_PLUGIN_VERSION:= 1.0.0
UHTTPD_REST_API_PLUGIN_SITE = $(TOPDIR)/../../src/plugins/uhttpd/uhttpd-rest-api/builders/cmake
UHTTPD_REST_API_PLUGIN_SITE_METHOD = local
UHTTPD_REST_API_PLUGIN_INSTALL_TARGET = YES
UHTTPD_REST_API_PLUGIN_INSTALL_STAGING = YES
UHTTPD_REST_API_PLUGIN_DEPENDENCIES = uhttpd-3p ubus json-c libfmt libubus-cpp
UHTTPD_REST_API_PLUGIN_CONF_OPTS += -DworkspaceRoot=$(TOPDIR)/../.. -DMODULE_PATH=$(TOPDIR)/../../bsp/cmake-modules -DCMAKE_BUILD_TYPE=$(BUILD_TYPE)
$(eval $(cmake-package))

View File

@@ -1,85 +1,56 @@
cmake_minimum_required (VERSION 3.0) cmake_minimum_required (VERSION 3.0)
project (uhttpd-awox-api-plugin) project (uhttpd-rest-api-plugin)
set (CMAKE_MODULE_PATH "${MODULE_PATH}") set (CMAKE_MODULE_PATH "${MODULE_PATH}")
set (CMAKE_CXX_STANDARD 11) set (CMAKE_CXX_STANDARD 11)
include (aw) include (br)
include_directories ($ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/) include_directories (${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/)
file ( file (
GLOB_RECURSE GLOB_RECURSE
source_files source_files
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/plugin.c ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/plugin.c
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/uhttp-server.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/uhttp-server.cpp
# core # core
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/http-reason.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/http-reason.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/http-parameter.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/http-parameter.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/http-header.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/http-header.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/uri-transform.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/uri-transform.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/web-controller.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/web-controller.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/web-connection.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/web-connection.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/ubus-connection.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/ubus-connection.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/core/ubus-reason.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/core/ubus-reason.cpp
# rest # rest
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/rest/rest-controller.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/rest/rest-controller.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/rest/rest-connection.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/rest/rest-connection.cpp
#etag-rest #etag-rest
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/etag-rest/etag-rest-controller.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/etag-rest/etag-rest-controller.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/etag-rest/etag-rest-connection.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/etag-rest/etag-rest-connection.cpp
# notification # notification
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/notification/notification-controller.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/notification/notification-controller.cpp
$ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/notification/notification-connection.cpp ${workspaceRoot}/src/plugins/uhttpd/uhttpd-rest-api/notification/notification-connection.cpp
) )
add_library (awox-api-plugin SHARED ${source_files}) add_library (rest-api-plugin SHARED ${source_files})
target_link_libraries (awox-api-plugin target_link_libraries (rest-api-plugin
LINK_PUBLIC LINK_PUBLIC
ubus ubus
ubox ubox
blobmsg_json blobmsg_json
json-c json-c
fmt fmt
aw-ubus ubus-cpp
) )
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined") set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
set_target_properties (awox-api-plugin PROPERTIES PREFIX "uhttpd_") set_target_properties (rest-api-plugin PROPERTIES PREFIX "uhttpd_")
target_include_directories (awox-api-plugin PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories (rest-api-plugin PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
install (TARGETS awox-api-plugin LIBRARY DESTINATION local/bin/Plugins/)
if (INSTALL_CORE)
install (FILES $ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/configs/core.json DESTINATION local/configs/restd/)
endif ()
if (INSTALL_SPOTIFY)
install (FILES $ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/configs/spotify.json DESTINATION local/configs/restd/)
endif ()
if (INSTALL_DEAP)
install (FILES $ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/configs/deap.json DESTINATION local/configs/restd/)
endif ()
if (INSTALL_LIGHT)
install (FILES $ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/configs/light.json DESTINATION local/configs/restd/)
endif ()
if (INSTALL_LIGHT_COLOR)
install (FILES $ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/configs/light-color.json DESTINATION local/configs/restd/)
endif ()
if (INSTALL_LIGHT_WHITE)
install (FILES $ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/configs/light-white.json DESTINATION local/configs/restd/)
endif ()
if (INSTALL_VOICE_CONTROL)
install (FILES $ENV{AWOXCVS}/AwoxAudio/Plugins/uhttpd/uhttpd-awox-api/configs/voice-control.json DESTINATION local/configs/restd/)
endif ()
install (TARGETS rest-api-plugin LIBRARY DESTINATION local/bin/plugins/)

View File

@@ -22,7 +22,11 @@
/*------------------------------- INCLUDES ----------------------------------*/ /*------------------------------- INCLUDES ----------------------------------*/
#include <aw-ubus/UBusCall.h> extern "C" {
#include <libubus.h>
}
#include <ubus-cpp/ubus-call.h>
#include "ubus-reason.h" #include "ubus-reason.h"

View File

@@ -33,6 +33,13 @@ struct client;
struct uhttpd_ops; struct uhttpd_ops;
struct ubus_context; struct ubus_context;
/*----------------------------- Dependencies --------------------------------*/
#define kEvent_status_entry "status"
#define kEvent_version_entry "version"
#define kEvent_content_entry "content"
/*--------------------------------- CLASS ----------------------------------*/ /*--------------------------------- CLASS ----------------------------------*/
class WebConnection { class WebConnection {

View File

@@ -26,9 +26,9 @@
#include <json-c/json.h> #include <json-c/json.h>
#include <aw-ubus/UBusCall.h> #include <ubus-cpp/ubus-call.h>
#include <mozart/event/messages.h> //#include <mozart/event/messages.h>
#include "etag-rest/etag-rest-controller.h" #include "etag-rest/etag-rest-controller.h"
@@ -90,7 +90,7 @@ EtagRestConnection::~EtagRestConnection (void)
void EtagRestConnection::invoke (struct ubus_context *a_ctx) void EtagRestConnection::invoke (struct ubus_context *a_ctx)
{ {
uint32_t the_id = 0; uint32_t the_id = 0;
awUBusCall the_cmd; UBusCall the_cmd;
std::string the_method; std::string the_method;
m_ctx = a_ctx; m_ctx = a_ctx;
@@ -103,7 +103,7 @@ void EtagRestConnection::invoke (struct ubus_context *a_ctx)
if (!ubus_lookup_id(a_ctx, m_controller->get_path().c_str(), &the_id)) { if (!ubus_lookup_id(a_ctx, m_controller->get_path().c_str(), &the_id)) {
// printf ("%s launch async call (%s)(%s)....\n", __PRETTY_FUNCTION__, the_method.c_str(), m_parameters.c_str()); // printf ("%s launch async call (%s)(%s)....\n", __PRETTY_FUNCTION__, the_method.c_str(), m_parameters.c_str());
the_cmd.ExecAsync(a_ctx, the_id, the_method, m_parameters, this); the_cmd.exec_async(a_ctx, the_id, the_method, m_parameters, this);
} }
if (m_client->request.method == UH_HTTP_MSG_GET) { if (m_client->request.method == UH_HTTP_MSG_GET) {
@@ -186,7 +186,7 @@ int EtagRestConnection::parse_parameter (void)
the_content_node = json_tokener_parse(m_connection_data.c_str()); the_content_node = json_tokener_parse(m_connection_data.c_str());
if (the_content_node != NULL) { if (the_content_node != NULL) {
json_object_object_add(the_root_node, kEvent_Message_content_entry, the_content_node); json_object_object_add(the_root_node, kEvent_content_entry, the_content_node);
} }
m_parameters = json_object_to_json_string(the_root_node); m_parameters = json_object_to_json_string(the_root_node);
@@ -223,13 +223,13 @@ void EtagRestConnection::manage_response (std::string a_response_data)
} }
// get status // get status
if (json_object_object_get_ex(the_root_node, kEvent_Message_status_entry, &the_status_node)) { if (json_object_object_get_ex(the_root_node, kEvent_status_entry, &the_status_node)) {
the_result_code = json_object_get_int(the_status_node); the_result_code = json_object_get_int(the_status_node);
} }
// get etag. // get etag.
if (json_object_object_get_ex(the_root_node, kEvent_Message_version_entry, &the_etag_node)) { if (json_object_object_get_ex(the_root_node, kEvent_version_entry, &the_etag_node)) {
enum json_type the_json_type; enum json_type the_json_type;
@@ -249,7 +249,7 @@ void EtagRestConnection::manage_response (std::string a_response_data)
// get contents // get contents
the_content_node = NULL; the_content_node = NULL;
if (!json_object_object_get_ex(the_root_node, kEvent_Message_content_entry, &the_content_node)) { if (!json_object_object_get_ex(the_root_node, kEvent_content_entry, &the_content_node)) {
the_content_node = the_root_node; the_content_node = the_root_node;
} }

View File

@@ -27,23 +27,22 @@
#include <string> #include <string>
#include <aw-ubus/UloopTimer.h> #include <ubus-cpp/uloop-timer.h>
#include <aw-ubus/UBusExecReceiver.h> #include <ubus-cpp/ubus-exec-receiver.h>
#include "aw-ubus/UBusEventReceiver.h" #include "ubus-cpp/ubus-event-receiver.h"
#include <aw-ubus/UBusEvent.h> #include <ubus-cpp/ubus-event.h>
#include "core/http-header.h" #include "core/http-header.h"
#include "core/web-connection.h" #include "core/web-connection.h"
/*----------------------------- Dependencies --------------------------------*/
class EtagRestController; class EtagRestController;
struct ubus_context; struct ubus_context;
/*--------------------------------- CLASS ----------------------------------*/ /*--------------------------------- CLASS ----------------------------------*/
class EtagRestConnection : public WebConnection, public awUBusExecReceiver, public awUBusEventReceiver, public ULoopTimer { class EtagRestConnection : public WebConnection, public UBusExecReceiver, public UBusEventReceiver, public ULoopTimer {
public: public:
EtagRestConnection (struct uhttpd_ops *an_ops, struct client *a_client, EtagRestController *a_controller, const std::string &a_parameters); EtagRestConnection (struct uhttpd_ops *an_ops, struct client *a_client, EtagRestController *a_controller, const std::string &a_parameters);

View File

@@ -29,8 +29,6 @@ extern "C" {
#include <uhttpd/uhttpd.h> #include <uhttpd/uhttpd.h>
#include <uhttpd/plugin.h> #include <uhttpd/plugin.h>
#include <notification-center/StringNotification.h>
#include "core/http-reason.h" #include "core/http-reason.h"
#include "notification/notification-controller.h" #include "notification/notification-controller.h"

View File

@@ -25,8 +25,9 @@
/*------------------------------- INCLUDES ----------------------------------*/ /*------------------------------- INCLUDES ----------------------------------*/
#include <aw-ubus/UloopTimer.h> #include <ubus-cpp/uloop-timer.h>
#include "aw-ubus/UBusEventReceiver.h" #include <ubus-cpp/ubus-event-receiver.h>
#include "core/web-connection.h" #include "core/web-connection.h"
/*----------------------------- Dependencies --------------------------------*/ /*----------------------------- Dependencies --------------------------------*/
@@ -36,7 +37,7 @@ struct ubus_context;
/*--------------------------------- CLASS ----------------------------------*/ /*--------------------------------- CLASS ----------------------------------*/
class NotificationConnection : public WebConnection, public awUBusEventReceiver, public ULoopTimer { class NotificationConnection : public WebConnection, public UBusEventReceiver, public ULoopTimer {
public: public:
NotificationConnection (struct uhttpd_ops *an_ops, struct client *a_client, NotificationController *a_controller); NotificationConnection (struct uhttpd_ops *an_ops, struct client *a_client, NotificationController *a_controller);
@@ -45,7 +46,7 @@ public:
// WebConnection // WebConnection
void invoke (struct ubus_context *a_ctx); void invoke (struct ubus_context *a_ctx);
// awUBusEventReceiver // UBusEventReceiver
void handle_event (const char *a_type, const char *a_json_msg); void handle_event (const char *a_type, const char *a_json_msg);
// Timer. // Timer.

View File

@@ -24,14 +24,14 @@
#include <json-c/json.h> #include <json-c/json.h>
#include <mozart/event/messages.h> //#include <mozart/event/messages.h>
extern "C" { extern "C" {
#include <uhttpd/uhttpd.h> #include <uhttpd/uhttpd.h>
#include <uhttpd/plugin.h> #include <uhttpd/plugin.h>
} }
#include <aw-ubus/UBusCall.h> #include <ubus-cpp/ubus-call.h>
#include "core/http-reason.h" #include "core/http-reason.h"
#include "core/http-parameter.h" #include "core/http-parameter.h"
@@ -97,7 +97,7 @@ void RestConnection::complete (void)
void RestConnection::invoke (struct ubus_context *a_ctx) void RestConnection::invoke (struct ubus_context *a_ctx)
{ {
uint32_t the_id = 0; uint32_t the_id = 0;
awUBusCall the_cmd; UBusCall the_cmd;
std::string the_method; std::string the_method;
m_ctx = a_ctx; m_ctx = a_ctx;
@@ -114,7 +114,7 @@ void RestConnection::invoke (struct ubus_context *a_ctx)
the_parameter_doc = parse_form_encoded_data(); the_parameter_doc = parse_form_encoded_data();
// printf("RestConnection::invoke launch async call (%d)....\n", the_id); // printf("RestConnection::invoke launch async call (%d)....\n", the_id);
the_cmd.ExecAsync(a_ctx, the_id, the_method, json_object_to_json_string(the_parameter_doc), this); the_cmd.exec_async(a_ctx, the_id, the_method, json_object_to_json_string(the_parameter_doc), this);
json_object_put(the_parameter_doc); json_object_put(the_parameter_doc);
} }
@@ -190,7 +190,7 @@ void RestConnection::send_response(int a_result_code, std::string a_content_docu
} }
json_object_object_add(the_root_node, "id", json_object_new_string(m_controller->get_name().c_str())); json_object_object_add(the_root_node, "id", json_object_new_string(m_controller->get_name().c_str()));
json_object_object_add(the_root_node, kEvent_Message_status_entry, json_object_new_string(the_status.c_str())); json_object_object_add(the_root_node, kEvent_status_entry, json_object_new_string(the_status.c_str()));
json_object_object_add(the_root_node, "response_code", json_object_new_int(a_result_code)); json_object_object_add(the_root_node, "response_code", json_object_new_int(a_result_code));
the_http_header.send(m_ops, m_client, a_result_code); the_http_header.send(m_ops, m_client, a_result_code);

View File

@@ -30,7 +30,7 @@
#include "core/web-connection.h" #include "core/web-connection.h"
#include <aw-ubus/UBusExecReceiver.h> #include <ubus-cpp/ubus-exec-receiver.h>
/*----------------------------- Dependencies --------------------------------*/ /*----------------------------- Dependencies --------------------------------*/
@@ -39,7 +39,7 @@ struct json_object;
/*--------------------------------- CLASS ----------------------------------*/ /*--------------------------------- CLASS ----------------------------------*/
class RestConnection : public WebConnection, public awUBusExecReceiver { class RestConnection : public WebConnection, public UBusExecReceiver {
public: public:
RestConnection (struct uhttpd_ops *an_ops, struct client *a_client, RestController *a_controller, const std::string &a_parameters); RestConnection (struct uhttpd_ops *an_ops, struct client *a_client, RestController *a_controller, const std::string &a_parameters);