2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
26 #include "icl-representation.h"
28 #include "icl-dbus-type.h"
29 #include "icl-device.h"
32 * @brief The maximum length which can be held in a manufacturer name.
36 #define ICL_MANUFACTURER_NAME_LENGTH_MAX 15
39 * @brief The maximum length which can be held in a manufacturer url.
43 #define ICL_MANUFACTURER_URL_LENGTH_MAX 32
47 iotcon_device_info_cb cb;
54 iotcon_platform_info_cb cb;
58 } icl_platform_info_s;
61 API int iotcon_device_info_get_property(iotcon_device_info_h device_info,
62 iotcon_device_info_e property, char **value)
64 RETV_IF(NULL == device_info, IOTCON_ERROR_INVALID_PARAMETER);
65 RETV_IF(NULL == value, IOTCON_ERROR_INVALID_PARAMETER);
68 case IOTCON_DEVICE_INFO_NAME:
69 *value = device_info->device_name;
71 case IOTCON_DEVICE_INFO_SPEC_VER:
72 *value = device_info->spec_ver;
74 case IOTCON_DEVICE_INFO_ID:
75 *value = device_info->device_id;
77 case IOTCON_DEVICE_INFO_DATA_MODEL_VER:
78 *value = device_info->data_model_ver;
81 ERR("Invalid property(%d)", property);
82 return IOTCON_ERROR_INVALID_PARAMETER;
85 return IOTCON_ERROR_NONE;
88 static void _icl_device_info_cb(GDBusConnection *connection,
89 const gchar *sender_name,
90 const gchar *object_path,
91 const gchar *interface_name,
92 const gchar *signal_name,
97 struct icl_device_info info = {0};
98 icl_device_info_s *cb_container = user_data;
99 iotcon_device_info_cb cb = cb_container->cb;
101 if (cb_container->timeout_id)
102 cb_container->timeout_id = 0;
104 g_variant_get(parameters, "(&s&s&s&s&s)", &uri_path, &info.device_name,
105 &info.spec_ver, &info.device_id, &info.data_model_ver);
107 /* From iotivity, we can get uri_path. But, the value is always "/oic/d". */
110 cb(&info, IOTCON_ERROR_NONE, cb_container->user_data);
113 static gboolean _icl_timeout_get_device_info(gpointer p)
116 icl_device_info_s *cb_container = p;
117 struct icl_device_info info = {0};
119 if (NULL == cb_container) {
120 ERR("cb_container is NULL");
121 return G_SOURCE_REMOVE;
124 if (cb_container->timeout_id && cb_container->cb)
125 cb_container->cb(&info, IOTCON_ERROR_TIMEOUT, cb_container->user_data);
127 icl_dbus_unsubscribe_signal(cb_container->id);
128 cb_container->id = 0;
130 return G_SOURCE_REMOVE;
133 API int iotcon_get_device_info(const char *host_address,
134 iotcon_connectivity_type_e connectivity_type,
135 iotcon_device_info_cb cb,
140 GError *error = NULL;
141 icl_device_info_s *cb_container;
142 int64_t signal_number;
143 char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
145 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
146 RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
148 timeout = icl_dbus_get_timeout();
150 ic_dbus_call_get_device_info_sync(icl_dbus_get_object(),
151 ic_utils_dbus_encode_str(host_address),
159 ERR("ic_dbus_call_get_device_info_sync() Fail(%s)", error->message);
160 ret = icl_dbus_convert_dbus_error(error->code);
165 if (IOTCON_ERROR_NONE != ret) {
166 ERR("iotcon-daemon Fail(%d)", ret);
167 return icl_dbus_convert_daemon_error(ret);
170 snprintf(signal_name, sizeof(signal_name), "%s_%llx", IC_DBUS_SIGNAL_DEVICE,
173 cb_container = calloc(1, sizeof(icl_device_info_s));
174 if (NULL == cb_container) {
175 ERR("calloc() Fail(%d)", errno);
176 return IOTCON_ERROR_OUT_OF_MEMORY;
179 cb_container->cb = cb;
180 cb_container->user_data = user_data;
182 sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
183 _icl_device_info_cb);
185 ERR("icl_dbus_subscribe_signal() Fail");
187 return IOTCON_ERROR_DBUS;
190 cb_container->id = sub_id;
192 cb_container->timeout_id = g_timeout_add_seconds(timeout,
193 _icl_timeout_get_device_info, cb_container);
198 API int iotcon_platform_info_get_property(iotcon_platform_info_h platform_info,
199 iotcon_platform_info_e property, char **value)
201 RETV_IF(NULL == platform_info, IOTCON_ERROR_INVALID_PARAMETER);
202 RETV_IF(NULL == value, IOTCON_ERROR_INVALID_PARAMETER);
205 case IOTCON_PLATFORM_INFO_ID:
206 *value = platform_info->platform_id;
208 case IOTCON_PLATFORM_INFO_MANUF_NAME:
209 *value = platform_info->manuf_name;
211 case IOTCON_PLATFORM_INFO_MANUF_URL:
212 *value = platform_info->manuf_url;
214 case IOTCON_PLATFORM_INFO_MODEL_NUMBER:
215 *value = platform_info->model_number;
217 case IOTCON_PLATFORM_INFO_DATE_OF_MANUF:
218 *value = platform_info->date_of_manuf;
220 case IOTCON_PLATFORM_INFO_PLATFORM_VER:
221 *value = platform_info->platform_ver;
223 case IOTCON_PLATFORM_INFO_OS_VER:
224 *value = platform_info->os_ver;
226 case IOTCON_PLATFORM_INFO_HARDWARE_VER:
227 *value = platform_info->hardware_ver;
229 case IOTCON_PLATFORM_INFO_FIRMWARE_VER:
230 *value = platform_info->firmware_ver;
232 case IOTCON_PLATFORM_INFO_SUPPORT_URL:
233 *value = platform_info->support_url;
235 case IOTCON_PLATFORM_INFO_SYSTEM_TIME:
236 *value = platform_info->system_time;
239 ERR("Invalid property(%d)", property);
240 return IOTCON_ERROR_INVALID_PARAMETER;
243 return IOTCON_ERROR_NONE;
247 static void _icl_platform_info_cb(GDBusConnection *connection,
248 const gchar *sender_name,
249 const gchar *object_path,
250 const gchar *interface_name,
251 const gchar *signal_name,
252 GVariant *parameters,
256 struct icl_platform_info info = {0};
257 icl_platform_info_s *cb_container = user_data;
258 iotcon_platform_info_cb cb = cb_container->cb;
260 if (cb_container->timeout_id)
261 cb_container->timeout_id = 0;
263 g_variant_get(parameters, "(&s&s&s&s&s&s&s&s&s&s&s&s)",
277 info.manuf_url = ic_utils_dbus_decode_str(info.manuf_url);
278 info.model_number = ic_utils_dbus_decode_str(info.model_number);
279 info.date_of_manuf = ic_utils_dbus_decode_str(info.date_of_manuf);
280 info.platform_ver = ic_utils_dbus_decode_str(info.platform_ver);
281 info.os_ver = ic_utils_dbus_decode_str(info.os_ver);
282 info.hardware_ver = ic_utils_dbus_decode_str(info.hardware_ver);
283 info.firmware_ver = ic_utils_dbus_decode_str(info.firmware_ver);
284 info.support_url = ic_utils_dbus_decode_str(info.support_url);
285 info.system_time = ic_utils_dbus_decode_str(info.system_time);
287 /* From iotivity, we can get uri_path. But, the value is always "/oic/p". */
290 cb(&info, IOTCON_ERROR_NONE, cb_container->user_data);
293 static gboolean _icl_timeout_get_platform_info(gpointer p)
296 icl_platform_info_s *cb_container = p;
297 struct icl_platform_info info = {0};
299 if (NULL == cb_container) {
300 ERR("cb_container is NULL");
301 return G_SOURCE_REMOVE;
304 if (cb_container->timeout_id && cb_container->cb)
305 cb_container->cb(&info, IOTCON_ERROR_TIMEOUT, cb_container->user_data);
307 icl_dbus_unsubscribe_signal(cb_container->id);
308 cb_container->id = 0;
310 return G_SOURCE_REMOVE;
313 API int iotcon_get_platform_info(const char *host_address,
314 iotcon_connectivity_type_e connectivity_type,
315 iotcon_platform_info_cb cb,
320 GError *error = NULL;
321 icl_platform_info_s *cb_container;
322 int64_t signal_number;
323 char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
325 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
326 RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
328 timeout = icl_dbus_get_timeout();
330 ic_dbus_call_get_platform_info_sync(icl_dbus_get_object(),
331 ic_utils_dbus_encode_str(host_address),
339 ERR("ic_dbus_call_get_platform_info_sync() Fail(%s)", error->message);
340 ret = icl_dbus_convert_dbus_error(error->code);
345 if (IOTCON_ERROR_NONE != ret) {
346 ERR("iotcon-daemon Fail(%d)", ret);
347 return icl_dbus_convert_daemon_error(ret);
350 snprintf(signal_name, sizeof(signal_name), "%s_%llx", IC_DBUS_SIGNAL_PLATFORM,
353 cb_container = calloc(1, sizeof(icl_platform_info_s));
354 if (NULL == cb_container) {
355 ERR("calloc() Fail(%d)", errno);
356 return IOTCON_ERROR_OUT_OF_MEMORY;
359 cb_container->cb = cb;
360 cb_container->user_data = user_data;
362 sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
363 _icl_platform_info_cb);
365 ERR("icl_dbus_subscribe_signal() Fail");
367 return IOTCON_ERROR_DBUS;
370 cb_container->id = sub_id;
371 cb_container->timeout_id = g_timeout_add_seconds(timeout,
372 _icl_timeout_get_platform_info, cb_container);