fix the problem when structures are destoried, repeatedly
[platform/core/iot/iotcon.git] / lib / icl-resource.c
index 56327e4..b077a6c 100644 (file)
@@ -57,11 +57,11 @@ static void _icl_request_handler(GDBusConnection *connection,
        g_variant_get(parameters, "(siia(qs)a(ss)iiavxx)",
                        &request.host_address,
                        &request.connectivity_type,
-                       &request.types,
+                       &request.type,
                        &options,
                        &query,
                        &request.observation_info.action,
-                       &request.observation_info.observer_id,
+                       &request.observation_info.observe_id,
                        &repr_iter,
                        &request.oic_request_h,
                        &request.oic_resource_h);
@@ -111,15 +111,12 @@ static void _icl_request_handler(GDBusConnection *connection,
        g_variant_iter_free(repr_iter);
 
        /* for iotcon_resource_notify */
-       if (IOTCON_REQUEST_OBSERVE & request.types) {
-               int observer_id = request.observation_info.observer_id;
-               if (IOTCON_OBSERVE_REGISTER == request.observation_info.action) {
-                       if (NULL == resource->observers)
-                               iotcon_observers_create(&resource->observers);
-                       iotcon_observers_add(resource->observers, observer_id);
-               } else if (IOTCON_OBSERVE_DEREGISTER == request.observation_info.action) {
-                       iotcon_observers_remove(resource->observers, observer_id);
-               }
+       if (IOTCON_OBSERVE_REGISTER == request.observation_info.action) {
+               if (NULL == resource->observers)
+                       iotcon_observers_create(&resource->observers);
+               iotcon_observers_add(resource->observers, request.observation_info.observe_id);
+       } else if (IOTCON_OBSERVE_DEREGISTER == request.observation_info.action) {
+               iotcon_observers_remove(resource->observers, request.observation_info.observe_id);
        }
 
        if (cb)
@@ -161,12 +158,13 @@ API int iotcon_resource_create(const char *uri_path,
                void *user_data,
                iotcon_resource_h *resource_handle)
 {
+       int ret;
        unsigned int sub_id;
-       GError *error = NULL;
        const gchar **types;
+       GError *error = NULL;
        iotcon_resource_h resource;
-       int signal_number, ret;
-       char sig_name[IC_DBUS_SIGNAL_LENGTH];
+       int64_t signal_number;
+       char signal_name[IC_DBUS_SIGNAL_LENGTH];
 
        RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
        RETV_IF(NULL == uri_path, IOTCON_ERROR_INVALID_PARAMETER);
@@ -188,10 +186,8 @@ API int iotcon_resource_create(const char *uri_path,
                return IOTCON_ERROR_OUT_OF_MEMORY;
        }
 
-       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);
+                       properties, &signal_number, &(resource->handle), NULL, &error);
        if (error) {
                ERR("ic_dbus_call_register_resource_sync() Fail(%s)", error->message);
                ret = icl_dbus_convert_dbus_error(error->code);
@@ -216,10 +212,10 @@ API int iotcon_resource_create(const char *uri_path,
        resource->ifaces = ifaces;
        resource->properties = properties;
 
-       snprintf(sig_name, sizeof(sig_name), "%s_%u", IC_DBUS_SIGNAL_REQUEST_HANDLER,
+       snprintf(signal_name, sizeof(signal_name), "%s_%llx", IC_DBUS_SIGNAL_REQUEST_HANDLER,
                        signal_number);
 
-       sub_id = icl_dbus_subscribe_signal(sig_name, resource, _icl_resource_conn_cleanup,
+       sub_id = icl_dbus_subscribe_signal(signal_name, resource, _icl_resource_conn_cleanup,
                        _icl_request_handler);
        if (0 == sub_id) {
                ERR("icl_dbus_subscribe_signal() Fail");
@@ -269,7 +265,9 @@ API int iotcon_resource_destroy(iotcon_resource_h resource)
                return ret;
        }
        resource->handle = 0;
+
        icl_dbus_unsubscribe_signal(resource->sub_id);
+       resource->sub_id = 0;
 
        return IOTCON_ERROR_NONE;
 }
@@ -343,15 +341,15 @@ API int iotcon_resource_bind_type(iotcon_resource_h resource, const char *resour
        return ret;
 }
 
-
 API int iotcon_resource_set_request_handler(iotcon_resource_h resource,
-               iotcon_request_handler_cb cb)
+               iotcon_request_handler_cb cb, void *user_data)
 {
        RETV_IF(NULL == resource, IOTCON_ERROR_INVALID_PARAMETER);
        RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
 
-       WARN("Request handler is changed");
+       DBG("Request handler is changed");
        resource->cb = cb;
+       resource->user_data = user_data;
 
        return IOTCON_ERROR_NONE;
 }
@@ -559,8 +557,8 @@ API int iotcon_resource_notify(iotcon_resource_h resource,
        else
                obs = icl_dbus_observers_to_gvariant(resource->observers);
 
-       ic_dbus_call_notify_sync(icl_dbus_get_object(), resource->handle, repr_gvar, obs, &ret,
-                       NULL, &error);
+       ic_dbus_call_notify_sync(icl_dbus_get_object(), resource->handle, repr_gvar, obs,
+                       &ret, NULL, &error);
        if (error) {
                ERR("ic_dbus_call_notify_sync() Fail(%s)", error->message);
                ret = icl_dbus_convert_dbus_error(error->code);