From f85fdbcdcc88ff5e771269a4db47e5862c500682 Mon Sep 17 00:00:00 2001 From: Minchul Lee Date: Tue, 11 Aug 2015 13:45:53 +0900 Subject: [PATCH] apply platform info functions Change-Id: Ibed262bce2df0a4af1a27d9b7da49e026dacba33 Signed-off-by: Minchul Lee --- daemon/icd-ioty-ocprocess.c | 70 ++++++++++++++++++++++++++++++++++++++++ daemon/icd-ioty-ocprocess.h | 3 ++ daemon/icd-ioty.c | 74 +++++++++++++++++++++++++++++++++++++++++-- lib/icl-client-crud.c | 2 ++ lib/icl-dbus-type.c | 22 ++++++------- lib/icl-device.c | 54 ++++++++++++++++--------------- lib/include/iotcon-constant.h | 13 ++++++++ lib/include/iotcon.h | 2 +- test/device-test-client.c | 50 ++++++++++++++++++++++------- test/device-test-server.c | 1 + 10 files changed, 239 insertions(+), 52 deletions(-) diff --git a/daemon/icd-ioty-ocprocess.c b/daemon/icd-ioty-ocprocess.c index 1416ee6..cee6f67 100644 --- a/daemon/icd-ioty-ocprocess.c +++ b/daemon/icd-ioty-ocprocess.c @@ -79,6 +79,14 @@ struct icd_crud_context { }; +struct icd_platform_context { + unsigned int signum; + int res; + char *bus_name; + char *payload; +}; + + struct icd_observe_context { unsigned int signum; int res; @@ -613,6 +621,30 @@ static int _worker_crud_cb(void *context) } +static int _worker_platform_cb(void *context) +{ + int ret; + GVariant *value; + struct icd_platform_context *ctx = context; + + RETV_IF(NULL == ctx, IOTCON_ERROR_INVALID_PARAMETER); + + value = g_variant_new("(s)", ctx->payload); + + ret = _ocprocess_response_signal(ctx->bus_name, IC_DBUS_SIGNAL_PLATFORM, ctx->signum, + value); + if (IOTCON_ERROR_NONE != ret) + ERR("_ocprocess_response_signal() Fail(%d)", ret); + + /* ctx was allocated from icd_ioty_ocprocess_platform_cb() */ + free(ctx->bus_name); + free(ctx->payload); + free(ctx); + + return ret; +} + + static int _ocprocess_worker(_ocprocess_fn fn, int type, const char *payload, int res, GVariantBuilder *options, void *ctx) { @@ -1082,3 +1114,41 @@ OCStackApplicationResult icd_ioty_ocprocess_presence_cb(void *ctx, OCDoHandle ha } +OCStackApplicationResult icd_ioty_ocprocess_platform_cb(void *ctx, OCDoHandle handle, + OCClientResponse *resp) +{ + int ret; + struct icd_platform_context *platform_ctx; + icd_sig_ctx_s *sig_context = ctx; + + RETV_IF(NULL == ctx, OC_STACK_KEEP_TRANSACTION); + + if (NULL == resp->resJSONPayload || '\0' == resp->resJSONPayload[0]) { + ERR("json payload is empty"); + return OC_STACK_KEEP_TRANSACTION; + } + + platform_ctx = calloc(1, sizeof(struct icd_platform_context)); + if (NULL == platform_ctx) { + ERR("calloc() Fail(%d)", errno); + return OC_STACK_KEEP_TRANSACTION; + } + + platform_ctx->payload = strdup(resp->resJSONPayload); + platform_ctx->signum = sig_context->signum; + platform_ctx->bus_name = ic_utils_strdup(sig_context->bus_name); + + ret = _ocprocess_worker_start(_worker_platform_cb, platform_ctx); + if (IOTCON_ERROR_NONE != ret) { + ERR("_ocprocess_worker_start() Fail(%d)", ret); + free(platform_ctx->bus_name); + free(platform_ctx->payload); + free(platform_ctx); + return OC_STACK_KEEP_TRANSACTION; + } + + /* DO NOT FREE sig_context. It MUST be freed in the ocstack */ + /* DO NOT FREE platform_ctx. It MUST be freed in the _worker_platform_cb func */ + + return OC_STACK_KEEP_TRANSACTION; +} diff --git a/daemon/icd-ioty-ocprocess.h b/daemon/icd-ioty-ocprocess.h index a9d94e7..eb18682 100644 --- a/daemon/icd-ioty-ocprocess.h +++ b/daemon/icd-ioty-ocprocess.h @@ -47,4 +47,7 @@ OCStackApplicationResult icd_ioty_ocprocess_observe_cb(void *ctx, OCDoHandle han OCStackApplicationResult icd_ioty_ocprocess_presence_cb(void *ctx, OCDoHandle handle, OCClientResponse* resp); +OCStackApplicationResult icd_ioty_ocprocess_platform_cb(void *ctx, OCDoHandle handle, + OCClientResponse *resp); + #endif /*__IOT_CONNECTIVITY_MANAGER_DAEMON_IOTIVITY_THREAD_H__*/ diff --git a/daemon/icd-ioty.c b/daemon/icd-ioty.c index c0c2e94..08a9deb 100644 --- a/daemon/icd-ioty.c +++ b/daemon/icd-ioty.c @@ -33,6 +33,8 @@ #include "icd-ioty.h" #include "icd-ioty-ocprocess.h" +#define ICD_IOTY_PLATFORM_URI_PATH "/oic/p" + static GMutex icd_csdk_mutex; void icd_ioty_csdk_lock() @@ -139,6 +141,7 @@ OCResourceHandle icd_ioty_register_resource(const char *uri_path, int icd_ioty_unregister_resource(OCResourceHandle handle) { + FN_CALL; OCStackResult ret; icd_ioty_csdk_lock(); @@ -762,7 +765,31 @@ int icd_ioty_get_device_info(const char *host_address, int icd_ioty_register_platform_info(GVariant *value) { - // TODO : To be implemented + OCStackResult result; + OCPlatformInfo platform_info = {0}; + + g_variant_get(value, "(&s&s&s&s&s&s&s&s&s&s&s)", + &platform_info.platformID, + &platform_info.manufacturerName, + &platform_info.manufacturerUrl, + &platform_info.modelNumber, + &platform_info.dateOfManufacture, + &platform_info.platformVersion, + &platform_info.operatingSystemVersion, + &platform_info.hardwareVersion, + &platform_info.firmwareVersion, + &platform_info.supportUrl, + &platform_info.systemTime); + + icd_ioty_csdk_lock(); + result = OCSetPlatformInfo(platform_info); + icd_ioty_csdk_unlock(); + + if (OC_STACK_OK != result) { + ERR("OCSetPlatformInfo() Fail(%d)", result); + return IOTCON_ERROR_IOTIVITY; + } + return IOTCON_ERROR_NONE; } @@ -770,7 +797,50 @@ int icd_ioty_register_platform_info(GVariant *value) int icd_ioty_get_platform_info(const char *host_address, unsigned int signal_number, const char *bus_name) { - // TODO : To be implemented + FN_CALL; + char *uri; + OCStackResult result; + icd_sig_ctx_s *context; + OCCallbackData cbdata = {0}; + char uri_buf[PATH_MAX] = {0}; + iotcon_connectivity_type_e conn_type = IOTCON_CONNECTIVITY_IPV4; + + snprintf(uri_buf, sizeof(uri_buf), "%s:%d"ICD_IOTY_PLATFORM_URI_PATH, host_address, + OC_MULTICAST_PORT); + uri = strdup(uri_buf); + if (NULL == uri) { + ERR("strdup() Fail(%d)", errno); + return IOTCON_ERROR_INVALID_PARAMETER; + } + + context = calloc(1, sizeof(icd_sig_ctx_s)); + if (NULL == context) { + ERR("calloc() Fail(%d)", errno); + free(uri); + return IOTCON_ERROR_OUT_OF_MEMORY; + } + context->bus_name = ic_utils_strdup(bus_name); + context->signum = signal_number; + + cbdata.context = context; + cbdata.cb = icd_ioty_ocprocess_platform_cb; + cbdata.cd = _ioty_free_signal_context; + + icd_ioty_csdk_lock(); + /* TODO : QoS is come from lib. And user can set QoS to client structure. */ + result = OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL, conn_type, OC_HIGH_QOS, + &cbdata, NULL, 0); + icd_ioty_csdk_unlock(); + + free(uri); + + if (OC_STACK_OK != result) { + ERR("OCDoResource() Fail(%d)", result); + free(context->bus_name); + free(context); + return IOTCON_ERROR_IOTIVITY; + } + return IOTCON_ERROR_NONE; } diff --git a/lib/icl-client-crud.c b/lib/icl-client-crud.c index e93100a..3ebd812 100644 --- a/lib/icl-client-crud.c +++ b/lib/icl-client-crud.c @@ -443,6 +443,7 @@ API int iotcon_observer_start(iotcon_client_h resource, iotcon_on_observe_cb cb, void *user_data) { + FN_CALL; int observe_handle; GError *error = NULL; unsigned int sub_id; @@ -510,6 +511,7 @@ API int iotcon_observer_start(iotcon_client_h resource, API int iotcon_observer_stop(iotcon_client_h resource) { + FN_CALL; int ret; GError *error = NULL; GVariant *arg_options; diff --git a/lib/icl-dbus-type.c b/lib/icl-dbus-type.c index eebdbaf..4d2edbf 100644 --- a/lib/icl-dbus-type.c +++ b/lib/icl-dbus-type.c @@ -162,17 +162,17 @@ GVariant* icl_dbus_platform_info_to_gvariant(iotcon_platform_info_s *platform_in GVariant *value; value = g_variant_new("(sssssssssss)", - ic_utils_dbus_encode_str(platform_info->platform_id), - ic_utils_dbus_encode_str(platform_info->manuf_name), - ic_utils_dbus_encode_str(platform_info->manuf_url), - ic_utils_dbus_encode_str(platform_info->model_number), - ic_utils_dbus_encode_str(platform_info->date_of_manufacture), - ic_utils_dbus_encode_str(platform_info->platform_ver), - ic_utils_dbus_encode_str(platform_info->os_ver), - ic_utils_dbus_encode_str(platform_info->hardware_ver), - ic_utils_dbus_encode_str(platform_info->firmware_ver), - ic_utils_dbus_encode_str(platform_info->support_url), - ic_utils_dbus_encode_str(platform_info->system_time)); + platform_info->platform_id, + platform_info->manuf_name, + platform_info->manuf_url, + platform_info->model_number, + platform_info->date_of_manufacture, + platform_info->platform_ver, + platform_info->os_ver, + platform_info->hardware_ver, + platform_info->firmware_ver, + platform_info->support_url, + platform_info->system_time); return value; } diff --git a/lib/icl-device.c b/lib/icl-device.c index 3694f94..9ee6cb9 100644 --- a/lib/icl-device.c +++ b/lib/icl-device.c @@ -22,6 +22,7 @@ #include "iotcon.h" #include "ic-utils.h" #include "icl.h" +#include "icl-repr.h" #include "icl-dbus.h" #include "icl-dbus-type.h" @@ -192,6 +193,21 @@ API int iotcon_register_platform_info(iotcon_platform_info_s platform_info) RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS); + if (NULL == platform_info.platform_id + || NULL == platform_info.manuf_name + || NULL == platform_info.manuf_url + || NULL == platform_info.model_number + || NULL == platform_info.date_of_manufacture + || NULL == platform_info.platform_ver + || NULL == platform_info.os_ver + || NULL == platform_info.hardware_ver + || NULL == platform_info.firmware_ver + || NULL == platform_info.support_url + || NULL == platform_info.system_time) { + ERR("one of parameter is NULL"); + return IOTCON_ERROR_INVALID_PARAMETER; + } + if (platform_info.manuf_name && (IOTCON_MANUFACTURER_NAME_LENGTH_MAX < strlen(platform_info.manuf_name))) { ERR("The length of manufacturer_name(%s) is invalid.", platform_info.manuf_name); @@ -231,38 +247,24 @@ static void _icl_platform_info_cb(GDBusConnection *connection, GVariant *parameters, gpointer user_data) { + FN_CALL; + char *repr_json = NULL; + iotcon_repr_h repr; icl_platform_info_s *cb_container = user_data; iotcon_platform_info_cb cb = cb_container->cb; - iotcon_platform_info_s info = {0}; - - g_variant_get(parameters, "(&s&s&s&s&s&s&s&s&s&s&s)", - &info.platform_id, - &info.manuf_name, - &info.manuf_url, - &info.model_number, - &info.date_of_manufacture, - &info.platform_ver, - &info.os_ver, - &info.hardware_ver, - &info.firmware_ver, - &info.support_url, - &info.system_time); + g_variant_get(parameters, "(&s)", &repr_json); + if (IC_STR_EQUAL == strcmp(IC_STR_NULL, repr_json)) { + ERR("Invalid Representation"); + return; + } - info.platform_id = ic_utils_dbus_decode_str(info.platform_id); - info.manuf_name = ic_utils_dbus_decode_str(info.manuf_name); - info.manuf_url = ic_utils_dbus_decode_str(info.manuf_url); - info.model_number = ic_utils_dbus_decode_str(info.model_number); - info.date_of_manufacture = ic_utils_dbus_decode_str(info.date_of_manufacture); - info.platform_ver = ic_utils_dbus_decode_str(info.platform_ver); - info.os_ver = ic_utils_dbus_decode_str(info.os_ver); - info.hardware_ver = ic_utils_dbus_decode_str(info.hardware_ver); - info.firmware_ver = ic_utils_dbus_decode_str(info.firmware_ver); - info.support_url = ic_utils_dbus_decode_str(info.support_url); - info.system_time = ic_utils_dbus_decode_str(info.system_time); + repr = icl_repr_create_repr(repr_json); if (cb) - cb(info, cb_container->user_data); + cb(repr, cb_container->user_data); + + iotcon_repr_free(repr); } diff --git a/lib/include/iotcon-constant.h b/lib/include/iotcon-constant.h index 014f39d..53b0b02 100644 --- a/lib/include/iotcon-constant.h +++ b/lib/include/iotcon-constant.h @@ -45,6 +45,19 @@ #define IOTCON_FUNC_STOP 0 #define IOTCON_FUNC_CONTINUE 1 +#define IOTCON_PLATFORM_PLATFORM_ID "pi" +#define IOTCON_PLATFORM_MFG_NAME "mnmn" +#define IOTCON_PLATFORM_MFG_URL "mnml" +#define IOTCON_PLATFORM_MODEL_NUM "mnmo" +#define IOTCON_PLATFORM_MFG_DATE "mndt" +#define IOTCON_PLATFORM_PLATFORM_VERSION "mnpv" +#define IOTCON_PLATFORM_OS_VERSION "mnos" +#define IOTCON_PLATFORM_HARDWARE_VERSION "mnhw" +#define IOTCON_PLATFORM_FIRMWARE_VERSION "mnfv" +#define IOTCON_PLATFORM_SUPPORT_URL "mnsl" +#define IOTCON_PLATFORM_SYSTEM_TIME "st" + + /** * @brief Action associated with observation */ diff --git a/lib/include/iotcon.h b/lib/include/iotcon.h index afd8ecb..c4d69e0 100644 --- a/lib/include/iotcon.h +++ b/lib/include/iotcon.h @@ -75,7 +75,7 @@ int iotcon_get_device_info(const char *host_address, iotcon_device_info_cb cb, #endif int iotcon_register_platform_info(iotcon_platform_info_s platform_info); -typedef void (*iotcon_platform_info_cb)(iotcon_platform_info_s info, void *user_data); +typedef void (*iotcon_platform_info_cb)(iotcon_repr_h repr, void *user_data); int iotcon_get_platform_info(const char *host_address, iotcon_platform_info_cb cb, void *user_data); diff --git a/test/device-test-client.c b/test/device-test-client.c index 3763188..4ae3648 100644 --- a/test/device-test-client.c +++ b/test/device-test-client.c @@ -18,23 +18,49 @@ #include #include "test.h" -static void _get_platform_info(iotcon_platform_info_s info, void *user_data) +static void _get_platform_info(iotcon_repr_h repr, void *user_data) { - INFO("platform_id : %s", info.platform_id); - INFO("manuf_name : %s", info.manuf_name); - INFO("manuf_url : %s", info.manuf_url); - INFO("model_number : %s", info.model_number); - INFO("date_of_manufacture : %s", info.date_of_manufacture); - INFO("platform_ver : %s", info.platform_ver); - INFO("os_ver : %s", info.os_ver); - INFO("hardware_ver : %s", info.hardware_ver); - INFO("firmware_ver : %s", info.firmware_ver); - INFO("support_url : %s", info.support_url); - INFO("system_time : %s", info.system_time); + FN_CALL; + char *platform_id = NULL; + char *manuf_name = NULL; + char *manuf_url = NULL; + char *model_number = NULL; + char *date_of_manufacture = NULL; + char *platform_ver = NULL; + char *os_ver = NULL; + char *hardware_ver = NULL; + char *firmware_ver = NULL; + char *support_url = NULL; + char *system_time = NULL; + + iotcon_repr_get_str(repr, IOTCON_PLATFORM_PLATFORM_ID, &platform_id); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_MFG_NAME, &manuf_name); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_MFG_URL, &manuf_url); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_MODEL_NUM, &model_number); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_MFG_DATE, &date_of_manufacture); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_PLATFORM_VERSION, &platform_ver); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_OS_VERSION, &os_ver); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_HARDWARE_VERSION, &hardware_ver); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_FIRMWARE_VERSION, &firmware_ver); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_SUPPORT_URL, &support_url); + iotcon_repr_get_str(repr, IOTCON_PLATFORM_SYSTEM_TIME, &system_time); + + INFO("platform_id : %s", platform_id); + INFO("manuf_name : %s", manuf_name); + INFO("manuf_url : %s", manuf_url); + INFO("model_number : %s", model_number); + INFO("date_of_manufacture : %s", date_of_manufacture); + INFO("platform_ver : %s", platform_ver); + INFO("os_ver : %s", os_ver); + INFO("hardware_ver : %s", hardware_ver); + INFO("firmware_ver : %s", firmware_ver); + INFO("support_url : %s", support_url); + INFO("system_time : %s", system_time); } int main() { + FN_CALL; GMainLoop *loop; loop = g_main_loop_new(NULL, FALSE); diff --git a/test/device-test-server.c b/test/device-test-server.c index 649760a..772086a 100644 --- a/test/device-test-server.c +++ b/test/device-test-server.c @@ -20,6 +20,7 @@ int main() { + FN_CALL; int ret; GMainLoop *loop; -- 2.7.4