Skip to content

RDK-55044: Implement DIAL requirement to use on EU product #142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 53 additions & 27 deletions server/gdial-rest.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,12 @@ static void gdial_soup_message_set_http_error(SoupMessage *msg, guint state_code
g_string_free(value_buf, FALSE); \
}

static GList *gdial_rest_server_registered_apps_clear(GList *registered_apps, GList *found) {
static GList *gdial_rest_server_registered_apps_clear(GDialRestServer *self, GList *registered_apps, GList *found) {
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
GDialAppRegistry *app_registry = (GDialAppRegistry *)found->data;
registered_apps = g_list_remove_link(registered_apps, found);
GDIAL_LOGINFO("gdial_local_rest_http_server_callback handler Removed for App[%s]instance[%x]", app_registry->name,priv->local_soup_instance);
soup_server_remove_handler(priv->local_soup_instance, app_registry->app_uri);
gdial_app_regstry_dispose (app_registry);
g_list_free(found);
return registered_apps;
Expand Down Expand Up @@ -208,6 +211,14 @@ static gint GCompareFunc_match_registry_app_name(gconstpointer a, gconstpointer
return is_matched ? 0 : 1;
}

static gint GCompareFunc_match_registry_app_uuid(gconstpointer a, gconstpointer b) {
GDialAppRegistry *app_registry = (GDialAppRegistry *)a;
int is_matched = 0;
/* match by exact uuid */
is_matched = (g_strcmp0(&app_registry->app_uri[1], b) == 0);
return is_matched ? 0 : 1;
}

GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry(GDialRestServer *self, const gchar *app_name) {
g_return_val_if_fail(self != NULL && app_name != NULL, FALSE);
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
Expand All @@ -218,6 +229,16 @@ GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry(GDialRestServ
return NULL;
}

GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry_by_uuid(GDialRestServer *self, const gchar *app_uuid) {
g_return_val_if_fail(self != NULL && app_uuid != NULL, FALSE);
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
GList *found = g_list_find_custom(priv->registered_apps, app_uuid, GCompareFunc_match_registry_app_uuid);
if (found) {
return (GDialAppRegistry *)found->data;
}
return NULL;
}

GDIAL_STATIC gboolean gdial_rest_server_is_allowed_youtube_origin(GDialRestServer *self, const gchar *header_origin, const gchar *app_name) {
if (self == NULL) return FALSE;

Expand Down Expand Up @@ -281,7 +302,7 @@ GDIAL_STATIC gboolean gdial_rest_server_is_allowed_origin(GDialRestServer *self,
return is_allowed;
}

GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode) {
GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode , const gchar* app_uri) {
/*
* The specifciation of additionalDataUrl in form of /apps/<app_name>/dial_data
* thus the instance data must be included in the query or payload, not the path.
Expand All @@ -291,7 +312,7 @@ GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_po
* for MIME type application/x-www-form-urlencoded.]]
*/
GString *url_buf = g_string_new("");
g_string_printf(url_buf, "http://%s:%d%s/%s%s", "localhost", listening_port, GDIAL_REST_HTTP_APPS_URI, app_name, GDIAL_REST_HTTP_DIAL_DATA_URI);
g_string_printf(url_buf, "http://%s:%d%s%s", "localhost", listening_port, app_uri, GDIAL_REST_HTTP_DIAL_DATA_URI);
gchar *unencoded = g_string_free(url_buf, FALSE);
if (encode) {
gchar *encoded = soup_uri_encode(unencoded, NULL);
Expand Down Expand Up @@ -433,7 +454,7 @@ static void gdial_rest_server_handle_POST(GDialRestServer *gdial_rest_server, So
if (new_app_instance) {
gchar *additional_data_url = NULL;
if (app_registry->use_additional_data) {
additional_data_url = gdial_rest_server_new_additional_data_url(listening_port, app_registry->name, FALSE);
additional_data_url = gdial_rest_server_new_additional_data_url(listening_port, app_registry->name, FALSE, app_registry->app_uri );
}
gchar *additional_data_url_safe = soup_uri_encode(additional_data_url, NULL);
GDIAL_LOGINFO("additionalDataUrl = %s, %s", additional_data_url, additional_data_url_safe);
Expand Down Expand Up @@ -673,13 +694,12 @@ static void gdial_local_rest_http_server_callback(SoupServer *server,
SoupMessage *msg, const gchar *path, GHashTable *query,
SoupClientContext *client, gpointer user_data) {
gchar *remote_address_str = g_inet_address_to_string(g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(soup_client_context_get_remote_address(client))));
g_print_with_timestamp("gdial_local_rest_http_server_callback() %s path=%s recv from [%s], in thread %lx", msg->method, path, remote_address_str, pthread_self());
GDIAL_LOGINFO("method[%s] path[%s] recv from [%s], in thread %lx", msg->method, path, remote_address_str, pthread_self());
g_free(remote_address_str);
GDialRestServer *gdial_rest_server = (GDIAL_REST_SERVER(user_data));
gchar **elements = g_strsplit(&path[1], "/", 4);
gchar **elements = g_strsplit(&path[1], "/", 3);
gdial_rest_server_http_return_if_fail(elements != NULL, msg, SOUP_STATUS_NOT_IMPLEMENTED);
gchar base[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
gchar app_name[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
gchar instance[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
gchar last_elem[GDIAL_REST_HTTP_PATH_COMPONENT_MAX_LEN] = {0};
int i = 0;
Expand All @@ -691,37 +711,35 @@ static void gdial_local_rest_http_server_callback(SoupServer *server,
GDIAL_LOGWARNING("Warn: empty elements in URI path");
continue;
}
if (j == 0) g_strlcpy(base, elements[i], sizeof(base));
else if (j == 1) {
ret = g_strlcpy(app_name, elements[i], sizeof(app_name));
if (ret >= sizeof(app_name)) {
g_printerr("Warn: app_name too long\r\n");
}
if (j == 0) {
g_strlcpy(base, elements[i], sizeof(base));
}
else if (j == 2) {
else if (j == 1) {
ret = g_strlcpy(instance, elements[i], sizeof(instance));
if (ret >= sizeof(instance)) {
g_printerr("Warn: instance too long\r\n");
GDIAL_LOGERROR("Warn: instance too long");
}
}
ret = g_strlcpy(last_elem, elements[i], sizeof(last_elem));
if (ret >= sizeof(last_elem)) {
g_printerr("Warn: last_elem too long\r\n");
GDIAL_LOGERROR("Warn: last_elem too long");
}
GDIAL_LOGINFO("last_elem[%s]", last_elem);
j++;
}
g_strfreev(elements);
const int element_num = j;
GDIAL_LOGINFO("there are %d non-empty elems", element_num);
if(element_num == 3 && g_strcmp0(instance,"dial_data") == 0)
if(element_num == 2 && g_strcmp0(instance,"dial_data") == 0)
{
GDialAppRegistry *app_registry = gdial_rest_server_find_app_registry(gdial_rest_server, app_name);
GDialAppRegistry *app_registry = gdial_rest_server_find_app_registry_by_uuid(gdial_rest_server, base);

gdial_rest_server_http_return_if_fail(app_registry, msg, SOUP_STATUS_NOT_FOUND);
if (msg->method == SOUP_METHOD_POST) {
gdial_rest_server_handle_POST_dial_data(gdial_rest_server, msg, query, app_name);
gdial_rest_server_handle_POST_dial_data(gdial_rest_server, msg, query, app_registry->name);
}
else if (msg->method == SOUP_METHOD_GET) {
gdial_rest_server_handle_GET_app(gdial_rest_server, msg, query, app_name, GDIAL_APP_INSTANCE_NULL);
gdial_rest_server_handle_GET_app(gdial_rest_server, msg, query, app_registry->name, GDIAL_APP_INSTANCE_NULL);
}
else {
gdial_rest_server_http_return_if_fail(msg->method == SOUP_METHOD_POST, msg, SOUP_STATUS_NOT_IMPLEMENTED);
Expand Down Expand Up @@ -981,7 +999,7 @@ static void gdial_rest_server_dispose(GObject *object) {
g_object_unref(priv->soup_instance);
g_object_unref(priv->local_soup_instance);
while (priv->registered_apps) {
priv->registered_apps = gdial_rest_server_registered_apps_clear(priv->registered_apps, priv->registered_apps);
priv->registered_apps = gdial_rest_server_registered_apps_clear(object, priv->registered_apps, priv->registered_apps);
}
G_OBJECT_CLASS (gdial_rest_server_parent_class)->dispose (object);
}
Expand Down Expand Up @@ -1102,10 +1120,7 @@ GDialRestServer *gdial_rest_server_new(SoupServer *rest_http_server,SoupServer *
*/
soup_server_add_handler(rest_http_server, "/apps/system", gdial_rest_http_server_system_callback, object, NULL);
#endif
GDIAL_LOGINFO("gdial_local_rest_http_server_callback add handler");
GDIAL_REST_HTTP_APPS_URI = g_strdup_printf("/%s", random_id);

soup_server_add_handler(local_rest_http_server, GDIAL_REST_HTTP_APPS_URI, gdial_local_rest_http_server_callback, object, NULL);
return object;
}

Expand Down Expand Up @@ -1147,6 +1162,12 @@ gboolean gdial_rest_server_register_app(GDialRestServer *self, const gchar *app_
}
g_return_val_if_fail(priv->registered_apps != NULL, FALSE);
g_return_val_if_fail(gdial_rest_server_is_app_registered(self, app_name), FALSE);

if( 0 != strcmp(app_name,"system"))
{
GDIAL_LOGINFO("gdial_local_rest_http_server_callback handler added for App[%s]uri[%s]instance[%x]",app_name,app_registry->app_uri,priv->local_soup_instance);
soup_server_add_handler(priv->local_soup_instance, app_registry->app_uri, gdial_local_rest_http_server_callback, self, NULL);
}
GDIAL_LOGTRACE("Exiting ...");
return TRUE;
}
Expand Down Expand Up @@ -1174,6 +1195,11 @@ gboolean gdial_rest_server_register_app_registry(GDialRestServer *self, GDialApp

g_return_val_if_fail(priv->registered_apps != NULL, FALSE);
g_return_val_if_fail(gdial_rest_server_is_app_registered(self, app_registry->name), FALSE);
if( 0 != strcmp(app_registry->name,"system"))
{
GDIAL_LOGINFO("gdial_local_rest_http_server_callback handler added for App[%s]uri[%s]instance[%x]",app_registry->name,app_registry->app_uri,priv->local_soup_instance);
soup_server_add_handler(priv->local_soup_instance, app_registry->app_uri, gdial_local_rest_http_server_callback, self, NULL);
}
return TRUE;
}

Expand Down Expand Up @@ -1204,7 +1230,7 @@ gboolean gdial_rest_server_unregister_all_apps(GDialRestServer *self) {
priv->registered_apps = registered_apps_head;
/*Remove all registered apps before*/
while (priv->registered_apps) {
priv->registered_apps = gdial_rest_server_registered_apps_clear(priv->registered_apps, priv->registered_apps);
priv->registered_apps = gdial_rest_server_registered_apps_clear(self, priv->registered_apps, priv->registered_apps);
}
GDIAL_LOGTRACE("Exiting ...");
return TRUE;
Expand All @@ -1219,7 +1245,7 @@ gboolean gdial_rest_server_unregister_app(GDialRestServer *self, const gchar *ap
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(self);
GList *found = g_list_find_custom(priv->registered_apps, app_name, GCompareFunc_match_registry_app_name);
if (found == NULL) return FALSE;
priv->registered_apps = gdial_rest_server_registered_apps_clear(priv->registered_apps, found);
priv->registered_apps = gdial_rest_server_registered_apps_clear(self, priv->registered_apps, found);
return TRUE;
}

Expand Down Expand Up @@ -1334,4 +1360,4 @@ GDIAL_STATIC_INLINE void GET_APP_response_builder_destroy(void *builder) {
g_free(rbuilder->additionalData);

g_free(builder);
}
}
3 changes: 2 additions & 1 deletion server/gdial-rest.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,9 @@ gboolean gdial_rest_server_unregister_all_apps(GDialRestServer *self);
typedef struct _GDialAppRegistry GDialAppRegistry;

GDIAL_STATIC gboolean gdial_rest_server_is_allowed_origin(GDialRestServer *self, const gchar *header_origin, const gchar *app_name);
GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode);
GDIAL_STATIC gchar *gdial_rest_server_new_additional_data_url(guint listening_port, const gchar *app_name, gboolean encode, const gchar* app_uri);
GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry(GDialRestServer *self, const gchar *app_name);
GDIAL_STATIC GDialAppRegistry *gdial_rest_server_find_app_registry_by_uuid(GDialRestServer *self, const gchar *app_uuid);

G_END_DECLS

Expand Down
46 changes: 44 additions & 2 deletions server/gdial-ssdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ static const char ssdp_device_xml_template[] = ""
static gchar *dd_xml_response_str_ = NULL;
static gchar *app_friendly_name = NULL;
static gchar *app_random_uuid = NULL;
static gchar *app_manufacturer_name = NULL;
static gchar *app_model_name = NULL;
static pthread_mutex_t ssdpServerEventSync = PTHREAD_MUTEX_INITIALIZER;

static void ssdp_http_server_callback(SoupServer *server, SoupMessage *msg, const char *path, GHashTable *query, SoupClientContext *client, gpointer user_data) {
Expand All @@ -95,8 +97,8 @@ static void ssdp_http_server_callback(SoupServer *server, SoupMessage *msg, cons
static size_t dd_xml_response_str_len = 0;

if (!dd_xml_response_str_) {
const gchar *manufacturer= gdial_plat_dev_get_manufacturer();
const gchar *model = gdial_plat_dev_get_model();
const gchar *manufacturer= app_manufacturer_name;
const gchar *model = app_model_name;

if (manufacturer == NULL) {
manufacturer = gdial_options_->manufacturer;
Expand Down Expand Up @@ -344,4 +346,44 @@ int gdial_ssdp_set_friendlyname(const gchar *friendlyname)
}
pthread_mutex_unlock(&ssdpServerEventSync);
return 0;
}

int gdial_ssdp_set_manufacturername(const gchar *manufacturer_name)
{
pthread_mutex_lock(&ssdpServerEventSync);
if(manufacturer_name)
{
if (app_manufacturer_name != NULL) {
g_free(app_manufacturer_name);
}
app_manufacturer_name = g_strdup(manufacturer_name);

GDIAL_LOGINFO("app_manufacturer_name :%s ",app_manufacturer_name);
if (dd_xml_response_str_!= NULL){
g_free(dd_xml_response_str_);
dd_xml_response_str_ = NULL;
}
}
pthread_mutex_unlock(&ssdpServerEventSync);
return 0;
}

int gdial_ssdp_set_modelname(const gchar *model_name)
{
pthread_mutex_lock(&ssdpServerEventSync);
if(model_name)
{
if (app_model_name != NULL) {
g_free(app_model_name);
}
app_model_name = g_strdup(model_name);

GDIAL_LOGINFO("app_model_name :%s ",app_model_name);
if (dd_xml_response_str_!= NULL){
g_free(dd_xml_response_str_);
dd_xml_response_str_ = NULL;
}
}
pthread_mutex_unlock(&ssdpServerEventSync);
return 0;
}
2 changes: 2 additions & 0 deletions server/gdial-ssdp.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ int gdial_ssdp_new(SoupServer *server, GDialOptions *options, const gchar *rando
int gdial_ssdp_destroy();
int gdial_ssdp_set_available(bool activationStatus, const gchar *friendlyName);
int gdial_ssdp_set_friendlyname(const gchar *friendlyName);
int gdial_ssdp_set_manufacturername(const gchar *manufacturer_name);
int gdial_ssdp_set_modelname(const gchar *model_name);
G_END_DECLS

#endif
59 changes: 59 additions & 0 deletions server/gdialservice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,16 @@ static void server_friendlyname_handler(const gchar * friendlyname)
gdial_ssdp_set_friendlyname(friendlyname);
}

static void server_manufacturername_handler(const gchar * manufacturername)
{
gdial_ssdp_set_manufacturername(manufacturername);
}

static void server_modelname_handler(const gchar * modelname)
{
gdial_ssdp_set_modelname(modelname);
}

static void server_powerstate_handler(const gchar * powerState)
{
gdialServiceImpl::getInstance()->updatePowerState(std::string(powerState));
Expand Down Expand Up @@ -268,6 +278,10 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[])

gdail_plat_register_activation_cb(server_activation_handler);
gdail_plat_register_friendlyname_cb(server_friendlyname_handler);

gdail_plat_register_manufacturername_cb(server_manufacturername_handler);
gdail_plat_register_modelname_cb(server_modelname_handler);

gdail_plat_register_registerapps_cb (server_register_application);
gdail_plat_dev_register_powerstate_cb(server_powerstate_handler);

Expand Down Expand Up @@ -678,6 +692,18 @@ void *gdialServiceImpl::requestHandlerThread(void *ctx)
gdial_plat_application_update_network_standby_mode((gboolean)reqHdlrPayload.user_param1);
}
break;
case UPDATE_MANUFACTURER_NAME:
{
GDIAL_LOGINFO("UPDATE_MANUFACTURER_NAME : data:%s",reqHdlrPayload.manufacturer.c_str());
gdial_plat_application_update_manufacturer_name(reqHdlrPayload.manufacturer.c_str());
}
break;
case UPDATE_MODEL_NAME:
{
GDIAL_LOGINFO("UPDATE_MODEL_NAME : data:%s",reqHdlrPayload.model.c_str());
gdial_plat_application_update_model_name(reqHdlrPayload.model.c_str());
}
break;
default:
{

Expand Down Expand Up @@ -1043,6 +1069,39 @@ void gdialService::setNetworkStandbyMode(bool nwStandbymode)
GDIAL_LOGTRACE("Exiting ...");
}


GDIAL_SERVICE_ERROR_CODES gdialService::setManufacturerName(string manufacturer)
{
gdialServiceImpl* gdialImplInstance = gdialServiceImpl::getInstance();
GDIAL_LOGTRACE("Entering ...");
GDIAL_LOGINFO("Manufacturer[%s]",manufacturer.c_str());
if ((nullptr != m_gdialService ) && (nullptr != gdialImplInstance))
{
RequestHandlerPayload payload;
payload.event = UPDATE_MANUFACTURER_NAME;
payload.manufacturer = manufacturer;
gdialImplInstance->sendRequest(payload);
}
GDIAL_LOGTRACE("Exiting ...");
return GDIAL_SERVICE_ERROR_NONE;
}

GDIAL_SERVICE_ERROR_CODES gdialService::setModelName(string model)
{
gdialServiceImpl* gdialImplInstance = gdialServiceImpl::getInstance();
GDIAL_LOGTRACE("Entering ...");
GDIAL_LOGINFO("Model[%s]",model.c_str());
if ((nullptr != m_gdialService ) && (nullptr != gdialImplInstance))
{
RequestHandlerPayload payload;
payload.event = UPDATE_MODEL_NAME;
payload.model = model;
gdialImplInstance->sendRequest(payload);
}
GDIAL_LOGTRACE("Exiting ...");
return GDIAL_SERVICE_ERROR_NONE;
}

void gdialServiceImpl::sendRequest( const RequestHandlerPayload& payload )
{
GDIAL_LOGTRACE("Entering ...");
Expand Down
Loading