diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..c7b23a3d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,5 @@ +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence, +# @global-owner1 and @global-owner2 will be requested for +# review when someone opens a pull request. +* @rdkcentral/xdialserver-maintainers diff --git a/.github/workflows/native_full_build.yml b/.github/workflows/native_full_build.yml new file mode 100755 index 00000000..8869a3ea --- /dev/null +++ b/.github/workflows/native_full_build.yml @@ -0,0 +1,25 @@ +name: Build Component in Native Environment + +on: + push: + branches: [ main, 'sprint/**', 'release/**', topic/*, develop ] + pull_request: + branches: [ main, 'sprint/**', 'release/**', topic/*, develop ] + +jobs: + build-entservices-on-pr: + name: Build xdialserver component in github rdkcentral + runs-on: ubuntu-latest + container: + image: ubuntu:22.04 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: native build + run: | + sh -x build_dependencies.sh + sh -x cov_build.sh + env: + GITHUB_TOKEN: ${{ secrets.RDKCM_RDKE }} \ No newline at end of file diff --git a/Makefile b/Makefile index 2ffd032e..32f94877 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,6 @@ DIRS:= server all: - for dir in $(DIRS); do (cd $$dir && cmake $(PLATFORM_FLAGS) . && make || exit 1) || exit 1; done + for dir in $(DIRS); do (cd $$dir && cmake $(DISABLE_SECURITY_TOKEN) $(PLATFORM_FLAGS) . && make || exit 1) || exit 1; done clean: for dir in $(DIRS); do (cd $$dir && make clean || exit 1) || exit 1; done diff --git a/build_dependencies.sh b/build_dependencies.sh new file mode 100755 index 00000000..1dad0973 --- /dev/null +++ b/build_dependencies.sh @@ -0,0 +1,130 @@ +#!/bin/bash +set -x +set -e +############################## +GITHUB_WORKSPACE="${PWD}" + +cd ${GITHUB_WORKSPACE} + +# # ############################# +#1. Install Dependencies and packages + +apt update +apt install -y git python3 python3-pip cmake ninja-build meson curl libsoup2.4-dev libxml2-dev libglib2.0-dev gobject-introspection libgirepository1.0-dev libgtk-3-dev libcurl4-openssl-dev libcunit1-dev valac pandoc +pip install jsonref + +############################ +# Build trevor-base64 +if [ ! -d "trower-base64" ]; then +git clone https://github.com/xmidt-org/trower-base64.git +fi +cd trower-base64 +meson setup --warnlevel 3 --werror build +ninja -C build +ninja -C build install +cd .. +########################################### +# Clone the required repositories + +rm -rf iarmbus ThunderTools Thunder entservices-apis entservices-testframework gssdp + + +git clone https://github.com/rdkcentral/iarmbus.git +export IARMBUS_PATH=$GITHUB_WORKSPACE/iarmbus + +git clone --branch R4.4.3 https://github.com/rdkcentral/ThunderTools.git + +git clone --branch R4.4.1 https://github.com/rdkcentral/Thunder.git + +git clone --branch main https://github.com/rdkcentral/entservices-apis.git + +git clone https://$GITHUB_TOKEN@github.com/rdkcentral/entservices-testframework.git + +git clone --branch gssdp-1.2.3 https://gitlab.gnome.org/GNOME/gssdp.git + +############################ +# Build gssdp-1.2 +echo "======================================================================================" +echo "buliding gssdp-1.2" +cd gssdp + +rm -rf build +meson setup build + +ninja -C build +ninja -C build install +cd - + +############################ +# Build Thunder-Tools +echo "======================================================================================" +echo "buliding thunderTools" +cd ThunderTools +patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/00010-R4.4-Add-support-for-project-dir.patch +cd - + + +cmake -G Ninja -S ThunderTools -B build/ThunderTools \ + -DEXCEPTIONS_ENABLE=ON \ + -DCMAKE_INSTALL_PREFIX="/usr" \ + -DCMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" \ + -DGENERIC_CMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" \ + +cmake --build build/ThunderTools --target install + + +############################ +# Build Thunder +echo "======================================================================================" +echo "buliding thunder" + +cd Thunder +patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/Use_Legact_Alt_Based_On_ThunderTools_R4.4.3.patch +patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/error_code_R4_4.patch +patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/1004-Add-support-for-project-dir.patch +patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/RDKEMW-733-Add-ENTOS-IDS.patch +cd - + +cmake -G Ninja -S Thunder -B build/Thunder \ + -DMESSAGING=ON \ + -DCMAKE_INSTALL_PREFIX="/usr" \ + -DCMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" \ + -DGENERIC_CMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" \ + -DBUILD_TYPE=Debug \ + -DBINDING=127.0.0.1 \ + -DPORT=55555 \ + -DEXCEPTIONS_ENABLE=ON \ + +cmake --build build/Thunder --target install + +############################ +# Build entservices-apis +echo "======================================================================================" +echo "buliding entservices-apis" +cd entservices-apis +rm -rf jsonrpc/DTV.json +cd .. + +cmake -G Ninja -S entservices-apis -B build/entservices-apis \ + -DEXCEPTIONS_ENABLE=ON \ + -DCMAKE_INSTALL_PREFIX="/usr" \ + -DCMAKE_MODULE_PATH="$GITHUB_WORKSPACE/install/tools/cmake" \ + +cmake --build build/entservices-apis --target install + +############################ + +############################ +# Build and deploy stubs for IARMBus and WPEFramework securityagent +mkdir -p /usr/include/WPEFramework/securityagent +cp $GITHUB_WORKSPACE/stubs/securityagent/* /usr/include/WPEFramework/securityagent/ -v + +echo "======================================================================================" +echo "Building IARMBus and WPEFramework securityagent stubs" +cd $GITHUB_WORKSPACE +cd ./stubs +g++ -fPIC -shared -o libIARMBus.so iarm_stubs.cpp -I$GITHUB_WORKSPACE/stubs -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I$IARMBUS_PATH/core -I$IARMBUS_PATH/core/include -fpermissive +g++ -fPIC -shared -o libWPEFrameworkSecurityUtil.so securityagent/SecurityTokenUtil.cpp -I$GITHUB_WORKSPACE/stubs -fpermissive + +cp libIARMBus.so /usr/local/lib/ +cp libWPEFrameworkSecurityUtil.so /usr/local/lib/ diff --git a/cov_build.sh b/cov_build.sh new file mode 100755 index 00000000..da227aba --- /dev/null +++ b/cov_build.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -x +set -e +############################## +GITHUB_WORKSPACE="${PWD}" +ls -la ${GITHUB_WORKSPACE} +############################ +# Build xdialserver +echo "buliding xdialserver" + +cd ${GITHUB_WORKSPACE} + +make + +echo "======================================================================================" +exit 0 diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 7c56967d..c506e0d7 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -27,6 +27,7 @@ find_package (PkgConfig REQUIRED) pkg_search_module (GLIB REQUIRED glib-2.0) pkg_search_module (GIO REQUIRED gio-2.0) pkg_search_module (GSSDP12 gssdp-1.2) +pkg_search_module (LIBSOUP3 libsoup-3.0) if (GSSDP12_FOUND) pkg_search_module (GSSDP REQUIRED gssdp-1.2) add_definitions(-DHAVE_GSSDP_VERSION_1_2_OR_NEWER) @@ -34,7 +35,12 @@ if (GSSDP12_FOUND) else() pkg_search_module (GSSDP REQUIRED gssdp-1.0) endif() -pkg_search_module (SOUP REQUIRED libsoup-2.4) +if (LIBSOUP3_FOUND) + pkg_search_module (SOUP REQUIRED libsoup-3.0) + message("Using libsoup-3.0") +else() + pkg_search_module (SOUP REQUIRED libsoup-2.4) +endif() pkg_search_module (XML2 REQUIRED libxml-2.0) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g") @@ -101,4 +107,4 @@ target_link_libraries (gdial-server add_executable (gdial-server-ut gdialserver_ut.cpp) -target_link_libraries (gdial-server-ut gdial-plat gdial-server) \ No newline at end of file +target_link_libraries (gdial-server-ut gdial-plat gdial-server) diff --git a/server/gdial-rest.c b/server/gdial-rest.c index 4ed904ae..c9604e98 100644 --- a/server/gdial-rest.c +++ b/server/gdial-rest.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include @@ -155,9 +157,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[%p]", app_registry->name,(void*)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; @@ -208,6 +213,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); @@ -218,6 +231,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; @@ -281,7 +304,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//dial_data * thus the instance data must be included in the query or payload, not the path. @@ -291,7 +314,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); @@ -433,7 +456,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); @@ -517,6 +540,8 @@ static void gdial_rest_server_handle_POST(GDialRestServer *gdial_rest_server, So } else { g_object_unref(app); + // FIX(Copilot): Set app to NULL after unref to prevent use-after-free + app = NULL; gdial_rest_server_http_return_if(start_error == GDIAL_APP_ERROR_FORBIDDEN, msg, SOUP_STATUS_FORBIDDEN); gdial_rest_server_http_return_if(start_error == GDIAL_APP_ERROR_UNAUTH, msg, SOUP_STATUS_UNAUTHORIZED); gdial_rest_server_http_return_if(TRUE, msg, SOUP_STATUS_SERVICE_UNAVAILABLE); @@ -630,7 +655,8 @@ static void gdial_rest_server_handle_POST_dial_data(GDialRestServer *gdial_rest_ if (query) { GHashTable *dupQuery = gdial_util_str_str_hashtable_dup(query); body_query = query ? gdial_util_str_str_hashtable_merge(body_query, dupQuery) : body_query; - g_hash_table_destory(dupQuery); + // FIX(Copilot): Correct typo g_hash_table_destory -> g_hash_table_destroy + g_hash_table_destroy(dupQuery); } #endif gdial_app_set_additional_dial_data(app, body_query); @@ -673,13 +699,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; @@ -691,37 +716,38 @@ 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) { + ret = g_strlcpy(base, elements[i], sizeof(base)); + if (ret >= sizeof(base)) { + GDIAL_LOGERROR("Warn: base too long"); } } - 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); @@ -981,7 +1007,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); } @@ -1102,10 +1128,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; } @@ -1147,6 +1170,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[%p]",app_name,app_registry->app_uri,(void*)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; } @@ -1174,6 +1203,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[%p]",app_registry->name,app_registry->app_uri,(void*)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; } @@ -1204,7 +1238,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; @@ -1219,7 +1253,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; } diff --git a/server/gdial-rest.h b/server/gdial-rest.h index ca6f3db9..8aa4f829 100644 --- a/server/gdial-rest.h +++ b/server/gdial-rest.h @@ -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 diff --git a/server/gdial-ssdp.c b/server/gdial-ssdp.c index 4cf34433..107b42cf 100644 --- a/server/gdial-ssdp.c +++ b/server/gdial-ssdp.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -74,6 +75,9 @@ 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) { /* @@ -85,33 +89,65 @@ static void ssdp_http_server_callback(SoupServer *server, SoupMessage *msg, cons GDIAL_DEBUG("warning: SSDP HTTP Method is not GET"); return; } + + pthread_mutex_lock(&ssdpServerEventSync); /* * there is no variant here, so we can cache the response. */ 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; + } + + if (model == NULL) { + model = gdial_options_->model_name; + } - if (manufacturer == NULL) {manufacturer = gdial_options_->manufacturer;} - if (model == NULL) {model = gdial_options_->model_name;} - if(gdial_options_->feature_friendlyname && strlen(app_friendly_name)) + if(gdial_options_->feature_friendlyname && app_friendly_name && strlen(app_friendly_name)) + { dd_xml_response_str_ = g_strdup_printf(ssdp_device_xml_template, app_friendly_name, manufacturer, model, gdial_options_->uuid); + } else + { dd_xml_response_str_ = g_strdup_printf(ssdp_device_xml_template, gdial_options_->friendly_name, manufacturer, model, gdial_options_->uuid); + } - dd_xml_response_str_len = strlen(dd_xml_response_str_); + if ( dd_xml_response_str_ ) { + dd_xml_response_str_len = strlen(dd_xml_response_str_); + } + else { + GDIAL_LOGERROR("Failed to allocate memory for dd.xml response"); + soup_message_set_status(msg, SOUP_STATUS_INTERNAL_SERVER_ERROR); + } } - gchar *application_url_str = g_strdup_printf("http://%s:%d/%s/", iface_ipv4_address, GDIAL_REST_HTTP_PORT,app_random_uuid); - soup_message_headers_replace (msg->response_headers, "Application-URL", application_url_str); - g_free(application_url_str); - application_url_str = NULL; - soup_message_set_response(msg, "text/xml; charset=utf-8", SOUP_MEMORY_STATIC, dd_xml_response_str_, dd_xml_response_str_len); - soup_message_set_status(msg, SOUP_STATUS_OK); - GDIAL_CHECK("Content-Type:text/xml"); - GDIAL_CHECK("Application-URL: exist"); + if ( dd_xml_response_str_ ) { + gchar *application_url_str = g_strdup_printf("http://%s:%d/%s/", iface_ipv4_address, GDIAL_REST_HTTP_PORT,app_random_uuid); + + if ( application_url_str ) + { + soup_message_headers_replace (msg->response_headers, "Application-URL", application_url_str); + g_free(application_url_str); + application_url_str = NULL; + + soup_message_set_response(msg, "text/xml; charset=utf-8", SOUP_MEMORY_STATIC, dd_xml_response_str_, dd_xml_response_str_len); + soup_message_set_status(msg, SOUP_STATUS_OK); + + GDIAL_CHECK("Content-Type:text/xml"); + GDIAL_CHECK("Application-URL: exist"); + } + else + { + GDIAL_LOGERROR("Failed to allocate memory for response_headers"); + soup_message_set_status(msg, SOUP_STATUS_INTERNAL_SERVER_ERROR); + } + } + pthread_mutex_unlock(&ssdpServerEventSync); } void gdial_ssdp_networkstandbymode_handler(const bool nwstandby) @@ -138,6 +174,12 @@ int gdial_ssdp_new(SoupServer *ssdp_http_server, GDialOptions *options, const gc g_return_val_if_fail(options != NULL, -1); g_return_val_if_fail(options->iface_name != NULL, -1); + if (0 != pthread_mutex_init(&ssdpServerEventSync, NULL)) + { + GDIAL_LOGERROR("Failed to initializing mutex"); + return EXIT_FAILURE; + } + gdial_options_ = options; GDIAL_LOGINFO("gdial_options_->friendly_name[%p]",gdial_options_->friendly_name); @@ -215,6 +257,7 @@ int gdial_ssdp_new(SoupServer *ssdp_http_server, GDialOptions *options, const gc int gdial_ssdp_destroy() { GDIAL_LOGTRACE("Entering ..."); + pthread_mutex_lock(&ssdpServerEventSync); if (ssdp_http_server_) { soup_server_remove_handler(ssdp_http_server_, "/dd.xml"); @@ -273,6 +316,8 @@ int gdial_ssdp_destroy() { g_object_unref(ssdp_client_); ssdp_client_ = NULL; } + pthread_mutex_unlock(&ssdpServerEventSync); + pthread_mutex_destroy(&ssdpServerEventSync); GDIAL_LOGTRACE("Exiting ..."); return 0; } @@ -287,15 +332,60 @@ int gdial_ssdp_set_available(bool activation_status, const gchar *friendlyname) int gdial_ssdp_set_friendlyname(const gchar *friendlyname) { - if(gdial_options_ && gdial_options_->feature_friendlyname && friendlyname) - { - if (app_friendly_name != NULL) g_free(app_friendly_name); - app_friendly_name = g_strdup(friendlyname); - GDIAL_LOGINFO("gdial_ssdp_set_friendlyname app_friendly_name :%s ",app_friendly_name); - if (dd_xml_response_str_!= NULL){ - g_free(dd_xml_response_str_); - dd_xml_response_str_ = NULL; - } - } - return 0; + pthread_mutex_lock(&ssdpServerEventSync); + if(gdial_options_ && gdial_options_->feature_friendlyname && friendlyname) + { + if (app_friendly_name != NULL) { + g_free(app_friendly_name); + } + app_friendly_name = g_strdup(friendlyname); + + GDIAL_LOGINFO("gdial_ssdp_set_friendlyname app_friendly_name :%s ",app_friendly_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_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; } diff --git a/server/gdial-ssdp.h b/server/gdial-ssdp.h index 838b148f..3522e6df 100644 --- a/server/gdial-ssdp.h +++ b/server/gdial-ssdp.h @@ -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 diff --git a/server/gdialserver_ut.cpp b/server/gdialserver_ut.cpp index 4669ac65..88ff7999 100644 --- a/server/gdialserver_ut.cpp +++ b/server/gdialserver_ut.cpp @@ -43,7 +43,7 @@ class gdialServiceTest: public GDialNotifier { GDIAL_LOGINFO("Entering ..."); std::string activation = status ? "true" : "false"; - service->ActivationChanged(activation,"SampleTest"); + service->ActivationChanged(std::move(activation),"SampleTest"); GDIAL_LOGINFO("Exiting ..."); } @@ -137,9 +137,9 @@ class gdialServiceTest: public GDialNotifier break; } - appReq->Names = Names; + appReq->Names = std::move(Names); appReq->prefixes = prefixes; - appReq->cors = prefixes; + appReq->cors = std::move(prefixes); appReq->allowStop = allowStop; appReqList->pushBack(appReq); @@ -181,11 +181,6 @@ class gdialServiceTest: public GDialNotifier GDIAL_LOGINFO("App:%s appID:%s",appName.c_str(),appID.c_str()); } - virtual void onStopped() override - { - GDIAL_LOGINFO("~~~~~~~~~~~"); - } - virtual void updatePowerState(string powerState) override { GDIAL_LOGINFO("powerState : %s",powerState.c_str()); @@ -253,4 +248,4 @@ int main(int argc, char *argv[]) delete testObject; return 0; -} \ No newline at end of file +} diff --git a/server/gdialservice.cpp b/server/gdialservice.cpp index f0b6ee88..fdd64ed9 100644 --- a/server/gdialservice.cpp +++ b/server/gdialservice.cpp @@ -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)); @@ -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); @@ -278,7 +292,7 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) soup_server_add_handler(ssdp_http_server, "/", gdial_http_server_throttle_callback, NULL, NULL); GSocketAddress *listen_address = g_inet_socket_address_new_from_string(iface_ipv4_address_, GDIAL_REST_HTTP_PORT); - SoupServerListenOptions option = 0; + SoupServerListenOptions option = (SoupServerListenOptions)0; gboolean success = soup_server_listen(rest_http_server, listen_address, option, &error); g_object_unref (listen_address); if (!success) @@ -362,7 +376,7 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) if (g_strstr_len(app_list_low, app_list_len, "netflix")) { GDIAL_LOGINFO("netflix is enabled from cmdline"); - GList *allowed_origins = g_list_prepend(NULL, ".netflix.com"); + GList *allowed_origins = g_list_prepend(NULL, (gpointer)".netflix.com"); gdial_rest_server_register_app(dial_rest_server, "Netflix", NULL, NULL, TRUE, TRUE, allowed_origins); g_list_free(allowed_origins); } @@ -374,7 +388,7 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) if (g_strstr_len(app_list_low, app_list_len, "youtube")) { GDIAL_LOGINFO("youtube is enabled from cmdline"); - GList *allowed_origins = g_list_prepend(NULL, ".youtube.com"); + GList *allowed_origins = g_list_prepend(NULL, (gpointer)".youtube.com"); gdial_rest_server_register_app(dial_rest_server, "YouTube", NULL, NULL, TRUE, TRUE, allowed_origins); g_list_free(allowed_origins); } @@ -386,7 +400,7 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) if (g_strstr_len(app_list_low, app_list_len, "youtubetv")) { GDIAL_LOGINFO("youtubetv is enabled from cmdline"); - GList *allowed_origins = g_list_prepend(NULL, ".youtube.com"); + GList *allowed_origins = g_list_prepend(NULL, (gpointer)".youtube.com"); gdial_rest_server_register_app(dial_rest_server, "YouTubeTV", NULL, NULL, TRUE, TRUE, allowed_origins); g_list_free(allowed_origins); } @@ -398,7 +412,7 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) if (g_strstr_len(app_list_low, app_list_len, "youtubekids")) { GDIAL_LOGINFO("youtubekids is enabled from cmdline"); - GList *allowed_origins = g_list_prepend(NULL, ".youtube.com"); + GList *allowed_origins = g_list_prepend(NULL, (gpointer)".youtube.com"); gdial_rest_server_register_app(dial_rest_server, "YouTubeKids", NULL, NULL, TRUE, TRUE, allowed_origins); g_list_free(allowed_origins); } @@ -410,7 +424,7 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) if (g_strstr_len(app_list_low, app_list_len, "amazoninstantvideo")) { GDIAL_LOGINFO("AmazonInstantVideo is enabled from cmdline"); - GList *allowed_origins = g_list_prepend(NULL, ".amazonprime.com"); + GList *allowed_origins = g_list_prepend(NULL, (gpointer)".amazonprime.com"); gdial_rest_server_register_app(dial_rest_server, "AmazonInstantVideo", NULL, NULL, TRUE, TRUE, allowed_origins); g_list_free(allowed_origins); } @@ -422,8 +436,8 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) if (g_strstr_len(app_list_low, app_list_len, "spotify")) { GDIAL_LOGINFO("spotify is enabled from cmdline"); - GList *app_prefixes= g_list_prepend(NULL, "com.spotify"); - GList *allowed_origins = g_list_prepend(NULL, ".spotify.com"); + GList *app_prefixes= g_list_prepend(NULL, (gpointer)"com.spotify"); + GList *allowed_origins = g_list_prepend(NULL, (gpointer)".spotify.com"); gdial_rest_server_register_app(dial_rest_server, "com.spotify.Spotify.TV", app_prefixes, NULL, TRUE, TRUE, allowed_origins); g_list_free(allowed_origins); g_list_free(app_prefixes); @@ -436,7 +450,7 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) if (g_strstr_len(app_list_low, app_list_len, "pairing")) { GDIAL_LOGINFO("pairing is enabled from cmdline"); - GList *allowed_origins = g_list_prepend(NULL, ".comcast.com"); + GList *allowed_origins = g_list_prepend(NULL, (gpointer)".comcast.com"); gdial_rest_server_register_app(dial_rest_server, "Pairing", NULL, NULL, TRUE, TRUE, allowed_origins); g_list_free(allowed_origins); } @@ -476,10 +490,16 @@ int gdialServiceImpl::start_GDialServer(int argc, char *argv[]) GSList *uris = soup_server_get_uris(m_servers[i]); for (GSList *uri = uris; uri != NULL; uri = uri->next) { - char *uri_string = soup_uri_to_string(uri->data, FALSE); + SoupURI *origin_uri = (SoupURI *)uri->data; + if (!origin_uri) + { + GDIAL_LOGWARNING("Failed to get SoupURI from SoupServer at index [%d]", i); + continue; + } + char *uri_string = soup_uri_to_string(origin_uri, FALSE); GDIAL_LOGINFO("Listening on %s", uri_string); g_free(uri_string); - soup_uri_free(uri->data); + soup_uri_free(origin_uri); } g_slist_free(uris); } @@ -605,7 +625,7 @@ void *gdialServiceImpl::requestHandlerThread(void *ctx) { GDIAL_LOGTRACE("Entering ..."); gdialServiceImpl *_instance = (gdialServiceImpl *)ctx; - RequestHandlerPayload reqHdlrPayload; + RequestHandlerPayload reqHdlrPayload = {}; while(!_instance->m_RequestHandlerThreadExit) { reqHdlrPayload.appNameOrfriendlyname = ""; @@ -678,6 +698,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: { @@ -741,7 +773,7 @@ void *gdialServiceImpl::responseHandlerThread(void *ctx) payload.c_str(), query.c_str(), AddDataUrl.c_str()); - _instance->m_observer->onApplicationLaunchRequestWithLaunchParam(appName,payload,query,AddDataUrl); + _instance->m_observer->onApplicationLaunchRequestWithLaunchParam(std::move(appName),std::move(payload),std::move(query),std::move(AddDataUrl)); } break; case APP_LAUNCH_REQUEST: @@ -749,7 +781,7 @@ void *gdialServiceImpl::responseHandlerThread(void *ctx) std::string appName = response_data.appName, parameter = response_data.parameterOrPayload; GDIAL_LOGINFO("AppLaunch : appName:%s parameter:%s",appName.c_str(),parameter.c_str()); - _instance->m_observer->onApplicationLaunchRequest(appName,parameter); + _instance->m_observer->onApplicationLaunchRequest(std::move(appName),std::move(parameter)); } break; case APP_STOP_REQUEST: @@ -757,7 +789,7 @@ void *gdialServiceImpl::responseHandlerThread(void *ctx) std::string appName = response_data.appName, appId = response_data.appIdOrQuery; GDIAL_LOGINFO("AppStop : appName:%s appId:%s",appName.c_str(),appId.c_str()); - _instance->m_observer->onApplicationStopRequest(appName,appId); + _instance->m_observer->onApplicationStopRequest(std::move(appName),std::move(appId)); } break; case APP_HIDE_REQUEST: @@ -765,7 +797,7 @@ void *gdialServiceImpl::responseHandlerThread(void *ctx) std::string appName = response_data.appName, appId = response_data.appIdOrQuery; GDIAL_LOGINFO("AppHide : appName:%s appId:%s",appName.c_str(),appId.c_str()); - _instance->m_observer->onApplicationHideRequest(appName,appId); + _instance->m_observer->onApplicationHideRequest(std::move(appName),std::move(appId)); } break; case APP_STATE_REQUEST: @@ -773,7 +805,7 @@ void *gdialServiceImpl::responseHandlerThread(void *ctx) std::string appName = response_data.appName, appId = response_data.appIdOrQuery; GDIAL_LOGINFO("AppState : appName:%s appId:%s",appName.c_str(),appId.c_str()); - _instance->m_observer->onApplicationStateRequest(appName,appId); + _instance->m_observer->onApplicationStateRequest(std::move(appName),std::move(appId)); } break; case APP_RESUME_REQUEST: @@ -781,7 +813,7 @@ void *gdialServiceImpl::responseHandlerThread(void *ctx) std::string appName = response_data.appName, appId = response_data.appIdOrQuery; GDIAL_LOGINFO("AppResume : appName:%s appId:%s",appName.c_str(),appId.c_str()); - _instance->m_observer->onApplicationResumeRequest(appName,appId); + _instance->m_observer->onApplicationResumeRequest(std::move(appName),std::move(appId)); } break; default: @@ -793,7 +825,6 @@ void *gdialServiceImpl::responseHandlerThread(void *ctx) } } _instance->m_gdialserver_response_handler_thread = 0; - _instance->m_observer->onStopped(); pthread_exit(nullptr); } @@ -950,13 +981,14 @@ GDIAL_SERVICE_ERROR_CODES gdialService::ApplicationStateChanged(string applicati error.c_str()); if ((nullptr != m_gdialService ) && (nullptr != gdialImplInstance)) { - RequestHandlerPayload payload; + RequestHandlerPayload payload = {}; payload.event = APP_STATE_CHANGED; - - payload.appNameOrfriendlyname = applicationName; - payload.appIdOractivation = applicationId; - payload.state = appState; - payload.error = error; + payload.appNameOrfriendlyname = std::move(applicationName); + payload.appIdOractivation = std::move(applicationId); + payload.state = std::move(appState); + payload.error = std::move(error); + payload.data_param = nullptr; + payload.user_param1 = false; gdialImplInstance->sendRequest(payload); } GDIAL_LOGTRACE("Exiting ..."); @@ -970,11 +1002,12 @@ GDIAL_SERVICE_ERROR_CODES gdialService::ActivationChanged(string activation, str GDIAL_LOGINFO("activation[%s] friendlyname[%s]",activation.c_str(),friendlyname.c_str()); if ((nullptr != m_gdialService ) && (nullptr != gdialImplInstance)) { - RequestHandlerPayload payload; + RequestHandlerPayload payload = {}; payload.event = ACTIVATION_CHANGED; - - payload.appNameOrfriendlyname = friendlyname; - payload.appIdOractivation = activation; + payload.appNameOrfriendlyname = std::move(friendlyname); + payload.appIdOractivation = std::move(activation); + payload.data_param = nullptr; + payload.user_param1 = false; GDIAL_LOGINFO("ACTIVATION_CHANGED request sent"); gdialImplInstance->sendRequest(payload); } @@ -989,10 +1022,11 @@ GDIAL_SERVICE_ERROR_CODES gdialService::FriendlyNameChanged(string friendlyname) GDIAL_LOGINFO("friendlyname[%s]",friendlyname.c_str()); if ((nullptr != m_gdialService ) && (nullptr != gdialImplInstance)) { - RequestHandlerPayload payload; + RequestHandlerPayload payload = {}; payload.event = FRIENDLYNAME_CHANGED; - - payload.appNameOrfriendlyname = friendlyname; + payload.appNameOrfriendlyname = std::move(friendlyname); + payload.data_param = nullptr; + payload.user_param1 = false; gdialImplInstance->sendRequest(payload); } GDIAL_LOGTRACE("Exiting ..."); @@ -1019,9 +1053,10 @@ GDIAL_SERVICE_ERROR_CODES gdialService::RegisterApplications(RegisterAppEntryLis GDIAL_LOGINFO("appConfigList[%p]",appConfigList); if ((nullptr != m_gdialService ) && (nullptr != gdialImplInstance)) { - RequestHandlerPayload payload; + RequestHandlerPayload payload = {}; payload.event = REGISTER_APPLICATIONS; payload.data_param = appConfigList; + payload.user_param1 = false; gdialImplInstance->sendRequest(payload); } GDIAL_LOGTRACE("Exiting ..."); @@ -1035,14 +1070,52 @@ void gdialService::setNetworkStandbyMode(bool nwStandbymode) GDIAL_LOGINFO("nwStandbymode[%u]",nwStandbymode); if ((nullptr != m_gdialService ) && (nullptr != gdialImplInstance)) { - RequestHandlerPayload payload; + RequestHandlerPayload payload = {}; payload.event = UPDATE_NW_STANDBY; payload.user_param1 = (bool)nwStandbymode; + payload.data_param = nullptr; gdialImplInstance->sendRequest(payload); } 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 = std::move(manufacturer); + payload.data_param = nullptr; + payload.user_param1 = false; + 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 = std::move(model); + payload.data_param = nullptr; + payload.user_param1 = false; + gdialImplInstance->sendRequest(payload); + } + GDIAL_LOGTRACE("Exiting ..."); + return GDIAL_SERVICE_ERROR_NONE; +} + void gdialServiceImpl::sendRequest( const RequestHandlerPayload& payload ) { GDIAL_LOGTRACE("Entering ..."); @@ -1069,10 +1142,10 @@ void gdialServiceImpl::onApplicationLaunchRequestWithLaunchParam(string appName, GDIAL_LOGTRACE("Entering ..."); payload.event = APP_LAUNCH_REQUEST_WITH_PARAMS; - payload.appName = appName; - payload.parameterOrPayload = strPayLoad; - payload.appIdOrQuery = strQuery; - payload.AddDataUrl = strAddDataUrl; + payload.appName = std::move(appName); + payload.parameterOrPayload = std::move(strPayLoad); + payload.appIdOrQuery = std::move(strQuery); + payload.AddDataUrl = std::move(strAddDataUrl); notifyResponse(payload); GDIAL_LOGTRACE("Exiting ..."); } @@ -1083,8 +1156,8 @@ void gdialServiceImpl::onApplicationLaunchRequest(string appName, string paramet GDIAL_LOGTRACE("Entering ..."); payload.event = APP_LAUNCH_REQUEST; - payload.appName = appName; - payload.parameterOrPayload = parameter; + payload.appName = std::move(appName); + payload.parameterOrPayload = std::move(parameter); notifyResponse(payload); GDIAL_LOGTRACE("Exiting ..."); } @@ -1095,8 +1168,8 @@ void gdialServiceImpl::onApplicationStopRequest(string appName, string appID) GDIAL_LOGTRACE("Entering ..."); payload.event = APP_STOP_REQUEST; - payload.appName = appName; - payload.appIdOrQuery = appID; + payload.appName = std::move(appName); + payload.appIdOrQuery = std::move(appID); notifyResponse(payload); GDIAL_LOGTRACE("Exiting ..."); } @@ -1107,8 +1180,8 @@ void gdialServiceImpl::onApplicationHideRequest(string appName, string appID) GDIAL_LOGTRACE("Entering ..."); payload.event = APP_HIDE_REQUEST; - payload.appName = appName; - payload.appIdOrQuery = appID; + payload.appName = std::move(appName); + payload.appIdOrQuery = std::move(appID); notifyResponse(payload); GDIAL_LOGTRACE("Exiting ..."); } @@ -1119,8 +1192,8 @@ void gdialServiceImpl::onApplicationResumeRequest(string appName, string appID) GDIAL_LOGTRACE("Entering ..."); payload.event = APP_RESUME_REQUEST; - payload.appName = appName; - payload.appIdOrQuery = appID; + payload.appName = std::move(appName); + payload.appIdOrQuery = std::move(appID); notifyResponse(payload); GDIAL_LOGTRACE("Exiting ..."); } @@ -1131,24 +1204,19 @@ void gdialServiceImpl::onApplicationStateRequest(string appName, string appID) GDIAL_LOGTRACE("Entering ..."); payload.event = APP_STATE_REQUEST; - payload.appName = appName; - payload.appIdOrQuery = appID; + payload.appName = std::move(appName); + payload.appIdOrQuery = std::move(appID); notifyResponse(payload); GDIAL_LOGTRACE("Exiting ..."); } -void gdialServiceImpl::onStopped() -{ - // -} - void gdialServiceImpl::updatePowerState(string powerState) { GDIAL_LOGTRACE("Entering ..."); GDIAL_LOGINFO("powerState : %s",powerState.c_str()); if (m_observer) { - m_observer->updatePowerState(powerState); + m_observer->updatePowerState(std::move(powerState)); } GDIAL_LOGTRACE("Exiting ..."); } \ No newline at end of file diff --git a/server/include/gdial-config.h b/server/include/gdial-config.h index c6b9a9bc..13dd4172 100644 --- a/server/include/gdial-config.h +++ b/server/include/gdial-config.h @@ -17,8 +17,8 @@ * limitations under the License. */ -#ifndef GDIAL_H_ -#define GDIAL_H_ +#ifndef _GDIAL_CONFIG_H_ +#define _GDIAL_CONFIG_H_ #ifdef __cplusplus extern "C" { @@ -81,12 +81,6 @@ extern "C" { #define GDIAL_THROTTLE_DELAY_US 100000 #define GDIAL_DEBUG g_print -enum { - GDIAL_ERROR_NONE = 0, - GDIAL_ERROR_NOT_REGISTERED, - GDIAL_ERROR_FAIL_TO_START, -} GDialError; - #define GDIAL_GERROR_CHECK_AND_FREE(err, msg) \ {\ if (err) {\ diff --git a/server/include/gdial-plat-app.h b/server/include/gdial-plat-app.h index 8a5134a9..8382f3ab 100644 --- a/server/include/gdial-plat-app.h +++ b/server/include/gdial-plat-app.h @@ -32,9 +32,13 @@ typedef void * gdial_async_handler_t; typedef void (*gdial_plat_activation_cb)(gboolean, const gchar *); typedef void (*gdial_plat_friendlyname_cb)(const gchar *); typedef void (*gdial_plat_registerapps_cb)(gpointer); +typedef void (*gdial_plat_manufacturername_cb)(const gchar *); +typedef void (*gdial_plat_modelname_cb)(const gchar *); void gdail_plat_register_activation_cb(gdial_plat_activation_cb cb); void gdail_plat_register_friendlyname_cb(gdial_plat_friendlyname_cb cb); void gdail_plat_register_registerapps_cb(gdial_plat_registerapps_cb cb); +void gdail_plat_register_manufacturername_cb(gdial_plat_manufacturername_cb cb); +void gdail_plat_register_modelname_cb(gdial_plat_modelname_cb cb); GDialAppError gdial_plat_application_start(const gchar *app_name, const gchar *payload, const gchar *query, const gchar *additional_data_url, gint *instance_id); GDialAppError gdial_plat_application_hide(const gchar *app_name, gint instance_id); @@ -48,6 +52,8 @@ GDialAppError gdial_plat_application_friendlyname_changed(const char *friendlyna const char* gdial_plat_application_get_protocol_version(); GDialAppError gdial_plat_application_register_applications(void*); void gdial_plat_application_update_network_standby_mode(gboolean nwstandbyMode); +GDialAppError gdial_plat_application_update_manufacturer_name(const char *manufacturer); +GDialAppError gdial_plat_application_update_model_name(const char *model); GDialAppError gdial_plat_application_service_notification(gboolean isNotifyRequired, void* notifier); void * gdial_plat_application_start_async(const gchar *app_name, const gchar *payload, const gchar *query, const gchar *additional_data_url, void *user_data); diff --git a/server/include/gdial-plat-dev.h b/server/include/gdial-plat-dev.h index 99ca0e53..05b607d4 100644 --- a/server/include/gdial-plat-dev.h +++ b/server/include/gdial-plat-dev.h @@ -26,8 +26,6 @@ extern "C" { #endif -const char * gdial_plat_dev_get_manufacturer(); -const char * gdial_plat_dev_get_model(); bool gdial_plat_dev_set_power_state_on(); bool gdial_plat_dev_set_power_state_off(); bool gdial_plat_dev_toggle_power_state(); diff --git a/server/include/gdial_app_registry.h b/server/include/gdial_app_registry.h index 02fbae09..1a701318 100644 --- a/server/include/gdial_app_registry.h +++ b/server/include/gdial_app_registry.h @@ -32,7 +32,10 @@ G_BEGIN_DECLS +#define APP_MAX_UUID_SIZE 64 + typedef struct _GDialAppRegistry { + gchar app_uri[APP_MAX_UUID_SIZE+1]; // for storing uri gchar *name; gboolean use_additional_data; gboolean is_singleton; diff --git a/server/include/gdialservice.h b/server/include/gdialservice.h index 179a1d47..e3523868 100644 --- a/server/include/gdialservice.h +++ b/server/include/gdialservice.h @@ -41,10 +41,12 @@ class gdialService string getProtocolVersion(void); GDIAL_SERVICE_ERROR_CODES RegisterApplications(RegisterAppEntryList* appConfigList); void setNetworkStandbyMode(bool nwStandbymode); + GDIAL_SERVICE_ERROR_CODES setManufacturerName(string manufacturer); + GDIAL_SERVICE_ERROR_CODES setModelName(string model); private: GDialNotifier* m_observer{nullptr}; gdialService(){}; virtual ~gdialService(){}; }; -#endif /* gdialService_hpp */ \ No newline at end of file +#endif /* gdialService_hpp */ diff --git a/server/include/gdialservicecommon.h b/server/include/gdialservicecommon.h index 3f9dfe49..fb463373 100644 --- a/server/include/gdialservicecommon.h +++ b/server/include/gdialservicecommon.h @@ -78,7 +78,6 @@ class GDialNotifier virtual void onApplicationHideRequest(string appName, string appID)=0; virtual void onApplicationResumeRequest(string appName, string appID)=0; virtual void onApplicationStateRequest(string appName, string appID)=0; - virtual void onStopped(void)=0; virtual void updatePowerState(string powerState)=0; }; #endif /* _GDIAL_SERVICE_COMMON_H_ */ \ No newline at end of file diff --git a/server/include/gdialserviceimpl.h b/server/include/gdialserviceimpl.h index 29fd6168..26f4b430 100644 --- a/server/include/gdialserviceimpl.h +++ b/server/include/gdialserviceimpl.h @@ -37,6 +37,8 @@ typedef enum _AppRequestEvents FRIENDLYNAME_CHANGED, REGISTER_APPLICATIONS, UPDATE_NW_STANDBY, + UPDATE_MANUFACTURER_NAME, + UPDATE_MODEL_NAME, INVALID_REQUEST } AppRequestEvents; @@ -59,6 +61,8 @@ typedef struct _RequestHandlerPayload std::string appIdOractivation; std::string state; std::string error; + std::string manufacturer; + std::string model; void* data_param; bool user_param1; AppRequestEvents event; @@ -93,14 +97,13 @@ class gdialServiceImpl: public GDialNotifier virtual void onApplicationHideRequest(string appName, string appID) override; virtual void onApplicationResumeRequest(string appName, string appID) override; virtual void onApplicationStateRequest(string appName, string appID) override; - virtual void onStopped() override; virtual void updatePowerState(string powerState) override; private: gdialServiceImpl(){}; virtual ~gdialServiceImpl(){}; - GDialNotifier *m_observer; + GDialNotifier *m_observer{nullptr}; pthread_t m_gdialserver_main_thread{0}; static void *mainThread(void *ctx); diff --git a/server/plat/CMakeLists.txt b/server/plat/CMakeLists.txt index 341fee74..dcb8215c 100644 --- a/server/plat/CMakeLists.txt +++ b/server/plat/CMakeLists.txt @@ -27,6 +27,12 @@ set (GDIAL_PLAT_DEPEND_LIBRARIES "${GLIB_LIBRARIES} ${GOBJECT_LIBRARIES}") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS} -std=c++11 -Wno-nonnull -DRT_PLATFORM_LINUX") +option(DISABLE_SECURITY_TOKEN "Disable security token" OFF) + +if(DISABLE_SECURITY_TOKEN) + add_definitions(-DDISABLE_SECURITY_TOKEN) +endif() + # # Template that generates .pc file # @@ -69,4 +75,8 @@ if(PLATFORM) endif() add_library(gdial-plat SHARED ${GDIAL_PLAT_LIB_SOURCE_FILES}) -target_link_Libraries(gdial-plat PRIVATE ${GLIB_LIBRARIES} ${GOBJECT_LIBRARIES} -lpthread -lWPEFrameworkCore -lWPEFrameworkDefinitions -lWPEFrameworkCOM -lWPEFrameworkPlugins -lWPEFrameworkSecurityUtil -lIARMBus) +if(DISABLE_SECURITY_TOKEN) + target_link_Libraries(gdial-plat PRIVATE ${GLIB_LIBRARIES} ${GOBJECT_LIBRARIES} -lpthread -lWPEFrameworkCore -lWPEFrameworkDefinitions -lWPEFrameworkCOM -lWPEFrameworkPlugins -lIARMBus -luuid) +else() + target_link_libraries(gdial-plat PRIVATE ${GLIB_LIBRARIES} ${GOBJECT_LIBRARIES} -lpthread -lWPEFrameworkCore -lWPEFrameworkDefinitions -lWPEFrameworkCOM -lWPEFrameworkPlugins -lWPEFrameworkSecurityUtil -lIARMBus -luuid) +endif() diff --git a/server/plat/gdial-os-app.h b/server/plat/gdial-os-app.h index 43229602..c2ed67e1 100644 --- a/server/plat/gdial-os-app.h +++ b/server/plat/gdial-os-app.h @@ -39,6 +39,8 @@ int gdial_os_application_friendlyname_changed(const char *friendlyname); const char* gdial_os_application_get_protocol_version(); int gdial_os_application_register_applications(void*); void gdial_os_application_update_network_standby_mode(gboolean nwstandbyMode); +int gdial_os_application_update_manufacturer_name(const char *manufacturer); +int gdial_os_application_update_model_name(const char *model); int gdial_os_application_service_notification(gboolean isNotifyRequired, void* notifier); #ifdef __cplusplus diff --git a/server/plat/gdial-plat-app.c b/server/plat/gdial-plat-app.c index 56fef49a..0d2d0eea 100644 --- a/server/plat/gdial-plat-app.c +++ b/server/plat/gdial-plat-app.c @@ -35,6 +35,8 @@ static gpointer gdial_app_state_cb_user_data_ = NULL; static gdial_plat_activation_cb g_activation_cb = NULL; static gdial_plat_friendlyname_cb g_friendlyname_cb = NULL; static gdial_plat_registerapps_cb g_registerapps_cb = NULL; +static gdial_plat_manufacturername_cb g_manufacturername_cb = NULL; +static gdial_plat_modelname_cb g_modelname_cb = NULL; #define GDIAL_PLAT_APP_ASYNC_CONTEXT_TYPE_COMMON 0 #define GDIAL_PLAT_APP_ASYNC_CONTEXT_TYPE_START 1 @@ -151,6 +153,18 @@ void gdail_plat_register_registerapps_cb(gdial_plat_registerapps_cb cb) gdial_register_registerapps_cb(cb); } +void gdail_plat_register_manufacturername_cb(gdial_plat_manufacturername_cb cb) +{ + g_manufacturername_cb = cb; + gdial_register_manufacturername_cb(cb); +} + +void gdail_plat_register_modelname_cb(gdial_plat_modelname_cb cb) +{ + g_modelname_cb = cb; + gdial_register_modelname_cb(cb); +} + gint gdial_plat_init(GMainContext *main_context) { g_return_val_if_fail(main_context != NULL, GDIAL_APP_ERROR_INTERNAL); g_return_val_if_fail((g_main_context_ == NULL || g_main_context_ == main_context), GDIAL_APP_ERROR_INTERNAL); @@ -336,8 +350,22 @@ void gdial_plat_application_update_network_standby_mode(gboolean nwstandby) gdial_os_application_update_network_standby_mode(nwstandby); } +GDialAppError gdial_plat_application_update_manufacturer_name(const char *manufacturer) +{ + g_return_val_if_fail(manufacturer != NULL, GDIAL_APP_ERROR_BAD_REQUEST); + + return gdial_os_application_update_manufacturer_name(manufacturer); +} + +GDialAppError gdial_plat_application_update_model_name(const char *model) +{ + g_return_val_if_fail(model != NULL, GDIAL_APP_ERROR_BAD_REQUEST); + + return gdial_os_application_update_model_name(model); +} + GDialAppError gdial_plat_application_service_notification(gboolean isNotifyRequired, void* notifier) { g_return_val_if_fail((notifier != NULL)||(false == isNotifyRequired), GDIAL_APP_ERROR_BAD_REQUEST); return gdial_os_application_service_notification(isNotifyRequired,notifier); -} +} \ No newline at end of file diff --git a/server/plat/gdial-plat-dev.c b/server/plat/gdial-plat-dev.c index 55d4c40f..baef465a 100644 --- a/server/plat/gdial-plat-dev.c +++ b/server/plat/gdial-plat-dev.c @@ -25,14 +25,6 @@ static gdial_plat_dev_nwstandbymode_cb g_nwstandbymode_cb = NULL; static gdial_plat_dev_powerstate_cb g_powerstate_cb = NULL; -const char * gdial_plat_dev_get_manufacturer() { - return g_getenv("GDIAL_DEV_MANUFACTURER"); -} - -const char * gdial_plat_dev_get_model() { - return g_getenv("GDIAL_DEV_MODEL"); -} - void gdial_plat_dev_nwstandby_mode_change(gboolean NetworkStandbyMode) { if(g_nwstandbymode_cb) g_nwstandbymode_cb(NetworkStandbyMode); diff --git a/server/plat/gdial-plat-util.c b/server/plat/gdial-plat-util.c index 9f4a07b7..fd6e9594 100644 --- a/server/plat/gdial-plat-util.c +++ b/server/plat/gdial-plat-util.c @@ -120,12 +120,12 @@ void gdial_plat_util_log(gdial_plat_util_LogLevel level, va_start(argptr, format); vsnprintf(formatted, kFormatMessageSize, format, argptr); va_end(argptr); - fprintf(stderr, "[GDIAL][%d] %s [%s:%d] %s: %s \n", - (int)syscall(SYS_gettid), + fprintf(stderr, "[GDIAL][%ld] %s [%s:%d] %s: %s \n", + (long)syscall(SYS_gettid), levelMap[level], basename(file), line, func, formatted); fflush(stderr); -} \ No newline at end of file +} diff --git a/server/plat/gdial.cpp b/server/plat/gdial.cpp index 465cf5dc..6e294fde 100644 --- a/server/plat/gdial.cpp +++ b/server/plat/gdial.cpp @@ -32,7 +32,9 @@ #include #include #include +#ifndef DISABLE_SECURITY_TOKEN #include +#endif #include "gdial-app.h" #include "gdial-plat-dev.h" #include "gdial-os-app.h" @@ -49,6 +51,8 @@ GDialAppStatusCache* AppCache = nullptr; static gdial_activation_cb g_activation_cb = NULL; static gdial_friendlyname_cb g_friendlyname_cb = NULL; static gdial_registerapps_cb g_registerapps_cb = NULL; +static gdial_manufacturername_cb g_manufacturername_cb = NULL; +static gdial_modelname_cb g_modelname_cb = NULL; #define DIAL_MAX_NUM_OF_APPS (64) #define DIAL_MAX_NUM_OF_APP_NAMES (64) @@ -68,7 +72,7 @@ class GDialCastObject AppInfo* AppObj = new AppInfo(applicationName,applicationId,state,error); if ((nullptr != AppObj) && (nullptr != AppCache)) { - GDIAL_LOGINFO("AppName : %s AppID : %s State : %s Error : %s", + GDIAL_LOGINFO("AppName[%s] AppID[%s] State[%s] Error[%s]", AppObj->appName.c_str(), AppObj->appId.c_str(), AppObj->appState.c_str(), @@ -78,6 +82,14 @@ class GDialCastObject reterror = GDIAL_CAST_ERROR_NONE; } } + else + { + if (nullptr != AppObj) + { + delete AppObj; + AppObj = nullptr; + } + } GDIAL_LOGTRACE("Exiting ..."); return reterror; } @@ -88,7 +100,7 @@ class GDialCastObject GDialErrorCode error = GDIAL_CAST_ERROR_INTERNAL; if( g_friendlyname_cb && friendlyname ) { - GDIAL_LOGINFO("GDialCastObject::friendlyNameChanged :%s ",friendlyname); + GDIAL_LOGINFO("GDialCastObject::friendlyNameChanged:[%s]",friendlyname); g_friendlyname_cb(friendlyname); error = GDIAL_CAST_ERROR_NONE; } @@ -111,7 +123,7 @@ class GDialCastObject { break; } - GDIAL_LOGINFO("Application: %d ", i); + GDIAL_LOGINFO("Application:[%d]", i); gAppPrefxes = g_list_prepend (gAppPrefxes, g_strdup(appEntry->prefixes.c_str())); GDIAL_LOGINFO("%s, ", appEntry->prefixes.c_str()); GDIAL_LOGINFO(""); @@ -123,7 +135,7 @@ class GDialCastObject GHashTable *gProperties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); std::string appAllowStop = appEntry->allowStop ? "true" : "false"; g_hash_table_insert(gProperties,g_strdup("allowStop"),g_strdup(appAllowStop.c_str())); - GDIAL_LOGINFO("allowStop: %s", appAllowStop.c_str()); + GDIAL_LOGINFO("allowStop:[%s]", appAllowStop.c_str()); GDIAL_LOGINFO(""); GDialAppRegistry* app_registry = gdial_app_registry_new( g_strdup(appEntry->Names.c_str()), @@ -165,7 +177,7 @@ class GDialCastObject { GDIAL_LOGTRACE("Entering ..."); GDialErrorCode error = GDIAL_CAST_ERROR_INTERNAL; - GDIAL_LOGINFO("status: %s friendlyname: %s ",status.c_str(),friendlyName.c_str()); + GDIAL_LOGINFO("status[%s] friendlyname[%s]",status.c_str(),friendlyName.c_str()); if( g_activation_cb ) { if(!strcmp(status.c_str(), "true")) @@ -176,7 +188,7 @@ class GDialCastObject { g_activation_cb(0,friendlyName.c_str()); } - GDIAL_LOGINFO("status: %s g_activation_cb :%p",status.c_str(), g_activation_cb); + GDIAL_LOGINFO("status[%s] g_activation_cb[%p]",status.c_str(), g_activation_cb); error = GDIAL_CAST_ERROR_NONE; } GDIAL_LOGTRACE("Exiting ..."); @@ -189,19 +201,53 @@ class GDialCastObject gdial_plat_dev_nwstandby_mode_change(nwstandbyMode); GDIAL_LOGTRACE("Exiting ..."); } + + GDialErrorCode updateManufacturerName(const char* manufacturerName) + { + GDIAL_LOGTRACE("Entering ..."); + GDialErrorCode error = GDIAL_CAST_ERROR_INTERNAL; + if( g_manufacturername_cb && manufacturerName ) + { + GDIAL_LOGINFO("Manufacturer[%s]",manufacturerName); + g_manufacturername_cb(manufacturerName); + error = GDIAL_CAST_ERROR_NONE; + } + GDIAL_LOGTRACE("Exiting ..."); + return error; + } + + GDialErrorCode updateModelName(const char* modelName) + { + GDIAL_LOGTRACE("Entering ..."); + GDialErrorCode error = GDIAL_CAST_ERROR_INTERNAL; + if( g_modelname_cb && modelName ) + { + GDIAL_LOGINFO("ModelName[%s]",modelName); + g_modelname_cb(modelName); + error = GDIAL_CAST_ERROR_NONE; + } + GDIAL_LOGTRACE("Exiting ..."); + return error; + } GDialErrorCode launchApplication(const char* appName, const char* args) { GDIAL_LOGTRACE("Entering ..."); std::string applicationName = "", parameter = ""; - if (nullptr!=appName) applicationName = appName; - if (nullptr!=args) parameter = args; + + if (nullptr!=appName){ + applicationName = appName; + } + + if (nullptr!=args){ + parameter = args; + } GDIAL_LOGINFO("App[%s] param[%s] observer[%p]",applicationName.c_str(),parameter.c_str(),m_observer); if (nullptr!=m_observer) { - m_observer->onApplicationLaunchRequest(applicationName,parameter); + m_observer->onApplicationLaunchRequest(std::move(applicationName),std::move(parameter)); } GDIAL_LOGTRACE("Exiting ..."); return GDIAL_CAST_ERROR_NONE; @@ -215,10 +261,18 @@ class GDialCastObject additionalDataUrl = ""; GDIAL_LOGTRACE("Entering ..."); - if (nullptr!=appName) applicationName = appName; - if (nullptr!=argPayload) payLoad = argPayload; - if (nullptr!=argQueryString) queryString = argQueryString; - if (nullptr!=argAdditionalDataUrl) additionalDataUrl = argAdditionalDataUrl; + if (nullptr!=appName){ + applicationName = appName; + } + if (nullptr!=argPayload){ + payLoad = argPayload; + } + if (nullptr!=argQueryString){ + queryString = argQueryString; + } + if (nullptr!=argAdditionalDataUrl){ + additionalDataUrl = argAdditionalDataUrl; + } GDIAL_LOGINFO("App[%s] payload[%s] query_string[%s] additional_data_url[%s]observer[%p]", applicationName.c_str(), @@ -228,10 +282,10 @@ class GDialCastObject m_observer); if (nullptr!=m_observer) { - m_observer->onApplicationLaunchRequestWithLaunchParam( applicationName, - payLoad, - queryString, - additionalDataUrl ); + m_observer->onApplicationLaunchRequestWithLaunchParam( std::move(applicationName), + std::move(payLoad), + std::move(queryString), + std::move(additionalDataUrl) ); } GDIAL_LOGTRACE("Exiting ..."); return GDIAL_CAST_ERROR_NONE; @@ -242,13 +296,17 @@ class GDialCastObject GDIAL_LOGTRACE("Entering ..."); std::string applicationName = "", applicationId = ""; - if (nullptr!=appName) applicationName = appName; - if (nullptr!=appID) applicationId = appID; + if (nullptr!=appName){ + applicationName = appName; + } + if (nullptr!=appID){ + applicationId = appID; + } GDIAL_LOGINFO("App[%s]ID[%s]observer[%p]",applicationName.c_str(),applicationId.c_str(),m_observer); if (nullptr!=m_observer) { - m_observer->onApplicationHideRequest(applicationName,applicationId); + m_observer->onApplicationHideRequest(std::move(applicationName),std::move(applicationId)); } GDIAL_LOGTRACE("Exiting ..."); return GDIAL_CAST_ERROR_NONE; @@ -260,13 +318,17 @@ class GDialCastObject std::string applicationName = "", applicationId = ""; - if (nullptr!=appName) applicationName = appName; - if (nullptr!=appID) applicationId = appID; + if (nullptr!=appName){ + applicationName = appName; + } + if (nullptr!=appID){ + applicationId = appID; + } GDIAL_LOGINFO("App[%s]ID[%s]observer[%p]",applicationName.c_str(),applicationId.c_str(),m_observer); if (nullptr!=m_observer) { - m_observer->onApplicationResumeRequest(applicationName,applicationId); + m_observer->onApplicationResumeRequest(std::move(applicationName),std::move(applicationId)); } GDIAL_LOGTRACE("Exiting ..."); return GDIAL_CAST_ERROR_NONE; @@ -278,13 +340,17 @@ class GDialCastObject std::string applicationName = "", applicationId = ""; - if (nullptr!=appName) applicationName = appName; - if (nullptr!=appID) applicationId = appID; + if (nullptr!=appName){ + applicationName = appName; + } + if (nullptr!=appID){ + applicationId = appID; + } GDIAL_LOGINFO("App[%s]ID[%s]observer[%p]",applicationName.c_str(),applicationId.c_str(),m_observer); if (nullptr!=m_observer) { - m_observer->onApplicationStopRequest(applicationName,applicationId); + m_observer->onApplicationStopRequest(std::move(applicationName),std::move(applicationId)); } GDIAL_LOGTRACE("Exiting ..."); return GDIAL_CAST_ERROR_NONE; @@ -296,13 +362,17 @@ class GDialCastObject std::string applicationName = "", applicationId = ""; - if (nullptr!=appName) applicationName = appName; - if (nullptr!=appID) applicationId = appID; + if (nullptr!=appName){ + applicationName = appName; + } + if (nullptr!=appID){ + applicationId = appID; + } GDIAL_LOGINFO("App[%s]ID[%s]observer[%p]",applicationName.c_str(),applicationId.c_str(),m_observer); if (nullptr!=m_observer) { - m_observer->onApplicationStateRequest(applicationName,applicationId); + m_observer->onApplicationStateRequest(std::move(applicationName),std::move(applicationId)); } GDIAL_LOGTRACE("Exiting ..."); return GDIAL_CAST_ERROR_NONE; @@ -313,7 +383,7 @@ class GDialCastObject m_observer = service; } private: - GDialNotifier *m_observer; + GDialNotifier *m_observer{nullptr}; }; GDialCastObject* GDialObjHandle = nullptr; @@ -333,6 +403,16 @@ void gdial_register_registerapps_cb(gdial_registerapps_cb cb) g_registerapps_cb = cb; } +void gdial_register_manufacturername_cb(gdial_manufacturername_cb cb) +{ + g_manufacturername_cb = cb; +} + +void gdial_register_modelname_cb(gdial_modelname_cb cb) +{ + g_modelname_cb = cb; +} + bool gdial_init(GMainContext *context) { bool returnValue = false; @@ -435,7 +515,7 @@ map parse_query(const char* query_string) { int gdial_os_application_start(const char *app_name, const char *payload, const char *query_string, const char *additional_data_url, int *instance_id) { GDIAL_LOGTRACE("Entering ..."); - GDIAL_LOGINFO("App launch req: appName: %s query: [%s], payload: [%s], additionalDataUrl [%s] instance[%p]", + GDIAL_LOGINFO("App launch req: appName[%s] query[%s], payload[%s], additionalDataUrl [%s] instance[%p]", app_name, query_string, payload, additional_data_url,instance_id); if (strcmp(app_name,"system") == 0) { @@ -497,31 +577,36 @@ std::string GetCurrentState() { std::string netflixState = ""; Core::JSON::ArrayType pluginResponse; Core::SystemInfo::SetEnvironment(_T("THUNDER_ACCESS"), (_T("127.0.0.1:9998"))); + string sToken = ""; + string query = ""; +#ifdef DISABLE_SECURITY_TOKEN + query = "token=" + sToken; +#else unsigned char buffer[MAX_LENGTH] = {0}; //Obtaining controller object if (NULL == controllerRemoteObject) { int ret = GetSecurityToken(MAX_LENGTH,buffer); - if(ret<0) + if(ret>0) { - controllerRemoteObject = new JSONRPC::LinkType(std::string()); - } else { - string sToken = (char*)buffer; - string query = "token=" + sToken; - GDIAL_LOGINFO("Security token = %s ",query.c_str()); - controllerRemoteObject = new JSONRPC::LinkType(std::string(), false, query); + sToken = (char*)buffer; + query = "token=" + sToken; + GDIAL_LOGINFO("Security token[%s] ",query.c_str()); } } +#endif + controllerRemoteObject = new JSONRPC::LinkType(std::string(), false, query); + std::string nfxstatus = "status@" + nfx_callsign; if(controllerRemoteObject->Get(1000, _T(nfxstatus), pluginResponse) == Core::ERROR_NONE) { - GDIAL_LOGINFO("Obtained netflix status = %s",nfxstatus.c_str()); + GDIAL_LOGINFO("Obtained netflix status[%s]",nfxstatus.c_str()); Core::JSON::ArrayType::Iterator index(pluginResponse.Elements()); while (index.Next() == true) { netflixState = index.Current().JSONState.Data(); } //end of while loop } //end of if case for querrying - GDIAL_LOGINFO("Netflix State = %s",netflixState.c_str()); + GDIAL_LOGINFO("Netflix State[%s]",netflixState.c_str()); return netflixState; } void stop_netflix() @@ -541,7 +626,7 @@ void stop_netflix() int gdial_os_application_stop(const char *app_name, int instance_id) { bool enable_stop = false; GDIAL_LOGTRACE("Entering ..."); - GDIAL_LOGINFO("AppName = %s appID = %s",app_name,std::to_string(instance_id).c_str()); + GDIAL_LOGINFO("AppName[%s] appID[%s]",app_name,std::to_string(instance_id).c_str()); if((strcmp(app_name,"system") == 0)){ GDIAL_LOGINFO("delete not supported for system app return GDIAL_APP_ERROR_BAD_REQUEST"); return GDIAL_APP_ERROR_BAD_REQUEST; @@ -591,7 +676,7 @@ int gdial_os_application_hide(const char *app_name, int instance_id) return GDIAL_APP_ERROR_NONE; } #if 0 - GDIAL_LOGINFO("gdial_os_application_hide-->stop: appName = %s appID = %s",app_name,std::to_string(instance_id).c_str()); + GDIAL_LOGINFO("gdial_os_application_hide-->stop: appName[%s] appID[%s]",app_name,std::to_string(instance_id).c_str()); std::string State = AppCache->SearchAppStatusInCache(app_name); if (0 && State != "running") { return GDIAL_APP_ERROR_BAD_REQUEST; @@ -607,7 +692,7 @@ int gdial_os_application_hide(const char *app_name, int instance_id) } return GDIAL_APP_ERROR_NONE; #else - GDIAL_LOGINFO("gdial_os_application_hide: appName = %s appID = %s",app_name,std::to_string(instance_id).c_str()); + GDIAL_LOGINFO("gdial_os_application_hide: appName[%s] appID[%s]",app_name,std::to_string(instance_id).c_str()); std::string State = AppCache->SearchAppStatusInCache(app_name); if (State != "running") { @@ -635,7 +720,7 @@ int gdial_os_application_hide(const char *app_name, int instance_id) int gdial_os_application_resume(const char *app_name, int instance_id) { GDIAL_LOGTRACE("Entering ..."); - GDIAL_LOGINFO("appName = %s appID = %s",app_name,std::to_string(instance_id).c_str()); + GDIAL_LOGINFO("appName[%s] appID[%s]",app_name,std::to_string(instance_id).c_str()); if((strcmp(app_name,"system") == 0)){ GDIAL_LOGINFO("system app can not be resume"); @@ -668,7 +753,7 @@ int gdial_os_application_resume(const char *app_name, int instance_id) { int gdial_os_application_state(const char *app_name, int instance_id, GDialAppState *state) { GDIAL_LOGTRACE("Entering ..."); - GDIAL_LOGINFO("App = %s Id = %d",app_name,instance_id); + GDIAL_LOGINFO("App[%s] Id[%d]",app_name,instance_id); if((strcmp(app_name,"system") == 0)){ *state = GDIAL_APP_STATE_HIDE; GDIAL_LOGINFO("getApplicationState: AppState = suspended "); @@ -676,7 +761,7 @@ int gdial_os_application_state(const char *app_name, int instance_id, GDialAppSt return GDIAL_APP_ERROR_NONE; } std::string State = AppCache->SearchAppStatusInCache(app_name); - GDIAL_LOGINFO("getApplicationState: AppState = %s ",State.c_str()); + GDIAL_LOGINFO("getApplicationState: AppState[%s] ",State.c_str()); /* * return cache, but also trigger a refresh */ @@ -710,7 +795,7 @@ int gdial_os_application_state(const char *app_name, int instance_id, GDialAppSt if ( enable_stop != NULL ) { if (strcmp(app_name,"Netflix") == 0 && strcmp(enable_stop,"true") == 0) { std::string app_state = GetCurrentState(); - GDIAL_LOGINFO("Presence of Netflix thunder plugin state = %s to confirm state", app_state.c_str()); + GDIAL_LOGINFO("Presence of Netflix thunder plugin state[%s] to confirm state", app_state.c_str()); if (app_state == "deactivated") { *state = GDIAL_APP_STATE_STOPPED; GDIAL_LOGINFO("app [%s] state converted to [%d]", app_name, *state); @@ -732,7 +817,7 @@ int gdial_os_application_state(const char *app_name, int instance_id, GDialAppSt int gdial_os_application_state_changed(const char *applicationName, const char *applicationId, const char *state, const char *error) { GDIAL_LOGTRACE("Entering ..."); - GDIAL_LOGINFO("appName: %s appId: [%s], state: [%s], error [%s]",applicationName, applicationId, state, error); + GDIAL_LOGINFO("appName[%s] appId[%s], state[%s], error [%s]",applicationName, applicationId, state, error); if (nullptr == GDialObjHandle) { @@ -755,7 +840,7 @@ int gdial_os_application_state_changed(const char *applicationName, const char * int gdial_os_application_activation_changed(const char *activation, const char *friendlyname) { GDIAL_LOGTRACE("Entering ..."); - GDIAL_LOGINFO("activation: %s friendlyname: [%s]",activation, friendlyname); + GDIAL_LOGINFO("activation[%s] friendlyname[%s]",activation, friendlyname); if (nullptr == GDialObjHandle) { @@ -778,7 +863,7 @@ int gdial_os_application_activation_changed(const char *activation, const char * int gdial_os_application_friendlyname_changed(const char *friendlyname) { GDIAL_LOGTRACE("Entering ..."); - GDIAL_LOGINFO("friendlyname: [%s]",friendlyname); + GDIAL_LOGINFO("friendlyname[%s]",friendlyname); if (nullptr == GDialObjHandle) { @@ -849,6 +934,47 @@ void gdial_os_application_update_network_standby_mode(gboolean nwstandbymode) GDIAL_LOGTRACE("Exiting ..."); } +int gdial_os_application_update_manufacturer_name(const char *manufacturer) +{ + GDialErrorCode returnValue = GDIAL_CAST_ERROR_INTERNAL; + GDIAL_LOGTRACE("Entering ..."); + if ((nullptr == GDialObjHandle)||(nullptr == manufacturer)) + { + GDIAL_LOGERROR("NULL GDialObjHandle[%p] manufacturer[%p]",GDialObjHandle,manufacturer); + } + else + { + GDIAL_LOGINFO("Manufacturer[%s]", manufacturer); + returnValue = GDialObjHandle->updateManufacturerName(manufacturer); + if (returnValue != GDIAL_CAST_ERROR_NONE) { + GDIAL_LOGERROR("Failed to updateManufacturerName. Error=%x",returnValue); + } + } + + GDIAL_LOGTRACE("Exiting ..."); + return returnValue; +} + +int gdial_os_application_update_model_name(const char *model) +{ + GDialErrorCode returnValue = GDIAL_CAST_ERROR_INTERNAL; + GDIAL_LOGTRACE("Entering ..."); + if ((nullptr == GDialObjHandle)||(nullptr == model)) + { + GDIAL_LOGERROR("NULL GDialObjHandle[%p] manufacturer[%p]",GDialObjHandle,model); + } + else + { + GDIAL_LOGINFO("Model[%s]", model); + returnValue = GDialObjHandle->updateModelName(model); + if (returnValue != GDIAL_CAST_ERROR_NONE) { + GDIAL_LOGERROR("Failed to updateModelName. Error=%x",returnValue); + } + } + GDIAL_LOGTRACE("Exiting ..."); + return returnValue; +} + int gdial_os_application_service_notification(gboolean isNotifyRequired, void* notifier) { GDIAL_LOGTRACE("Entering ..."); diff --git a/server/plat/gdial.hpp b/server/plat/gdial.hpp index dcd36d2e..6570e974 100644 --- a/server/plat/gdial.hpp +++ b/server/plat/gdial.hpp @@ -45,9 +45,14 @@ void gdial_term(); typedef void (*gdial_activation_cb)(bool, const gchar *); typedef void (*gdial_friendlyname_cb)(const gchar *); typedef void (*gdial_registerapps_cb)(gpointer); +typedef void (*gdial_manufacturername_cb)(const gchar *); +typedef void (*gdial_modelname_cb)(const gchar *); + void gdial_register_activation_cb(gdial_activation_cb cb); void gdial_register_friendlyname_cb(gdial_friendlyname_cb cb); void gdial_register_registerapps_cb(gdial_registerapps_cb cb); +void gdial_register_manufacturername_cb(gdial_manufacturername_cb cb); +void gdial_register_modelname_cb(gdial_manufacturername_cb cb); #ifdef __cplusplus } diff --git a/server/plat/gdial_app_registry.c b/server/plat/gdial_app_registry.c index c3346470..2ef69c77 100644 --- a/server/plat/gdial_app_registry.c +++ b/server/plat/gdial_app_registry.c @@ -19,9 +19,12 @@ * limitations under the License. */ +#include #include #include "gdialservicelogging.h" +#define UUID_FILE_TEMPLATE "/tmp/.dial_%s_uuid.txt" + #define GDIAL_STR_ENDS_WITH(s1, s2) ((s1 != NULL) && (s2 != NULL) && ((strlen(s2) == 0) || (g_str_has_suffix(s1, s2)))) void gdial_app_regstry_dispose (GDialAppRegistry *app_registry) { @@ -92,5 +95,34 @@ GDialAppRegistry* gdial_app_registry_new (const gchar *app_name, const GList *ap app_registry->allowed_origins = g_list_prepend(app_registry->allowed_origins, g_strdup(allowed_origins->data)); allowed_origins = allowed_origins->next; } + + char app_uuid_file_path[64] = {0}; + char uuid_data[APP_MAX_UUID_SIZE] = {0}; + snprintf( app_uuid_file_path, sizeof(app_uuid_file_path), UUID_FILE_TEMPLATE , app_name); + + FILE *fuuid = fopen(app_uuid_file_path, "r"); + if (fuuid == NULL) + { + uuid_t random_uuid; + uuid_generate_random(random_uuid); + uuid_unparse(random_uuid, uuid_data); + GDIAL_LOGINFO("generated uuid:[%s]", uuid_data); + + fuuid = fopen(app_uuid_file_path, "w"); + if (fuuid != NULL) + { + fprintf(fuuid, "%s", uuid_data); + fclose(fuuid); + } + } + else + { + fgets(uuid_data, sizeof(uuid_data), fuuid); + fclose(fuuid); + } + + snprintf( app_registry->app_uri, sizeof(app_registry->app_uri), "/%s" , uuid_data); + GDIAL_LOGINFO("App:[%s] uuid:[%s] per Bootup", app_name, uuid_data); + return app_registry; -} +} \ No newline at end of file diff --git a/server/plat/gdialappcache.cpp b/server/plat/gdialappcache.cpp index 287d53e7..d8c380c7 100644 --- a/server/plat/gdialappcache.cpp +++ b/server/plat/gdialappcache.cpp @@ -44,12 +44,12 @@ void GDialAppStatusCache :: setAppCacheId(std::string app_name,std::string id) GDIAL_LOGTRACE("Entering ..."); if(!strcmp(app_name.c_str(),"Netflix")) { - GDialAppStatusCache::Netflix_AppCacheId = id; + GDialAppStatusCache::Netflix_AppCacheId = std::move(id); GDIAL_LOGINFO("App cache Id of Netflix updated to %s",GDialAppStatusCache::Netflix_AppCacheId.c_str()); } else if(!strcmp(app_name.c_str(),"YouTube")) { - GDialAppStatusCache::Youtube_AppCacheId = id; + GDialAppStatusCache::Youtube_AppCacheId = std::move(id); GDIAL_LOGINFO("App cache Id of Youtube updated to %s",GDialAppStatusCache::Youtube_AppCacheId.c_str()); } else @@ -75,7 +75,7 @@ AppCacheErrorCodes GDialAppStatusCache::UpdateAppStatusCache(AppInfo* appEntry) GDIAL_LOGINFO("erasing old data"); err = ObjectCache->erase(id); } - err = ObjectCache->insert(id,appEntry); + err = ObjectCache->insert(std::move(id),appEntry); GDIAL_LOGTRACE("Exiting ..."); return err; } @@ -89,14 +89,19 @@ std::string GDialAppStatusCache::SearchAppStatusInCache(const char* app_name) if(doIdExist(id)) { AppInfo* appEntry = ObjectCache->findObject(id); - - state = appEntry->appState; - GDIAL_LOGINFO("APPCache: App Name[%s] AppID[%s] Error[%s]", - appEntry->appName.c_str(), - appEntry->appId.c_str(), - appEntry->appError.c_str()); + // FIX(Copilot): Add NULL check for appEntry + if (appEntry) { + state = appEntry->appState; + GDIAL_LOGINFO("APPCache: App Name[%s] AppID[%s] Error[%s]", + appEntry->appName.c_str(), + appEntry->appId.c_str(), + appEntry->appError.c_str()); + } + else { + GDIAL_LOGERROR("Cache entry exists but findObject returned NOT_FOUND"); + } } - GDIAL_LOGINFO("App State = ",state.c_str()); + GDIAL_LOGINFO("App State = %s ",state.c_str()); GDIAL_LOGTRACE("Exiting ..."); return state; } diff --git a/server/plat/gdialappcache.hpp b/server/plat/gdialappcache.hpp index a3191f5e..276b79f3 100644 --- a/server/plat/gdialappcache.hpp +++ b/server/plat/gdialappcache.hpp @@ -56,7 +56,7 @@ class GDialAppStatusCache private: GDialObjectCacheHelper* ObjectCache; - GDialNotifier* m_observer; + GDialNotifier* m_observer{nullptr}; static std::string Netflix_AppCacheId; static std::string Youtube_AppCacheId; }; diff --git a/stubs/iarm_stubs.cpp b/stubs/iarm_stubs.cpp new file mode 100644 index 00000000..ef10fc2d --- /dev/null +++ b/stubs/iarm_stubs.cpp @@ -0,0 +1,68 @@ +#include "libIBus.h" +#include "libIARMCore.h" +using namespace std; + +IARM_Result_t IARM_Malloc(IARM_MemType_t type, size_t size, void **ptr) +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Free(IARM_MemType_t type, void *alloc) +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Bus_BroadcastEvent(const char *ownerName, IARM_EventId_t eventId, void *arg, size_t argLen) +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Bus_Init(const char* name) +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Bus_Connect() +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Bus_IsConnected(const char* memberName, int* isRegistered) +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Bus_RegisterEventHandler(const char* ownerName, IARM_EventId_t eventId, IARM_EventHandler_t handler) +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Bus_UnRegisterEventHandler(const char* ownerName, IARM_EventId_t eventId) +{ + return IARM_RESULT_SUCCESS; +} + +IARM_Result_t IARM_Bus_RemoveEventHandler(const char* ownerName, IARM_EventId_t eventId, IARM_EventHandler_t handler) +{ + return IARM_RESULT_SUCCESS; +} +IARM_Result_t IARM_Bus_RegisterCall(const char *methodName, IARM_BusCall_t handler) +{ +return IARM_RESULT_SUCCESS; +} +IARM_Result_t IARM_Bus_Term(void) +{ +return IARM_RESULT_SUCCESS; +} +IARM_Result_t IARM_Bus_Disconnect(void) +{ +return IARM_RESULT_SUCCESS; +} +IARM_Result_t IARM_Bus_RegisterEvent(IARM_EventId_t maxEventId) +{ +return IARM_RESULT_SUCCESS; +} +IARM_Result_t IARM_Bus_Call(const char* ownerName, const char* methodName, void* arg, size_t argLen) +{ + return IARM_RESULT_SUCCESS; +} diff --git a/stubs/securityagent/SecurityTokenUtil.cpp b/stubs/securityagent/SecurityTokenUtil.cpp new file mode 100644 index 00000000..a743d52f --- /dev/null +++ b/stubs/securityagent/SecurityTokenUtil.cpp @@ -0,0 +1,56 @@ +/* + * If not stated otherwise in this file or this component's LICENSE file the + * following copyright and licenses apply: + * + * Copyright 2020 RDK Management + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "SecurityTokenUtil.h" +/* + * Send thunder security token for localhost. + * This token can be used by native applications to securely access rdkservices. + */ + +using namespace std; + +extern "C" { + /* + * GetSecurityToken - function to obtain a token from SecurityAgent + * + * Parameters + * maxLength - holds the maximum uint8_t length of the buffer + * Id - Buffer to hold the token. + * + * Return value + * < 0 - failure, absolute value returned is the length required to store the token + * > 0 - success, char length of the returned token + * + * Post-condition; return value 0 should not occur + * + */ + int GetSecurityToken(unsigned short maxLength, unsigned char buffer[]) + { + // get a localhost token + string payload = "http://localhost"; + + size_t len = payload.length(); + + if(!memcpy(buffer,payload.c_str(),len)) + return -1; + return 0; + } +} diff --git a/stubs/securityagent/SecurityTokenUtil.h b/stubs/securityagent/SecurityTokenUtil.h new file mode 100644 index 00000000..b32894f5 --- /dev/null +++ b/stubs/securityagent/SecurityTokenUtil.h @@ -0,0 +1,50 @@ +/* + * If not stated otherwise in this file or this component's LICENSE file the + * following copyright and licenses apply: + * + * Copyright 2020 RDK Management + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#ifdef __WINDOWS__ +#undef EXTERNAL +#ifdef SECURITYUTILITY_EXPORTS +#define EXTERNAL EXTERNAL_EXPORT +#else +#define EXTERNAL EXTERNAL_IMPORT +#endif +#else +#undef EXTERNAL +#define EXTERNAL +#endif + +extern "C" { + /* + * GetSecurityToken - function to obtain a token from SecurityAgent + * + * Parameters + * maxLength - holds the maximum uint8_t length of the buffer + * buffer - Buffer to hold the token. + * + * Return value + * < 0 - failure, absolute value returned is the length required to store the token + * > 0 - success, char length of the returned token + * + * Post-condition; return value 0 should not occur + * + */ + int EXTERNAL GetSecurityToken(unsigned short maxLength, unsigned char buffer[]); +}