From: cheoleun moon Date: Wed, 13 Dec 2023 10:58:19 +0000 (+0900) Subject: Extract classes for Advert/Seek roles X-Git-Tag: accepted/tizen/unified/20240712.160131~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F88%2F302788%2F7;p=platform%2Fcore%2Fapi%2Fasp.git Extract classes for Advert/Seek roles Change-Id: Id254bda7cfdedc959a47738bd48ac7d469106cf7 --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 50b66b2..47562fd 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,11 +19,15 @@ SET(ASP_PATH ${PROJECT_SOURCE_DIR}/src) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${ASP_PATH}/include + ${ASP_DEPS_INCLUDE_DIRS} ) SET(ASP_SOURCES - ${ASP_PATH}/asp-client.c - ${ASP_PATH}/asp-dbus.c + ${ASP_PATH}/asp-client.cpp + ${ASP_PATH}/asp-dbus.cpp + ${ASP_PATH}/asp-advert.cpp + ${ASP_PATH}/asp-seek.cpp + ${ASP_PATH}/asp-utils.cpp ) ADD_DEFINITIONS("-fvisibility=default") diff --git a/src/asp-advert.cpp b/src/asp-advert.cpp new file mode 100644 index 0000000..53ce92d --- /dev/null +++ b/src/asp-advert.cpp @@ -0,0 +1,141 @@ +#include "asp.h" +#include "asp-advert.h" +#include "asp-conts.h" +#include "asp-log.h" +#include "asp-utils.h" + +static __thread GList *asp_adverts = NULL; + +AspAdvert::AspAdvert() +{ + auto_accept = 0; + config_method = 1; + status = 0; + role = 1; + service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + adv_id = (unsigned int)this & 0xffffffff; + instance_name = NULL; + serivce_name = NULL; + service_type = NULL; + rsp_info = NULL; +} + +AspAdvert::~AspAdvert() +{ + g_free(instance_name); + g_free(serivce_name); + g_free(service_type); + g_free(rsp_info); + g_hash_table_remove_all(service_info_map); + g_hash_table_destroy(service_info_map); +} + +int AspAdvert::setServiceType(const std::string &type) +{ + if (type.empty()) { + ASP_LOGE("Zero length value"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + if (!AspUtil::isValidServiceType(type)) { + ASP_LOGE("invalid service_type"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + return ASP_ERROR_NONE; +} + +int AspAdvert::addInfo(const std::string &key, const std::string &value) +{ + if (!AspUtil::isValidKey(key)) { + ASP_LOGE("invalid key!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + g_hash_table_replace(service_info_map, g_strdup(key.c_str()), g_strdup(value.c_str())); + return ASP_ERROR_NONE; +} + +int AspAdvert::setDiscoveryTech(int tech) +{ + if (!((tech & ASP_DISCOVERY_TECH_P2P) | + (tech & ASP_DISCOVERY_TECH_NFC) | + (tech & ASP_DISCOVERY_TECH_BLE) | + (tech & ASP_DISCOVERY_TECH_INFRA) | + (tech & ASP_DISCOVERY_TECH_NAN))) { + ASP_LOGE("invalid parameter!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + discovery_tech = tech; + return ASP_ERROR_NONE; +} + +AspAdvert *getAdvert(void *handle) +{ + __ASP_LOG_FUNC_START__; + AspAdvert *service = NULL; + + if (asp_adverts == NULL) { + __ASP_LOG_FUNC_END__; + return NULL; + } + + ASP_LOGD("service [%p]", handle); + + for (GList *temp = g_list_first(asp_adverts); temp != NULL; temp = g_list_next(temp)) { + service = (AspAdvert *)temp->data; + + ASP_LOGD("temp [%p]", service); + if (service != NULL && service == handle) + break; + service = NULL; + } + __ASP_LOG_FUNC_END__; + return service; +} + +AspAdvert *getAdvertById(unsigned int id) +{ + AspAdvert *advert = NULL; + GList *temp = NULL; + + for (temp = g_list_first(asp_adverts); + temp != NULL; temp = g_list_next(temp)) { + advert = (AspAdvert *)temp->data; + if (advert != NULL && advert->adv_id == id) + break; + advert = NULL; + } + + return advert; + +} + +bool removeAdvert(void *handle) +{ + AspAdvert *service = getAdvert(handle); + + if (service == NULL) { + __ASP_LOG_FUNC_END__; + return false; + } + + removeAdvertFromServiceList(service); + delete service; + + return true; +} + +void addAdvertToServiceList(AspAdvert *service) +{ + asp_adverts = g_list_prepend(asp_adverts, service); +} + +void removeAdvertFromServiceList(AspAdvert *service) +{ + asp_adverts = g_list_remove(asp_adverts, service); +} diff --git a/src/asp-client.c b/src/asp-client.c deleted file mode 100755 index a3d2c1c..0000000 --- a/src/asp-client.c +++ /dev/null @@ -1,3028 +0,0 @@ -/* - * Application Service Platform(ASP) - * - * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. - * - * 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. - * - */ - -/** - * This file implements Application Service Platform(ASP) user library. - * - * @file asp-client.c - * @author Jiung Yu (jiung.yu@samsung.com) - * @version 0.1 - */ - - -/***************************************************************************** - * Standard headers - *****************************************************************************/ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -/***************************************************************************** - * System headers - *****************************************************************************/ -#include - -/***************************************************************************** - * Application Service Platform(ASP) library headers - *****************************************************************************/ -#include "asp.h" - -#include "asp-client.h" -#include "asp-dbus.h" -#include "asp-log.h" -#include "asp-util.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -#define INSTANCE_NAME_LEN 63 -#define MAX_SERVICE_NAME_LEN 15 -#define MAX_SERVICE_TYPE_LEN 255 -#define PROTO_LEN 4 -#define KEY_LEN 9 /* http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt */ -#define KEY_MIN 0x20 /* RFC 20 */ -#define KEY_MAX 0x7E - -#define SERVICE_INFO_LEN 65000 -#define DEFERRED_LEN 144 -#define SESSION_INFO_LEN 144 - -/***************************************************************************** - * Global Variables - *****************************************************************************/ -static __thread asp_client_info_s g_client_info = { - .is_registered = FALSE, - - .seek_search_result_cb = NULL, - .advert_status_changed_cb = NULL, - .session_request_cb = NULL, - .session_config_request_cb = NULL, - .session_connect_status_cb = NULL, - .session_status_cb = NULL, - .session_port_status_cb = NULL, - - .user_data_for_cb_seek_search_result = NULL, - .user_data_for_cb_advert_status_changed = NULL, - .user_data_for_cb_session_request = NULL, - .user_data_for_cb_session_config_request = NULL, - .user_data_for_cb_session_connect_status = NULL, - .user_data_for_cb_session_status = NULL, - .user_data_for_cb_session_port_status = NULL -}; - -static __thread GList *asp_adverts = NULL; -static __thread GList *asp_seeks = NULL; -static __thread GList *asp_sessions = NULL; - -/***************************************************************************** - * Local Structures Definition - *****************************************************************************/ -typedef struct { - unsigned int search_id; - unsigned int adv_id; - unsigned int config_method; - - const char *service_mac; - char *service_info; - int service_info_len; - - unsigned int session_id; - const char *session_mac; - const char *session_info; - int session_info_len; - - const char * device_name; - const char *instance_name; - - gboolean get_pin; - const char *pin; - - const char *ip_address; - int port; - int proto; - int service_status; - const char *deferred_resp; - int deferred_resp_len; - - int state; - int status; - const char *requested_info; -} asp_variant_s; - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ - -//LCOV_EXCL_START -static char* __asp_create_service_info_from_g_variant(GVariant *variant) -{ - gchar *info = (gchar*)g_try_malloc0(ASP_SERVICE_INFO_MAX_LEN + 1); - if (!info) - return NULL; - - GVariantIter *iter = NULL; - g_variant_get(variant, "a{sv}", &iter); - - GVariant* var = NULL; - gchar *key = NULL; - int offset = 0; - while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { - gsize value_len = 0; - gchar *value = g_variant_dup_string(var, &value_len); - int len = strlen(key) + value_len + 2; - snprintf(info + offset, len + 1, "%s=%s,", key, value); - offset += len; - g_free(value); - } - - return info; -} - -static asp_variant_s *__get_asp_variant_from_iterator(GVariantIter *iter) -{ - asp_variant_s *variant = (asp_variant_s *)g_try_malloc0(sizeof(asp_variant_s)); - if (variant == NULL) - return variant; - - const char *key = NULL; - GVariant *value = NULL; - - while (g_variant_iter_loop(iter, "{sv}", &key, &value)) { - if (!g_strcmp0(key, "search_id")) { - g_variant_get(value, "u", &variant->search_id); - } else if (!g_strcmp0(key, "service_mac")) { - g_variant_get(value, "&s", &variant->service_mac); - } else if (!g_strcmp0(key, "adv_id")) { - g_variant_get(value, "u", &variant->adv_id); - } else if (!g_strcmp0(key, "config_method")) { - g_variant_get(value, "u", &variant->config_method); - } else if (!g_strcmp0(key, "instance_name")) { - g_variant_get(value, "&s", &variant->instance_name); - } else if (!g_strcmp0(key, "service_info")) { - g_free(variant->service_info); - variant->service_info = __asp_create_service_info_from_g_variant(value); - if (variant->service_info) { - ASP_LOGD("Service Info: %s", variant->service_info); - variant->service_info_len = strlen(variant->service_info); - } - } else if (!g_strcmp0(key, "service_status")) { - g_variant_get(value, "y", &variant->service_status); - } else if (!g_strcmp0(key, "session_id")) { - g_variant_get(value, "u", &variant->session_id); - } else if (!g_strcmp0(key, "session_mac")) { - g_variant_get(value, "&s", &variant->session_mac); - } else if (!g_strcmp0(key, "session_info")) { - g_variant_get(value, "&s", &variant->session_info); - if (variant->session_info) - variant->session_info_len = strlen(variant->session_info); - } else if (!g_strcmp0(key, "device_name")) { - g_variant_get(value, "&s", &variant->device_name); - } else if (!g_strcmp0(key, "get_pin")) { - g_variant_get(value, "b", &variant->get_pin); - } else if (!g_strcmp0(key, "pin")) { - g_variant_get(value, "&s", &variant->pin); - } else if (!g_strcmp0(key, "deferred_resp")) { - g_variant_get(value, "&s", &variant->deferred_resp); - if (variant->deferred_resp) - variant->deferred_resp_len = strlen(variant->deferred_resp); - } else if (!g_strcmp0(key, "ip_address")) { - g_variant_get(value, "&s", &variant->ip_address); - } else if (!g_strcmp0(key, "port")) { - g_variant_get(value, "i", &variant->port); - } else if (!g_strcmp0(key, "proto")) { - g_variant_get(value, "i", &variant->proto); - } else if (!g_strcmp0(key, "state")) { - g_variant_get(value, "i", &variant->state); - } else if (!g_strcmp0(key, "status")) { - g_variant_get(value, "i", &variant->status); - } else if (!g_strcmp0(key, "requested_info")) { - g_variant_get(value, "&s", &variant->requested_info); - } else { - /* Do Nothing */ - } - } - - return variant; -} - -static void __clear_asp_variant(asp_variant_s *variant) -{ - if (variant && variant->service_info) { - g_free(variant->service_info); - variant->service_info = NULL; - } - g_free(variant); -} - -static int __asp_err_string_to_enum(const char *error) -{ - if (NULL != strstr(error, "NoReply")) - return ASP_ERROR_COMMUNICATION_FAILED; - else if (NULL != strstr(error, "PermissionDenied")) - return ASP_ERROR_PERMISSION_DENIED; - else if (NULL != strstr(error, "MEM_ERR")) - return ASP_ERROR_OUT_OF_MEMORY; - else if (NULL != strstr(error, "INVALID_PARAM")) - return ASP_ERROR_INVALID_PARAMETER; - else if (NULL != strstr(error, "OPER_FAILED")) - return ASP_ERROR_OPERATION_FAILED; - else if (NULL != strstr(error, "NO_SERVICE")) - return ASP_ERROR_SERVICE_NOT_FOUND; - else if (NULL != strstr(error, "NO_SESSION")) - return ASP_ERROR_SESSION_NOT_FOUND; - else - return ASP_ERROR_OPERATION_FAILED; -} - -static asp_client_advert_s *get_advert_by_id(unsigned int adv_id) -{ - asp_client_advert_s *advert = NULL; - GList *temp = NULL; - - for (temp = g_list_first(asp_adverts); - temp != NULL; temp = g_list_next(temp)) { - advert = temp->data; - if (advert != NULL && advert->adv_id == adv_id) - break; - advert = NULL; - } - - return advert; - -} - -static asp_client_seek_s *get_seek_by_id(long long unsigned search_id) -{ - asp_client_seek_s *seek = NULL; - GList *temp = NULL; - - for (temp = g_list_first(asp_seeks); - temp != NULL; temp = g_list_next(temp)) { - seek = temp->data; - if (seek != NULL && seek->search_id == search_id) - break; - seek = NULL; - } - - return seek; - -} - -static asp_client_session_s *get_session_by_id_mac(const char *session_mac, unsigned int session_id) -{ - asp_client_session_s *session = NULL; - GList *temp = NULL; - - for (temp = g_list_first(asp_sessions); - temp != NULL; temp = g_list_next(temp)) { - session = temp->data; - if (session != NULL && session->session_id == session_id && - memcmp(session->session_mac, session_mac, MACSTR_LEN) == 0) - break; - session = NULL; - } - - return session; -} - -void asp_process_seek_search_result(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_START__; - asp_client_info_s *client = &g_client_info; - if (!client->seek_search_result_cb) { - ASP_LOGD("search_result_cb is NULL!!"); - return; - } - - if (!parameters) { - __ASP_LOG_FUNC_END__; - return; - } - - GVariantIter *iter = NULL; - g_variant_get(parameters, "(a{sv})", &iter); - asp_variant_s *variant = __get_asp_variant_from_iterator(iter); - if (variant == NULL) { - ASP_LOGE("Out of memory"); - return; - } - - asp_client_seek_s *seek = get_seek_by_id(variant->search_id); - if (!seek) { - ASP_LOGD("There's no related seek"); - goto ERROR; - } - - client->seek_search_result_cb(ASP_ERROR_NONE, (asp_seek_service_h)seek, - variant->service_mac, variant->adv_id, - (asp_wps_type_e)variant->config_method, variant->instance_name, - variant->service_info, variant->service_info_len, - variant->service_status, client->user_data_for_cb_seek_search_result); - -ERROR: - g_variant_iter_free(iter); - __clear_asp_variant(variant); - __ASP_LOG_FUNC_END__; - return; -} - -void asp_process_advert_status_changed(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_START__; - - asp_client_info_s *client = &g_client_info; - asp_client_advert_s *advert = NULL; - unsigned int advertisement_id = 0; - unsigned char status = 0; - int reason = 0; - - if (!client->advert_status_changed_cb) { - ASP_LOGD("search_result_cb is NULL!!"); - return; - } - - if (!parameters) { - __ASP_LOG_FUNC_END__; - return; - } - - g_variant_get(parameters, "(uyi)", &advertisement_id, &status, &reason); - - advert = get_advert_by_id(advertisement_id); - if (!advert) { - ASP_LOGD("There's no related advert"); - return; - } - - client->advert_status_changed_cb( - (asp_advert_service_h)advert, (asp_service_status_e)status, - (asp_advert_status_reason_e)reason, - client->user_data_for_cb_advert_status_changed); - - __ASP_LOG_FUNC_END__; - return; -} - -int __handle_session_request(unsigned int adv_id, const char *session_mac, - unsigned int session_id, const char *session_info) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - asp_client_session_s *session = NULL; - GList *temp = NULL; - int res = 0; - - for (temp = g_list_first(asp_adverts); - temp != NULL; temp = g_list_next(temp)) { - service = temp->data; - if (service != NULL && service->adv_id == adv_id) - break; - service = NULL; - } - - if (service == NULL) { - ASP_LOGD("No matched local service"); - __ASP_LOG_FUNC_END__; - return -1; - } - - ASP_LOGD("Process auto accept service"); - - temp = NULL; - for (temp = g_list_first(asp_sessions); - temp != NULL; temp = g_list_next(temp)) { - session = temp->data; - if (session != NULL && session->session_id == session_id && - memcmp(session->session_mac, session_mac, MACSTR_LEN) == 0) - break; - session = NULL; - } - - if (session == NULL) { - res = asp_session_get_handle((char *)session_mac, session_id, (void **)&session); - if (res < 0) { - ASP_LOGE("asp_get_session failed"); - __ASP_LOG_FUNC_END__; - return -1; - } - - if (session_info) - session->session_information = g_strdup(session_info); - asp_sessions = g_list_prepend(asp_sessions, session); - } - - if (service->auto_accept == FALSE) { - ASP_LOGD("Don't accept request automatically"); - __ASP_LOG_FUNC_END__; - return 0; - } - - asp_session_confirm(session, TRUE, NULL); - ASP_LOGD("asp_confirm_session"); - __ASP_LOG_FUNC_END__; - return -1; -} - -static void __invoke_session_request_cb(asp_variant_s *variant) -{ - if (variant == NULL) - return; - - asp_client_info_s *client = &g_client_info; - if (!client->session_request_cb) { - ASP_LOGE("session_request_cb is NULL!!"); - return; - } - - asp_client_advert_s *advert = get_advert_by_id(variant->adv_id); - if (!advert) { - ASP_LOGD("There's no related advert"); - return; - } - - asp_client_session_s *session = get_session_by_id_mac(variant->session_mac, variant->session_id); - if (!session) { - ASP_LOGD("There's no related session"); - return; - } - - client->session_request_cb(ASP_ERROR_NONE, advert, session, - variant->device_name, variant->session_info, variant->session_info_len, - (bool)variant->get_pin, variant->pin, - client->user_data_for_cb_session_config_request); -} - -void asp_process_session_request(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_START__; - if (!parameters) { - ASP_LOGE("parameters is NULL!!"); - __ASP_LOG_FUNC_END__; - return; - } - - GVariantIter *iter = NULL; - g_variant_get(parameters, "(a{sv})", &iter); - asp_variant_s *variant = __get_asp_variant_from_iterator(iter); - if (variant == NULL) { - ASP_LOGE("Out of memory"); - goto ERROR; - } - - if (variant->session_mac == NULL) { - ASP_LOGE("session_mac is NULL"); - goto ERROR; - } - - if (__handle_session_request(variant->adv_id, variant->session_mac, - variant->session_id, variant->session_info) != 0) - goto ERROR; - - __invoke_session_request_cb(variant); - -ERROR: - g_variant_iter_free(iter); - __clear_asp_variant(variant); - __ASP_LOG_FUNC_END__; - return; -} - -void asp_process_session_config_request(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_START__; - asp_client_info_s *client = &g_client_info; - if (!client->session_config_request_cb) { - ASP_LOGE("session_config_request_cb is NULL!!"); - return; - } - - if (!parameters) { - __ASP_LOG_FUNC_END__; - return; - } - - GVariantIter *iter = NULL; - g_variant_get(parameters, "(a{sv})", &iter); - asp_variant_s *variant = __get_asp_variant_from_iterator(iter); - if (variant == NULL) { - ASP_LOGE("Out of memory"); - return; - } - - if (variant->session_mac == NULL) { - ASP_LOGE("session_mac is NULL"); - goto ERROR; - } - - asp_client_session_s *session = get_session_by_id_mac(variant->session_mac, variant->session_id); - if (!session) { - ASP_LOGD("There's no related session"); - goto ERROR; - } - - client->session_config_request_cb(ASP_ERROR_NONE, (asp_session_h)session, - (bool)variant->pin, variant->pin, - client->user_data_for_cb_session_config_request); - -ERROR: - g_variant_iter_free(iter); - __clear_asp_variant(variant); - __ASP_LOG_FUNC_END__; - return; -} - -void asp_process_session_connect_status(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_START__; - asp_client_info_s *client = &g_client_info; - if (!client->session_connect_status_cb) { - ASP_LOGE("connect_status_cb is NULL!!"); - return; - } - - if (!parameters) { - __ASP_LOG_FUNC_END__; - return; - } - - GVariantIter *iter = NULL; - g_variant_get(parameters, "(a{sv})", &iter); - asp_variant_s *variant = __get_asp_variant_from_iterator(iter); - if (variant == NULL) { - ASP_LOGE("Out of memory"); - return; - } - - if (variant->session_mac == NULL) { - ASP_LOGE("session_mac is NULL"); - goto ERROR; - } - - asp_client_session_s *session = get_session_by_id_mac(variant->session_mac, variant->session_id); - if (!session) { - ASP_LOGD("There's no related session"); - goto ERROR; - } - - client->session_connect_status_cb(ASP_ERROR_NONE, (asp_session_h)session, - (asp_connect_status_e)variant->status, - variant->deferred_resp, variant->deferred_resp_len, - client->user_data_for_cb_session_connect_status); - -ERROR: - g_variant_iter_free(iter); - __clear_asp_variant(variant); - __ASP_LOG_FUNC_END__; - return; -} - -void asp_process_session_status(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_START__; - asp_client_info_s *client = &g_client_info; - if (!client->session_status_cb) { - ASP_LOGE("session_status_cb is NULL!!"); - return; - } - - if (!parameters) { - __ASP_LOG_FUNC_END__; - return; - } - - GVariantIter *iter = NULL; - g_variant_get(parameters, "(a{sv})", &iter); - asp_variant_s *variant = __get_asp_variant_from_iterator(iter); - if (variant == NULL) { - ASP_LOGE("Out of memory"); - return; - } - - if (variant->session_mac == NULL) { - ASP_LOGE("session_mac is NULL"); - goto ERROR; - } - - asp_client_session_s *session = get_session_by_id_mac(variant->session_mac, variant->session_id); - if (!session) { - ASP_LOGD("There's no related session"); - goto ERROR; - } - - client->session_status_cb(ASP_ERROR_NONE, (asp_session_h)session, - (asp_session_state_e)variant->state, variant->requested_info, - client->user_data_for_cb_session_status); - -ERROR: - g_variant_iter_free(iter); - __clear_asp_variant(variant); - __ASP_LOG_FUNC_END__; - return; -} - -void asp_process_session_port_status(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_START__; - asp_client_info_s *client = &g_client_info; - if (!client->session_port_status_cb) { - ASP_LOGE("port_status_cb is NULL!!"); - return; - } - - if (!parameters) { - __ASP_LOG_FUNC_END__; - return; - } - - GVariantIter *iter = NULL; - g_variant_get(parameters, "(a{sv})", &iter); - asp_variant_s *variant = __get_asp_variant_from_iterator(iter); - if (variant == NULL) { - ASP_LOGE("Out of memory"); - return; - } - - if (variant->session_mac == NULL) { - ASP_LOGE("session_mac is NULL"); - goto ERROR; - } - - asp_client_session_s *session = get_session_by_id_mac(variant->session_mac, variant->session_id); - if (!session) { - ASP_LOGD("There's no related session"); - goto ERROR; - } - - client->session_port_status_cb(ASP_ERROR_NONE, (asp_session_h)session, - variant->ip_address, variant->port, variant->proto, - (asp_port_status_e)variant->status, - client->user_data_for_cb_session_port_status); - -ERROR: - g_variant_iter_free(iter); - __clear_asp_variant(variant); - __ASP_LOG_FUNC_END__; - return; -} -//LCOV_EXCL_STOP -int asp_initialize(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - - if (g_client_info.is_registered == TRUE) { - ASP_LOGW("Warning!!! Already registered\nUpdate user data and callback!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_ALREADY_INITIALIZED; - } - - if (asp_dbus_init() == FALSE) { - ASP_LOGW("Failed to initialize dbus"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } - - g_client_info.is_registered = TRUE; - - /* Initialize callbacks */ - g_client_info.seek_search_result_cb = NULL; - g_client_info.advert_status_changed_cb = NULL; - - g_client_info.session_request_cb = NULL; - g_client_info.session_config_request_cb = NULL; - g_client_info.session_connect_status_cb = NULL; - g_client_info.session_status_cb = NULL; - g_client_info.session_port_status_cb = NULL; - - g_client_info.user_data_for_cb_seek_search_result = NULL; - g_client_info.user_data_for_cb_advert_status_changed = NULL; - - g_client_info.user_data_for_cb_session_request = NULL; - g_client_info.user_data_for_cb_session_config_request = NULL; - g_client_info.user_data_for_cb_session_connect_status = NULL; - g_client_info.user_data_for_cb_session_status = NULL; - g_client_info.user_data_for_cb_session_port_status = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_deinitialize(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - asp_dbus_deinit(); - - g_client_info.seek_search_result_cb = NULL; - g_client_info.advert_status_changed_cb = NULL; - - g_client_info.session_request_cb = NULL; - g_client_info.session_config_request_cb = NULL; - g_client_info.session_connect_status_cb = NULL; - g_client_info.session_status_cb = NULL; - g_client_info.session_port_status_cb = NULL; - - g_client_info.user_data_for_cb_seek_search_result = NULL; - g_client_info.user_data_for_cb_advert_status_changed = NULL; - - g_client_info.user_data_for_cb_session_request = NULL; - g_client_info.user_data_for_cb_session_config_request = NULL; - g_client_info.user_data_for_cb_session_connect_status = NULL; - g_client_info.user_data_for_cb_session_status = NULL; - g_client_info.user_data_for_cb_session_port_status = NULL; - - g_client_info.is_registered = FALSE; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} -int asp_seek_set_search_result_cb(asp_seek_search_result_cb cb, void *user_data) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); - - - g_client_info.seek_search_result_cb = cb; - g_client_info.user_data_for_cb_seek_search_result = user_data; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_seek_unset_search_result_cb(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - g_client_info.seek_search_result_cb = NULL; - g_client_info.user_data_for_cb_seek_search_result = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_set_status_changed_cb(asp_advert_status_changed_cb cb, void *user_data) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); - - g_client_info.advert_status_changed_cb = cb; - g_client_info.user_data_for_cb_advert_status_changed = user_data; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_unset_status_changed_cb(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - g_client_info.advert_status_changed_cb = NULL; - g_client_info.user_data_for_cb_advert_status_changed = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_set_request_cb(asp_session_request_cb cb, void *user_data) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); - - g_client_info.session_request_cb = cb; - g_client_info.user_data_for_cb_session_request = user_data; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_unset_request_cb(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - g_client_info.session_request_cb = NULL; - g_client_info.user_data_for_cb_session_request = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_set_config_request_cb(asp_session_config_request_cb cb, void *user_data) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); - - g_client_info.session_config_request_cb = cb; - g_client_info.user_data_for_cb_session_config_request = user_data; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_unset_config_request_cb(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - g_client_info.session_config_request_cb = NULL; - g_client_info.user_data_for_cb_session_config_request = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_set_connect_status_cb(asp_session_connect_status_cb cb, void *user_data) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); - - g_client_info.session_connect_status_cb = cb; - g_client_info.user_data_for_cb_session_connect_status = user_data; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - - -int asp_session_unset_connect_status_cb(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - g_client_info.session_connect_status_cb = NULL; - g_client_info.user_data_for_cb_session_connect_status = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_set_status_cb(asp_session_status_cb cb, void *user_data) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); - - g_client_info.session_status_cb = cb; - g_client_info.user_data_for_cb_session_status = user_data; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - - -int asp_session_unset_status_cb(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - g_client_info.session_status_cb = NULL; - g_client_info.user_data_for_cb_session_status = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_set_port_status_cb(asp_session_port_status_cb cb, void *user_data) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); - - g_client_info.session_port_status_cb = cb; - g_client_info.user_data_for_cb_session_port_status = user_data; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_session_unset_port_status_cb(void) -{ - __ASP_LOG_FUNC_START__; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - g_client_info.session_port_status_cb = NULL; - g_client_info.user_data_for_cb_session_port_status = NULL; - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -typedef void (*free_func)(void *); - -static void __free_advert(void *advert) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - service = (asp_client_advert_s *)advert; - if (service == NULL) { - ASP_LOGE("invalid parameter"); - __ASP_LOG_FUNC_END__; - return; - } - - g_free(service->instance_name); - g_free(service->serivce_name); - g_free(service->service_type); - g_free(service->rsp_info); - g_hash_table_destroy(service->service_info_map); - g_free(service); - service = NULL; - __ASP_LOG_FUNC_END__; - return; -} - -static void __free_seek(void *seek) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - - service = (asp_client_seek_s *)seek; - if (service == NULL) { - ASP_LOGE("invalid parameter"); - __ASP_LOG_FUNC_END__; - return; - } - - g_free(service->serivce_name); - g_free(service->service_type); - g_free(service->rsp_info); - g_hash_table_destroy(service->service_info_map); - g_free(service); - service = NULL; - __ASP_LOG_FUNC_END__; - return; -} - -static void __free_session(void *session) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - - service = (asp_client_session_s *)session; - if (service == NULL) { - ASP_LOGE("invalid parameter"); - __ASP_LOG_FUNC_END__; - return; - } - - g_free(service->session_information); - g_free(service->deferred_session_response); - g_free(service); - service = NULL; - __ASP_LOG_FUNC_END__; - return; -} - -static asp_client_advert_s *__get_advert(void *handle) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - GList *temp = NULL; - - if (asp_adverts == NULL) { - __ASP_LOG_FUNC_END__; - return NULL; - } - - ASP_LOGD("service [%p]", handle); - - temp = g_list_first(asp_adverts); - for (temp = g_list_first(asp_adverts); temp != NULL; temp = g_list_next(temp)) { - service = temp->data; - - ASP_LOGD("temp [%p]", service); - if (service != NULL && service == handle) - break; - service = NULL; - } - __ASP_LOG_FUNC_END__; - return service; -} - -static asp_client_seek_s *__get_seek(void *handle) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - GList *temp = NULL; - - if (asp_seeks == NULL) { - __ASP_LOG_FUNC_END__; - return NULL; - } - - ASP_LOGD("service [%p]", handle); - - temp = g_list_first(asp_seeks); - for (temp = g_list_first(asp_seeks); temp != NULL; temp = g_list_next(temp)) { - service = temp->data; - - ASP_LOGD("temp [%p]", service); - if (service != NULL && service == handle) - break; - service = NULL; - } - __ASP_LOG_FUNC_END__; - return service; -} - -static asp_client_session_s *__get_session(void *handle) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - GList *temp = NULL; - - if (asp_sessions == NULL) { - - __ASP_LOG_FUNC_END__; - return NULL; - } - - ASP_LOGD("service [%p]", handle); - - temp = g_list_first(asp_sessions); - for (temp = g_list_first(asp_sessions); temp != NULL; temp = g_list_next(temp)) { - service = temp->data; - - ASP_LOGD("temp [%p]", service); - if (service != NULL && service == handle) - break; - service = NULL; - } - __ASP_LOG_FUNC_END__; - return service; -} - -static int __remove_advert(void *handle) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - service = __get_advert(handle); - - if (service == NULL) { - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } else { - asp_adverts = g_list_remove(asp_adverts, handle); - __free_advert(service); - } - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -static int __remove_seek(void *handle) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - service = __get_seek(handle); - - if (service == NULL) { - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } else { - asp_seeks = g_list_remove(asp_seeks, handle); - __free_seek(service); - } - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -static int __remove_session(void *handle) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - service = __get_session(handle); - - if (service == NULL) { - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } else { - asp_sessions = g_list_remove(asp_sessions, handle); - __free_session(service); - } - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -static bool __is_valid_instance_name(char *instance_name) -{ - if (strlen(instance_name) > INSTANCE_NAME_LEN) - return false; - else - return true; -} - -int asp_advert_create(char *instance_name, asp_advert_service_h *adv_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - - service = (asp_client_advert_s *)g_try_malloc0(sizeof(asp_client_advert_s)); - if (!service) { - ASP_LOGE("malloc() failed!!!."); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OUT_OF_MEMORY; - } - ASP_LOGD("service [%p]", service); - - if (instance_name) { - ASP_LOGD("instance_name = [%s]", instance_name); - if (!__is_valid_instance_name(instance_name)) { - ASP_LOGE("Not valid instance_name"); - g_free(service); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - service->instance_name = g_strdup(instance_name); - if (!service->instance_name) { - ASP_LOGE("malloc() failed!!!."); - g_free(service); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OUT_OF_MEMORY; - } - } - asp_adverts = g_list_prepend(asp_adverts, service); - - /* TODO : consider the case if target arch is 64bit. */ - /* TODO : Make asp enable support for other methods. */ - /* Default : ASP */ - service->auto_accept = 0; - service->config_method = 1; - service->status = 0; - service->role = 1; - service->service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - service->adv_id = (unsigned int)service & 0xffffffff; - *adv_service = (asp_advert_service_h)service; - ASP_LOGD("asp_advert_create() SUCCESS"); - - ASP_LOGD("advert handler [%p]", *adv_service); - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_advert_destroy(asp_advert_service_h adv_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - g_hash_table_remove_all(service->service_info_map); - res = __remove_advert((void *)service); - if (res != ASP_ERROR_NONE) { - __ASP_LOG_FUNC_END__; - return res; - } - - ASP_LOGD("asp_destory_advertise_handle() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -static bool __is_valid_service_type_for_wfds(char *service_type) -{ - int pos = 0; - - /* Wi-Fi Peer-to-Peer Services Technical Specification v1.1 - * The UTF-8 encoded service name (and therefore the contents - * of each service_name parameter) shall be 255 bytes or less - */ - if (strlen(service_type) > MAX_SERVICE_TYPE_LEN) - return false; - - while (service_type[pos] != 0) { - if (!g_ascii_isalpha(service_type[pos]) && - !g_ascii_isdigit(service_type[pos]) && - service_type[pos] != '.' && - service_type[pos] != '-') - return false; - pos++; - } - return true; -} - -static bool __is_valid_service_type(char *service_type) -{ - int srv_name_len = strlen(service_type) - PROTO_LEN - 1; - char *proto; - int pos; - - if (srv_name_len < 2) - return __is_valid_service_type_for_wfds(service_type); - - proto = &(service_type[srv_name_len + 1]); - if (strncmp(proto, "_udp", PROTO_LEN) != 0 && strncmp(proto, "_tcp", PROTO_LEN) != 0) - return __is_valid_service_type_for_wfds(service_type); - - /* Service Type = <_>service_name.<_> - * Service Name description: - * Shall be at least 1 character and no more than 15 characters long - * Shall contain only US-ASCII [ANSI.X3.4-1986] letters 'A' - 'Z' and - * 'a' - 'z', digits '0' - '9', and hyphens ('-', ASCII 0x2D or decimal 45) - * Shall contain at least one letter ('A' - 'Z' or 'a' - ‘z') - * Shall NOT begin or end with a hyphen - */ - - if (srv_name_len > MAX_SERVICE_NAME_LEN + 1) - return false; - - if (service_type[0] != '_' || service_type[1] == '-' || - service_type[srv_name_len] != '.') - return false; - - pos = 1; - while (pos < srv_name_len) { - if (!g_ascii_isalpha(service_type[pos]) && - !g_ascii_isdigit(service_type[pos]) && - service_type[pos] != '-') - return false; - pos++; - } - - return true; -} - -int asp_advert_set_service_type(asp_advert_service_h adv_service, - char *service_type) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - char *type = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(service_type, __ASP_LOG_FUNC_END__); - - if (strlen(service_type) == 0) { - ASP_LOGE("Zero length value"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - ASP_LOGD("service [%p]", adv_service); - - if (!__is_valid_service_type(service_type)) { - ASP_LOGE("invalid service_type"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - type = g_strdup(service_type); - if (!type) { - ASP_LOGE("malloc() failed!!!."); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } - g_free(service->service_type); - service->service_type = type; - - ASP_LOGD("asp_advert_set_service_type() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_set_auto_accept(asp_advert_service_h adv_service, - bool auto_accept) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->auto_accept = auto_accept; - - ASP_LOGD("asp_advert_set_auto_accept() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - - -static bool __is_valid_key(const char *key) -{ - int pos = 0; - - if (strlen(key) > KEY_LEN) - return false; - - while (key[pos] != 0) { - if (key[pos] < KEY_MIN || key[pos] > KEY_MAX) - return false; - pos++; - } - return true; -} - -int asp_advert_add_info(asp_advert_service_h adv_service, - const char *key, const char *value) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - if (__is_valid_key(key)) { - ASP_LOGE("invalid key!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - /* TODO: add advertised info */ - g_hash_table_replace(service->service_info_map, g_strdup(key), g_strdup(value)); - - ASP_LOGD("asp_advert_add_info() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_get_info(asp_advert_service_h adv_service, const char *key, - int *length, char **value) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - char *ret_val = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - /* TODO: get advertised info */ - ret_val = g_hash_table_lookup(service->service_info_map, key); - if (ret_val == NULL) { - ASP_LOGD("value is NULL"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; - } - - *value = ret_val; - *length = strlen(ret_val); - - ASP_LOGD("asp_advert_get_info() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_remove_info(asp_advert_service_h adv_service, const char *key) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - /* TODO: remove advertised info */ - g_hash_table_remove(service->service_info_map, key); - - ASP_LOGD("asp_advert_remove_info() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_set_status(asp_advert_service_h adv_service, - unsigned char status) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->status = status; - - ASP_LOGD("asp_advert_set_status() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_set_discovery_tech(asp_advert_service_h adv_service, int discovery_tech) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - if (!((discovery_tech & ASP_DISCOVERY_TECH_P2P) | - (discovery_tech & ASP_DISCOVERY_TECH_NFC) | - (discovery_tech & ASP_DISCOVERY_TECH_BLE) | - (discovery_tech & ASP_DISCOVERY_TECH_INFRA) | - (discovery_tech & ASP_DISCOVERY_TECH_NAN))) { - ASP_LOGE("invalid parameter!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - if (!adv_service) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->discovery_tech = discovery_tech; - - ASP_LOGD("asp_advert_set_discovery_tech() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_set_preferred_connection(asp_advert_service_h adv_service, - unsigned char preferred_connection) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - if (!adv_service) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->preferred_connection = preferred_connection; - - ASP_LOGD("asp_advert_set_preferred_connection() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_set_p2p_role_scheme(asp_advert_service_h adv_service, - asp_advert_p2p_role_scheme_e role) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - if (!adv_service) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->role = role; - - ASP_LOGD("asp_advert_set_p2p_role_scheme() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_get_p2p_role_scheme(asp_advert_service_h adv_service, - asp_advert_p2p_role_scheme_e *role) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - if (!adv_service || !role) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - *role = service->role; - - ASP_LOGD("asp_advert_get_p2p_role_scheme() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - - -int asp_advert_set_p2p_config_method(asp_advert_service_h adv_service, - asp_wps_type_e config_method) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - if (!adv_service) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - if (config_method > ASP_WPS_TYPE_PIN_KEYPAD) { - ASP_LOGE("config_method is larger than expected"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->config_method = config_method; - - ASP_LOGD("asp_advert_set_p2p_config_method() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_get_p2p_config_method(asp_advert_service_h adv_service, - asp_wps_type_e *config_method) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(config_method, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - *config_method = service->config_method; - - ASP_LOGD("asp_advert_get_p2p_config_method() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_advert_set_p2p_response(asp_advert_service_h adv_service, - char *rsp_info, int length) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - char *info = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - /* TODO fit the rsp info for length */ - if (length <= 0 || length > DEFERRED_LEN) { - ASP_LOGE("invalid length!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - if (!adv_service || !rsp_info) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - info = g_strdup(rsp_info); - if (!info) { - ASP_LOGE("malloc() failed!!!."); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } - g_free(service->rsp_info); - service->rsp_info = info; - - ASP_LOGD("asp_advert_set_p2p_response() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - - -static GVariant* __g_hash_keys_to_g_variant(GHashTable *hash) -{ - GVariantBuilder builder; - - __ASP_LOG_FUNC_START__; - g_variant_builder_init(&builder, G_VARIANT_TYPE("as")); -/* g_variant_builder_open(&builder, G_VARIANT_TYPE("a{sv}")); */ - - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init(&iter, hash); - while (g_hash_table_iter_next(&iter, &key, &value)) { - - ASP_LOGE("key [%s]", (char*)key); - g_variant_builder_add(&builder, "s", key); - } - -/* g_variant_builder_close(&builder); */ - __ASP_LOG_FUNC_END__; - return g_variant_builder_end(&builder); -} - -static GVariant* __g_hash_table_to_g_variant(GHashTable *hash) -{ - GVariantBuilder builder; - - __ASP_LOG_FUNC_START__; - g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); - - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init(&iter, hash); - while (g_hash_table_iter_next(&iter, &key, &value)) - g_variant_builder_add(&builder, "{sv}", key, g_variant_new_string(value)); - - __ASP_LOG_FUNC_END__; - return g_variant_builder_end(&builder); -} - -int asp_advert_start_advertising(asp_advert_service_h adv_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - GVariantBuilder *builder = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - // LCOV_EXCL_START - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->adv_id)); - g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); - g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); - g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new("i", service->auto_accept)); - g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status)); - g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->role)); - g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method)); - - if (service->instance_name) /* This can be NULL if this is ASP 1.0 service */ - g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name)); - if (service->service_type) /* This can be NULL if Instance name is UUID */ - g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); - if (g_hash_table_size(service->service_info_map) > 0) - g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_table_to_g_variant(service->service_info_map)); - if (service->rsp_info) - g_variant_builder_add(builder, "{sv}", "rsp_info", g_variant_new("s", service->rsp_info)); - params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - ASP_LOGI("service type (%s) adv ID (%u)", service->service_type, service->adv_id); - - reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, - "AdvertiseService", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_advert_stop_advertising(asp_advert_service_h adv_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - // LCOV_EXCL_START - params = g_variant_new("(ui)", service->adv_id, service->discovery_tech); - reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, - "CancelAdvertiseService", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_advert_change_service_status(asp_advert_service_h adv_service, - unsigned char status) -{ - __ASP_LOG_FUNC_START__; - asp_client_advert_s *service = NULL; - GVariantBuilder *builder = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", adv_service); - - service = __get_advert((void *)adv_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - // LCOV_EXCL_START - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->adv_id)); - g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new("i", service->auto_accept)); - service->status = status; - g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status)); - g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->role)); - g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method)); - - if (service->instance_name) /* This can be NULL if this is ASP 1.0 service */ - g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name)); - if (service->service_type) /* This can be NULL if Instance name is UUID */ - g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); - if (g_hash_table_size(service->service_info_map) > 0) - g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_keys_to_g_variant(service->service_info_map)); - if (service->rsp_info) - g_variant_builder_add(builder, "{sv}", "rsp_info", g_variant_new("s", service->rsp_info)); - - params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - ASP_LOGI("service type (%s) adv ID (%u)", service->service_type, service->adv_id); - - reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, - "ServiceChangeStatus", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_seek_create(char *service_type, asp_seek_service_h *seek_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - if (!service_type || strlen(service_type) == 0 || !__is_valid_service_type(service_type)) { - ASP_LOGE("NULL Param [service_type]!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - ASP_LOGD("service_type = [%s]", service_type); - - if (!seek_service) { - ASP_LOGE("NULL Param [handle]!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - service = (asp_client_seek_s *)g_try_malloc0(sizeof(asp_client_seek_s)); - if (!service) { - ASP_LOGE("malloc() failed!!!."); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OUT_OF_MEMORY; - } - ASP_LOGD("service [%p]", service); - - service->service_type = g_strdup(service_type); - if (!service->service_type) { - ASP_LOGE("malloc() failed!!!."); - g_free(service); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OUT_OF_MEMORY; - } - - service->service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - asp_seeks = g_list_prepend(asp_seeks, service); - - *seek_service = (asp_seek_service_h)service; - ASP_LOGD("asp_create_seek_handle() SUCCESS"); - - ASP_LOGD("seek handler [%p]", *seek_service); - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_seek_destroy(asp_seek_service_h seek_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", seek_service); - - service = __get_seek((void *)seek_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - g_hash_table_remove_all(service->service_info_map); - res = __remove_seek((void *)service); - if (res != ASP_ERROR_NONE) { - __ASP_LOG_FUNC_END__; - return res; - } - - ASP_LOGD("asp_seek_destroy() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_seek_add_info(asp_seek_service_h seek_service, const char *key) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); - - if (strlen(key) == 0) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - ASP_LOGD("service [%p]", seek_service); - - service = __get_seek((void *)seek_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - g_hash_table_replace(service->service_info_map, g_strdup(key), NULL); - - ASP_LOGD("service info [%d]", g_hash_table_size(service->service_info_map)); - ASP_LOGD("asp_add_seek_info() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; - -} - -int asp_seek_remove_info(asp_seek_service_h seek_service, const char *key) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); - - if (strlen(key) == 0) { - ASP_LOGE("NULL handler!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - ASP_LOGD("service [%p]", seek_service); - - service = __get_seek((void *)seek_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - /* TODO: remove seek info */ - g_hash_table_remove(service->service_info_map, key); - - ASP_LOGD("asp_remove_seek_info() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; - -} - -int asp_seek_set_discovery_tech(asp_seek_service_h seek_service, int discovery_tech) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); - - if (!((discovery_tech & ASP_DISCOVERY_TECH_P2P) | - (discovery_tech & ASP_DISCOVERY_TECH_NFC) | - (discovery_tech & ASP_DISCOVERY_TECH_BLE) | - (discovery_tech & ASP_DISCOVERY_TECH_INFRA) | - (discovery_tech & ASP_DISCOVERY_TECH_NAN))) { - ASP_LOGE("invalid parameter!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - ASP_LOGD("service [%p]", seek_service); - - service = __get_seek((void *)seek_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->discovery_tech = discovery_tech; - - ASP_LOGD("asp_set_seeking_tech() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - -int asp_seek_set_preferred_connection(asp_seek_service_h seek_service, - unsigned char preferred_connection) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", seek_service); - - service = __get_seek((void *)seek_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - service->preferred_connection = preferred_connection; - - ASP_LOGD("asp_set_seeking_preferred_connection() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - - -int asp_seek_start(asp_seek_service_h seek_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - GVariantBuilder *builder = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", seek_service); - - service = __get_seek((void *)seek_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SERVICE_NOT_FOUND; - } - - // LCOV_EXCL_START - ASP_LOGD("service info [%d]", g_hash_table_size(service->service_info_map)); - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); - g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); - g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); - if (g_hash_table_size(service->service_info_map) > 0) { - ASP_LOGE("Service info"); - g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_keys_to_g_variant(service->service_info_map)); - } - - params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - ASP_LOGI("service name (%s)", service->serivce_name); - - reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, - "SeekService", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(it)", &ret, &(service->search_id)); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_seek_stop(asp_seek_service_h seek_service) -{ - __ASP_LOG_FUNC_START__; - asp_client_seek_s *service = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); - - service = __get_seek((void *)seek_service); - if (service == NULL) { - ASP_LOGE("Service NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } - ASP_LOGD("service_type = [%s]", service->service_type); - - // LCOV_EXCL_START - params = g_variant_new("(ti)", service->search_id, service->discovery_tech); - reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, - "CancelSeekService", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_session_create(char *service_mac, unsigned int adv_id, asp_session_h* session) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - - if (!service_mac || strlen(service_mac) != (MACSTR_LEN -1)) { - ASP_LOGE("Invalid Param [service_mac]!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - if (adv_id == 0 || !session) { - ASP_LOGE("NULL Param [session]!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - service = (asp_client_session_s *)g_try_malloc0(sizeof(asp_client_session_s)); - if (!service) { - ASP_LOGE("malloc() failed!!!."); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OUT_OF_MEMORY; - } - ASP_LOGD("service [%p]", service); - - service->advertisement_id = adv_id; - g_strlcpy(service->service_mac, service_mac, MACSTR_LEN); - - asp_sessions = g_list_prepend(asp_sessions, service); - - /* Session ID will be generated by asp-manager */ - *session = (asp_session_h)service; - ASP_LOGD("asp_session_create() SUCCESS"); - - ASP_LOGD("service [%p]", *session); - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_destroy(asp_session_h session) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", session); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - res = __remove_session((void *)service); - if (res != ASP_ERROR_NONE) { - __ASP_LOG_FUNC_END__; - return res; - } - - ASP_LOGD("asp_session_destroy() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return ASP_ERROR_NONE; -} - - -int asp_session_get_mac(asp_session_h session, char **session_mac) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session_mac, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", session); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - *session_mac = service->session_mac; - - ASP_LOGD("asp_session_get_mac() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - - -int asp_session_get_id(asp_session_h session, unsigned int *session_id) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session_id, __ASP_LOG_FUNC_END__); - - ASP_LOGD("service [%p]", session); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - *session_id = service->session_id; - - ASP_LOGD("asp_session_get_id() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_set_info(asp_session_h session, char *service_info) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - char *info = NULL; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(service_info, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - if (strlen(service_info) > SESSION_INFO_LEN) { - ASP_LOGE("NULL Param!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - info = g_strdup(service_info); - if (!info) { - ASP_LOGE("malloc() failed!!!."); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } - g_free(service->session_information); - service->session_information = info; - - ASP_LOGD("asp_session_set_info() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_get_info(asp_session_h session, char **service_info) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(service_info, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - if (service->session_information) - *service_info = service->session_information; - - ASP_LOGD("asp_session_get_info() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_set_p2p_role_scheme(asp_session_h session, - asp_advert_p2p_role_scheme_e role) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(role, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - service->network_role = role; - - ASP_LOGD("asp_session_set_p2p_role_scheme() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_get_p2p_role_scheme(asp_session_h session, - asp_advert_p2p_role_scheme_e *role) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(role, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - *role = service->network_role; - - ASP_LOGD("asp_session_get_p2p_role_scheme() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_set_p2p_config_method(asp_session_h session, - asp_wps_type_e config_method) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - if (config_method < ASP_WPS_TYPE_DEFAULT || - config_method > ASP_WPS_TYPE_PIN_KEYPAD) { - ASP_LOGE("network_config is invalid"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_INVALID_PARAMETER; - } - - service->network_config = config_method; - - ASP_LOGD("asp_session_set_p2p_config_method() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_get_p2p_config_method(asp_session_h session, - asp_wps_type_e *config_method) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(config_method, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - *config_method = service->network_config; - - ASP_LOGD("asp_session_get_p2p_config_method() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} - -int asp_session_get_close_status(asp_session_h session, int *status) -{ - __ASP_LOG_FUNC_START__; - asp_client_session_s *service = NULL; - int res = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(status, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - *status = service->state; - - ASP_LOGD("asp_session_get_close_status() SUCCESS"); - - __ASP_LOG_FUNC_END__; - return res; -} -int asp_session_connect(asp_session_h session) -{ - __ASP_LOG_FUNC_START__; - GVariantBuilder *builder = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - asp_client_session_s *service = NULL; - const char *str = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - // LCOV_EXCL_START - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", service->service_mac)); - g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->advertisement_id)); - g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->network_config)); - g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->network_config)); - if (service->session_information) - g_variant_builder_add(builder, "{sv}", "session_info", g_variant_new("s", service->session_information)); - - params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - - reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, - "ConnectSession", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(iu&s)", &ret, &(service->session_id), &str); - if (str != NULL) - g_strlcpy(service->session_mac, str, MACSTR_LEN); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_session_confirm(asp_session_h session, bool confirmed, char *pin) -{ - __ASP_LOG_FUNC_START__; - GVariantBuilder *builder = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - asp_client_session_s *service = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - // LCOV_EXCL_START - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", service->session_mac)); - g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", service->session_id)); - g_variant_builder_add(builder, "{sv}", "confirmed", g_variant_new("i", confirmed)); - if (pin) - g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin)); - params = g_variant_new("(a{sv})", builder); - reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, - "ConfirmSession", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_session_get_handle(char *session_mac, unsigned int session_id, - asp_session_h *session) - -{ - __ASP_LOG_FUNC_START__; - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session_mac, __ASP_LOG_FUNC_END__); - - // LCOV_EXCL_START - int ret = ASP_ERROR_NONE; - GError *error = NULL; - GVariant *params = g_variant_new("(su)", session_mac, session_id); - GVariant *reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, - "GetSession", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - if (!reply) { - ASP_LOGE("reply is NULL!!"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_OPERATION_FAILED; - } - - asp_client_session_s *service = (asp_client_session_s *)g_try_malloc0(sizeof(asp_client_session_s)); - if (!service) { - ASP_LOGE("malloc() failed!!!."); - g_variant_unref(reply); - return ASP_ERROR_OUT_OF_MEMORY; - } - ASP_LOGD("service [%p]", service); - g_strlcpy(service->session_mac, session_mac, MACSTR_LEN); - service->session_id = session_id; - - GVariantIter *iter = NULL; - g_variant_get(reply, "(ia{sv})", &ret, &iter); - asp_variant_s *variant = __get_asp_variant_from_iterator(iter); - g_variant_unref(reply); - if (variant == NULL) { - ASP_LOGE("Out of memory"); - return ASP_ERROR_OUT_OF_MEMORY; - } - - service->advertisement_id = variant->adv_id; - __clear_asp_variant(variant); - - *session = service; - asp_sessions = g_list_prepend(asp_sessions, service); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_session_set_state_ready(asp_session_h session) - -{ - __ASP_LOG_FUNC_START__; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - asp_client_session_s *service = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - return ASP_ERROR_SESSION_NOT_FOUND; - } - - params = g_variant_new("(su)", service->session_mac, service->session_id); - reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, - "SetSessionReady", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; -} - -int asp_session_close(asp_session_h session) - -{ - __ASP_LOG_FUNC_START__; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - asp_client_session_s *service = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - return ASP_ERROR_SESSION_NOT_FOUND; - } - - params = g_variant_new("(su)", service->session_mac, service->session_id); - reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, - "CloseSession", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; -} - -int asp_session_bind_port(asp_session_h session, char *ip_address, - int port, int proto) -{ - __ASP_LOG_FUNC_START__; - GVariantBuilder *builder = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - asp_client_session_s *service = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(ip_address, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - // LCOV_EXCL_START - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", service->session_mac)); - g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", service->session_id)); - g_variant_builder_add(builder, "{sv}", "ip_address", g_variant_new("s", ip_address)); - g_variant_builder_add(builder, "{sv}", "port", g_variant_new("i", port)); - g_variant_builder_add(builder, "{sv}", "proto", g_variant_new("i", proto)); - params = g_variant_new("(a{sv})", builder); - reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, - "BoundPort", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} - -int asp_session_release_port(asp_session_h session, char *ip_address, - int port, int proto) -{ - __ASP_LOG_FUNC_START__; - GVariantBuilder *builder = NULL; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - asp_client_session_s *service = NULL; - int ret = ASP_ERROR_NONE; - - CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); - RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); - RET_ERR_IF_PARAMETER_IS_NOT_VALID(ip_address, __ASP_LOG_FUNC_END__); - - service = __get_session((void *)session); - if (service == NULL) { - ASP_LOGE("Session NOT registered"); - __ASP_LOG_FUNC_END__; - return ASP_ERROR_SESSION_NOT_FOUND; - } - - // LCOV_EXCL_START - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", service->session_mac)); - g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", service->session_id)); - g_variant_builder_add(builder, "{sv}", "ip_address", g_variant_new("s", ip_address)); - g_variant_builder_add(builder, "{sv}", "port", g_variant_new("i", port)); - g_variant_builder_add(builder, "{sv}", "proto", g_variant_new("i", proto)); - params = g_variant_new("(a{sv})", builder); - reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, - "ReleasePort", params, &error); - if (error != NULL) { - ASP_LOGE("asp_dbus_method_call_sync() failed." - "error [%d: %s]", error->code, error->message); - ret = __asp_err_string_to_enum(error->message); - g_error_free(error); - __ASP_LOG_FUNC_END__; - return ret; - } - - g_variant_get(reply, "(i)", &ret); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, ret); - - __ASP_LOG_FUNC_END__; - return ret; - // LCOV_EXCL_STOP -} diff --git a/src/asp-client.cpp b/src/asp-client.cpp new file mode 100755 index 0000000..11c53ef --- /dev/null +++ b/src/asp-client.cpp @@ -0,0 +1,2681 @@ +/* + * Application Service Platform(ASP) + * + * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * 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. + * + */ + +/** + * This file implements Application Service Platform(ASP) user library. + * + * @file asp-client.c + * @author Jiung Yu (jiung.yu@samsung.com) + * @version 0.1 + */ + + +/***************************************************************************** + * Standard headers + *****************************************************************************/ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/***************************************************************************** + * System headers + *****************************************************************************/ +#include + +/***************************************************************************** + * Application Service Platform(ASP) library headers + *****************************************************************************/ +#include "asp.h" + +#include "asp-advert.h" +#include "asp-client.h" +#include "asp-conts.h" +#include "asp-defs.h" +#include "asp-dbus.h" +#include "asp-log.h" +#include "asp-seek.h" +#include "asp-utils.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +/***************************************************************************** + * Global Variables + *****************************************************************************/ +static __thread asp_client_info_s g_client_info = { + .is_registered = FALSE, + + .seek_search_result_cb = NULL, + .advert_status_changed_cb = NULL, + .session_request_cb = NULL, + .session_config_request_cb = NULL, + .session_connect_status_cb = NULL, + .session_status_cb = NULL, + .session_port_status_cb = NULL, + + .user_data_for_cb_seek_search_result = NULL, + .user_data_for_cb_advert_status_changed = NULL, + .user_data_for_cb_session_request = NULL, + .user_data_for_cb_session_config_request = NULL, + .user_data_for_cb_session_connect_status = NULL, + .user_data_for_cb_session_status = NULL, + .user_data_for_cb_session_port_status = NULL +}; + +static __thread GList *asp_sessions = NULL; + +/***************************************************************************** + * Local Structures Definition + *****************************************************************************/ +typedef struct { + unsigned int search_id; + unsigned int adv_id; + unsigned int config_method; + + const char *service_mac; + char *service_info; + int service_info_len; + + unsigned int session_id; + const char *session_mac; + const char *session_info; + int session_info_len; + + const char * device_name; + const char *instance_name; + + gboolean get_pin; + const char *pin; + + const char *ip_address; + int port; + int proto; + int service_status; + const char *deferred_resp; + int deferred_resp_len; + + int state; + int status; + const char *requested_info; +} asp_variant_s; + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ + +//LCOV_EXCL_START +static char* __asp_create_service_info_from_g_variant(GVariant *variant) +{ + gchar *info = (gchar*)g_try_malloc0(ASP_SERVICE_INFO_MAX_LEN + 1); + if (!info) + return NULL; + + GVariantIter *iter = NULL; + g_variant_get(variant, "a{sv}", &iter); + + GVariant* var = NULL; + gchar *key = NULL; + int offset = 0; + while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { + gsize value_len = 0; + gchar *value = g_variant_dup_string(var, &value_len); + int len = strlen(key) + value_len + 2; + snprintf(info + offset, len + 1, "%s=%s,", key, value); + offset += len; + g_free(value); + } + + return info; +} + +static asp_variant_s *__get_asp_variant_from_iterator(GVariantIter *iter) +{ + asp_variant_s *variant = (asp_variant_s *)g_try_malloc0(sizeof(asp_variant_s)); + if (variant == NULL) + return variant; + + const char *key = NULL; + GVariant *value = NULL; + + while (g_variant_iter_loop(iter, "{sv}", &key, &value)) { + if (!g_strcmp0(key, "search_id")) { + g_variant_get(value, "u", &variant->search_id); + } else if (!g_strcmp0(key, "service_mac")) { + g_variant_get(value, "&s", &variant->service_mac); + } else if (!g_strcmp0(key, "adv_id")) { + g_variant_get(value, "u", &variant->adv_id); + } else if (!g_strcmp0(key, "config_method")) { + g_variant_get(value, "u", &variant->config_method); + } else if (!g_strcmp0(key, "instance_name")) { + g_variant_get(value, "&s", &variant->instance_name); + } else if (!g_strcmp0(key, "service_info")) { + g_free(variant->service_info); + variant->service_info = __asp_create_service_info_from_g_variant(value); + if (variant->service_info) { + ASP_LOGD("Service Info: %s", variant->service_info); + variant->service_info_len = strlen(variant->service_info); + } + } else if (!g_strcmp0(key, "service_status")) { + g_variant_get(value, "y", &variant->service_status); + } else if (!g_strcmp0(key, "session_id")) { + g_variant_get(value, "u", &variant->session_id); + } else if (!g_strcmp0(key, "session_mac")) { + g_variant_get(value, "&s", &variant->session_mac); + } else if (!g_strcmp0(key, "session_info")) { + g_variant_get(value, "&s", &variant->session_info); + if (variant->session_info) + variant->session_info_len = strlen(variant->session_info); + } else if (!g_strcmp0(key, "device_name")) { + g_variant_get(value, "&s", &variant->device_name); + } else if (!g_strcmp0(key, "get_pin")) { + g_variant_get(value, "b", &variant->get_pin); + } else if (!g_strcmp0(key, "pin")) { + g_variant_get(value, "&s", &variant->pin); + } else if (!g_strcmp0(key, "deferred_resp")) { + g_variant_get(value, "&s", &variant->deferred_resp); + if (variant->deferred_resp) + variant->deferred_resp_len = strlen(variant->deferred_resp); + } else if (!g_strcmp0(key, "ip_address")) { + g_variant_get(value, "&s", &variant->ip_address); + } else if (!g_strcmp0(key, "port")) { + g_variant_get(value, "i", &variant->port); + } else if (!g_strcmp0(key, "proto")) { + g_variant_get(value, "i", &variant->proto); + } else if (!g_strcmp0(key, "state")) { + g_variant_get(value, "i", &variant->state); + } else if (!g_strcmp0(key, "status")) { + g_variant_get(value, "i", &variant->status); + } else if (!g_strcmp0(key, "requested_info")) { + g_variant_get(value, "&s", &variant->requested_info); + } else { + /* Do Nothing */ + } + } + + return variant; +} + +static void __clear_asp_variant(asp_variant_s *variant) +{ + if (variant && variant->service_info) { + g_free(variant->service_info); + variant->service_info = NULL; + } + g_free(variant); +} + +static int __asp_err_string_to_enum(const char *error) +{ + if (NULL != strstr(error, "NoReply")) + return ASP_ERROR_COMMUNICATION_FAILED; + else if (NULL != strstr(error, "PermissionDenied")) + return ASP_ERROR_PERMISSION_DENIED; + else if (NULL != strstr(error, "MEM_ERR")) + return ASP_ERROR_OUT_OF_MEMORY; + else if (NULL != strstr(error, "INVALID_PARAM")) + return ASP_ERROR_INVALID_PARAMETER; + else if (NULL != strstr(error, "OPER_FAILED")) + return ASP_ERROR_OPERATION_FAILED; + else if (NULL != strstr(error, "NO_SERVICE")) + return ASP_ERROR_SERVICE_NOT_FOUND; + else if (NULL != strstr(error, "NO_SESSION")) + return ASP_ERROR_SESSION_NOT_FOUND; + else + return ASP_ERROR_OPERATION_FAILED; +} + +static asp_client_session_s *get_session_by_id_mac(const char *session_mac, unsigned int session_id) +{ + asp_client_session_s *session = NULL; + GList *temp = NULL; + + for (temp = g_list_first(asp_sessions); + temp != NULL; temp = g_list_next(temp)) { + session = (asp_client_session_s *)temp->data; + if (session != NULL && session->session_id == session_id && + memcmp(session->session_mac, session_mac, MACSTR_LEN) == 0) + break; + session = NULL; + } + + return session; +} + +void asp_process_seek_search_result(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_START__; + asp_client_info_s *client = &g_client_info; + if (!client->seek_search_result_cb) { + ASP_LOGD("search_result_cb is NULL!!"); + return; + } + + if (!parameters) { + __ASP_LOG_FUNC_END__; + return; + } + + GVariantIter *iter = NULL; + g_variant_get(parameters, "(a{sv})", &iter); + asp_variant_s *variant = __get_asp_variant_from_iterator(iter); + if (variant == NULL) { + ASP_LOGE("Out of memory"); + return; + } + + AspSeek *seek = getSeekById(variant->search_id); + if (!seek) { + ASP_LOGD("There's no related seek"); + goto ERROR; + } + + client->seek_search_result_cb(ASP_ERROR_NONE, (asp_seek_service_h)seek, + variant->service_mac, variant->adv_id, + (asp_wps_type_e)variant->config_method, variant->instance_name, + variant->service_info, variant->service_info_len, + variant->service_status, client->user_data_for_cb_seek_search_result); + +ERROR: + g_variant_iter_free(iter); + __clear_asp_variant(variant); + __ASP_LOG_FUNC_END__; + return; +} + +void asp_process_advert_status_changed(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_START__; + + asp_client_info_s *client = &g_client_info; + AspAdvert *advert = NULL; + unsigned int advertisement_id = 0; + unsigned char status = 0; + int reason = 0; + + if (!client->advert_status_changed_cb) { + ASP_LOGD("search_result_cb is NULL!!"); + return; + } + + if (!parameters) { + __ASP_LOG_FUNC_END__; + return; + } + + g_variant_get(parameters, "(uyi)", &advertisement_id, &status, &reason); + + advert = getAdvertById(advertisement_id); + if (!advert) { + ASP_LOGD("There's no related advert"); + return; + } + + client->advert_status_changed_cb( + (asp_advert_service_h)advert, (asp_service_status_e)status, + (asp_advert_status_reason_e)reason, + client->user_data_for_cb_advert_status_changed); + + __ASP_LOG_FUNC_END__; + return; +} + +int __handle_session_request(unsigned int adv_id, const char *session_mac, + unsigned int session_id, const char *session_info) +{ + __ASP_LOG_FUNC_START__; + AspAdvert *service = NULL; + asp_client_session_s *session = NULL; + GList *temp = NULL; + int res = 0; + + service = getAdvertById(adv_id); + + if (service == NULL) { + ASP_LOGD("No matched local service"); + __ASP_LOG_FUNC_END__; + return -1; + } + + ASP_LOGD("Process auto accept service"); + + temp = NULL; + for (temp = g_list_first(asp_sessions); + temp != NULL; temp = g_list_next(temp)) { + session = (asp_client_session_s *)temp->data; + if (session != NULL && session->session_id == session_id && + memcmp(session->session_mac, session_mac, MACSTR_LEN) == 0) + break; + session = NULL; + } + + if (session == NULL) { + res = asp_session_get_handle((char *)session_mac, session_id, (void **)&session); + if (res < 0) { + ASP_LOGE("asp_get_session failed"); + __ASP_LOG_FUNC_END__; + return -1; + } + + if (session_info) + session->session_information = g_strdup(session_info); + asp_sessions = g_list_prepend(asp_sessions, session); + } + + if (service->auto_accept == FALSE) { + ASP_LOGD("Don't accept request automatically"); + __ASP_LOG_FUNC_END__; + return 0; + } + + asp_session_confirm(session, TRUE, NULL); + ASP_LOGD("asp_confirm_session"); + __ASP_LOG_FUNC_END__; + return -1; +} + +static void __invoke_session_request_cb(asp_variant_s *variant) +{ + if (variant == NULL) + return; + + asp_client_info_s *client = &g_client_info; + if (!client->session_request_cb) { + ASP_LOGE("session_request_cb is NULL!!"); + return; + } + + AspAdvert *advert = getAdvertById(variant->adv_id); + if (!advert) { + ASP_LOGD("There's no related advert"); + return; + } + + asp_client_session_s *session = get_session_by_id_mac(variant->session_mac, variant->session_id); + if (!session) { + ASP_LOGD("There's no related session"); + return; + } + + client->session_request_cb(ASP_ERROR_NONE, advert, session, + variant->device_name, variant->session_info, variant->session_info_len, + (bool)variant->get_pin, variant->pin, + client->user_data_for_cb_session_config_request); +} + +void asp_process_session_request(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_START__; + if (!parameters) { + ASP_LOGE("parameters is NULL!!"); + __ASP_LOG_FUNC_END__; + return; + } + + GVariantIter *iter = NULL; + g_variant_get(parameters, "(a{sv})", &iter); + asp_variant_s *variant = __get_asp_variant_from_iterator(iter); + if (variant == NULL) { + ASP_LOGE("Out of memory"); + goto ERROR; + } + + if (variant->session_mac == NULL) { + ASP_LOGE("session_mac is NULL"); + goto ERROR; + } + + if (__handle_session_request(variant->adv_id, variant->session_mac, + variant->session_id, variant->session_info) != 0) + goto ERROR; + + __invoke_session_request_cb(variant); + +ERROR: + g_variant_iter_free(iter); + __clear_asp_variant(variant); + __ASP_LOG_FUNC_END__; + return; +} + +void asp_process_session_config_request(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *session = NULL; + asp_client_info_s *client = &g_client_info; + if (!client->session_config_request_cb) { + ASP_LOGE("session_config_request_cb is NULL!!"); + return; + } + + if (!parameters) { + __ASP_LOG_FUNC_END__; + return; + } + + GVariantIter *iter = NULL; + g_variant_get(parameters, "(a{sv})", &iter); + asp_variant_s *variant = __get_asp_variant_from_iterator(iter); + if (variant == NULL) { + ASP_LOGE("Out of memory"); + return; + } + + if (variant->session_mac == NULL) { + ASP_LOGE("session_mac is NULL"); + goto ERROR; + } + + session = get_session_by_id_mac(variant->session_mac, variant->session_id); + if (!session) { + ASP_LOGD("There's no related session"); + goto ERROR; + } + + client->session_config_request_cb(ASP_ERROR_NONE, (asp_session_h)session, + (bool)variant->pin, variant->pin, + client->user_data_for_cb_session_config_request); + +ERROR: + g_variant_iter_free(iter); + __clear_asp_variant(variant); + __ASP_LOG_FUNC_END__; + return; +} + +void asp_process_session_connect_status(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *session = NULL; + asp_client_info_s *client = &g_client_info; + if (!client->session_connect_status_cb) { + ASP_LOGE("connect_status_cb is NULL!!"); + return; + } + + if (!parameters) { + __ASP_LOG_FUNC_END__; + return; + } + + GVariantIter *iter = NULL; + g_variant_get(parameters, "(a{sv})", &iter); + asp_variant_s *variant = __get_asp_variant_from_iterator(iter); + if (variant == NULL) { + ASP_LOGE("Out of memory"); + return; + } + + if (variant->session_mac == NULL) { + ASP_LOGE("session_mac is NULL"); + goto ERROR; + } + + session = get_session_by_id_mac(variant->session_mac, variant->session_id); + if (!session) { + ASP_LOGD("There's no related session"); + goto ERROR; + } + + client->session_connect_status_cb(ASP_ERROR_NONE, (asp_session_h)session, + (asp_connect_status_e)variant->status, + variant->deferred_resp, variant->deferred_resp_len, + client->user_data_for_cb_session_connect_status); + +ERROR: + g_variant_iter_free(iter); + __clear_asp_variant(variant); + __ASP_LOG_FUNC_END__; + return; +} + +void asp_process_session_status(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *session = NULL; + asp_client_info_s *client = &g_client_info; + if (!client->session_status_cb) { + ASP_LOGE("session_status_cb is NULL!!"); + return; + } + + if (!parameters) { + __ASP_LOG_FUNC_END__; + return; + } + + GVariantIter *iter = NULL; + g_variant_get(parameters, "(a{sv})", &iter); + asp_variant_s *variant = __get_asp_variant_from_iterator(iter); + if (variant == NULL) { + ASP_LOGE("Out of memory"); + return; + } + + if (variant->session_mac == NULL) { + ASP_LOGE("session_mac is NULL"); + goto ERROR; + } + + session = get_session_by_id_mac(variant->session_mac, variant->session_id); + if (!session) { + ASP_LOGD("There's no related session"); + goto ERROR; + } + + client->session_status_cb(ASP_ERROR_NONE, (asp_session_h)session, + (asp_session_state_e)variant->state, variant->requested_info, + client->user_data_for_cb_session_status); + +ERROR: + g_variant_iter_free(iter); + __clear_asp_variant(variant); + __ASP_LOG_FUNC_END__; + return; +} + +void asp_process_session_port_status(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *session = NULL; + asp_client_info_s *client = &g_client_info; + if (!client->session_port_status_cb) { + ASP_LOGE("port_status_cb is NULL!!"); + return; + } + + if (!parameters) { + __ASP_LOG_FUNC_END__; + return; + } + + GVariantIter *iter = NULL; + g_variant_get(parameters, "(a{sv})", &iter); + asp_variant_s *variant = __get_asp_variant_from_iterator(iter); + if (variant == NULL) { + ASP_LOGE("Out of memory"); + return; + } + + if (variant->session_mac == NULL) { + ASP_LOGE("session_mac is NULL"); + goto ERROR; + } + + session = get_session_by_id_mac(variant->session_mac, variant->session_id); + if (!session) { + ASP_LOGD("There's no related session"); + goto ERROR; + } + + client->session_port_status_cb(ASP_ERROR_NONE, (asp_session_h)session, + variant->ip_address, variant->port, variant->proto, + (asp_port_status_e)variant->status, + client->user_data_for_cb_session_port_status); + +ERROR: + g_variant_iter_free(iter); + __clear_asp_variant(variant); + __ASP_LOG_FUNC_END__; + return; +} +//LCOV_EXCL_STOP +int asp_initialize(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + + if (g_client_info.is_registered == TRUE) { + ASP_LOGW("Warning!!! Already registered\nUpdate user data and callback!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_ALREADY_INITIALIZED; + } + + if (asp_dbus_init() == FALSE) { + ASP_LOGW("Failed to initialize dbus"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } + + g_client_info.is_registered = TRUE; + + /* Initialize callbacks */ + g_client_info.seek_search_result_cb = NULL; + g_client_info.advert_status_changed_cb = NULL; + + g_client_info.session_request_cb = NULL; + g_client_info.session_config_request_cb = NULL; + g_client_info.session_connect_status_cb = NULL; + g_client_info.session_status_cb = NULL; + g_client_info.session_port_status_cb = NULL; + + g_client_info.user_data_for_cb_seek_search_result = NULL; + g_client_info.user_data_for_cb_advert_status_changed = NULL; + + g_client_info.user_data_for_cb_session_request = NULL; + g_client_info.user_data_for_cb_session_config_request = NULL; + g_client_info.user_data_for_cb_session_connect_status = NULL; + g_client_info.user_data_for_cb_session_status = NULL; + g_client_info.user_data_for_cb_session_port_status = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_deinitialize(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + asp_dbus_deinit(); + + g_client_info.seek_search_result_cb = NULL; + g_client_info.advert_status_changed_cb = NULL; + + g_client_info.session_request_cb = NULL; + g_client_info.session_config_request_cb = NULL; + g_client_info.session_connect_status_cb = NULL; + g_client_info.session_status_cb = NULL; + g_client_info.session_port_status_cb = NULL; + + g_client_info.user_data_for_cb_seek_search_result = NULL; + g_client_info.user_data_for_cb_advert_status_changed = NULL; + + g_client_info.user_data_for_cb_session_request = NULL; + g_client_info.user_data_for_cb_session_config_request = NULL; + g_client_info.user_data_for_cb_session_connect_status = NULL; + g_client_info.user_data_for_cb_session_status = NULL; + g_client_info.user_data_for_cb_session_port_status = NULL; + + g_client_info.is_registered = FALSE; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} +int asp_seek_set_search_result_cb(asp_seek_search_result_cb cb, void *user_data) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); + + + g_client_info.seek_search_result_cb = cb; + g_client_info.user_data_for_cb_seek_search_result = user_data; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_seek_unset_search_result_cb(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + g_client_info.seek_search_result_cb = NULL; + g_client_info.user_data_for_cb_seek_search_result = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_set_status_changed_cb(asp_advert_status_changed_cb cb, void *user_data) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); + + g_client_info.advert_status_changed_cb = cb; + g_client_info.user_data_for_cb_advert_status_changed = user_data; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_unset_status_changed_cb(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + g_client_info.advert_status_changed_cb = NULL; + g_client_info.user_data_for_cb_advert_status_changed = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_set_request_cb(asp_session_request_cb cb, void *user_data) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); + + g_client_info.session_request_cb = cb; + g_client_info.user_data_for_cb_session_request = user_data; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_unset_request_cb(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + g_client_info.session_request_cb = NULL; + g_client_info.user_data_for_cb_session_request = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_set_config_request_cb(asp_session_config_request_cb cb, void *user_data) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); + + g_client_info.session_config_request_cb = cb; + g_client_info.user_data_for_cb_session_config_request = user_data; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_unset_config_request_cb(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + g_client_info.session_config_request_cb = NULL; + g_client_info.user_data_for_cb_session_config_request = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_set_connect_status_cb(asp_session_connect_status_cb cb, void *user_data) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); + + g_client_info.session_connect_status_cb = cb; + g_client_info.user_data_for_cb_session_connect_status = user_data; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + + +int asp_session_unset_connect_status_cb(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + g_client_info.session_connect_status_cb = NULL; + g_client_info.user_data_for_cb_session_connect_status = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_set_status_cb(asp_session_status_cb cb, void *user_data) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); + + g_client_info.session_status_cb = cb; + g_client_info.user_data_for_cb_session_status = user_data; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + + +int asp_session_unset_status_cb(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + g_client_info.session_status_cb = NULL; + g_client_info.user_data_for_cb_session_status = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_set_port_status_cb(asp_session_port_status_cb cb, void *user_data) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(cb, __ASP_LOG_FUNC_END__); + + g_client_info.session_port_status_cb = cb; + g_client_info.user_data_for_cb_session_port_status = user_data; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_session_unset_port_status_cb(void) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + g_client_info.session_port_status_cb = NULL; + g_client_info.user_data_for_cb_session_port_status = NULL; + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +typedef void (*free_func)(void *); + + +static void __free_session(void *session) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + + service = (asp_client_session_s *)session; + if (service == NULL) { + ASP_LOGE("invalid parameter"); + __ASP_LOG_FUNC_END__; + return; + } + + g_free(service->session_information); + g_free(service->deferred_session_response); + g_free(service); + service = NULL; + __ASP_LOG_FUNC_END__; + return; +} + +static asp_client_session_s *__get_session(void *handle) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + GList *temp = NULL; + + if (asp_sessions == NULL) { + + __ASP_LOG_FUNC_END__; + return NULL; + } + + ASP_LOGD("service [%p]", handle); + + temp = g_list_first(asp_sessions); + for (temp = g_list_first(asp_sessions); temp != NULL; temp = g_list_next(temp)) { + service = (asp_client_session_s *)temp->data; + + ASP_LOGD("temp [%p]", service); + if (service != NULL && service == handle) + break; + service = NULL; + } + __ASP_LOG_FUNC_END__; + return service; +} + +static int __remove_session(void *handle) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + service = __get_session(handle); + + if (service == NULL) { + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } else { + asp_sessions = g_list_remove(asp_sessions, handle); + __free_session(service); + } + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +static bool __is_valid_instance_name(char *instance_name) +{ + if (strlen(instance_name) > INSTANCE_NAME_LEN) + return false; + else + return true; +} + +int asp_advert_create(char *instance_name, asp_advert_service_h *adv_service) +{ + __ASP_LOG_FUNC_START__; + + int res = ASP_ERROR_NONE; + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + + AspAdvert *service = new AspAdvert; + + if (!service) { + ASP_LOGE("malloc() failed!!!."); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OUT_OF_MEMORY; + } + ASP_LOGD("service [%p]", service); + + if (instance_name) { + ASP_LOGD("instance_name = [%s]", instance_name); + if (!__is_valid_instance_name(instance_name)) { + ASP_LOGE("Not valid instance_name"); + delete service; + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + service->instance_name = g_strdup(instance_name); + if (!service->instance_name) { + ASP_LOGE("malloc() failed!!!."); + g_free(service); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OUT_OF_MEMORY; + } + } + + addAdvertToServiceList(service); + + *adv_service = (asp_advert_service_h)service; + ASP_LOGD("asp_advert_create() SUCCESS"); + ASP_LOGD("advert handler [%p]", *adv_service); + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_advert_destroy(asp_advert_service_h adv_service) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + if (removeAdvert((void *)service) == false) { + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } + + ASP_LOGD("asp_destory_advertise_handle() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_set_service_type(asp_advert_service_h adv_service, + char *service_type) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(service_type, __ASP_LOG_FUNC_END__); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + return service->setServiceType(service_type); +} + +int asp_advert_set_auto_accept(asp_advert_service_h adv_service, + bool auto_accept) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + service->auto_accept = auto_accept; + + ASP_LOGD("asp_advert_set_auto_accept() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_add_info(asp_advert_service_h adv_service, + const char *key, const char *value) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + return service->addInfo(key, value); +} + +int asp_advert_get_info(asp_advert_service_h adv_service, const char *key, + int *length, char **value) +{ + __ASP_LOG_FUNC_START__; + char *ret_val = NULL; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + /* TODO: get advertised info */ + ret_val = (char *)g_hash_table_lookup(service->service_info_map, key); + if (ret_val == NULL) { + ASP_LOGD("value is NULL"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; + } + + *value = ret_val; + *length = strlen(ret_val); + + ASP_LOGD("asp_advert_get_info() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_remove_info(asp_advert_service_h adv_service, const char *key) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + /* TODO: remove advertised info */ + g_hash_table_remove(service->service_info_map, key); + + ASP_LOGD("asp_advert_remove_info() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_set_status(asp_advert_service_h adv_service, + unsigned char status) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + service->status = status; + + ASP_LOGD("asp_advert_set_status() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_set_discovery_tech(asp_advert_service_h adv_service, int discovery_tech) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + if (!adv_service) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + return service->setDiscoveryTech(discovery_tech); +} + +int asp_advert_set_preferred_connection(asp_advert_service_h adv_service, + unsigned char preferred_connection) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + if (!adv_service) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + service->preferred_connection = preferred_connection; + + ASP_LOGD("asp_advert_set_preferred_connection() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_set_p2p_role_scheme(asp_advert_service_h adv_service, + asp_advert_p2p_role_scheme_e role) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + if (!adv_service) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + service->role = role; + + ASP_LOGD("asp_advert_set_p2p_role_scheme() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_get_p2p_role_scheme(asp_advert_service_h adv_service, + asp_advert_p2p_role_scheme_e *role) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + if (!adv_service || !role) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + *role = (asp_advert_p2p_role_scheme_e)service->role; + + ASP_LOGD("asp_advert_get_p2p_role_scheme() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + + +int asp_advert_set_p2p_config_method(asp_advert_service_h adv_service, + asp_wps_type_e config_method) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + if (!adv_service) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + if (config_method > ASP_WPS_TYPE_PIN_KEYPAD) { + ASP_LOGE("config_method is larger than expected"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + service->config_method = config_method; + + ASP_LOGD("asp_advert_set_p2p_config_method() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_get_p2p_config_method(asp_advert_service_h adv_service, + asp_wps_type_e *config_method) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(config_method, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + *config_method = (asp_wps_type_e)service->config_method; + + ASP_LOGD("asp_advert_get_p2p_config_method() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_advert_set_p2p_response(asp_advert_service_h adv_service, + char *rsp_info, int length) +{ + __ASP_LOG_FUNC_START__; + + char *info = NULL; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + /* TODO fit the rsp info for length */ + if (length <= 0 || length > DEFERRED_LEN) { + ASP_LOGE("invalid length!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + if (!adv_service || !rsp_info) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + info = g_strdup(rsp_info); + if (!info) { + ASP_LOGE("malloc() failed!!!."); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } + g_free(service->rsp_info); + service->rsp_info = info; + + ASP_LOGD("asp_advert_set_p2p_response() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + + +static GVariant* __g_hash_keys_to_g_variant(GHashTable *hash) +{ + GVariantBuilder builder; + + __ASP_LOG_FUNC_START__; + g_variant_builder_init(&builder, G_VARIANT_TYPE("as")); +/* g_variant_builder_open(&builder, G_VARIANT_TYPE("a{sv}")); */ + + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init(&iter, hash); + while (g_hash_table_iter_next(&iter, &key, &value)) { + + ASP_LOGE("key [%s]", (char*)key); + g_variant_builder_add(&builder, "s", key); + } + +/* g_variant_builder_close(&builder); */ + __ASP_LOG_FUNC_END__; + return g_variant_builder_end(&builder); +} + +static GVariant* __g_hash_table_to_g_variant(GHashTable *hash) +{ + GVariantBuilder builder; + + __ASP_LOG_FUNC_START__; + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); + + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init(&iter, hash); + while (g_hash_table_iter_next(&iter, &key, &value)) + g_variant_builder_add(&builder, "{sv}", key, g_variant_new_string((const gchar *)value)); + + __ASP_LOG_FUNC_END__; + return g_variant_builder_end(&builder); +} + +int asp_advert_start_advertising(asp_advert_service_h adv_service) +{ + __ASP_LOG_FUNC_START__; + + GVariantBuilder *builder = NULL; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + // LCOV_EXCL_START + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->adv_id)); + g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); + g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); + g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new("i", service->auto_accept)); + g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status)); + g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->role)); + g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method)); + + if (service->instance_name) /* This can be NULL if this is ASP 1.0 service */ + g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name)); + if (service->service_type) /* This can be NULL if Instance name is UUID */ + g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); + if (g_hash_table_size(service->service_info_map) > 0) + g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_table_to_g_variant(service->service_info_map)); + if (service->rsp_info) + g_variant_builder_add(builder, "{sv}", "rsp_info", g_variant_new("s", service->rsp_info)); + params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + ASP_LOGI("service type (%s) adv ID (%u)", service->service_type, service->adv_id); + + reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, + "AdvertiseService", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_advert_stop_advertising(asp_advert_service_h adv_service) +{ + __ASP_LOG_FUNC_START__; + + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + // LCOV_EXCL_START + params = g_variant_new("(ui)", service->adv_id, service->discovery_tech); + reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, + "CancelAdvertiseService", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_advert_change_service_status(asp_advert_service_h adv_service, + unsigned char status) +{ + __ASP_LOG_FUNC_START__; + + GVariantBuilder *builder = NULL; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(adv_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", adv_service); + + AspAdvert *service = getAdvert((void *)adv_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + // LCOV_EXCL_START + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->adv_id)); + g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new("i", service->auto_accept)); + service->status = status; + g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status)); + g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->role)); + g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method)); + + if (service->instance_name) /* This can be NULL if this is ASP 1.0 service */ + g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name)); + if (service->service_type) /* This can be NULL if Instance name is UUID */ + g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); + if (g_hash_table_size(service->service_info_map) > 0) + g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_keys_to_g_variant(service->service_info_map)); + if (service->rsp_info) + g_variant_builder_add(builder, "{sv}", "rsp_info", g_variant_new("s", service->rsp_info)); + + params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + ASP_LOGI("service type (%s) adv ID (%u)", service->service_type, service->adv_id); + + reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, + "ServiceChangeStatus", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_seek_create(char *service_type, asp_seek_service_h *seek_service) +{ + __ASP_LOG_FUNC_START__; + + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + if (!service_type || strlen(service_type) == 0 || !AspUtil::isValidServiceType(service_type)) { + ASP_LOGE("NULL Param [service_type]!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + ASP_LOGD("service_type = [%s]", service_type); + + if (!seek_service) { + ASP_LOGE("NULL Param [handle]!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + AspSeek *service = new AspSeek; + ASP_LOGD("service [%p]", service); + + service->service_type = g_strdup(service_type); + if (!service->service_type) { + ASP_LOGE("malloc() failed!!!."); + g_free(service); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OUT_OF_MEMORY; + } + + addSeekToServiceList(service); + + *seek_service = (asp_seek_service_h)service; + ASP_LOGD("asp_create_seek_handle() SUCCESS"); + ASP_LOGD("seek handler [%p]", *seek_service); + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_seek_destroy(asp_seek_service_h seek_service) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", seek_service); + + AspSeek *service = getSeek((void *)seek_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + if (removeSeek(service) == false) { + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } + + ASP_LOGD("asp_seek_destroy() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_seek_add_info(asp_seek_service_h seek_service, const char *key) +{ + __ASP_LOG_FUNC_START__; + + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); + + if (strlen(key) == 0) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + ASP_LOGD("service [%p]", seek_service); + + AspSeek *service = getSeek((void *)seek_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + g_hash_table_replace(service->service_info_map, g_strdup(key), NULL); + + ASP_LOGD("service info [%d]", g_hash_table_size(service->service_info_map)); + ASP_LOGD("asp_add_seek_info() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; + +} + +int asp_seek_remove_info(asp_seek_service_h seek_service, const char *key) +{ + __ASP_LOG_FUNC_START__; + + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(key, __ASP_LOG_FUNC_END__); + + if (strlen(key) == 0) { + ASP_LOGE("NULL handler!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + ASP_LOGD("service [%p]", seek_service); + + AspSeek *service = getSeek((void *)seek_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + /* TODO: remove seek info */ + g_hash_table_remove(service->service_info_map, key); + + ASP_LOGD("asp_remove_seek_info() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; + +} + +int asp_seek_set_discovery_tech(asp_seek_service_h seek_service, int discovery_tech) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); + + if (!((discovery_tech & ASP_DISCOVERY_TECH_P2P) | + (discovery_tech & ASP_DISCOVERY_TECH_NFC) | + (discovery_tech & ASP_DISCOVERY_TECH_BLE) | + (discovery_tech & ASP_DISCOVERY_TECH_INFRA) | + (discovery_tech & ASP_DISCOVERY_TECH_NAN))) { + ASP_LOGE("invalid parameter!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + ASP_LOGD("service [%p]", seek_service); + + AspSeek *service = getSeek((void *)seek_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + service->discovery_tech = discovery_tech; + + ASP_LOGD("asp_set_seeking_tech() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + +int asp_seek_set_preferred_connection(asp_seek_service_h seek_service, + unsigned char preferred_connection) +{ + __ASP_LOG_FUNC_START__; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", seek_service); + + AspSeek *service = getSeek((void *)seek_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + service->preferred_connection = preferred_connection; + + ASP_LOGD("asp_set_seeking_preferred_connection() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + + +int asp_seek_start(asp_seek_service_h seek_service) +{ + __ASP_LOG_FUNC_START__; + + GVariantBuilder *builder = NULL; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", seek_service); + + AspSeek *service = getSeek((void *)seek_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SERVICE_NOT_FOUND; + } + + // LCOV_EXCL_START + ASP_LOGD("service info [%d]", g_hash_table_size(service->service_info_map)); + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); + g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); + g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); + if (g_hash_table_size(service->service_info_map) > 0) { + ASP_LOGE("Service info"); + g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_keys_to_g_variant(service->service_info_map)); + } + + params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + ASP_LOGI("service name (%s)", service->service_name); + + reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, + "SeekService", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(it)", &ret, &(service->search_id)); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_seek_stop(asp_seek_service_h seek_service) +{ + __ASP_LOG_FUNC_START__; + + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(seek_service, __ASP_LOG_FUNC_END__); + + AspSeek *service = getSeek((void *)seek_service); + if (service == NULL) { + ASP_LOGE("Service NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } + ASP_LOGD("service_type = [%s]", service->service_type); + + // LCOV_EXCL_START + params = g_variant_new("(ti)", service->search_id, service->discovery_tech); + reply = asp_dbus_method_call_sync(ASP_DAEMON_SERVICE_INTERFACE, + "CancelSeekService", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_session_create(char *service_mac, unsigned int adv_id, asp_session_h* session) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + + if (!service_mac || strlen(service_mac) != (MACSTR_LEN -1)) { + ASP_LOGE("Invalid Param [service_mac]!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + if (adv_id == 0 || !session) { + ASP_LOGE("NULL Param [session]!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + service = (asp_client_session_s *)g_try_malloc0(sizeof(asp_client_session_s)); + if (!service) { + ASP_LOGE("malloc() failed!!!."); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OUT_OF_MEMORY; + } + ASP_LOGD("service [%p]", service); + + service->advertisement_id = adv_id; + g_strlcpy(service->service_mac, service_mac, MACSTR_LEN); + + asp_sessions = g_list_prepend(asp_sessions, service); + + /* Session ID will be generated by asp-manager */ + *session = (asp_session_h)service; + ASP_LOGD("asp_session_create() SUCCESS"); + + ASP_LOGD("service [%p]", *session); + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_destroy(asp_session_h session) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", session); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + res = __remove_session((void *)service); + if (res != ASP_ERROR_NONE) { + __ASP_LOG_FUNC_END__; + return res; + } + + ASP_LOGD("asp_session_destroy() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return ASP_ERROR_NONE; +} + + +int asp_session_get_mac(asp_session_h session, char **session_mac) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session_mac, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", session); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + *session_mac = service->session_mac; + + ASP_LOGD("asp_session_get_mac() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + + +int asp_session_get_id(asp_session_h session, unsigned int *session_id) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session_id, __ASP_LOG_FUNC_END__); + + ASP_LOGD("service [%p]", session); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + *session_id = service->session_id; + + ASP_LOGD("asp_session_get_id() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_set_info(asp_session_h session, char *service_info) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + char *info = NULL; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(service_info, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + if (strlen(service_info) > SESSION_INFO_LEN) { + ASP_LOGE("NULL Param!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + info = g_strdup(service_info); + if (!info) { + ASP_LOGE("malloc() failed!!!."); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } + g_free(service->session_information); + service->session_information = info; + + ASP_LOGD("asp_session_set_info() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_get_info(asp_session_h session, char **service_info) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(service_info, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + if (service->session_information) + *service_info = service->session_information; + + ASP_LOGD("asp_session_get_info() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_set_p2p_role_scheme(asp_session_h session, + asp_advert_p2p_role_scheme_e role) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(role, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + service->network_role = role; + + ASP_LOGD("asp_session_set_p2p_role_scheme() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_get_p2p_role_scheme(asp_session_h session, + asp_advert_p2p_role_scheme_e *role) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(role, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + *role = (asp_advert_p2p_role_scheme_e)service->network_role; + + ASP_LOGD("asp_session_get_p2p_role_scheme() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_set_p2p_config_method(asp_session_h session, + asp_wps_type_e config_method) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + if (config_method < ASP_WPS_TYPE_DEFAULT || + config_method > ASP_WPS_TYPE_PIN_KEYPAD) { + ASP_LOGE("network_config is invalid"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_INVALID_PARAMETER; + } + + service->network_config = config_method; + + ASP_LOGD("asp_session_set_p2p_config_method() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_get_p2p_config_method(asp_session_h session, + asp_wps_type_e *config_method) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(config_method, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + *config_method = (asp_wps_type_e)service->network_config; + + ASP_LOGD("asp_session_get_p2p_config_method() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} + +int asp_session_get_close_status(asp_session_h session, int *status) +{ + __ASP_LOG_FUNC_START__; + asp_client_session_s *service = NULL; + int res = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(status, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + *status = service->state; + + ASP_LOGD("asp_session_get_close_status() SUCCESS"); + + __ASP_LOG_FUNC_END__; + return res; +} +int asp_session_connect(asp_session_h session) +{ + __ASP_LOG_FUNC_START__; + GVariantBuilder *builder = NULL; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + asp_client_session_s *service = NULL; + const char *str = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + // LCOV_EXCL_START + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", service->service_mac)); + g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->advertisement_id)); + g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->network_config)); + g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->network_config)); + if (service->session_information) + g_variant_builder_add(builder, "{sv}", "session_info", g_variant_new("s", service->session_information)); + + params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + + reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, + "ConnectSession", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(iu&s)", &ret, &(service->session_id), &str); + if (str != NULL) + g_strlcpy(service->session_mac, str, MACSTR_LEN); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_session_confirm(asp_session_h session, bool confirmed, char *pin) +{ + __ASP_LOG_FUNC_START__; + GVariantBuilder *builder = NULL; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + asp_client_session_s *service = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + // LCOV_EXCL_START + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", service->session_mac)); + g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", service->session_id)); + g_variant_builder_add(builder, "{sv}", "confirmed", g_variant_new("i", confirmed)); + if (pin) + g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin)); + params = g_variant_new("(a{sv})", builder); + reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, + "ConfirmSession", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_session_get_handle(char *session_mac, unsigned int session_id, + asp_session_h *session) + +{ + __ASP_LOG_FUNC_START__; + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session_mac, __ASP_LOG_FUNC_END__); + + // LCOV_EXCL_START + int ret = ASP_ERROR_NONE; + GError *error = NULL; + GVariant *params = g_variant_new("(su)", session_mac, session_id); + GVariant *reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, + "GetSession", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + if (!reply) { + ASP_LOGE("reply is NULL!!"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_OPERATION_FAILED; + } + + asp_client_session_s *service = (asp_client_session_s *)g_try_malloc0(sizeof(asp_client_session_s)); + if (!service) { + ASP_LOGE("malloc() failed!!!."); + g_variant_unref(reply); + return ASP_ERROR_OUT_OF_MEMORY; + } + ASP_LOGD("service [%p]", service); + g_strlcpy(service->session_mac, session_mac, MACSTR_LEN); + service->session_id = session_id; + + GVariantIter *iter = NULL; + g_variant_get(reply, "(ia{sv})", &ret, &iter); + asp_variant_s *variant = __get_asp_variant_from_iterator(iter); + g_variant_unref(reply); + if (variant == NULL) { + ASP_LOGE("Out of memory"); + return ASP_ERROR_OUT_OF_MEMORY; + } + + service->advertisement_id = variant->adv_id; + __clear_asp_variant(variant); + + *session = service; + asp_sessions = g_list_prepend(asp_sessions, service); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_session_set_state_ready(asp_session_h session) + +{ + __ASP_LOG_FUNC_START__; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + asp_client_session_s *service = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + return ASP_ERROR_SESSION_NOT_FOUND; + } + + params = g_variant_new("(su)", service->session_mac, service->session_id); + reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, + "SetSessionReady", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; +} + +int asp_session_close(asp_session_h session) + +{ + __ASP_LOG_FUNC_START__; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + asp_client_session_s *service = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + return ASP_ERROR_SESSION_NOT_FOUND; + } + + params = g_variant_new("(su)", service->session_mac, service->session_id); + reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, + "CloseSession", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; +} + +int asp_session_bind_port(asp_session_h session, char *ip_address, + int port, int proto) +{ + __ASP_LOG_FUNC_START__; + GVariantBuilder *builder = NULL; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + asp_client_session_s *service = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(ip_address, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + // LCOV_EXCL_START + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", service->session_mac)); + g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", service->session_id)); + g_variant_builder_add(builder, "{sv}", "ip_address", g_variant_new("s", ip_address)); + g_variant_builder_add(builder, "{sv}", "port", g_variant_new("i", port)); + g_variant_builder_add(builder, "{sv}", "proto", g_variant_new("i", proto)); + params = g_variant_new("(a{sv})", builder); + reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, + "BoundPort", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} + +int asp_session_release_port(asp_session_h session, char *ip_address, + int port, int proto) +{ + __ASP_LOG_FUNC_START__; + GVariantBuilder *builder = NULL; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + asp_client_session_s *service = NULL; + int ret = ASP_ERROR_NONE; + + CHECK_FEATURE_SUPPORTED(TIZEN_FEATURE_ASP); + RET_ERR_IF_NOT_INITIALIZED(__ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(session, __ASP_LOG_FUNC_END__); + RET_ERR_IF_PARAMETER_IS_NOT_VALID(ip_address, __ASP_LOG_FUNC_END__); + + service = __get_session((void *)session); + if (service == NULL) { + ASP_LOGE("Session NOT registered"); + __ASP_LOG_FUNC_END__; + return ASP_ERROR_SESSION_NOT_FOUND; + } + + // LCOV_EXCL_START + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", service->session_mac)); + g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", service->session_id)); + g_variant_builder_add(builder, "{sv}", "ip_address", g_variant_new("s", ip_address)); + g_variant_builder_add(builder, "{sv}", "port", g_variant_new("i", port)); + g_variant_builder_add(builder, "{sv}", "proto", g_variant_new("i", proto)); + params = g_variant_new("(a{sv})", builder); + reply = asp_dbus_method_call_sync(ASP_DAEMON_SESSION_INTERFACE, + "ReleasePort", params, &error); + if (error != NULL) { + ASP_LOGE("asp_dbus_method_call_sync() failed." + "error [%d: %s]", error->code, error->message); + ret = __asp_err_string_to_enum(error->message); + g_error_free(error); + __ASP_LOG_FUNC_END__; + return ret; + } + + g_variant_get(reply, "(i)", &ret); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, ret); + + __ASP_LOG_FUNC_END__; + return ret; + // LCOV_EXCL_STOP +} diff --git a/src/asp-dbus.c b/src/asp-dbus.c deleted file mode 100644 index 680c03b..0000000 --- a/src/asp-dbus.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Application Service Platform(ASP) - * - * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. - * - * 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. - * - */ - -/** - * This file implements asp dbus utility functions. - * - * @file asp-dbus.c - * @author Jiung Yu (jiung.yu@samsung.com) - * @version 0.1 - */ - -#include "asp.h" - -#include "asp-dbus.h" -#include "asp-log.h" -#include "asp-util.h" -#include "asp-client.h" - -const char *service_path = ASP_DAEMON_SERVICE_PATH; -const char *session_path = ASP_DAEMON_SESSION_PATH; - -typedef struct { - GDBusConnection *connection; - guint signal_subscribe_id; -} gdbus_connection_data; - -static gdbus_connection_data gdbus_conn = {NULL, 0}; - -static struct { - const char *interface; - const char *member; - void (*function) (GDBusConnection *connection, - const gchar *object_path, - GVariant *parameters); -} asp_dbus_signal_map[] = { - { - ASP_DAEMON_SERVICE_INTERFACE, - "SearchResult", - asp_process_seek_search_result - }, - { - ASP_DAEMON_SERVICE_INTERFACE, - "AdvertiseStatusChanged", - asp_process_advert_status_changed - }, - { - ASP_DAEMON_SESSION_INTERFACE, - "SessionRequest", - asp_process_session_request - }, - { - ASP_DAEMON_SESSION_INTERFACE, - "SessionConfigRequest", - asp_process_session_config_request - }, - { - ASP_DAEMON_SESSION_INTERFACE, - "ConnectStatus", - asp_process_session_connect_status - }, - { - ASP_DAEMON_SESSION_INTERFACE, - "SessionStatus", - asp_process_session_status - }, - { - ASP_DAEMON_SESSION_INTERFACE, - "PortStatus", - asp_process_session_port_status - }, - { - NULL, - NULL, - NULL - } -}; -//LCOV_EXCL_START -static void _asp_dbus_signal_cb(GDBusConnection *connection, - const gchar *sender, const gchar *object_path, - const gchar *interface, const gchar *signal, - GVariant *parameters, gpointer user_data) -{ - int i = 0; - - ASP_LOGD("Signal Name [%s]", signal); - DBUS_DEBUG_VARIANT(parameters); - - for (i = 0; asp_dbus_signal_map[i].member != NULL; i++) { - if (!g_strcmp0(signal, asp_dbus_signal_map[i].member) && - !g_strcmp0(interface, asp_dbus_signal_map[i].interface) && - asp_dbus_signal_map[i].function != NULL) { - asp_dbus_signal_map[i].function(connection, object_path, parameters); - break; - } - } -} - -GVariant *asp_dbus_method_call_sync_debug(const char* interface_name, - const char* method, - GVariant *params, - GError **error, - const char *calling_func) -{ - GVariant *reply = NULL; - const char *object_path = NULL; - - if (gdbus_conn.connection == NULL) { - ASP_LOGE("GDBusconnection is NULL"); - return reply; - } - - ASP_LOGD("[%s][%s.%s]", calling_func, interface_name, method); - DBUS_DEBUG_VARIANT(params); - - if (g_strcmp0(ASP_DAEMON_SERVICE_INTERFACE, interface_name) == 0) - object_path = service_path; - else - object_path = session_path; - - reply = g_dbus_connection_call_sync(gdbus_conn.connection, - ASP_DAEMON_SERVICE, /* bus name */ - object_path, /* object path */ - interface_name, /* interface name */ - method, /* method name */ - params, /* GVariant *params */ - NULL, /* reply_type */ - G_DBUS_CALL_FLAGS_NONE, /* flags */ - ASP_DBUS_REPLY_TIMEOUT_SYNC, /* timeout */ - NULL, /* cancellable */ - error); /* error */ - DBUS_DEBUG_VARIANT(reply); - return reply; -} -//LCOV_EXCL_STOP -gboolean asp_dbus_init(void) -{ - GError *Error = NULL; - GDBusConnection *connection = NULL; - - connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &Error); - if (connection == NULL) { - ASP_LOGE("Failed to get connection, Error[%s]", Error->message); - g_error_free(Error); - return FALSE; - } - - gdbus_conn.connection = connection; - - /* subscribe signal handler */ - gdbus_conn.signal_subscribe_id = g_dbus_connection_signal_subscribe(connection, - - ASP_DAEMON_SERVICE, /* bus name */ - NULL, /* interface */ - NULL, /* member */ - NULL, /* object_path */ - NULL, /* arg0 */ - G_DBUS_SIGNAL_FLAGS_NONE, - _asp_dbus_signal_cb, - NULL, - NULL); - ASP_LOGD("Subscribed dbus signals [%d]", gdbus_conn.signal_subscribe_id); - return TRUE; -} - -void asp_dbus_deinit(void) -{ - if (gdbus_conn.connection == NULL) - return; - - /* unsubscribe signal handler */ - g_dbus_connection_signal_unsubscribe(gdbus_conn.connection, gdbus_conn.signal_subscribe_id); - gdbus_conn.signal_subscribe_id = 0; - - /* unref gdbus connection */ - g_object_unref(gdbus_conn.connection); - gdbus_conn.connection = NULL; -} diff --git a/src/asp-dbus.cpp b/src/asp-dbus.cpp new file mode 100644 index 0000000..f169cc2 --- /dev/null +++ b/src/asp-dbus.cpp @@ -0,0 +1,193 @@ +/* + * Application Service Platform(ASP) + * + * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * 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. + * + */ + +/** + * This file implements asp dbus utility functions. + * + * @file asp-dbus.c + * @author Jiung Yu (jiung.yu@samsung.com) + * @version 0.1 + */ + +#include "asp.h" + +#include "asp-dbus.h" +#include "asp-log.h" +#include "asp-defs.h" +#include "asp-client.h" + +const char *service_path = ASP_DAEMON_SERVICE_PATH; +const char *session_path = ASP_DAEMON_SESSION_PATH; + +typedef struct { + GDBusConnection *connection; + guint signal_subscribe_id; +} gdbus_connection_data; + +static gdbus_connection_data gdbus_conn = {NULL, 0}; + +static struct { + const char *interface; + const char *member; + void (*function) (GDBusConnection *connection, + const gchar *object_path, + GVariant *parameters); +} asp_dbus_signal_map[] = { + { + ASP_DAEMON_SERVICE_INTERFACE, + "SearchResult", + asp_process_seek_search_result + }, + { + ASP_DAEMON_SERVICE_INTERFACE, + "AdvertiseStatusChanged", + asp_process_advert_status_changed + }, + { + ASP_DAEMON_SESSION_INTERFACE, + "SessionRequest", + asp_process_session_request + }, + { + ASP_DAEMON_SESSION_INTERFACE, + "SessionConfigRequest", + asp_process_session_config_request + }, + { + ASP_DAEMON_SESSION_INTERFACE, + "ConnectStatus", + asp_process_session_connect_status + }, + { + ASP_DAEMON_SESSION_INTERFACE, + "SessionStatus", + asp_process_session_status + }, + { + ASP_DAEMON_SESSION_INTERFACE, + "PortStatus", + asp_process_session_port_status + }, + { + NULL, + NULL, + NULL + } +}; +//LCOV_EXCL_START +static void _asp_dbus_signal_cb(GDBusConnection *connection, + const gchar *sender, const gchar *object_path, + const gchar *interface, const gchar *signal, + GVariant *parameters, gpointer user_data) +{ + int i = 0; + + ASP_LOGD("Signal Name [%s]", signal); + DBUS_DEBUG_VARIANT(parameters); + + for (i = 0; asp_dbus_signal_map[i].member != NULL; i++) { + if (!g_strcmp0(signal, asp_dbus_signal_map[i].member) && + !g_strcmp0(interface, asp_dbus_signal_map[i].interface) && + asp_dbus_signal_map[i].function != NULL) { + asp_dbus_signal_map[i].function(connection, object_path, parameters); + break; + } + } +} + +GVariant *asp_dbus_method_call_sync_debug(const char* interface_name, + const char* method, + GVariant *params, + GError **error, + const char *calling_func) +{ + GVariant *reply = NULL; + const char *object_path = NULL; + + if (gdbus_conn.connection == NULL) { + ASP_LOGE("GDBusconnection is NULL"); + return reply; + } + + ASP_LOGD("[%s][%s.%s]", calling_func, interface_name, method); + DBUS_DEBUG_VARIANT(params); + + if (g_strcmp0(ASP_DAEMON_SERVICE_INTERFACE, interface_name) == 0) + object_path = service_path; + else + object_path = session_path; + + reply = g_dbus_connection_call_sync(gdbus_conn.connection, + ASP_DAEMON_SERVICE, /* bus name */ + object_path, /* object path */ + interface_name, /* interface name */ + method, /* method name */ + params, /* GVariant *params */ + NULL, /* reply_type */ + G_DBUS_CALL_FLAGS_NONE, /* flags */ + ASP_DBUS_REPLY_TIMEOUT_SYNC, /* timeout */ + NULL, /* cancellable */ + error); /* error */ + DBUS_DEBUG_VARIANT(reply); + return reply; +} +//LCOV_EXCL_STOP +gboolean asp_dbus_init(void) +{ + GError *Error = NULL; + GDBusConnection *connection = NULL; + + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &Error); + if (connection == NULL) { + ASP_LOGE("Failed to get connection, Error[%s]", Error->message); + g_error_free(Error); + return FALSE; + } + + gdbus_conn.connection = connection; + + /* subscribe signal handler */ + gdbus_conn.signal_subscribe_id = g_dbus_connection_signal_subscribe(connection, + + ASP_DAEMON_SERVICE, /* bus name */ + NULL, /* interface */ + NULL, /* member */ + NULL, /* object_path */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + _asp_dbus_signal_cb, + NULL, + NULL); + ASP_LOGD("Subscribed dbus signals [%d]", gdbus_conn.signal_subscribe_id); + return TRUE; +} + +void asp_dbus_deinit(void) +{ + if (gdbus_conn.connection == NULL) + return; + + /* unsubscribe signal handler */ + g_dbus_connection_signal_unsubscribe(gdbus_conn.connection, gdbus_conn.signal_subscribe_id); + gdbus_conn.signal_subscribe_id = 0; + + /* unref gdbus connection */ + g_object_unref(gdbus_conn.connection); + gdbus_conn.connection = NULL; +} diff --git a/src/asp-seek.cpp b/src/asp-seek.cpp new file mode 100644 index 0000000..a035ad4 --- /dev/null +++ b/src/asp-seek.cpp @@ -0,0 +1,89 @@ +#include "asp-seek.h" +#include "asp-log.h" + +static __thread GList *asp_seeks = NULL; + +AspSeek::AspSeek() +{ + service_name = NULL; + service_type = NULL; + rsp_info = NULL; + service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); +} + +AspSeek::~AspSeek() +{ + g_free(service_name); + g_free(service_type); + g_free(rsp_info); + g_hash_table_remove_all(service_info_map); + g_hash_table_destroy(service_info_map); +} + +AspSeek *getSeek(void *handle) +{ + __ASP_LOG_FUNC_START__; + AspSeek *service = NULL; + GList *temp = NULL; + + if (asp_seeks == NULL) { + __ASP_LOG_FUNC_END__; + return NULL; + } + + ASP_LOGD("service [%p]", handle); + + temp = g_list_first(asp_seeks); + for (temp = g_list_first(asp_seeks); temp != NULL; temp = g_list_next(temp)) { + service = (AspSeek *)temp->data; + + ASP_LOGD("temp [%p]", service); + if (service != NULL && service == handle) + break; + service = NULL; + } + __ASP_LOG_FUNC_END__; + return service; +} + +AspSeek *getSeekById(long long unsigned id) +{ + AspSeek *seek = NULL; + GList *temp = NULL; + + for (temp = g_list_first(asp_seeks); + temp != NULL; temp = g_list_next(temp)) { + seek = (AspSeek *)temp->data; + if (seek != NULL && seek->search_id == id) + break; + seek = NULL; + } + + return seek; + +} + +bool removeSeek(void *handle) +{ + AspSeek *service = getSeek(handle); + + if (service == NULL) { + __ASP_LOG_FUNC_END__; + return false; + } + + removeSeekFromServiceList(service); + delete service; + + return true; +} + +void addSeekToServiceList(AspSeek *service) +{ + asp_seeks = g_list_prepend(asp_seeks, service); +} + +void removeSeekFromServiceList(AspSeek *service) +{ + asp_seeks = g_list_remove(asp_seeks, service); +} \ No newline at end of file diff --git a/src/asp-utils.cpp b/src/asp-utils.cpp new file mode 100644 index 0000000..f10f222 --- /dev/null +++ b/src/asp-utils.cpp @@ -0,0 +1,76 @@ +#include "asp-conts.h" +#include "asp-utils.h" +#include + +bool AspUtil::isValidServiceType(const std::string &type) +{ + const char *service_type = type.c_str(); + int srv_name_len = type.size() - PROTO_LEN - 1; + int pos; + + if (srv_name_len < 2) + return isValidServiceTypeForWfds(type); + + const char *proto = &(service_type[srv_name_len + 1]); + if (strncmp(proto, "_udp", PROTO_LEN) != 0 && strncmp(proto, "_tcp", PROTO_LEN) != 0) + return isValidServiceTypeForWfds(type); + + /* Service Type = <_>service_name.<_> + * Service Name description: + * Shall be at least 1 character and no more than 15 characters long + * Shall contain only US-ASCII [ANSI.X3.4-1986] letters 'A' - 'Z' and + * 'a' - 'z', digits '0' - '9', and hyphens ('-', ASCII 0x2D or decimal 45) + * Shall contain at least one letter ('A' - 'Z' or 'a' - ‘z') + * Shall NOT begin or end with a hyphen + */ + + if (srv_name_len > MAX_SERVICE_NAME_LEN + 1) + return false; + + if (service_type[0] != '_' || service_type[1] == '-' || + service_type[srv_name_len] != '.') + return false; + + pos = 1; + while (pos < srv_name_len) { + if (!g_ascii_isalpha(service_type[pos]) && + !g_ascii_isdigit(service_type[pos]) && + service_type[pos] != '-') + return false; + pos++; + } + + return true; +} + +bool AspUtil::isValidServiceTypeForWfds(const std::string &type) +{ + /* Wi-Fi Peer-to-Peer Services Technical Specification v1.1 + * The UTF-8 encoded service name (and therefore the contents + * of each service_name parameter) shall be 255 bytes or less + */ + if (type.size() > MAX_SERVICE_TYPE_LEN) + return false; + + for (auto c : type) { + if (!g_ascii_isalpha(c) && + !g_ascii_isdigit(c) && + c != '.' && + c != '-') + return false; + } + return true; +} + +bool AspUtil::isValidKey(const std::string &key) +{ + if (key.size() > KEY_LEN) + return false; + + for (auto c : key) { + if (c < KEY_MIN || c > KEY_MAX) + return false; + } + + return true; +} diff --git a/src/include/asp-advert.h b/src/include/asp-advert.h new file mode 100644 index 0000000..cc726c9 --- /dev/null +++ b/src/include/asp-advert.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +class AspAdvert { +public: + AspAdvert(); + ~AspAdvert(); + + int setServiceType(const std::string &type); + int addInfo(const std::string &key, const std::string &value); + int setDiscoveryTech(int tech); + + unsigned int adv_id; + long long unsigned search_id; + int auto_accept; + int discovery_tech; + unsigned char preferred_connection; + + unsigned char status; + unsigned char role; + unsigned int config_method; + unsigned char tran_id; + + char *instance_name; + char *serivce_name; + char *service_type; + GHashTable *service_info_map; + char *rsp_info; +}; + +AspAdvert *getAdvert(void *handle); +AspAdvert *getAdvertById(unsigned int id); +bool removeAdvert(void *hahndle); +void addAdvertToServiceList(AspAdvert *service); +void removeAdvertFromServiceList(AspAdvert *service); \ No newline at end of file diff --git a/src/include/asp-client.h b/src/include/asp-client.h index 2abeb43..7e398a4 100755 --- a/src/include/asp-client.h +++ b/src/include/asp-client.h @@ -34,49 +34,6 @@ #define MACSTR_LEN 18 #define ASP_SERVICE_INFO_MAX_LEN 200 -/** - * Application Service Platform(ASP) advertise data structure - */ -typedef struct { - unsigned int adv_id; - long long unsigned search_id; - int auto_accept; - int discovery_tech; - unsigned char preferred_connection; - - unsigned char status; - unsigned char role; - unsigned int config_method; - unsigned char tran_id; - - char *instance_name; - char *serivce_name; - char *service_type; - GHashTable *service_info_map; - char *rsp_info; -} asp_client_advert_s; - -/** - * Application Service Platform(ASP) seek data structure - */ -typedef struct { - unsigned int adv_id; - long long unsigned search_id; - int auto_accept; - int discovery_tech; - unsigned char preferred_connection; - - unsigned char status; - unsigned char role; - unsigned int config_method; - unsigned char tran_id; - - char *serivce_name; - char *service_type; - GHashTable *service_info_map; - char *rsp_info; -} asp_client_seek_s; - /** * Application Service Platform(ASP) session data structure */ diff --git a/src/include/asp-conts.h b/src/include/asp-conts.h new file mode 100644 index 0000000..d48f8d5 --- /dev/null +++ b/src/include/asp-conts.h @@ -0,0 +1,13 @@ +#pragma once + +#define INSTANCE_NAME_LEN 63 +#define MAX_SERVICE_NAME_LEN 15 +#define MAX_SERVICE_TYPE_LEN 255 +#define PROTO_LEN 4 +#define KEY_LEN 9 /* http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt */ +#define KEY_MIN 0x20 /* RFC 20 */ +#define KEY_MAX 0x7E + +#define SERVICE_INFO_LEN 65000 +#define DEFERRED_LEN 144 +#define SESSION_INFO_LEN 144 \ No newline at end of file diff --git a/src/include/asp-dbus.h b/src/include/asp-dbus.h index 013df35..4b8998f 100755 --- a/src/include/asp-dbus.h +++ b/src/include/asp-dbus.h @@ -28,10 +28,6 @@ #ifndef __ASP_DBUS_H__ #define __ASP_DBUS_H__ -#ifdef __cplusplus -extern "C" { -#endif - #include #define ASP_DAEMON_SERVICE "net.asp" @@ -71,8 +67,4 @@ GVariant *asp_dbus_method_call_sync_debug(const char* interface_name, int asp_dbus_unpack_ay(unsigned char *dst, GVariant *src, int size); -#ifdef __cplusplus -} -#endif - #endif /* __ASP_DBUS_H__ */ diff --git a/src/include/asp-defs.h b/src/include/asp-defs.h new file mode 100755 index 0000000..06cce3c --- /dev/null +++ b/src/include/asp-defs.h @@ -0,0 +1,80 @@ +/* + * Application Service Platform(ASP) + * + * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * 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. + * + */ + +/** + * This file declares macros for usefuls. + * + * @file asp-util.h + * @author Jiung Yu (jiung.yu.com) + * @version 0.1 + */ + +#ifndef __ASP_UTIL_H__ +#define __ASP_UTIL_H__ + +#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" +#define IP2STR(a) (a)[0], (a)[1], (a)[2], (a)[3] +#define IPSTR "%d.%d.%d.%d" +#define MAC2SECSTR(a) (a)[0], (a)[4], (a)[5] +#define MACSECSTR "%02x:%02x:%02x" +#define IP2SECSTR(a) (a)[0], (a)[3] +#define IPSECSTR "%d..%d" + +#define MACSTR_LEN 18 +#define MACADDR_LEN 6 +#define IP_LEN 6 +#define IPSTR_LEN 16 +#define WPS_PIN_LEN 8 + +#define TIZEN_FEATURE_ASP "tizen.org/feature/network.asp" + +#define CHECK_FEATURE_SUPPORTED(feature_name)\ + do {\ + bool feature_supported = FALSE;\ + if (!system_info_get_platform_bool(feature_name, &feature_supported)) {\ + if (feature_supported == FALSE) {\ + LOGE("%s feature is disabled", feature_name);\ + return ASP_ERROR_NOT_SUPPORTED;\ + } \ + } else {\ + LOGE("Error - Feature getting from System Info");\ + return ASP_ERROR_OPERATION_FAILED;\ + } \ + } while (0) + +#define RET_ERR_IF_PARAMETER_IS_NOT_VALID(arg, release)\ + do {\ + if (!(arg)) {\ + ASP_LOGE("Invalid parameter");\ + release;\ + return ASP_ERROR_INVALID_PARAMETER;\ + }\ + } while(0) + +#define RET_ERR_IF_NOT_INITIALIZED(release)\ + do {\ + if (!(g_client_info.is_registered)) {\ + ASP_LOGE("Client is not initialized.");\ + release;\ + return ASP_ERROR_NOT_INITIALIZED;\ + }\ + } while(0) + +#endif /** __ASP_UTIL_H__ */ diff --git a/src/include/asp-seek.h b/src/include/asp-seek.h new file mode 100644 index 0000000..e97caea --- /dev/null +++ b/src/include/asp-seek.h @@ -0,0 +1,31 @@ +#pragma once + +#include + +class AspSeek { +public: + AspSeek(); + ~AspSeek(); + unsigned int adv_id; + long long unsigned search_id; + int auto_accept; + int discovery_tech; + unsigned char preferred_connection; + + unsigned char status; + unsigned char role; + unsigned int config_method; + unsigned char tran_id; + + char *service_name; + char *service_type; + GHashTable *service_info_map; + char *rsp_info; +}; + +AspSeek *getSeek(void *handle); +AspSeek *getSeekById(long long unsigned id); + +bool removeSeek(void *handle); +void addSeekToServiceList(AspSeek *service); +void removeSeekFromServiceList(AspSeek *service); diff --git a/src/include/asp-util.h b/src/include/asp-util.h deleted file mode 100755 index 06cce3c..0000000 --- a/src/include/asp-util.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Application Service Platform(ASP) - * - * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved. - * - * 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. - * - */ - -/** - * This file declares macros for usefuls. - * - * @file asp-util.h - * @author Jiung Yu (jiung.yu.com) - * @version 0.1 - */ - -#ifndef __ASP_UTIL_H__ -#define __ASP_UTIL_H__ - -#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] -#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" -#define IP2STR(a) (a)[0], (a)[1], (a)[2], (a)[3] -#define IPSTR "%d.%d.%d.%d" -#define MAC2SECSTR(a) (a)[0], (a)[4], (a)[5] -#define MACSECSTR "%02x:%02x:%02x" -#define IP2SECSTR(a) (a)[0], (a)[3] -#define IPSECSTR "%d..%d" - -#define MACSTR_LEN 18 -#define MACADDR_LEN 6 -#define IP_LEN 6 -#define IPSTR_LEN 16 -#define WPS_PIN_LEN 8 - -#define TIZEN_FEATURE_ASP "tizen.org/feature/network.asp" - -#define CHECK_FEATURE_SUPPORTED(feature_name)\ - do {\ - bool feature_supported = FALSE;\ - if (!system_info_get_platform_bool(feature_name, &feature_supported)) {\ - if (feature_supported == FALSE) {\ - LOGE("%s feature is disabled", feature_name);\ - return ASP_ERROR_NOT_SUPPORTED;\ - } \ - } else {\ - LOGE("Error - Feature getting from System Info");\ - return ASP_ERROR_OPERATION_FAILED;\ - } \ - } while (0) - -#define RET_ERR_IF_PARAMETER_IS_NOT_VALID(arg, release)\ - do {\ - if (!(arg)) {\ - ASP_LOGE("Invalid parameter");\ - release;\ - return ASP_ERROR_INVALID_PARAMETER;\ - }\ - } while(0) - -#define RET_ERR_IF_NOT_INITIALIZED(release)\ - do {\ - if (!(g_client_info.is_registered)) {\ - ASP_LOGE("Client is not initialized.");\ - release;\ - return ASP_ERROR_NOT_INITIALIZED;\ - }\ - } while(0) - -#endif /** __ASP_UTIL_H__ */ diff --git a/src/include/asp-utils.h b/src/include/asp-utils.h new file mode 100644 index 0000000..00125e5 --- /dev/null +++ b/src/include/asp-utils.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +class AspUtil { +public: + static bool isValidServiceType(const std::string &type); + static bool isValidServiceTypeForWfds(const std::string &type); + static bool isValidKey(const std::string &key); +}; \ No newline at end of file diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 175903e..e394903 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -10,7 +10,15 @@ SET(ASP_GTEST "asp-gtest") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-lto") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-lto") -FILE(GLOB GTEST_SRCS *.cpp ${CMAKE_SOURCE_DIR}/src/*.c) +FILE(GLOB GTEST_SRCS *.cpp ${CMAKE_SOURCE_DIR}/src/*.cpp mock/*.cpp) ADD_EXECUTABLE(${ASP_GTEST} ${GTEST_SRCS}) TARGET_LINK_LIBRARIES(${ASP_GTEST} ${gtest_pkgs_LIBRARIES} ${${fw_name}_LIBRARIES}) + +SET_TARGET_PROPERTIES(${ASP_GTEST} PROPERTIES + COMPILE_FLAGS "-fPIE" + LINK_FLAGS "-Wl,\ +--wrap=asp_dbus_init,\ +--wrap=asp_dbus_deinit,\ +--wrap=system_info_get_platform_bool") + INSTALL(TARGETS ${ASP_GTEST} DESTINATION bin/) diff --git a/unittest/asp-gtest-advert.cpp b/unittest/asp-gtest-advert.cpp new file mode 100644 index 0000000..fa2c6f3 --- /dev/null +++ b/unittest/asp-gtest-advert.cpp @@ -0,0 +1,105 @@ +#include + +#include "asp.h" +#include "asp-advert.h" + +class AspAdvertTest: public ::testing::Test { +protected: + void SetUp() override + { + mAdvert = new AspAdvert; + } + + void TearDown() override + { + delete mAdvert; + } + + AspAdvert *mAdvert; +}; + +TEST_F(AspAdvertTest, getAdvertP) +{ + AspAdvert *advert = new AspAdvert; + addAdvertToServiceList(advert); + EXPECT_EQ(advert, getAdvert(advert)); + removeAdvertFromServiceList(advert); + delete advert; +} + +TEST_F(AspAdvertTest, getAdvertN) +{ + AspAdvert *advert = new AspAdvert; + EXPECT_EQ(NULL, getAdvert(advert)); + EXPECT_EQ(NULL, getAdvert(NULL)); + delete advert; +} + + +TEST_F(AspAdvertTest, addRemoveP1) +{ + AspAdvert *advert = new AspAdvert; + addAdvertToServiceList(advert); + EXPECT_EQ(true, removeAdvert(advert)); +} + +TEST_F(AspAdvertTest, addRemoveP2) +{ + AspAdvert *advert = new AspAdvert; + addAdvertToServiceList(advert); + removeAdvertFromServiceList(advert); + EXPECT_EQ(NULL, removeAdvert(advert)); + delete advert; +} + +TEST_F(AspAdvertTest, addRemoveP) +{ + AspAdvert *advert = new AspAdvert; + EXPECT_EQ(false, removeAdvert(advert)); + delete advert; +} + +TEST_F(AspAdvertTest, setServiceTypeP) +{ + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setServiceType("_http._tcp")); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setServiceType("_test._udp")); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setServiceType("abcde12345")); +} + +TEST_F(AspAdvertTest, setServiceTypeN) +{ + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, mAdvert->setServiceType("")); + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, mAdvert->setServiceType("__")); +} + +TEST_F(AspAdvertTest, addInfoP) +{ + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->addInfo("12345678", "VALUE")); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->addInfo("abcdefg", "VALUE")); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->addInfo("!@#$%^&*", "VALUE")); +} + +TEST_F(AspAdvertTest, addInfoN) +{ + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, mAdvert->addInfo("1234567890", "VALUE")); + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, mAdvert->addInfo("abcdefghij", "VALUE")); + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, mAdvert->addInfo("!@#$%^&*()", "VALUE")); +} + +TEST_F(AspAdvertTest, setDiscoveryTechP) +{ + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setDiscoveryTech(ASP_DISCOVERY_TECH_P2P)); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setDiscoveryTech(ASP_DISCOVERY_TECH_NFC)); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setDiscoveryTech(ASP_DISCOVERY_TECH_BLE)); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setDiscoveryTech(ASP_DISCOVERY_TECH_INFRA)); + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setDiscoveryTech(ASP_DISCOVERY_TECH_NAN)); + + int tech = ASP_DISCOVERY_TECH_P2P | ASP_DISCOVERY_TECH_NFC | ASP_DISCOVERY_TECH_BLE + | ASP_DISCOVERY_TECH_INFRA | ASP_DISCOVERY_TECH_NAN; + EXPECT_EQ(ASP_ERROR_NONE, mAdvert->setDiscoveryTech(tech)); +} + +TEST_F(AspAdvertTest, setDiscoveryTechN) +{ + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, mAdvert->setDiscoveryTech(0)); +} diff --git a/unittest/asp-gtest-client.cpp b/unittest/asp-gtest-client.cpp new file mode 100644 index 0000000..e632f6e --- /dev/null +++ b/unittest/asp-gtest-client.cpp @@ -0,0 +1,61 @@ +#include +#include + +#include "asp.h" + +extern "C" { +} + +class AspClientTest: public ::testing::Test { +protected: + void SetUp() override + { + asp_initialize(); + } + + void TearDown() override + { + asp_deinitialize(); + } + + char *INSTANCE_NAME = "INSTANCE"; + char *SERVICE_TYPE = "SERVICE"; +}; + +TEST_F(AspClientTest, asp_advert_createP) +{ + asp_advert_service_h service; + EXPECT_EQ(ASP_ERROR_NONE, asp_advert_create(INSTANCE_NAME, &service)); +} + +TEST_F(AspClientTest, asp_advert_destroyP) +{ + asp_advert_service_h service; + asp_advert_create(INSTANCE_NAME, &service); + EXPECT_EQ(ASP_ERROR_NONE, asp_advert_destroy(service)); +} + +TEST_F(AspClientTest, asp_advert_destroyN) +{ + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, asp_advert_destroy(NULL)); + EXPECT_EQ(ASP_ERROR_SERVICE_NOT_FOUND, asp_advert_destroy((asp_advert_service_h)0x01)); +} + +TEST_F(AspClientTest, asp_seek_createP) +{ + asp_seek_service_h service; + EXPECT_EQ(ASP_ERROR_NONE, asp_seek_create(SERVICE_TYPE, &service)); +} + +TEST_F(AspClientTest, asp_seek_destroyP) +{ + asp_seek_service_h service; + asp_seek_create(SERVICE_TYPE, &service); + EXPECT_EQ(ASP_ERROR_NONE, asp_seek_destroy(service)); +} + +TEST_F(AspClientTest, asp_seek_destroyN) +{ + EXPECT_EQ(ASP_ERROR_INVALID_PARAMETER, asp_seek_destroy(NULL)); + EXPECT_EQ(ASP_ERROR_SERVICE_NOT_FOUND, asp_seek_destroy((asp_seek_service_h)0x01)); +} \ No newline at end of file diff --git a/unittest/asp-gtest-seek.cpp b/unittest/asp-gtest-seek.cpp new file mode 100644 index 0000000..d4176d9 --- /dev/null +++ b/unittest/asp-gtest-seek.cpp @@ -0,0 +1,55 @@ +#include + +#include "asp-seek.h" + +class AspSeekTest: public ::testing::Test { +protected: + void SetUp() override + { + } + + void TearDown() override + { + } +}; + +TEST_F(AspSeekTest, getSeekP) +{ + AspSeek *seek = new AspSeek; + addSeekToServiceList(seek); + EXPECT_EQ(seek, getSeek(seek)); + removeSeekFromServiceList(seek); + delete seek; +} + +TEST_F(AspSeekTest, getSeekN) +{ + AspSeek *seek = new AspSeek; + EXPECT_EQ(NULL, getSeek(seek)); + EXPECT_EQ(NULL, getSeek(NULL)); + delete seek; +} + + +TEST_F(AspSeekTest, addRemoveP1) +{ + AspSeek *seek = new AspSeek; + addSeekToServiceList(seek); + EXPECT_EQ(true, removeSeek(seek)); +} + +TEST_F(AspSeekTest, addRemoveP2) +{ + AspSeek *seek = new AspSeek; + addSeekToServiceList(seek); + removeSeekFromServiceList(seek); + EXPECT_EQ(NULL, removeSeek(seek)); + delete seek; +} + +TEST_F(AspSeekTest, addRemoveP) +{ + AspSeek *seek = new AspSeek; + EXPECT_EQ(false, removeSeek(seek)); + delete seek; +} diff --git a/unittest/asp-gtest-util.cpp b/unittest/asp-gtest-util.cpp new file mode 100644 index 0000000..35d18c9 --- /dev/null +++ b/unittest/asp-gtest-util.cpp @@ -0,0 +1,56 @@ +#include + +#include "asp.h" +#include "asp-utils.h" + +class AspUtilTest: public ::testing::Test { +protected: + void SetUp() override + { + } + + void TearDown() override + { + } + +}; + +TEST_F(AspUtilTest, isValidServiceTypeP) +{ + EXPECT_EQ(true, AspUtil::isValidServiceType("_http._tcp")); + EXPECT_EQ(true, AspUtil::isValidServiceType("_test._udp")); + EXPECT_EQ(true, AspUtil::isValidServiceType("abcde12345")); +} + +TEST_F(AspUtilTest, isValidServiceTypeN) +{ + EXPECT_EQ(false, AspUtil::isValidServiceType("__")); +} + +TEST_F(AspUtilTest, isValidServiceTypeForWfdsP) +{ + EXPECT_EQ(true, AspUtil::isValidServiceTypeForWfds("abcdef")); + EXPECT_EQ(true, AspUtil::isValidServiceType(".....")); + EXPECT_EQ(true, AspUtil::isValidServiceType("-----")); +} + +TEST_F(AspUtilTest, isValidServiceTypeForWfdsN) +{ + EXPECT_EQ(false, AspUtil::isValidServiceTypeForWfds("__")); + EXPECT_EQ(false, AspUtil::isValidServiceTypeForWfds("**")); + EXPECT_EQ(false, AspUtil::isValidServiceTypeForWfds("abcd**efg")); +} + +TEST_F(AspUtilTest, isValidKeyP) +{ + EXPECT_EQ(true, AspUtil::isValidKey("12345678")); + EXPECT_EQ(true, AspUtil::isValidKey("abcdefg")); + EXPECT_EQ(true, AspUtil::isValidKey("!@#$%^&*")); +} + +TEST_F(AspUtilTest, isValidKeyN) +{ + EXPECT_EQ(false, AspUtil::isValidKey("1234567890")); + EXPECT_EQ(false, AspUtil::isValidKey("abcdefghij")); + EXPECT_EQ(false, AspUtil::isValidKey("!@#$%^&*()")); +} diff --git a/unittest/mock/mock-asp-dbus.cpp b/unittest/mock/mock-asp-dbus.cpp new file mode 100644 index 0000000..d0d5101 --- /dev/null +++ b/unittest/mock/mock-asp-dbus.cpp @@ -0,0 +1,13 @@ +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +API int __wrap_asp_dbus_init() +{ + return 1; +} + +API int __wrap_asp_dbus_deinit() +{ + return 1; +} \ No newline at end of file diff --git a/unittest/mock/mock-system-info.cpp b/unittest/mock/mock-system-info.cpp new file mode 100644 index 0000000..c106106 --- /dev/null +++ b/unittest/mock/mock-system-info.cpp @@ -0,0 +1,17 @@ +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +API int __wrap_system_info_get_platform_bool (const char *key, bool *value) +{ + *value = true; + return 0; +} + +#ifdef __cplusplus +} +#endif \ No newline at end of file