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")
--- /dev/null
+#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);
+}
+++ /dev/null
-/*
- * 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 <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <string.h>
-#include <sys/un.h>
-#include <sys/wait.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <signal.h>
-#include <linux/unistd.h>
-#include <sys/poll.h>
-#include <pthread.h>
-#include <errno.h>
-
-#include <glib.h>
-#include <gio/gio.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-#include <system_info.h>
-
-/*****************************************************************************
- * 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.<_><Transport protocol>
- * 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
-}
--- /dev/null
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <sys/un.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <signal.h>
+#include <linux/unistd.h>
+#include <sys/poll.h>
+#include <pthread.h>
+#include <errno.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+#include <system_info.h>
+
+/*****************************************************************************
+ * 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
+}
+++ /dev/null
-/*
- * 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;
-}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+#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
--- /dev/null
+#include "asp-conts.h"
+#include "asp-utils.h"
+#include <glib.h>
+
+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.<_><Transport protocol>
+ * 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;
+}
--- /dev/null
+#pragma once
+
+#include <glib.h>
+#include <string>
+
+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
#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
*/
--- /dev/null
+#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
#ifndef __ASP_DBUS_H__
#define __ASP_DBUS_H__
-#ifdef __cplusplus
-extern "C" {
-#endif
-
#include <gio/gio.h>
#define ASP_DAEMON_SERVICE "net.asp"
int asp_dbus_unpack_ay(unsigned char *dst, GVariant *src, int size);
-#ifdef __cplusplus
-}
-#endif
-
#endif /* __ASP_DBUS_H__ */
--- /dev/null
+/*
+ * 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__ */
--- /dev/null
+#pragma once
+
+#include <glib.h>
+
+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);
+++ /dev/null
-/*
- * 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__ */
--- /dev/null
+#pragma once
+
+#include <string>
+
+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
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/)
--- /dev/null
+#include <gtest/gtest.h>
+
+#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));
+}
--- /dev/null
+#include <gtest/gtest.h>
+#include <string>
+
+#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
--- /dev/null
+#include <gtest/gtest.h>
+
+#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;
+}
--- /dev/null
+#include <gtest/gtest.h>
+
+#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("!@#$%^&*()"));
+}
--- /dev/null
+#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
--- /dev/null
+#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