}
-iotcon_presence_h icd_ioty_subscribe_presence(const char *host_address,
+OCDoHandle icd_ioty_subscribe_presence(const char *host_address,
const char *resource_type, unsigned int signal_number, const char *sender)
{
// TODO : To be implemented
}
-int icd_ioty_unsubscribe_presence(iotcon_presence_h presence_handle)
+int icd_ioty_unsubscribe_presence(OCDoHandle presence_handle)
{
// TODO : To be implemented
return IOTCON_ERROR_NONE;
int icd_ioty_get_platform_info(const char *host_address, unsigned int signal_number,
const char *sender);
-iotcon_presence_h icd_ioty_subscribe_presence(const char *host_address,
- const char *resource_type, unsigned int signal_number, const char *sender);
+void* icd_ioty_subscribe_presence(const char *host_address, const char *resource_type,
+ unsigned int signal_number, const char *sender);
-int icd_ioty_unsubscribe_presence(iotcon_presence_h presence_handle);
+int icd_ioty_unsubscribe_presence(void *presence_handle);
int icd_ioty_start_presence(unsigned int time_to_live);
--- /dev/null
+/*
+ * 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.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <glib.h>
+
+#include "iotcon.h"
+#include "ic-utils.h"
+#include "icl.h"
+#include "icl-options.h"
+#include "icl-dbus.h"
+#include "icl-dbus-type.h"
+#include "icl-repr.h"
+#include "icl-client.h"
+
+typedef struct {
+ iotcon_on_cru_cb cb;
+ void *user_data;
+ iotcon_client_h resource;
+ unsigned int id;
+} icl_on_cru_s;
+
+typedef struct {
+ iotcon_on_delete_cb cb;
+ void *user_data;
+ iotcon_client_h resource;
+ unsigned int id;
+} icl_on_delete_s;
+
+typedef struct {
+ iotcon_on_observe_cb cb;
+ void *user_data;
+ iotcon_client_h resource;
+} icl_on_observe_s;
+
+
+static void _icl_on_cru_cb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ int res;
+ GVariantIter *options;
+ unsigned short option_id;
+ char *option_data;
+ iotcon_options_h header_options = NULL;
+ iotcon_repr_h repr = NULL;
+ char *repr_json = NULL;
+
+ icl_on_cru_s *cb_container = user_data;
+ iotcon_on_cru_cb cb = cb_container->cb;
+
+ icl_dbus_unsubscribe_signal(cb_container->id);
+
+ g_variant_get(parameters, "(a(qs)si)", &options, &repr_json, &res);
+
+ if (IOTCON_ERROR_NONE == res && g_variant_iter_n_children(options)) {
+ header_options = iotcon_options_new();
+ while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
+ iotcon_options_insert(header_options, option_id, option_data);
+ }
+ g_variant_iter_free(options);
+
+ if (IC_STR_EQUAL == strcmp(IC_STR_NULL, repr_json)) {
+ repr = iotcon_repr_new();
+ } else {
+ repr = icl_repr_create_repr(repr_json);
+ if (NULL == repr) {
+ ERR("icl_repr_create_repr() Fail");
+ if (header_options)
+ iotcon_options_free(header_options);
+ return;
+ }
+ }
+
+ res = icl_dbus_convert_daemon_error(res);
+
+ if (cb)
+ cb(cb_container->resource, repr, header_options, res, cb_container->user_data);
+
+ if (repr)
+ iotcon_repr_free(repr);
+ if (header_options)
+ iotcon_options_free(header_options);
+
+}
+
+
+static void _icl_cru_conn_cleanup(icl_on_cru_s *cb_container)
+{
+ iotcon_client_free(cb_container->resource);
+ free(cb_container);
+}
+
+
+API int iotcon_get(iotcon_client_h resource, iotcon_query_h query,
+ iotcon_on_cru_cb cb, void *user_data)
+{
+ int ret;
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ icl_on_cru_s *cb_container;
+ GVariant *arg_client;
+ GVariant *arg_query;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+ signal_number = icl_dbus_generate_signal_number();
+
+ arg_client = icl_dbus_client_to_gvariant(resource);
+ arg_query = icl_dbus_query_to_gvariant(query);
+
+ ic_dbus_call_get_sync(icl_dbus_get_object(), arg_client, arg_query, signal_number,
+ &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_get_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_query);
+ g_variant_unref(arg_client);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_GET,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_on_cru_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->resource = iotcon_client_ref(resource);
+ if (NULL == cb_container->resource) {
+ ERR("iotcon_client_ref() Fail");
+ free(cb_container);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, _icl_cru_conn_cleanup,
+ _icl_on_cru_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ _icl_cru_conn_cleanup(cb_container);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ cb_container->id = sub_id;
+
+ return ret;
+}
+
+
+API int iotcon_put(iotcon_client_h resource, iotcon_repr_h repr,
+ iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data)
+{
+ int ret;
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ char *arg_repr;
+ icl_on_cru_s *cb_container;
+ GVariant *arg_client;
+ GVariant *arg_query;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == repr, IOTCON_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+ signal_number = icl_dbus_generate_signal_number();
+
+ arg_repr = icl_repr_generate_json(repr, FALSE);
+ if (NULL == arg_repr) {
+ ERR("icl_repr_generate_json() Fail");
+ return IOTCON_ERROR_REPRESENTATION;
+ }
+
+ arg_client = icl_dbus_client_to_gvariant(resource);
+ arg_query = icl_dbus_query_to_gvariant(query);
+
+ ic_dbus_call_put_sync(icl_dbus_get_object(), arg_client, arg_repr, arg_query,
+ signal_number, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_put_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_query);
+ g_variant_unref(arg_client);
+ free(arg_repr);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ free(arg_repr);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+ free(arg_repr);
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PUT,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_on_cru_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->resource = iotcon_client_ref(resource);
+ if (NULL == cb_container->resource) {
+ ERR("iotcon_client_ref() Fail");
+ free(cb_container);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, _icl_cru_conn_cleanup,
+ _icl_on_cru_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ _icl_cru_conn_cleanup(cb_container);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ cb_container->id = sub_id;
+
+ return ret;
+}
+
+
+API int iotcon_post(iotcon_client_h resource, iotcon_repr_h repr,
+ iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data)
+{
+ int ret;
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ char *arg_repr;
+ icl_on_cru_s *cb_container;
+ GVariant *arg_client;
+ GVariant *arg_query;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == repr, IOTCON_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+ signal_number = icl_dbus_generate_signal_number();
+
+ arg_repr = icl_repr_generate_json(repr, FALSE);
+ if (NULL == arg_repr) {
+ ERR("icl_repr_generate_json() Fail");
+ return IOTCON_ERROR_REPRESENTATION;
+ }
+
+ arg_client = icl_dbus_client_to_gvariant(resource);
+ arg_query = icl_dbus_query_to_gvariant(query);
+
+ ic_dbus_call_post_sync(icl_dbus_get_object(), arg_client, arg_repr, arg_query,
+ signal_number, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_post_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_client);
+ g_variant_unref(arg_query);
+ free(arg_repr);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ free(arg_repr);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+ free(arg_repr);
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_POST,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_on_cru_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->resource = iotcon_client_ref(resource);
+ if (NULL == cb_container->resource) {
+ ERR("iotcon_client_ref() Fail");
+ free(cb_container);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, _icl_cru_conn_cleanup,
+ _icl_on_cru_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ _icl_cru_conn_cleanup(cb_container);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ cb_container->id = sub_id;
+
+ return ret;
+}
+
+
+static void _icl_on_delete_cb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ GVariantIter *options;
+ unsigned short option_id;
+ char *option_data;
+ iotcon_options_h header_options = NULL;
+ int res;
+
+ icl_on_delete_s *cb_container = user_data;
+ iotcon_on_delete_cb cb = cb_container->cb;
+
+ g_variant_get(parameters, "(a(qs)i)", &options, &res);
+
+ if (g_variant_iter_n_children(options)) {
+ header_options = iotcon_options_new();
+ while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
+ iotcon_options_insert(header_options, option_id, option_data);
+ }
+ g_variant_iter_free(options);
+
+ if (cb)
+ cb(cb_container->resource, header_options, res, cb_container->user_data);
+
+ if (header_options)
+ iotcon_options_free(header_options);
+
+ icl_dbus_unsubscribe_signal(cb_container->id);
+}
+
+
+static void _icl_delete_conn_cleanup(icl_on_delete_s *cb_container)
+{
+ iotcon_client_free(cb_container->resource);
+ free(cb_container);
+}
+
+
+API int iotcon_delete(iotcon_client_h resource, iotcon_on_delete_cb cb, void *user_data)
+{
+ int ret;
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ icl_on_delete_s *cb_container;
+ GVariant *arg_client;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+ signal_number = icl_dbus_generate_signal_number();
+
+ arg_client = icl_dbus_client_to_gvariant(resource);
+
+ ic_dbus_call_delete_sync(icl_dbus_get_object(), arg_client, signal_number, &ret,
+ NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_delete_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_client);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_DELETE,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_on_delete_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->resource = iotcon_client_ref(resource);
+ if (NULL == cb_container->resource) {
+ ERR("iotcon_client_ref() Fail");
+ free(cb_container);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, _icl_delete_conn_cleanup,
+ _icl_on_delete_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ _icl_delete_conn_cleanup(cb_container);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ cb_container->id = sub_id;
+
+ return ret;
+}
+
+
+static void _icl_on_observe_cb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ FN_CALL;
+ int index;
+ GVariantIter *options;
+ unsigned short option_id;
+ char *option_data;
+ iotcon_options_h header_options = NULL;
+ iotcon_repr_h repr = NULL;
+ GVariantIter *repr_iter;
+ char *repr_json;
+ char *repr_uri_path;
+ int res;
+ int seq_num;
+
+ icl_on_observe_s *cb_container = user_data;
+ iotcon_on_observe_cb cb = cb_container->cb;
+
+ g_variant_get(parameters, "(a(qs)asii)", &options, &repr_iter, &res, &seq_num);
+
+ if (g_variant_iter_n_children(options)) {
+ header_options = iotcon_options_new();
+ while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
+ iotcon_options_insert(header_options, option_id, option_data);
+ }
+ g_variant_iter_free(options);
+
+ for (index = 0; g_variant_iter_loop(repr_iter, "&s", &repr_json); index++) {
+ iotcon_repr_h cur_repr = icl_repr_parse_json(repr_json);
+ if (NULL == cur_repr) {
+ ERR("icl_repr_parse_json() Fail");
+ iotcon_options_free(header_options);
+ if (repr)
+ iotcon_repr_free(repr);
+ g_variant_iter_free(repr_iter);
+ return;
+ }
+ repr_uri_path = icl_repr_json_get_uri_path(repr_json);
+ iotcon_repr_set_uri_path(cur_repr, repr_uri_path);
+ free(repr_uri_path);
+
+ if (0 == index)
+ repr = cur_repr;
+ else
+ repr->children = g_list_append(repr->children, cur_repr);
+ }
+ g_variant_iter_free(repr_iter);
+
+ if (cb)
+ cb(cb_container->resource, repr, header_options, res, seq_num,
+ cb_container->user_data);
+
+ if (repr)
+ iotcon_repr_free(repr);
+ if (header_options)
+ iotcon_options_free(header_options);
+}
+
+
+static void _icl_observe_conn_cleanup(icl_on_observe_s *cb_container)
+{
+ cb_container->resource->observe_handle = 0;
+ cb_container->resource->observe_sub_id = 0;
+ iotcon_client_free(cb_container->resource);
+ free(cb_container);
+}
+
+
+API int iotcon_observer_start(iotcon_client_h resource,
+ iotcon_observe_type_e observe_type,
+ iotcon_query_h query,
+ iotcon_on_observe_cb cb,
+ void *user_data)
+{
+ int ret;
+ int observe_handle;
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ icl_on_observe_s *cb_container;
+ GVariant *arg_client;
+ GVariant *arg_query;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
+
+ signal_number = icl_dbus_generate_signal_number();
+
+ arg_client = icl_dbus_client_to_gvariant(resource);
+ arg_query = icl_dbus_query_to_gvariant(query);
+
+ ic_dbus_call_observer_start_sync(icl_dbus_get_object(), arg_client, observe_type,
+ arg_query, signal_number, &observe_handle, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_observer_start_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_query);
+ g_variant_unref(arg_client);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_OBSERVE,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_on_observe_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->resource = iotcon_client_ref(resource);
+ if (NULL == cb_container->resource) {
+ ERR("iotcon_client_ref() Fail");
+ free(cb_container);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, _icl_observe_conn_cleanup,
+ _icl_on_observe_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ return IOTCON_ERROR_DBUS;
+ }
+ resource->observe_sub_id = sub_id;
+ resource->observe_handle = observe_handle;
+
+ return ret;
+}
+
+
+API int iotcon_observer_stop(iotcon_client_h resource)
+{
+ int ret;
+ GError *error = NULL;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ if (0 == resource->observe_handle) {
+ ERR("It doesn't have a observe_handle");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
+
+ ic_dbus_call_observer_stop_sync(icl_dbus_get_object(),
+ resource->observe_handle, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_observer_stop_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ icl_dbus_unsubscribe_signal(resource->observe_sub_id);
+
+ return ret;
+}
+
* limitations under the License.
*/
#include <stdbool.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <glib.h>
#include <json-glib/json-glib.h>
-#include "iotcon-struct.h"
+#include "iotcon.h"
#include "ic-utils.h"
#include "icl.h"
-#include "icl-ioty.h"
#include "icl-options.h"
#include "icl-resource-types.h"
#include "icl-dbus.h"
#include "icl-repr.h"
#include "icl-client.h"
+typedef struct {
+ iotcon_found_resource_cb cb;
+ void *user_data;
+ unsigned int id;
+} icl_found_resource_s;
+
+
+static void _icl_found_resource_cb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ FN_CALL;
+ int conn_type;
+ JsonParser *parser;
+ iotcon_client_h client;
+ char *payload, *host;
+ icl_found_resource_s *cb_container = user_data;
+ iotcon_found_resource_cb cb = cb_container->cb;
+
+ g_variant_get(parameters, "(&s&si)", &payload, &host, &conn_type);
+
+ RET_IF(NULL == payload);
+ RET_IF(NULL == host);
+
+ parser = json_parser_new();
+
+ client = icl_client_parse_resource_object(parser, payload, host, conn_type);
+ if (NULL == client) {
+ ERR("icl_client_parse_resource_object() Fail");
+ g_object_unref(parser);
+ return;
+ }
+
+ if (cb)
+ cb(client, cb_container->user_data);
+
+ iotcon_client_free(client);
+
+ g_object_unref(parser);
+
+ /* TODO
+ * When is callback removed?
+ */
+}
+
+
/* The length of resource_type should be less than or equal to 61.
* If resource_type is NULL, then All resources in host are discovered. */
API int iotcon_find_resource(const char *host_address, const char *resource_type,
iotcon_found_resource_cb cb, void *user_data)
{
- FN_CALL;
int ret;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ unsigned int sub_id;
+ icl_found_resource_s *cb_container;
+ GError *error = NULL;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == host_address, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
if (resource_type && (IOTCON_RESOURCE_TYPE_LENGTH_MAX < strlen(resource_type))) {
return IOTCON_ERROR_INVALID_PARAMETER;
}
- ret = icl_dbus_find_resource(host_address, resource_type, cb, user_data);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_find_resource() Fail(%d)", ret);
+ signal_number = icl_dbus_generate_signal_number();
+
+ ic_dbus_call_find_resource_sync(icl_dbus_get_object(), host_address,
+ ic_utils_dbus_encode_str(resource_type), signal_number, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_find_resource_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_FOUND_RESOURCE,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_found_resource_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
+ _icl_found_resource_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ return IOTCON_ERROR_DBUS;
+ }
+
+ cb_container->id = sub_id;
return ret;
}
resource->types = icl_resource_types_ref(resource_types);
resource->ifaces = resource_ifs;
+ resource->ref_count = 1;
+
return resource;
}
RET_IF(NULL == resource);
+ resource->ref_count--;
+
+ if (0 < resource->ref_count)
+ return;
+
free(resource->uri_path);
free(resource->host);
free(resource->sid);
+ iotcon_resource_types_free(resource->types);
/* null COULD be allowed */
if (resource->header_options)
iotcon_options_free(resource->header_options);
- iotcon_resource_types_free(resource->types);
+
free(resource);
}
-API iotcon_client_h iotcon_client_clone(iotcon_client_h resource)
+API iotcon_client_h iotcon_client_ref(iotcon_client_h resource)
{
- iotcon_client_h clone;
-
RETV_IF(NULL == resource, NULL);
+ RETV_IF(resource->ref_count <= 0, NULL);
- clone = iotcon_client_new(resource->host,
- resource->uri_path,
- resource->is_observable,
- iotcon_resource_types_clone(resource->types),
- resource->ifaces);
- if (NULL == clone) {
- ERR("iotcon_client_new() Fail");
- return clone;
- }
+ resource->ref_count++;
- clone->sid = resource->sid;
- clone->observe_handle = resource->observe_handle;
-
- return clone;
+ return resource;
}
return IOTCON_ERROR_NONE;
}
+
+/* The content of the resource should not be freed by user. */
API int iotcon_client_get_server_id(iotcon_client_h resource, char **sid)
{
RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
}
-API int iotcon_get(iotcon_client_h resource, iotcon_query_h query,
- iotcon_on_cru_cb cb, void *user_data)
-{
- FN_CALL;
- int ret;
-
- RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
- RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
-
- ret = icl_dbus_get(resource, query, cb, user_data);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_get() Fail(%d)", ret);
-
- return ret;
-}
-
-
-API int iotcon_put(iotcon_client_h resource, iotcon_repr_h repr,
- iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data)
-{
- FN_CALL;
- int ret;
-
- RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
- RETV_IF(NULL == repr, IOTCON_ERROR_INVALID_PARAMETER);
- RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
-
- ret = icl_dbus_put(resource, repr, query, cb, user_data);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_put() Fail(%d)", ret);
-
- return ret;
-}
-
-
-API int iotcon_post(iotcon_client_h resource, iotcon_repr_h repr,
- iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data)
-{
- FN_CALL;
- int ret;
-
- RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
- RETV_IF(NULL == repr, IOTCON_ERROR_INVALID_PARAMETER);
- RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
-
- ret = icl_dbus_post(resource, repr, query, cb, user_data);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_post() Fail(%d)", ret);
-
- return ret;
-}
-
-
-API int iotcon_delete(iotcon_client_h resource, iotcon_on_delete_cb cb, void *user_data)
-{
- FN_CALL;
- int ret;
-
- RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
- RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
-
- ret = icl_dbus_delete(resource, cb, user_data);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_delete() Fail(%d)", ret);
-
- return ret;
-}
-
-
-API int iotcon_observer_start(iotcon_client_h resource,
- iotcon_observe_type_e observe_type,
- iotcon_query_h query,
- iotcon_on_observe_cb cb,
- void *user_data)
-{
- FN_CALL;
- int ret;
-
- RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
- RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
-
- ret = icl_dbus_observer_start(resource, observe_type, query, cb, user_data);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_observer_start() Fail(%d)", ret);
-
- return ret;
-}
-
-
-API int iotcon_observer_stop(iotcon_client_h resource)
-{
- FN_CALL;
- int ret;
-
- RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
- if (NULL == resource->observe_handle) {
- ERR("It doesn't have a observe_handle");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
-
- ret = icl_dbus_observer_stop(resource->observe_handle);
- if (IOTCON_ERROR_NONE != ret) {
- ERR("icl_dbus_observer_stop() Fail(%d)", ret);
- return ret;
- }
- resource->observe_handle = NULL;
-
- return ret;
-}
-
-
iotcon_client_h icl_client_parse_resource_object(JsonParser *parser, char *json_string,
const char *host, iotcon_connectivity_type_e conn_type)
{
ERR("iotcon_client_new() Fail");
return NULL;
}
+ client->ref_count = 1;
client->sid = strdup(server_id);
if (NULL == client->sid) {
#include <json-glib/json-glib.h>
struct icl_remote_resource {
+ int ref_count;
char *uri_path;
char *host;
char *sid;
iotcon_resource_types_h types;
int ifaces;
iotcon_connectivity_type_e conn_type;
- icl_handle_container_s *observe_handle;
+ int observe_handle;
+ unsigned int observe_sub_id;
};
iotcon_client_h icl_client_parse_resource_object(JsonParser *parser, char *json_string,
#include "iotcon.h"
#include "ic-common.h"
-#include "ic-utils.h"
#include "ic-dbus.h"
#include "icl.h"
-#include "icl-dbus-type.h"
#include "icl-dbus.h"
-#include "icl-client.h"
-#include "icl-repr.h"
-#include "icl-request.h"
static GDBusConnection *icl_dbus_conn;
static int icl_dbus_count;
static icDbus *icl_dbus_object;
static GList *icl_dbus_sub_ids;
-static GList *icl_dbus_handle_containers;
static GList *icl_dbus_conn_changed_cbs;
typedef struct {
} icl_cb_container_s;
-static inline unsigned int _icl_dbus_generate_signal_number()
+icDbus* icl_dbus_get_object()
{
- static unsigned int i = 0;
-
- return i++;
-}
-
-
-static inline int _icl_dbus_get()
-{
- if (NULL == icl_dbus_conn) {
- icl_dbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
- if (NULL == icl_dbus_conn) {
- ERR("g_bus_get_sync() Fail");
- return IOTCON_ERROR_DBUS;
- }
- }
-
- icl_dbus_count++;
-
- return IOTCON_ERROR_NONE;
-}
-
-
-static inline void _icl_dbus_unref()
-{
- icl_dbus_count--;
-
- if (0 == icl_dbus_count) {
- DBG("All connection is closed");
- g_object_unref(icl_dbus_conn);
- icl_dbus_conn = NULL;
- }
-}
-
-
-static unsigned int _icl_dbus_subscribe_signal(char *sig_name, void *cb, void *user_data,
- GDBusSignalCallback sig_handler)
-{
- unsigned int id;
- icl_cb_container_s *cb_container;
-
- cb_container = calloc(1, sizeof(icl_cb_container_s));
- if (NULL == cb_container) {
- ERR("calloc() Fail(%d)", errno);
- return 0;
- }
- cb_container->cb = cb;
- cb_container->user_data = user_data;
-
- id = g_dbus_connection_signal_subscribe(icl_dbus_conn,
- NULL,
- IOTCON_DBUS_INTERFACE,
- sig_name,
- IOTCON_DBUS_OBJPATH,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- sig_handler,
- cb_container,
- free);
- if (0 == id) {
- ERR("g_dbus_connection_signal_subscribe() Fail");
- free(cb_container);
- return id;
- }
-
- cb_container->id = id;
-
- return id;
-}
-
-
-static void _icl_dbus_request_handler(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- FN_CALL;
-
- GVariantIter *options;
- unsigned short option_id;
- char *option_data;
- GVariantIter *query;
- char *key = NULL;
- char *value = NULL;
- char *repr_json;
- int request_handle;
- int resource_handle;
- struct icl_resource_request request = {0};
- icl_cb_container_s *cb_container = user_data;
- iotcon_request_handler_cb cb = cb_container->cb;
-
- g_variant_get(parameters, "(ia(qs)a(ss)ii&sii)",
- &request.types,
- &options,
- &query,
- &request.observation_info.action,
- &request.observation_info.observer_id,
- &repr_json,
- &request_handle,
- &resource_handle);
-
- if (g_variant_iter_n_children(options)) {
- request.header_options = iotcon_options_new();
- while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
- iotcon_options_insert(request.header_options, option_id, option_data);
- }
- g_variant_iter_free(options);
-
- if (g_variant_iter_n_children(query)) {
- request.query = iotcon_query_new();
- while (g_variant_iter_loop(query, "(&s&s)", &key, &value))
- iotcon_query_insert(request.query, key, value);
- }
- g_variant_iter_free(query);
-
- request.request_handle = GINT_TO_POINTER(request_handle);
- request.resource_handle = GINT_TO_POINTER(resource_handle);
-
- if (ic_utils_dbus_decode_str(repr_json)) {
- request.repr = icl_repr_create_repr(repr_json);
- if (NULL == request.repr) {
- ERR("icl_repr_create_repr() Fail");
- return;
- }
- }
-
- /* TODO remove request.uri */
- request.uri_path = "temp_uri_path";
-
- if (cb)
- cb(&request, cb_container->user_data);
-
- /* To avoid unnecessary ERR log (repr could be NULL) */
- if (request.repr)
- iotcon_repr_free(request.repr);
- if (request.query)
- iotcon_query_free(request.query);
- if (request.header_options)
- iotcon_options_free(request.header_options);
-}
-
-
-icl_handle_container_s* icl_dbus_register_resource(const char *uri_path,
- iotcon_resource_types_h types,
- int ifaces,
- uint8_t properties,
- iotcon_request_handler_cb cb,
- void *user_data)
-{
- int signal_number;
- unsigned int sub_id;
- int resource_handle;
- GError *error = NULL;
- const gchar **res_types;
- char sig_name[IC_DBUS_SIGNAL_LENGTH];
- icl_handle_container_s *resource;
-
- RETV_IF(NULL == icl_dbus_object, NULL);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- resource = calloc(1, sizeof(icl_handle_container_s));
- if (NULL == resource) {
- ERR("calloc() Fail(%d)", errno);
- return NULL;
- }
-
- res_types = icl_dbus_resource_types_to_array(types);
- if (NULL == res_types) {
- ERR("icl_dbus_resource_types_to_array() Fail");
- free(resource);
- return NULL;
- }
-
- ic_dbus_call_register_resource_sync(icl_dbus_object, uri_path, res_types,
- ifaces, properties, signal_number, &resource_handle, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_register_resource_sync() Fail(%s)", error->message);
- g_error_free(error);
- free(res_types);
- free(resource);
- return NULL;
- }
- free(res_types);
-
- snprintf(sig_name, sizeof(sig_name), "%s_%u", IC_DBUS_SIGNAL_REQUEST_HANDLER,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(sig_name, cb, user_data,
- _icl_dbus_request_handler);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- free(resource);
- return NULL;
- }
-
- resource->handle = resource_handle;
- resource->id = sub_id;
-
- icl_dbus_handle_containers = g_list_append(icl_dbus_handle_containers, resource);
-
- return resource;
-}
-
-
-int icl_dbus_unregister_resource(icl_handle_container_s *resource)
-{
- FN_CALL;
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- if (0 == resource->id) {
- WARN("Invalid Resource handle");
- free(resource);
- return IOTCON_ERROR_NONE;
- }
-
- ic_dbus_call_unregister_resource_sync(icl_dbus_object, resource->handle, &ret,
- NULL, &error);
- if (error) {
- ERR("ic_dbus_call_unregister_resource_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- g_dbus_connection_signal_unsubscribe(icl_dbus_conn, resource->id);
- icl_dbus_handle_containers = g_list_remove(icl_dbus_handle_containers, resource);
- free(resource);
-
- return ret;
-}
-
-
-int icl_dbus_bind_interface(icl_handle_container_s *resource, int iface)
-{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == resource->id) {
- ERR("Invalid Resource handle");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
-
- ic_dbus_call_bind_interface_sync(icl_dbus_object, resource->handle, iface, &ret,
- NULL, &error);
- if (error) {
- ERR("ic_dbus_call_bind_interface_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- return ret;
-}
-
-
-int icl_dbus_bind_type(icl_handle_container_s *resource, const char *type)
-{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == resource->id) {
- ERR("Invalid Resource handle");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
-
- ic_dbus_call_bind_type_sync(icl_dbus_object, resource->handle, type, &ret, NULL,
- &error);
- if (error) {
- ERR("ic_dbus_call_bind_type_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- return ret;
-}
-
-
-int icl_dbus_bind_resource(icl_handle_container_s *parent, icl_handle_container_s *child)
-{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == parent->id) {
- ERR("Invalid Resource handle(parent)");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
- if (0 == child->id) {
- ERR("Invalid Resource handle(child)");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
-
- ic_dbus_call_bind_resource_sync(icl_dbus_object, parent->handle, child->handle,
- &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_bind_resource_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- return ret;
-}
-
-
-int icl_dbus_unbind_resource(icl_handle_container_s *parent,
- icl_handle_container_s *child)
-{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == parent->id) {
- ERR("Invalid Resource handle(parent)");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
- if (0 == child->id) {
- ERR("Invalid Resource handle(child)");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
-
- ic_dbus_call_unbind_resource_sync(icl_dbus_object, parent->handle, child->handle,
- &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_unbind_resource_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- return ret;
-}
-
-
-int icl_dbus_notify_list_of_observers(icl_handle_container_s *resource,
- struct icl_notify_msg *msg, iotcon_observers_h observers)
-{
- int ret;
- GError *error = NULL;
- GVariant *noti_msg;
- GVariant *obs;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == resource->id) {
- ERR("Invalid Resource handle");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
-
- noti_msg = icl_dbus_notimsg_to_gvariant(msg);
- if (NULL == noti_msg) {
- ERR("icl_dbus_notimsg_to_gvariant() Fail");
- return IOTCON_ERROR_REPRESENTATION;
- }
- obs = icl_dbus_observers_to_gvariant(observers);
-
- ic_dbus_call_notify_list_of_observers_sync(icl_dbus_object, resource->handle,
- noti_msg, obs, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_notify_list_of_observers_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(obs);
- g_variant_unref(noti_msg);
- return IOTCON_ERROR_DBUS;
- }
-
- return IOTCON_ERROR_NONE;
-}
-
-
-int icl_dbus_notify_all(icl_handle_container_s *resource)
-{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == resource->id) {
- ERR("Invalid Resource handle");
- return IOTCON_ERROR_INVALID_PARAMETER;
- }
-
- ic_dbus_call_notify_all_sync(icl_dbus_object, resource->handle, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_notify_all_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- return IOTCON_ERROR_NONE;
-}
-
-
-int icl_dbus_send_response(struct icl_resource_response *response)
-{
- int ret;
- GError *error = NULL;
- GVariant *arg_response;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- arg_response = icl_dbus_response_to_gvariant(response);
- ic_dbus_call_send_response_sync(icl_dbus_object, arg_response,
- &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_send_response_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_response);
- return IOTCON_ERROR_DBUS;
- }
-
- return ret;
-}
-
-
-static void _icl_dbus_found_resource(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- FN_CALL;
- int conn_type;
- JsonParser *parser;
- iotcon_client_h client;
- char *payload, *host;
- icl_cb_container_s *cb_container = user_data;
- iotcon_found_resource_cb cb = cb_container->cb;
-
- g_variant_get(parameters, "(&s&si)", &payload, &host, &conn_type);
-
- RET_IF(NULL == payload);
- RET_IF(NULL == host);
-
- parser = json_parser_new();
-
- client = icl_client_parse_resource_object(parser, payload, host, conn_type);
- if (NULL == client) {
- ERR("icl_client_parse_resource_object() Fail");
- g_object_unref(parser);
- return;
- }
-
- if (cb)
- cb(client, cb_container->user_data);
-
- iotcon_client_free(client);
-
- g_object_unref(parser);
-}
-
-
-int icl_dbus_find_resource(const char *host_address, const char *resource_type,
- iotcon_found_resource_cb cb, void *user_data)
-{
- int ret;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- ic_dbus_call_find_resource_sync(icl_dbus_object, host_address,
- ic_utils_dbus_encode_str(resource_type), signal_number, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_find_resource_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_FOUND_RESOURCE,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data,
- _icl_dbus_found_resource);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- return IOTCON_ERROR_DBUS;
- }
- icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(sub_id));
-
- return ret;
-}
-
-
-static inline int _icl_dbus_convert_daemon_error(int error)
-{
- int ret;
-
- if (IOTCON_ERROR_INVALID_PARAMETER == error)
- ret = IOTCON_ERROR_SYSTEM;
- else
- ret = error;
-
- return ret;
-}
-
-
-static void _icl_dbus_on_cru(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- FN_CALL;
- int res;
- GVariantIter *options;
- unsigned short option_id;
- char *option_data;
- iotcon_options_h header_options = NULL;
- iotcon_repr_h repr = NULL;
- char *repr_json = NULL;
-
- icl_cb_container_s *cb_container = user_data;
- iotcon_on_cru_cb cb = cb_container->cb;
-
- g_dbus_connection_signal_unsubscribe(icl_dbus_conn, cb_container->id);
- icl_dbus_sub_ids = g_list_remove(icl_dbus_sub_ids,
- GUINT_TO_POINTER(cb_container->id));
-
- g_variant_get(parameters, "(a(qs)si)", &options, &repr_json, &res);
-
- if (IOTCON_ERROR_NONE == res && g_variant_iter_n_children(options)) {
- header_options = iotcon_options_new();
- while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
- iotcon_options_insert(header_options, option_id, option_data);
- g_variant_iter_free(options);
- }
-
- if (IC_STR_EQUAL == strcmp(IC_STR_NULL, repr_json))
- repr = iotcon_repr_new();
- else {
- repr = icl_repr_create_repr(repr_json);
- if (NULL == repr) {
- ERR("icl_repr_create_repr() Fail");
- return;
- }
- }
-
- res = _icl_dbus_convert_daemon_error(res);
-
- if (cb)
- cb(repr, header_options, res, cb_container->user_data);
-
- if (repr)
- iotcon_repr_free(repr);
- if (header_options)
- iotcon_options_free(header_options);
-}
-
-
-int icl_dbus_get(iotcon_client_h resource, iotcon_query_h query,
- iotcon_on_cru_cb cb, void *user_data)
-{
- int ret;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
- GVariant *arg_client;
- GVariant *arg_query;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- arg_client = icl_dbus_client_to_gvariant(resource);
- arg_query = icl_dbus_query_to_gvariant(query);
- ic_dbus_call_get_sync(icl_dbus_object, arg_client, arg_query, signal_number, &ret,
- NULL, &error);
- if (error) {
- ERR("ic_dbus_call_get_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_query);
- g_variant_unref(arg_client);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_GET,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data, _icl_dbus_on_cru);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- return IOTCON_ERROR_DBUS;
- }
- icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(sub_id));
-
- return ret;
-}
-
-
-int icl_dbus_put(iotcon_client_h resource, iotcon_repr_h repr,
- iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data)
-{
- int ret;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
- char *arg_repr;
- GVariant *arg_client;
- GVariant *arg_query;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- arg_repr = icl_repr_generate_json(repr, FALSE);
- if (NULL == arg_repr) {
- ERR("icl_repr_generate_json() Fail");
- return IOTCON_ERROR_REPRESENTATION;
- }
-
- arg_client = icl_dbus_client_to_gvariant(resource);
- arg_query = icl_dbus_query_to_gvariant(query);
-
- ic_dbus_call_put_sync(icl_dbus_object, arg_client, arg_repr, arg_query,
- signal_number, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_put_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_query);
- g_variant_unref(arg_client);
- free(arg_repr);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PUT,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data, _icl_dbus_on_cru);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- free(arg_repr);
- return IOTCON_ERROR_DBUS;
- }
- icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(sub_id));
-
- free(arg_repr);
-
- return ret;
-}
-
-
-int icl_dbus_post(iotcon_client_h resource, iotcon_repr_h repr,
- iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data)
-{
- int ret;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
- char *arg_repr;
- GVariant *arg_client;
- GVariant *arg_query;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- arg_repr = icl_repr_generate_json(repr, FALSE);
- if (NULL == arg_repr) {
- ERR("icl_repr_generate_json() Fail");
- return IOTCON_ERROR_REPRESENTATION;
- }
-
- arg_client = icl_dbus_client_to_gvariant(resource);
- arg_query = icl_dbus_query_to_gvariant(query);
-
- ic_dbus_call_post_sync(icl_dbus_object, arg_client, arg_repr, arg_query,
- signal_number, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_post_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_client);
- g_variant_unref(arg_query);
- free(arg_repr);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_POST,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data, _icl_dbus_on_cru);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- free(arg_repr);
- return IOTCON_ERROR_DBUS;
- }
- icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(sub_id));
-
- free(arg_repr);
-
- return ret;
-}
-
-
-static void _icl_dbus_on_delete(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- GVariantIter *options;
- unsigned short option_id;
- char *option_data;
- iotcon_options_h header_options = NULL;
- int res;
-
- icl_cb_container_s *cb_container = user_data;
- iotcon_on_delete_cb cb = cb_container->cb;
-
- g_dbus_connection_signal_unsubscribe(icl_dbus_conn, cb_container->id);
- icl_dbus_sub_ids = g_list_remove(icl_dbus_sub_ids,
- GUINT_TO_POINTER(cb_container->id));
-
- g_variant_get(parameters, "(a(qs)i)", &options, &res);
-
- if (g_variant_iter_n_children(options)) {
- header_options = iotcon_options_new();
- while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
- iotcon_options_insert(header_options, option_id, option_data);
- }
- g_variant_iter_free(options);
-
- if (cb)
- cb(header_options, res, cb_container->user_data);
-
- if (header_options)
- iotcon_options_free(header_options);
+ return icl_dbus_object;
}
-int icl_dbus_delete(iotcon_client_h resource, iotcon_on_delete_cb cb,
- void *user_data)
+inline unsigned int icl_dbus_generate_signal_number()
{
- int ret;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
- GVariant *arg_client;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- arg_client = icl_dbus_client_to_gvariant(resource);
-
- ic_dbus_call_delete_sync(icl_dbus_object, arg_client, signal_number, &ret, NULL,
- &error);
- if (error) {
- ERR("ic_dbus_call_delete_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_client);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_DELETE,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data, _icl_dbus_on_delete);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- return IOTCON_ERROR_DBUS;
- }
- icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(sub_id));
+ static unsigned int i = 0;
- return ret;
+ return i++;
}
-static void _icl_dbus_on_observe(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
+static inline int _icl_dbus_get()
{
- FN_CALL;
- int index;
- GVariantIter *options;
- unsigned short option_id;
- char *option_data;
- iotcon_options_h header_options = NULL;
- iotcon_repr_h repr = NULL;
- GVariantIter *reprIter;
- char *repr_json;
- char *repr_uri_path;
- int res;
- int seq_num;
-
- icl_cb_container_s *cb_container = user_data;
- iotcon_on_observe_cb cb = cb_container->cb;
-
- g_variant_get(parameters, "(a(qs)asii)", &options, &reprIter, &res, &seq_num);
-
- if (g_variant_iter_n_children(options)) {
- header_options = iotcon_options_new();
- while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
- iotcon_options_insert(header_options, option_id, option_data);
- }
- g_variant_iter_free(options);
-
- for (index = 0; g_variant_iter_loop(reprIter, "&s", &repr_json); index++) {
- iotcon_repr_h cur_repr = icl_repr_parse_json(repr_json);
- if (NULL == cur_repr) {
- ERR("icl_repr_parse_json() Fail");
- iotcon_options_free(header_options);
- if (repr)
- iotcon_repr_free(repr);
- g_variant_iter_free(reprIter);
- return;
+ if (NULL == icl_dbus_conn) {
+ icl_dbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
+ if (NULL == icl_dbus_conn) {
+ ERR("g_bus_get_sync() Fail");
+ return IOTCON_ERROR_DBUS;
}
- repr_uri_path = icl_repr_json_get_uri_path(repr_json);
- iotcon_repr_set_uri_path(cur_repr, repr_uri_path);
- free(repr_uri_path);
-
- if (0 == index)
- repr = cur_repr;
- else
- repr->children = g_list_append(repr->children, cur_repr);
- }
- g_variant_iter_free(reprIter);
-
- if (cb)
- cb(header_options, repr, res, seq_num, cb_container->user_data);
-
- if (repr)
- iotcon_repr_free(repr);
- if (header_options)
- iotcon_options_free(header_options);
-}
-
-
-int icl_dbus_observer_start(iotcon_client_h resource,
- iotcon_observe_type_e observe_type,
- iotcon_query_h query,
- iotcon_on_observe_cb cb,
- void *user_data)
-{
- int ret;
- int observe_handle;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
- GVariant *arg_client;
- GVariant *arg_query;
- icl_handle_container_s *observe;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- observe = calloc(1, sizeof(icl_handle_container_s));
- if (NULL == observe) {
- ERR("calloc() Fail(%d)", errno);
- return IOTCON_ERROR_OUT_OF_MEMORY;
- }
-
- arg_client = icl_dbus_client_to_gvariant(resource);
- arg_query = icl_dbus_query_to_gvariant(query);
-
- ic_dbus_call_observer_start_sync(icl_dbus_object, arg_client, observe_type,
- arg_query, signal_number, &observe_handle, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_observer_start_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_query);
- g_variant_unref(arg_client);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_OBSERVE,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data, _icl_dbus_on_observe);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- return IOTCON_ERROR_DBUS;
- }
-
- observe->handle = observe_handle;
- observe->id = sub_id;
- resource->observe_handle = observe;
-
- icl_dbus_handle_containers = g_list_append(icl_dbus_handle_containers, observe);
-
- return ret;
-}
-
-
-int icl_dbus_observer_stop(icl_handle_container_s *observe)
-{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == observe->id) {
- WARN("Invalid Client handle");
- free(observe);
- return IOTCON_ERROR_NONE;
- }
-
- ic_dbus_call_observer_stop_sync(icl_dbus_object, observe->handle, &ret, NULL,
- &error);
- if (error) {
- ERR("ic_dbus_call_observer_stop_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
- if (IOTCON_ERROR_NONE != ret)
- return ret;
-
- g_dbus_connection_signal_unsubscribe(icl_dbus_conn, observe->id);
- icl_dbus_handle_containers = g_list_remove(icl_dbus_handle_containers, observe);
- free(observe);
-
- return ret;
-}
-
-#ifdef DEVICE_INFO_IMPL /* not implemented in iotivity 0.9.1 */
-int icl_dbus_register_device_info(iotcon_device_info_s info)
-{
- int ret;
- GError *error = NULL;
- GVariant *arg_info;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- arg_info = icl_dbus_device_info_to_gvariant(&info);
- ic_dbus_call_register_device_info_sync(icl_dbus_object, arg_info, &ret,
- NULL, &error);
- if (error) {
- ERR("ic_dbus_call_register_device_info_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_info);
- return IOTCON_ERROR_DBUS;
- }
-
- return ret;
-}
-
-
-static void _icl_dbus_received_device_info(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- icl_cb_container_s *cb_container = user_data;
- iotcon_device_info_cb cb = cb_container->cb;
-
- iotcon_device_info_s info = {0};
-
- g_variant_get(parameters, "(&s&s&s&s&s&s&s&s&s&s&s&s)",
- &info.name,
- &info.host_name,
- &info.uuid,
- &info.content_type,
- &info.version,
- &info.manuf_name,
- &info.manuf_url,
- &info.model_number,
- &info.date_of_manufacture,
- &info.platform_ver,
- &info.firmware_ver,
- &info.support_url);
-
- info.name = ic_utils_dbus_decode_str(info.name);
- info.host_name = ic_utils_dbus_decode_str(info.host_name);
- info.uuid = ic_utils_dbus_decode_str(info.uuid);
- info.content_type = ic_utils_dbus_decode_str(info.content_type);
- info.version = ic_utils_dbus_decode_str(info.version);
- 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.firmware_ver = ic_utils_dbus_decode_str(info.firmware_ver);
- info.support_url = ic_utils_dbus_decode_str(info.support_url);
-
- if (cb)
- cb(info, cb_container->user_data);
-}
-
-
-int icl_dbus_get_device_info(const char *host_address, iotcon_device_info_cb cb,
- void *user_data)
-{
- int ret;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- ic_dbus_call_get_device_info_sync(icl_dbus_object, host_address,
- signal_number, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_get_device_info_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_DEVICE,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data,
- _icl_dbus_received_device_info);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- return IOTCON_ERROR_DBUS;
- }
- icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(sub_id));
-
- return ret;
-}
-#endif
-
-int icl_dbus_register_platform_info(iotcon_platform_info_s info)
-{
- int ret;
- GError *error = NULL;
- GVariant *arg_info;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- arg_info = icl_dbus_platform_info_to_gvariant(&info);
- ic_dbus_call_register_platform_info_sync(icl_dbus_object, arg_info, &ret,
- NULL, &error);
- if (error) {
- ERR("ic_dbus_call_register_platform_info_sync() Fail(%s)", error->message);
- g_error_free(error);
- g_variant_unref(arg_info);
- return IOTCON_ERROR_DBUS;
- }
-
- return ret;
-}
-
-
-static void _icl_dbus_received_platform_info(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- icl_cb_container_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);
-
- 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);
-
- if (cb)
- cb(info, cb_container->user_data);
-}
-
-
-int icl_dbus_get_platform_info(const char *host_address, iotcon_platform_info_cb cb,
- void *user_data)
-{
- int ret;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- ic_dbus_call_get_platform_info_sync(icl_dbus_object, host_address,
- signal_number, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_get_platform_info_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PLATFORM,
- signal_number);
-
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data,
- _icl_dbus_received_platform_info);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- return IOTCON_ERROR_DBUS;
}
- icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(sub_id));
-
- return ret;
-}
-
-
-
-int icl_dbus_start_presence(unsigned int time_to_live)
-{
- int ret;
- GError *error = NULL;
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
-
- ic_dbus_call_start_presence_sync(icl_dbus_object, time_to_live, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_start_presence_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
+ icl_dbus_count++;
- return ret;
+ return IOTCON_ERROR_NONE;
}
-int icl_dbus_stop_presence()
+static inline void _icl_dbus_unref()
{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
+ icl_dbus_count--;
- ic_dbus_call_stop_presence_sync(icl_dbus_object, &ret, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_stop_presence_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
+ if (0 == icl_dbus_count) {
+ DBG("All connection is closed");
+ g_object_unref(icl_dbus_conn);
+ icl_dbus_conn = NULL;
}
-
- return ret;
-}
-
-
-static void _icl_dbus_presence_handler(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- FN_CALL;
- int res;
- unsigned int nonce;
- char *host_address;
- icl_cb_container_s *cb_container = user_data;
- iotcon_presence_cb cb = cb_container->cb;
-
- g_variant_get(parameters, "(iu&s)", &res, &nonce, &host_address);
-
- if (cb)
- cb(res, nonce, host_address, cb_container->user_data);
}
-icl_handle_container_s* icl_dbus_subscribe_presence(const char *host_address,
- const char *type, iotcon_presence_cb cb, void *user_data)
+unsigned int icl_dbus_subscribe_signal(char *sig_name, void *cb_container, void *cb_free,
+ GDBusSignalCallback sig_handler)
{
- int presence_handle;
- GError *error = NULL;
- unsigned int sub_id;
- int signal_number;
- char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
- icl_handle_container_s *presence;
-
- RETV_IF(NULL == icl_dbus_object, NULL);
-
- signal_number = _icl_dbus_generate_signal_number();
-
- presence = calloc(1, sizeof(icl_handle_container_s));
- if (NULL == presence) {
- ERR("calloc() Fail(%d)", errno);
- return NULL;
- }
-
- ic_dbus_call_subscribe_presence_sync(icl_dbus_object, host_address, type,
- signal_number, &presence_handle, NULL, &error);
- if (error) {
- ERR("ic_dbus_call_subscribe_presence_sync() Fail(%s)", error->message);
- g_error_free(error);
- free(presence);
- return NULL;
- }
-
- snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PRESENCE,
- signal_number);
+ unsigned int id;
- sub_id = _icl_dbus_subscribe_signal(signal_name, cb, user_data,
- _icl_dbus_presence_handler);
- if (0 == sub_id) {
- ERR("_icl_dbus_subscribe_signal() Fail");
- free(presence);
- return NULL;
+ id = g_dbus_connection_signal_subscribe(icl_dbus_conn,
+ NULL,
+ IOTCON_DBUS_INTERFACE,
+ sig_name,
+ IOTCON_DBUS_OBJPATH,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ sig_handler,
+ cb_container,
+ cb_free);
+ if (0 == id) {
+ ERR("g_dbus_connection_signal_subscribe() Fail");
+ return id;
}
- presence->handle = presence_handle;
- presence->id = sub_id;
-
- icl_dbus_handle_containers = g_list_append(icl_dbus_handle_containers, presence);
+ icl_dbus_sub_ids = g_list_append(icl_dbus_sub_ids, GUINT_TO_POINTER(id));
- return presence;
+ return id;
}
-int icl_dbus_unsubscribe_presence(icl_handle_container_s *presence)
+void icl_dbus_unsubscribe_signal(unsigned int id)
{
- int ret;
- GError *error = NULL;
-
- RETV_IF(NULL == icl_dbus_object, IOTCON_ERROR_DBUS);
- if (0 == presence->id) {
- WARN("Invalid Presence handle");
- free(presence);
- return IOTCON_ERROR_NONE;
- }
-
- ic_dbus_call_unsubscribe_presence_sync(icl_dbus_object, presence->handle, &ret,
- NULL, &error);
- if (error) {
- ERR("ic_dbus_call_unsubscribe_presence_sync() Fail(%s)", error->message);
- g_error_free(error);
- return IOTCON_ERROR_DBUS;
- }
-
- g_dbus_connection_signal_unsubscribe(icl_dbus_conn, presence->id);
- icl_dbus_handle_containers = g_list_remove(icl_dbus_handle_containers, presence);
- free(presence);
+ g_dbus_connection_signal_unsubscribe(icl_dbus_conn, id);
- return ret;
+ icl_dbus_sub_ids = g_list_remove(icl_dbus_sub_ids, GUINT_TO_POINTER(id));
}
}
-static void _icl_dbus_handle_container_unsubscribe_signal()
-{
- GList *node;
-
- for (node = icl_dbus_handle_containers; node; node = node->next) {
- icl_handle_container_s *handle_container = node->data;
- g_dbus_connection_signal_unsubscribe(icl_dbus_conn, handle_container->id);
- handle_container->id = 0;
- }
-}
-
-
/* Unsubscribe all signals */
static void _icl_dbus_cleanup()
{
g_list_free_full(icl_dbus_sub_ids, _icl_dbus_sub_id_list_free);
icl_dbus_sub_ids = NULL;
-
- /* It makes subscription id be 0.
- * Handle containers should be freed. */
- _icl_dbus_handle_container_unsubscribe_signal();
-
- g_list_free(icl_dbus_handle_containers);
- icl_dbus_handle_containers = NULL;
}
}
+inline int icl_dbus_convert_daemon_error(int error)
+{
+ int ret;
+
+ if (IOTCON_ERROR_INVALID_PARAMETER == error)
+ ret = IOTCON_ERROR_SYSTEM;
+ else
+ ret = error;
+
+ return ret;
+}
+
+
unsigned int icl_dbus_start()
{
int ret;
#ifndef __IOT_CONNECTIVITY_MANAGER_DBUS_H__
#define __IOT_CONNECTIVITY_MANAGER_DBUS_H__
-typedef struct {
- int handle;
- unsigned int id;
-} icl_handle_container_s;
+#include "ic-dbus.h"
-int icl_dbus_config(const char *address, unsigned short port);
-icl_handle_container_s* icl_dbus_register_resource(const char *uri_path,
- iotcon_resource_types_h types,
- int ifaces,
- uint8_t properties,
- iotcon_request_handler_cb cb,
- void *user_data);
-int icl_dbus_unregister_resource(icl_handle_container_s *resource);
-
-int icl_dbus_bind_interface(icl_handle_container_s *resource, int iface);
-int icl_dbus_bind_type(icl_handle_container_s *resource, const char *type);
-int icl_dbus_bind_resource(icl_handle_container_s *parent,
- icl_handle_container_s *child);
-int icl_dbus_unbind_resource(icl_handle_container_s *parent,
- icl_handle_container_s *child);
-
-int icl_dbus_notify_list_of_observers(icl_handle_container_s *resource,
- struct icl_notify_msg *msg, iotcon_observers_h observers);
-int icl_dbus_notify_all(icl_handle_container_s *resource);
-int icl_dbus_send_response(struct icl_resource_response *response);
-
-int icl_dbus_find_resource(const char *host_address, const char *resource_type,
- iotcon_found_resource_cb cb, void *user_data);
-
-int icl_dbus_get(iotcon_client_h resource, iotcon_query_h query,
- iotcon_on_cru_cb cb, void *user_data);
-int icl_dbus_put(iotcon_client_h resource, iotcon_repr_h repr,
- iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data);
-int icl_dbus_post(iotcon_client_h resource, iotcon_repr_h repr,
- iotcon_query_h query, iotcon_on_cru_cb cb, void *user_data);
-int icl_dbus_delete(iotcon_client_h resource, iotcon_on_delete_cb cb,
- void *user_data);
-int icl_dbus_observer_start(iotcon_client_h resource,
- iotcon_observe_type_e observe_type,
- iotcon_query_h query,
- iotcon_on_observe_cb cb,
- void *user_data);
-int icl_dbus_observer_stop(icl_handle_container_s *observe);
-
-#ifdef DEVICE_INFO_IMPL /* not implemented in iotivity 0.9.1 */
-int icl_dbus_register_device_info(iotcon_device_info_s info);
-int icl_dbus_get_device_info(const char *host_address, iotcon_device_info_cb cb,
- void *user_data);
-#endif
+icDbus* icl_dbus_get_object();
+unsigned int icl_dbus_generate_signal_number();
-int icl_dbus_register_platform_info(iotcon_platform_info_s info);
-int icl_dbus_get_platform_info(const char *host_address, iotcon_platform_info_cb cb,
- void *user_data);
-
-int icl_dbus_start_presence(unsigned int time_to_live);
-int icl_dbus_stop_presence();
-icl_handle_container_s* icl_dbus_subscribe_presence(const char *host_address,
- const char *type, iotcon_presence_cb cb, void *user_data);
-int icl_dbus_unsubscribe_presence(icl_handle_container_s *presence);
+unsigned int icl_dbus_subscribe_signal(char *sig_name, void *cb_container, void *cb_free,
+ GDBusSignalCallback sig_handler);
+void icl_dbus_unsubscribe_signal(unsigned int id);
int icl_dbus_add_connection_changed_cb(iotcon_connection_changed_cb cb, void *user_data);
int icl_dbus_remove_connection_changed_cb(iotcon_connection_changed_cb cb,
void *user_data);
+int icl_dbus_convert_daemon_error(int error);
+
unsigned int icl_dbus_start();
void icl_dbus_stop();
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <glib.h>
#include "iotcon.h"
+#include "ic-utils.h"
#include "icl.h"
-#include "icl-ioty.h"
#include "icl-dbus.h"
+#include "icl-dbus-type.h"
+
+#ifdef DEVICE_INFO_IMPL /* not implemented in iotivity 0.9.1 */
+typedef struct {
+ iotcon_device_info_cb cb;
+ void *user_data;
+ unsigned int id;
+} icl_device_info_s;
+#endif
+
+typedef struct {
+ iotcon_platform_info_cb cb;
+ void *user_data;
+ unsigned int id;
+} icl_platform_info_s;
+
#ifdef DEVICE_INFO_IMPL /* not implemented in iotivity 0.9.1 */
/* The length of manufacturer_name should be less than and equal to 16.
int iotcon_register_device_info(iotcon_device_info_s device_info)
{
int ret;
+ GError *error = NULL;
+ GVariant *arg_info;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
if (device_info.manuf_name
&& (IOTCON_MANUFACTURER_NAME_LENGTH_MAX < strlen(device_info.manuf_name))) {
return IOTCON_ERROR_INVALID_PARAMETER;
}
- ret = icl_dbus_register_device_info(device_info);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_register_device_info() Fail(%d)", ret);
+ arg_info = icl_dbus_device_info_to_gvariant(&device_info);
+ ic_dbus_call_register_device_info_sync(icl_dbus_get_object(), arg_info, &ret,
+ NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_register_device_info_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_info);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
return ret;
}
+
+static void _icl_device_info_cb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ icl_device_info_s *cb_container = user_data;
+ iotcon_device_info_cb cb = cb_container->cb;
+
+ iotcon_device_info_s info = {0};
+
+ g_variant_get(parameters, "(&s&s&s&s&s&s&s&s&s&s&s&s)",
+ &info.name,
+ &info.host_name,
+ &info.uuid,
+ &info.content_type,
+ &info.version,
+ &info.manuf_name,
+ &info.manuf_url,
+ &info.model_number,
+ &info.date_of_manufacture,
+ &info.platform_ver,
+ &info.firmware_ver,
+ &info.support_url);
+
+ info.name = ic_utils_dbus_decode_str(info.name);
+ info.host_name = ic_utils_dbus_decode_str(info.host_name);
+ info.uuid = ic_utils_dbus_decode_str(info.uuid);
+ info.content_type = ic_utils_dbus_decode_str(info.content_type);
+ info.version = ic_utils_dbus_decode_str(info.version);
+ 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.firmware_ver = ic_utils_dbus_decode_str(info.firmware_ver);
+ info.support_url = ic_utils_dbus_decode_str(info.support_url);
+
+ if (cb)
+ cb(info, cb_container->user_data);
+}
+
+
int iotcon_get_device_info(const char *host_address, iotcon_device_info_cb cb,
void *user_data)
{
- int ret = IOTCON_ERROR_NONE;
+ int ret;
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ icl_device_info_s *cb_container;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == host_address, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
- ret = icl_dbus_get_device_info(host_address, cb, user_data);
+ signal_number = icl_dbus_generate_signal_number();
+
+ ic_dbus_call_get_device_info_sync(icl_dbus_get_object(), host_address,
+ signal_number, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_get_device_info_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
if (IOTCON_ERROR_NONE != ret) {
- ERR("icl_dbus_get_device_info() Fail(%d)", ret);
- return ret;
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_DEVICE,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_device_info_container_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
+ _icl_device_info_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ return IOTCON_ERROR_DBUS;
}
- return IOTCON_ERROR_NONE;
+ cb_container->id = sub_id;
+
+ return ret;
}
#endif
+
+/* The length of manufacturer_name should be less than and equal to 16.
+ * The length of manufacturer_url should be less than and equal to 32. */
API int iotcon_register_platform_info(iotcon_platform_info_s platform_info)
{
int ret;
+ GError *error = NULL;
+ GVariant *arg_info;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+
+ 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);
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
- ret = icl_dbus_register_platform_info(platform_info);
- if (IOTCON_ERROR_NONE != ret)
- ERR("ic_ioty_register_platform_info() Fail(%d)", ret);
+ if (platform_info.manuf_url
+ && (IOTCON_MANUFACTURER_URL_LENGTH_MAX < strlen(platform_info.manuf_url))) {
+ ERR("The length of manufacturer_url(%s) is invalid.", platform_info.manuf_url);
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
+
+ arg_info = icl_dbus_platform_info_to_gvariant(&platform_info);
+ ic_dbus_call_register_platform_info_sync(icl_dbus_get_object(), arg_info, &ret,
+ NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_register_platform_info_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_info);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
return ret;
}
+static void _icl_platform_info_cb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ 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);
+
+ 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);
+
+ if (cb)
+ cb(info, cb_container->user_data);
+}
+
+
API int iotcon_get_platform_info(const char *host_address, iotcon_platform_info_cb cb,
void *user_data)
{
- int ret = IOTCON_ERROR_NONE;
+ int ret;
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ icl_platform_info_s *cb_container;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == host_address, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
- ret = icl_dbus_get_platform_info(host_address, cb, user_data);
+ signal_number = icl_dbus_generate_signal_number();
+
+ ic_dbus_call_get_platform_info_sync(icl_dbus_get_object(), host_address,
+ signal_number, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_get_platform_info_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
if (IOTCON_ERROR_NONE != ret) {
- ERR("ic_ioty_get_platform_info() Fail(%d)", ret);
- return ret;
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
}
- return IOTCON_ERROR_NONE;
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PLATFORM,
+ signal_number);
+
+ cb_container = calloc(1, sizeof(icl_platform_info_s));
+ if (NULL == cb_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return IOTCON_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_container->cb = cb;
+ cb_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
+ _icl_platform_info_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ return IOTCON_ERROR_DBUS;
+ }
+
+ cb_container->id = sub_id;
+
+ return ret;
}
bool is_observable;
iotcon_resource_types_h types;
int ifaces;
- icl_handle_container_s *handle;
iotcon_request_handler_cb cb;
void *user_data;
+ unsigned int sub_id;
+ int handle;
iotcon_resource_h children[IOTCON_CONTAINED_RESOURCES_MAX];
};
--- /dev/null
+/*
+ * 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.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <glib.h>
+
+#include "iotcon.h"
+#include "icl.h"
+#include "icl-dbus.h"
+
+typedef struct icl_presence {
+ iotcon_presence_cb cb;
+ void *user_data;
+ unsigned int id;
+ int handle;
+} icl_presence_s;
+
+API int iotcon_start_presence(unsigned int time_to_live)
+{
+ FN_CALL;
+ int ret;
+ GError *error = NULL;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+
+ ic_dbus_call_start_presence_sync(icl_dbus_get_object(), time_to_live, &ret, NULL,
+ &error);
+ if (error) {
+ ERR("ic_dbus_call_start_presence_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ return IOTCON_ERROR_NONE;
+}
+
+
+API int iotcon_stop_presence()
+{
+ FN_CALL;
+ int ret;
+ GError *error = NULL;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+
+ ic_dbus_call_stop_presence_sync(icl_dbus_get_object(), &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_stop_presence_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ return IOTCON_ERROR_NONE;
+}
+
+
+static void _icl_presence_cb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ FN_CALL;
+ int res;
+ unsigned int nonce;
+ char *host_address;
+ icl_presence_s *presence_container = user_data;
+ iotcon_presence_cb cb = presence_container->cb;
+
+ g_variant_get(parameters, "(iu&s)", &res, &nonce, &host_address);
+
+ if (cb)
+ cb(res, nonce, host_address, presence_container->user_data);
+}
+
+
+static void _icl_presence_conn_cleanup(icl_presence_s *presence)
+{
+ presence->id = 0;
+ presence->handle = 0;
+}
+
+
+/* The length of resource_type should be less than or equal to 61. */
+API iotcon_presence_h iotcon_subscribe_presence(const char *host_address,
+ const char *resource_type, iotcon_presence_cb cb, void *user_data)
+{
+ GError *error = NULL;
+ unsigned int sub_id;
+ int signal_number;
+ char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
+ icl_presence_s *presence_container;
+
+ RETV_IF(NULL == icl_dbus_get_object(), NULL);
+ RETV_IF(NULL == host_address, NULL);
+ RETV_IF(NULL == cb, NULL);
+ if (resource_type && (IOTCON_RESOURCE_TYPE_LENGTH_MAX < strlen(resource_type))) {
+ ERR("The length of resource_type(%s) is invalid", resource_type);
+ return NULL;
+ }
+
+ signal_number = icl_dbus_generate_signal_number();
+
+ presence_container = calloc(1, sizeof(icl_presence_s));
+ if (NULL == presence_container) {
+ ERR("calloc() Fail(%d)", errno);
+ return NULL;
+ }
+
+ if (NULL == resource_type)
+ resource_type = "";
+
+ ic_dbus_call_subscribe_presence_sync(icl_dbus_get_object(), host_address,
+ resource_type, signal_number, &(presence_container->handle), NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_subscribe_presence_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ free(presence_container);
+ return NULL;
+ }
+
+ if (0 == presence_container->handle) {
+ ERR("iotcon-daemon Fail");
+ free(presence_container);
+ return NULL;
+ }
+
+ snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PRESENCE,
+ signal_number);
+
+ presence_container->cb = cb;
+ presence_container->user_data = user_data;
+
+ sub_id = icl_dbus_subscribe_signal(signal_name, presence_container,
+ _icl_presence_conn_cleanup, _icl_presence_cb);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ free(presence_container);
+ return NULL;
+ }
+
+ presence_container->id = sub_id;
+
+ return presence_container;
+}
+
+
+API int iotcon_unsubscribe_presence(iotcon_presence_h presence)
+{
+ FN_CALL;
+ int ret;
+ GError *error = NULL;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == presence, IOTCON_ERROR_INVALID_PARAMETER);
+
+ if (0 == presence->id) {
+ WARN("Invalid Presence handle");
+ free(presence);
+ return IOTCON_ERROR_NONE;
+ }
+
+ ic_dbus_call_unsubscribe_presence_sync(icl_dbus_get_object(), presence->handle,
+ &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_unsubscribe_presence_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ icl_dbus_unsubscribe_signal(presence->id);
+
+ free(presence);
+
+ return IOTCON_ERROR_NONE;
+}
+
#include "ic-utils.h"
#include "icl.h"
#include "icl-dbus.h"
+#include "icl-dbus-type.h"
#include "icl-ioty.h"
#include "icl-repr.h"
#include "icl-options.h"
{
FN_CALL;
int ret;
+ GError *error = NULL;
+ GVariant *arg_response;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == resp, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == resp->repr, IOTCON_ERROR_INVALID_PARAMETER);
- ret = icl_dbus_send_response(resp);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_send_response() Fail(%d)", ret);
+ arg_response = icl_dbus_response_to_gvariant(resp);
+ ic_dbus_call_send_response_sync(icl_dbus_get_object(), arg_response, &ret, NULL,
+ &error);
+ if (error) {
+ ERR("ic_dbus_call_send_response_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(arg_response);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
- return ret;
+ return IOTCON_ERROR_NONE;
}
*/
#include <stdbool.h>
#include <stdint.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "iotcon.h"
#include "ic-utils.h"
#include "icl-resource-types.h"
+#include "icl-request.h"
#include "icl-ioty.h"
#include "icl-repr.h"
#include "icl-dbus.h"
+#include "icl-dbus-type.h"
#include "icl.h"
/**
}
+static void _icl_request_handler(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ GVariantIter *options;
+ unsigned short option_id;
+ char *option_data;
+ GVariantIter *query;
+ char *key = NULL;
+ char *value = NULL;
+ char *repr_json;
+ int request_handle;
+ int resource_handle;
+ struct icl_resource_request request = {0};
+ iotcon_resource_h resource = user_data;
+ iotcon_request_handler_cb cb = resource->cb;
+
+ g_variant_get(parameters, "(ia(qs)a(ss)ii&sii)",
+ &request.types,
+ &options,
+ &query,
+ &request.observation_info.action,
+ &request.observation_info.observer_id,
+ &repr_json,
+ &request_handle,
+ &resource_handle);
+
+ if (g_variant_iter_n_children(options)) {
+ request.header_options = iotcon_options_new();
+ while (g_variant_iter_loop(options, "(q&s)", &option_id, &option_data))
+ iotcon_options_insert(request.header_options, option_id, option_data);
+ }
+ g_variant_iter_free(options);
+
+ if (g_variant_iter_n_children(query)) {
+ request.query = iotcon_query_new();
+ while (g_variant_iter_loop(query, "(&s&s)", &key, &value))
+ iotcon_query_insert(request.query, key, value);
+ }
+ g_variant_iter_free(query);
+
+ request.request_handle = GINT_TO_POINTER(request_handle);
+ request.resource_handle = GINT_TO_POINTER(resource_handle);
+
+ if (ic_utils_dbus_decode_str(repr_json)) {
+ request.repr = icl_repr_create_repr(repr_json);
+ if (NULL == request.repr) {
+ ERR("icl_repr_create_repr() Fail");
+ if (request.query)
+ iotcon_query_free(request.query);
+ if (request.header_options)
+ iotcon_options_free(request.header_options);
+ return;
+ }
+ }
+
+ /* TODO remove request.uri */
+ request.uri_path = "temp_uri_path";
+
+ if (cb)
+ cb(resource, &request, resource->user_data);
+
+ /* To avoid unnecessary ERR log (repr could be NULL) */
+ if (request.repr)
+ iotcon_repr_free(request.repr);
+ if (request.query)
+ iotcon_query_free(request.query);
+ if (request.header_options)
+ iotcon_options_free(request.header_options);
+}
+
+
+static void _icl_resource_conn_cleanup(iotcon_resource_h resource)
+{
+ resource->sub_id = 0;
+ resource->handle = 0;
+}
+
+
/* The length of uri_path should be less than or equal to 36. */
API iotcon_resource_h iotcon_register_resource(const char *uri_path,
iotcon_resource_types_h res_types,
void *user_data)
{
FN_CALL;
+ int signal_number;
+ unsigned int sub_id;
+ GError *error = NULL;
+ const gchar **types;
+ char sig_name[IC_DBUS_SIGNAL_LENGTH];
iotcon_resource_h resource;
+ RETV_IF(NULL == icl_dbus_get_object(), NULL);
RETV_IF(NULL == uri_path, NULL);
+ RETVM_IF(IOTCON_URI_PATH_LENGTH_MAX < strlen(uri_path), NULL, "Invalid uri_path(%s)",
+ uri_path);
RETV_IF(NULL == res_types, NULL);
RETV_IF(NULL == cb, NULL);
- RETVM_IF(IOTCON_URI_LENGTH_MAX < strlen(uri_path), NULL, "Invalid uri_path(%s)",
- uri_path);
resource = calloc(1, sizeof(struct icl_resource));
if (NULL == resource) {
return NULL;
}
- resource->handle = icl_dbus_register_resource(uri_path, res_types, ifaces, properties, cb,
- user_data);
- if (NULL == resource->handle) {
- ERR("icl_dbus_register_resource() Fail");
+ types = icl_dbus_resource_types_to_array(res_types);
+ if (NULL == types) {
+ ERR("icl_dbus_resource_types_to_array() Fail");
+ free(resource);
+ return NULL;
+ }
+
+ signal_number = icl_dbus_generate_signal_number();
+
+ ic_dbus_call_register_resource_sync(icl_dbus_get_object(), uri_path, types, ifaces,
+ properties, signal_number, &(resource->handle), NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_register_resource_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ free(types);
+ free(resource);
+ return NULL;
+ }
+ free(types);
+
+ if (0 == resource->handle) {
+ ERR("iotcon-daemon Fail");
free(resource);
return NULL;
}
resource->cb = cb;
resource->user_data = user_data;
- resource->uri_path = ic_utils_strdup(uri_path);
resource->types = icl_resource_types_ref(res_types);
+ resource->uri_path = ic_utils_strdup(uri_path);
resource->ifaces = ifaces;
resource->is_observable = properties & IOTCON_OBSERVABLE;
+ snprintf(sig_name, sizeof(sig_name), "%s_%u", IC_DBUS_SIGNAL_REQUEST_HANDLER,
+ signal_number);
+
+ sub_id = icl_dbus_subscribe_signal(sig_name, resource, _icl_resource_conn_cleanup,
+ _icl_request_handler);
+ if (0 == sub_id) {
+ ERR("icl_dbus_subscribe_signal() Fail");
+ free(resource);
+ return NULL;
+ }
+
+ resource->sub_id = sub_id;
+
return resource;
}
-API void iotcon_unregister_resource(iotcon_resource_h resource)
+API int iotcon_unregister_resource(iotcon_resource_h resource)
{
FN_CALL;
int ret;
+ GError *error = NULL;
+
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
+ RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
- RET_IF(NULL == resource);
+ if (0 == resource->sub_id) {
+ WARN("Invalid Resource handle");
+ iotcon_resource_types_free(resource->types);
+ free(resource->uri_path);
+ free(resource);
+ return IOTCON_ERROR_NONE;
+ }
+
+ ic_dbus_call_unregister_resource_sync(icl_dbus_get_object(), resource->handle,
+ &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_unregister_resource_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
- ret = icl_dbus_unregister_resource(resource->handle);
if (IOTCON_ERROR_NONE != ret) {
- ERR("icl_dbus_unregister_resource() Fail(%d)", ret);
- return;
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
}
- resource->handle = NULL;
- free(resource->uri_path);
- resource->uri_path = NULL;
- free(resource->types);
- resource->types = NULL;
+ icl_dbus_unsubscribe_signal(resource->sub_id);
+ iotcon_resource_types_free(resource->types);
+ free(resource->uri_path);
free(resource);
+
+ return IOTCON_ERROR_NONE;
}
{
FN_CALL;
int ret;
+ GError *error = NULL;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ if (0 == resource->sub_id) {
+ ERR("Invalid Resource handle");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
- ret = icl_dbus_bind_interface(resource->handle, iface);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_bind_iface() Fail(%d)", ret);
+ ic_dbus_call_bind_interface_sync(icl_dbus_get_object(), resource->handle,
+ iface, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_bind_interface_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
return ret;
}
{
FN_CALL;
int ret;
+ GError *error = NULL;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == resource_type, IOTCON_ERROR_INVALID_PARAMETER);
if (IOTCON_RESOURCE_TYPE_LENGTH_MAX < strlen(resource_type)) {
- ERR("The length of resource_type(%s) is invalid", resource_type);
+ ERR("Invalid resource_type(%s)", resource_type);
return IOTCON_ERROR_INVALID_PARAMETER;
}
- ret = icl_dbus_bind_type(resource->handle, resource_type);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_bind_type() Fail(%d)", ret);
+ if (0 == resource->sub_id) {
+ ERR("Invalid Resource handle");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
+
+ ic_dbus_call_bind_type_sync(icl_dbus_get_object(), resource->handle, resource_type,
+ &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_bind_type_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
return ret;
}
FN_CALL;
int ret;
int i;
+ GError *error = NULL;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == parent, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == child, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(parent == child, IOTCON_ERROR_INVALID_PARAMETER);
+ if (0 == parent->sub_id) {
+ ERR("Invalid Resource handle(parent)");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
+ if (0 == child->sub_id) {
+ ERR("Invalid Resource handle(child)");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
+
for (i = 0; i < IOTCON_CONTAINED_RESOURCES_MAX; i++) {
if (child == parent->children[i]) {
ERR("Child resource was already bound to parent resource.");
for (i = 0; i < IOTCON_CONTAINED_RESOURCES_MAX; i++) {
if (NULL == parent->children[i]) {
- ret = icl_dbus_bind_resource(parent->handle, child->handle);
- if (IOTCON_ERROR_NONE == ret)
- parent->children[i] = child;
- else
- ERR("icl_dbus_bind_resource() Fail(%d)", ret);
-
- return ret;
+ ic_dbus_call_bind_resource_sync(icl_dbus_get_object(), parent->handle,
+ child->handle, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_bind_resource_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ parent->children[i] = child;
+
+ return IOTCON_ERROR_NONE;
}
}
{
int ret;
int i;
+ GError *error = NULL;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == parent, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == child, IOTCON_ERROR_INVALID_PARAMETER);
- ret = icl_dbus_unbind_resource(parent->handle, child->handle);
- if (IOTCON_ERROR_NONE == ret) {
- for (i = 0; i < IOTCON_CONTAINED_RESOURCES_MAX; i++) {
+ if (0 == parent->sub_id) {
+ ERR("Invalid Resource handle(parent)");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
+ if (0 == child->sub_id) {
+ ERR("Invalid Resource handle(child)");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
- if (child == parent->children[i])
- parent->children[i] = NULL;
- }
- } else {
- ERR("icl_dbus_unbind_res() Fail(%d)", ret);
+ ic_dbus_call_unbind_resource_sync(icl_dbus_get_object(), parent->handle,
+ child->handle, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_unbind_resource_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
}
- return ret;
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ for (i = 0; i < IOTCON_CONTAINED_RESOURCES_MAX; i++) {
+ if (child == parent->children[i])
+ parent->children[i] = NULL;
+ }
+
+ return IOTCON_ERROR_NONE;
}
/* The content of the resource should not be freed by user. */
-API int iotcon_resource_get_types(iotcon_resource_h resource, iotcon_resource_types_h *types)
+API int iotcon_resource_get_types(iotcon_resource_h resource,
+ iotcon_resource_types_h *types)
{
RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == types, IOTCON_ERROR_INVALID_PARAMETER);
}
-API int iotcon_start_presence(unsigned int time_to_live)
-{
- FN_CALL;
- int ret;
-
- ret = icl_dbus_start_presence(time_to_live);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_start_presence() Fail(%d)", ret);
-
- return ret;
-}
-
-
-API int iotcon_stop_presence()
-{
- FN_CALL;
- int ret;
-
- ret = icl_dbus_stop_presence();
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_stop_presence() Fail(%d)", ret);
-
- return ret;
-}
-
-
-/* The length of resource_type should be less than or equal to 61. */
-API iotcon_presence_h iotcon_subscribe_presence(const char *host_address,
- const char *resource_type, iotcon_presence_cb cb, void *user_data)
-{
- iotcon_presence_h handle;
-
- RETV_IF(NULL == host_address, NULL);
- RETV_IF(NULL == cb, NULL);
- if (resource_type && (IOTCON_RESOURCE_TYPE_LENGTH_MAX < strlen(resource_type))) {
- ERR("The length of resource_type(%s) is invalid", resource_type);
- return NULL;
- }
-
- if (NULL == resource_type)
- resource_type = "";
-
- handle = icl_dbus_subscribe_presence(host_address, resource_type, cb, user_data);
- if (NULL == handle)
- ERR("icl_dbus_subscribe_presence() Fail");
-
- return handle;
-}
-
-
-API int iotcon_unsubscribe_presence(iotcon_presence_h handle)
-{
- FN_CALL;
- int ret;
-
- RETV_IF(NULL == handle, IOTCON_ERROR_INVALID_PARAMETER);
-
- ret = icl_dbus_unsubscribe_presence(handle);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_unsubscribe_presence() Fail(%d)", ret);
-
- return ret;
-}
-
-
-
API iotcon_notimsg_h iotcon_notimsg_new(iotcon_repr_h repr, iotcon_interface_e iface)
{
iotcon_notimsg_h msg;
iotcon_observers_h observers)
{
int ret;
+ GError *error = NULL;
+ GVariant *noti_msg;
+ GVariant *obs;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
RETV_IF(NULL == observers, IOTCON_ERROR_INVALID_PARAMETER);
- ret = icl_dbus_notify_list_of_observers(resource->handle, msg, observers);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_notify_list_of_observers() Fail(%d)", ret);
+ if (0 == resource->sub_id) {
+ ERR("Invalid Resource handle");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
- return ret;
+ noti_msg = icl_dbus_notimsg_to_gvariant(msg);
+ if (NULL == noti_msg) {
+ ERR("icl_dbus_notimsg_to_gvariant() Fail");
+ return IOTCON_ERROR_REPRESENTATION;
+ }
+ obs = icl_dbus_observers_to_gvariant(observers);
+
+ ic_dbus_call_notify_list_of_observers_sync(icl_dbus_get_object(), resource->handle,
+ noti_msg, obs, &ret, NULL, &error);
+ if (error) {
+ ERR("ic_dbus_call_notify_list_of_observers_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ g_variant_unref(obs);
+ g_variant_unref(noti_msg);
+ return IOTCON_ERROR_DBUS;
+ }
+
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ return IOTCON_ERROR_NONE;
}
API int iotcon_notify_all(iotcon_resource_h resource)
{
int ret;
+ GError *error = NULL;
+ RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
+ if (0 == resource->sub_id) {
+ ERR("Invalid Resource handle");
+ return IOTCON_ERROR_INVALID_PARAMETER;
+ }
- ret = icl_dbus_notify_all(resource->handle);
- if (IOTCON_ERROR_NONE != ret)
- ERR("icl_dbus_notify_all() Fail(%d)", ret);
+ ic_dbus_call_notify_all_sync(icl_dbus_get_object(), resource->handle, &ret, NULL,
+ &error);
+ if (error) {
+ ERR("ic_dbus_call_notify_all_sync() Fail(%s)", error->message);
+ g_error_free(error);
+ return IOTCON_ERROR_DBUS;
+ }
- return ret;
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon-daemon Fail(%d)", ret);
+ return icl_dbus_convert_daemon_error(ret);
+ }
+
+ return IOTCON_ERROR_NONE;
}
#define IOTCON_OPTIONS_MAX 2
#define IOTCON_OPTION_DATA_LENGTH_MAX 16
-#define IOTCON_URI_LENGTH_MAX 36
+#define IOTCON_URI_PATH_LENGTH_MAX 36
#define IOTCON_QUERY_LENGTH_MAX 64
typedef struct icl_notify_msg* iotcon_notimsg_h;
-typedef void* iotcon_presence_h;
+typedef struct icl_presence* iotcon_presence_h;
#ifdef DEVICE_INFO_IMPL /* not implemented in iotivity 0.9.1 */
typedef struct _device_info {
int iotcon_remove_connection_changed_cb(iotcon_connection_changed_cb cb,
void *user_data);
-typedef void (*iotcon_request_handler_cb)(iotcon_request_h request, void *user_data);
+typedef void (*iotcon_request_handler_cb)(iotcon_resource_h resource,
+ iotcon_request_h request, void *user_data);
iotcon_resource_h iotcon_register_resource(const char *uri_path,
iotcon_resource_types_h res_types,
int ifaces,
uint8_t properties,
iotcon_request_handler_cb cb,
void *user_data);
-void iotcon_unregister_resource(iotcon_resource_h resource_handle);
+int iotcon_unregister_resource(iotcon_resource_h resource_handle);
int iotcon_bind_interface(iotcon_resource_h resource,
iotcon_interface_e iface);
iotcon_client_h iotcon_client_new(const char *host, const char *uri_path, bool is_observable,
iotcon_resource_types_h resource_types, int resource_interfaces);
void iotcon_client_free(iotcon_client_h resource);
-iotcon_client_h iotcon_client_clone(iotcon_client_h resource);
+iotcon_client_h iotcon_client_ref(iotcon_client_h resource);
-typedef void (*iotcon_on_observe_cb)(iotcon_options_h header_options, iotcon_repr_h repr,
- int response_result, int sequence_number, void *user_data);
+typedef void (*iotcon_on_observe_cb)(iotcon_client_h resource,
+ iotcon_repr_h repr,
+ iotcon_options_h header_options,
+ int response_result,
+ int sequence_number,
+ void *user_data);
int iotcon_observer_start(iotcon_client_h resource,
iotcon_observe_type_e observe_type,
iotcon_query_h query,
iotcon_observers_h observers);
int iotcon_notify_all(iotcon_resource_h resource);
-typedef void (*iotcon_on_cru_cb)(iotcon_repr_h repr, iotcon_options_h header_options,
- int response_result, void *user_data);
+typedef void (*iotcon_on_cru_cb)(iotcon_client_h resource, iotcon_repr_h repr,
+ iotcon_options_h options, int response_result, void *user_data);
int iotcon_get(iotcon_client_h resource, iotcon_query_h query,
iotcon_on_cru_cb cb, void *user_data);
int iotcon_post(iotcon_client_h resource, iotcon_repr_h repr, iotcon_query_h query,
iotcon_on_cru_cb cb, void *user_data);
-typedef void (*iotcon_on_delete_cb)(iotcon_options_h header_options, int response_result,
- void *user_data);
+typedef void (*iotcon_on_delete_cb)(iotcon_client_h resource, iotcon_options_h options,
+ int response_result, void *user_data);
int iotcon_delete(iotcon_client_h resource, iotcon_on_delete_cb cb,
void *user_data);
static const char* const door_uri_path = "/a/door";
static char *door_resource_sid;
-static iotcon_client_h door_resource = NULL;
-
void _print_repr_info(iotcon_repr_h repr)
{
if (0 < iotcon_repr_get_keys_count(repr))
DBG("rep : \n%s", iotcon_repr_generate_json(repr));
}
-static void _on_observe(iotcon_options_h header_options, iotcon_repr_h recv_repr,
- int response_result, int sequence_number, void *user_data)
+static void _on_observe(iotcon_client_h resource,
+ iotcon_repr_h recv_repr,
+ iotcon_options_h header_options,
+ int response_result,
+ int sequence_number,
+ void *user_data)
{
INFO("_on_observe");
i++;
if (2 == i)
- iotcon_observer_stop(door_resource);
+ iotcon_observer_stop(resource);
}
-static void _on_delete(iotcon_options_h header_options, int response_result,
- void *user_data)
+static void _on_delete(iotcon_client_h resource, iotcon_options_h header_options,
+ int response_result, void *user_data)
{
+ iotcon_client_h door_resource = user_data;
+
RETM_IF(IOTCON_RESPONSE_RESULT_OK != response_result
&& IOTCON_RESPONSE_RESULT_RESOURCE_DELETED != response_result,
"_on_delete Response error(%d)", response_result);
/* delete callback operations */
iotcon_observer_start(door_resource, IOTCON_OBSERVE_ALL, NULL, _on_observe, NULL);
+ iotcon_client_free(door_resource);
}
-static void _on_post(iotcon_repr_h recv_repr, iotcon_options_h header_options,
- int response_result, void *user_data)
+static void _on_post(iotcon_client_h resource, iotcon_repr_h recv_repr,
+ iotcon_options_h header_options, int response_result, void *user_data)
{
int ret;
char *created_uri_path = NULL;
iotcon_client_h new_door_resource = NULL;
+ iotcon_client_h door_resource = NULL;
char *host = NULL;
iotcon_resource_types_h types = NULL;
int ifaces = 0;
DBG("New resource created : %s", created_uri_path);
- ret = iotcon_client_get_host(door_resource, &host);
+ ret = iotcon_client_get_host(resource, &host);
if (IOTCON_ERROR_NONE != ret) {
ERR("iotcon_client_get_host() Fail(%d)", ret);
return;
}
- ret = iotcon_client_get_types(door_resource, &types);
+ ret = iotcon_client_get_types(resource, &types);
if (IOTCON_ERROR_NONE != ret) {
ERR("iotcon_client_get_types() Fail(%d)", ret);
return;
}
- ret = iotcon_client_get_interfaces(door_resource, &ifaces);
+ ret = iotcon_client_get_interfaces(resource, &ifaces);
if (IOTCON_ERROR_NONE != ret) {
ERR("iotcon_client_get_ifaces() Fail(%d)", ret);
return;
}
new_door_resource = iotcon_client_new(host, created_uri_path, true, types, ifaces);
+ door_resource = iotcon_client_ref(resource);
- iotcon_delete(new_door_resource, _on_delete, NULL);
+ iotcon_delete(new_door_resource, _on_delete, door_resource);
iotcon_client_free(new_door_resource);
}
-static void _on_put(iotcon_repr_h recv_repr, iotcon_options_h header_options,
- int response_result, void *user_data)
+static void _on_put(iotcon_client_h resource, iotcon_repr_h recv_repr,
+ iotcon_options_h header_options, int response_result, void *user_data)
{
RETM_IF(IOTCON_RESPONSE_RESULT_OK != response_result, "_on_put Response error(%d)",
response_result);
iotcon_repr_h send_repr = iotcon_repr_new();
/* send POST request */
- iotcon_post(door_resource, send_repr, NULL, _on_post, NULL);
+ iotcon_post(resource, send_repr, NULL, _on_post, NULL);
iotcon_repr_free(send_repr);
}
-static void _on_get(iotcon_repr_h recv_repr, iotcon_options_h header_options,
- int response_result, void *user_data)
+static void _on_get(iotcon_client_h resource, iotcon_repr_h recv_repr,
+ iotcon_options_h header_options, int response_result, void *user_data)
{
RETM_IF(IOTCON_RESPONSE_RESULT_OK != response_result, "_on_get Response error(%d)",
response_result);
iotcon_repr_set_bool(send_repr, "opened", true);
/* send PUT request */
- iotcon_put(door_resource, send_repr, NULL, _on_put, NULL);
+ iotcon_put(resource, send_repr, NULL, _on_put, NULL);
iotcon_repr_free(send_repr);
}
iotcon_subscribe_presence(resource_host, "core.door", _presence_handler, NULL);
if (TEST_STR_EQUAL == strcmp(door_uri_path, resource_uri_path)) {
- door_resource = iotcon_client_clone(resource);
-
iotcon_query_h query = iotcon_query_new();
+ ret = iotcon_query_insert(query, "query_key", "query_value");
+ if (IOTCON_ERROR_NONE != ret) {
+ ERR("iotcon_query_insert() Fail(%d)", ret);
+ return;
+ }
/* send GET Request */
iotcon_get(resource, query, _on_get, NULL);
static door_resource_s my_door;
static bool resource_created = false;
-static iotcon_resource_h door_handle;
-static iotcon_resource_h new_door_handle;
-
static iotcon_observers_h observers = NULL;
-static void _request_handler(iotcon_request_h request, void *user_data);
+static void _request_handler(iotcon_resource_h resource, iotcon_request_h request,
+ void *user_data);
-static iotcon_error_e _set_door_resource()
+static int _set_door_resource()
{
my_door.state = false;
my_door.type = strdup("core.door");
iotcon_repr_free(resp_repr);
}
-static void _request_handler_post(iotcon_response_h response)
+static gboolean _notifier(gpointer user_data)
{
+ static int i = 0;
+ if ((5 == i++) || !(observers))
+ return FALSE;
+
+ INFO("NOTIFY!");
+ iotcon_repr_h repr = iotcon_repr_new();
+ iotcon_notimsg_h msg = iotcon_notimsg_new(repr, IOTCON_INTERFACE_DEFAULT);
+ iotcon_notify_list_of_observers(user_data, msg, observers);
+
+ iotcon_notimsg_free(msg);
+ iotcon_repr_free(repr);
+
+ return TRUE;
+}
+
+static void _request_handler_post(iotcon_resource_h resource, iotcon_response_h response)
+{
+ iotcon_resource_h new_door_handle;
iotcon_repr_h resp_repr = NULL;
INFO("POST request");
_send_response(response, resp_repr, IOTCON_RESPONSE_RESULT_RESOURCE_CREATED);
iotcon_repr_free(resp_repr);
-}
-static gboolean _notifier(gpointer user_data)
-{
- static int i = 0;
- if ((5 == i++) || !(observers))
- return FALSE;
-
- INFO("NOTIFY!");
- iotcon_repr_h repr = iotcon_repr_new();
- iotcon_notimsg_h msg = iotcon_notimsg_new(repr, IOTCON_INTERFACE_DEFAULT);
- iotcon_notify_list_of_observers(user_data, msg, observers);
-
- iotcon_notimsg_free(msg);
- iotcon_repr_free(repr);
-
- return TRUE;
+ /* add observe */
+ g_timeout_add_seconds(5, _notifier, resource);
}
-static void _request_handler_delete(iotcon_response_h response)
+static void _request_handler_delete(iotcon_resource_h resource,
+ iotcon_response_h response)
{
iotcon_repr_h resp_repr = NULL;
iotcon_response_result_e result = IOTCON_RESPONSE_RESULT_OK;
INFO("DELETE request");
- iotcon_unregister_resource(new_door_handle);
+ iotcon_unregister_resource(resource);
resp_repr = iotcon_repr_new();
result = IOTCON_RESPONSE_RESULT_RESOURCE_DELETED;
_send_response(response, resp_repr, result);
- /* add observe */
- g_timeout_add_seconds(5, _notifier, door_handle);
-
iotcon_repr_free(resp_repr);
}
return IOTCON_FUNC_CONTINUE;
}
-static void _request_handler(iotcon_request_h request, void *user_data)
+static void _request_handler(iotcon_resource_h resource, iotcon_request_h request,
+ void *user_data)
{
int ret;
int types;
_request_handler_put(request, response);
else if (IOTCON_REQUEST_POST & types)
- _request_handler_post(response);
+ _request_handler_post(resource, response);
else if (IOTCON_REQUEST_DELETE & types)
- _request_handler_delete(response);
+ _request_handler_delete(resource, response);
iotcon_response_free(response);
{
FN_CALL;
GMainLoop *loop;
+ iotcon_resource_h door_handle;
iotcon_interface_e door_interfaces = IOTCON_INTERFACE_DEFAULT;
iotcon_resource_property_e resource_properties = IOTCON_DISCOVERABLE;
- iotcon_error_e iotcon_error = IOTCON_ERROR_NONE;
+ int ret = IOTCON_ERROR_NONE;
loop = g_main_loop_new(NULL, FALSE);
iotcon_initialize();
/* set local door resource */
- iotcon_error = _set_door_resource();
- if (IOTCON_ERROR_NONE != iotcon_error) {
+ ret = _set_door_resource();
+ if (IOTCON_ERROR_NONE != ret) {
ERR("_set_door_resource() Fail");
return -1;
}
static const char* const room_uri_path = "/a/room";
static char *room_resource_sid;
-static iotcon_client_h room_resource = NULL;
-
static int _get_int_list_fn(int pos, const int value, void *user_data)
{
DBG("%d°C", value);
}
}
-static void _on_get_2nd(iotcon_repr_h recv_repr, iotcon_options_h header_options,
- int response_result, void *user_data)
+static void _on_get_2nd(iotcon_client_h resource, iotcon_repr_h recv_repr,
+ iotcon_options_h header_options, int response_result, void *user_data)
{
_on_get(recv_repr, response_result);
}
-static void _on_get_1st(iotcon_repr_h recv_repr, iotcon_options_h header_options,
- int response_result, void *user_data)
+static void _on_get_1st(iotcon_client_h resource, iotcon_repr_h recv_repr,
+ iotcon_options_h header_options, int response_result, void *user_data)
{
iotcon_query_h query_params;
iotcon_query_insert(query_params, "if", "oc.mi.b");
/* send GET request again with BATCH interface */
- iotcon_get(room_resource, query_params, _on_get_2nd, NULL);
+ iotcon_get(resource, query_params, _on_get_2nd, NULL);
iotcon_query_free(query_params);
}
iotcon_resource_types_foreach(resource_types, _get_res_type_fn, resource_uri_path);
if (TEST_STR_EQUAL == strcmp(room_uri_path, resource_uri_path)) {
- /* copy resource to use elsewhere */
- room_resource = iotcon_client_clone(resource);
-
/* send GET request */
iotcon_get(resource, NULL, _on_get_1st, NULL);
}
#include <iotcon.h>
#include "test.h"
-static void _room_request_handler(iotcon_request_h request, void *user_data);
+static void _room_request_handler(iotcon_resource_h resource, iotcon_request_h request,
+ void *user_data);
static void _send_response(iotcon_response_h response, iotcon_repr_h repr,
iotcon_interface_e interface)
}
-static void _light_request_handler(iotcon_request_h request, void *user_data)
+static void _light_request_handler(iotcon_resource_h resource, iotcon_request_h request,
+ void *user_data)
{
int ret;
int types;
iotcon_response_free(response);
}
-static void _room_request_handler(iotcon_request_h request, void *user_data)
+static void _room_request_handler(iotcon_resource_h resource, iotcon_request_h request,
+ void *user_data)
{
int ret;
int types;
GMainLoop *loop;
iotcon_resource_types_h room_rtypes = NULL;
iotcon_resource_types_h light_rtypes = NULL;
- iotcon_error_e iotcon_error = IOTCON_ERROR_NONE;
+ int ret = IOTCON_ERROR_NONE;
loop = g_main_loop_new(NULL, FALSE);
return -1;
}
- iotcon_error = iotcon_bind_resource(room_handle, light_handle);
- if (IOTCON_ERROR_NONE != iotcon_error) {
+ ret = iotcon_bind_resource(room_handle, light_handle);
+ if (IOTCON_ERROR_NONE != ret) {
ERR("iotcon_bind_resource() Fail");
return -1;
}