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.
27 #include "icl-dbus-type.h"
30 * @brief The maximum length which can be held in a manufacturer name.
34 #define IOTCON_MANUFACTURER_NAME_LENGTH_MAX 15
37 * @brief The maximum length which can be held in a manufacturer url.
41 #define IOTCON_MANUFACTURER_URL_LENGTH_MAX 32
45 iotcon_device_info_cb cb;
51 iotcon_platform_info_cb cb;
54 } icl_platform_info_s;
57 API int iotcon_register_device_info(const char *device_name)
63 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
64 RETV_IF(NULL == device_name, IOTCON_ERROR_INVALID_PARAMETER);
66 arg_info = icl_dbus_device_info_to_gvariant(device_name);
67 ic_dbus_call_register_device_info_sync(icl_dbus_get_object(), arg_info, &ret,
70 ERR("ic_dbus_call_register_device_info_sync() Fail(%s)", error->message);
72 g_variant_unref(arg_info);
73 return IOTCON_ERROR_DBUS;
76 if (IOTCON_ERROR_NONE != ret) {
77 ERR("iotcon-daemon Fail(%d)", ret);
78 return icl_dbus_convert_daemon_error(ret);
85 static void _icl_device_info_cb(GDBusConnection *connection,
86 const gchar *sender_name,
87 const gchar *object_path,
88 const gchar *interface_name,
89 const gchar *signal_name,
93 icl_device_info_s *cb_container = user_data;
94 iotcon_device_info_cb cb = cb_container->cb;
95 char *device_name, *sid, *spec_version, *data_model_version;
97 g_variant_get(parameters, "(&s&s&s&s)", &device_name, &sid, &spec_version,
101 cb(device_name, sid, spec_version, data_model_version, cb_container->user_data);
105 API int iotcon_get_device_info(const char *host_address, iotcon_device_info_cb cb,
109 GError *error = NULL;
112 char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
113 icl_device_info_s *cb_container;
115 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
116 RETV_IF(NULL == host_address, IOTCON_ERROR_INVALID_PARAMETER);
117 RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
119 signal_number = icl_dbus_generate_signal_number();
121 ic_dbus_call_get_device_info_sync(icl_dbus_get_object(), host_address,
122 signal_number, &ret, NULL, &error);
124 ERR("ic_dbus_call_get_device_info_sync() Fail(%s)", error->message);
126 return IOTCON_ERROR_DBUS;
129 if (IOTCON_ERROR_NONE != ret) {
130 ERR("iotcon-daemon Fail(%d)", ret);
131 return icl_dbus_convert_daemon_error(ret);
134 snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_DEVICE,
137 cb_container = calloc(1, sizeof(icl_device_info_s));
138 if (NULL == cb_container) {
139 ERR("calloc() Fail(%d)", errno);
140 return IOTCON_ERROR_OUT_OF_MEMORY;
143 cb_container->cb = cb;
144 cb_container->user_data = user_data;
146 sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
147 _icl_device_info_cb);
149 ERR("icl_dbus_subscribe_signal() Fail");
150 return IOTCON_ERROR_DBUS;
153 cb_container->id = sub_id;
159 /* The length of manufacturer_name should be less than and equal to 16.
160 * The length of manufacturer_url should be less than and equal to 32. */
161 API int iotcon_register_platform_info(iotcon_platform_info_s platform_info)
164 GError *error = NULL;
167 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
169 if (NULL == platform_info.platform_id
170 || NULL == platform_info.manuf_name
171 || NULL == platform_info.manuf_url
172 || NULL == platform_info.model_number
173 || NULL == platform_info.date_of_manufacture
174 || NULL == platform_info.platform_ver
175 || NULL == platform_info.os_ver
176 || NULL == platform_info.hardware_ver
177 || NULL == platform_info.firmware_ver
178 || NULL == platform_info.support_url
179 || NULL == platform_info.system_time) {
180 ERR("one of parameter is NULL");
181 return IOTCON_ERROR_INVALID_PARAMETER;
184 if (platform_info.manuf_name
185 && (IOTCON_MANUFACTURER_NAME_LENGTH_MAX < strlen(platform_info.manuf_name))) {
186 ERR("The length of manufacturer_name(%s) is invalid.", platform_info.manuf_name);
187 return IOTCON_ERROR_INVALID_PARAMETER;
190 if (platform_info.manuf_url
191 && (IOTCON_MANUFACTURER_URL_LENGTH_MAX < strlen(platform_info.manuf_url))) {
192 ERR("The length of manufacturer_url(%s) is invalid.", platform_info.manuf_url);
193 return IOTCON_ERROR_INVALID_PARAMETER;
196 arg_info = icl_dbus_platform_info_to_gvariant(&platform_info);
197 ic_dbus_call_register_platform_info_sync(icl_dbus_get_object(), arg_info, &ret,
200 ERR("ic_dbus_call_register_platform_info_sync() Fail(%s)", error->message);
202 g_variant_unref(arg_info);
203 return IOTCON_ERROR_DBUS;
206 if (IOTCON_ERROR_NONE != ret) {
207 ERR("iotcon-daemon Fail(%d)", ret);
208 return icl_dbus_convert_daemon_error(ret);
215 static void _icl_platform_info_cb(GDBusConnection *connection,
216 const gchar *sender_name,
217 const gchar *object_path,
218 const gchar *interface_name,
219 const gchar *signal_name,
220 GVariant *parameters,
224 iotcon_platform_info_s info = {0};
225 icl_platform_info_s *cb_container = user_data;
226 iotcon_platform_info_cb cb = cb_container->cb;
228 g_variant_get(parameters, "(&s&s&s&s&s&s&s&s&s&s&s&s)",
234 &info.date_of_manufacture,
242 /* From iotivity, we can get uri_path. But, the value is always "/oic/p". */
245 cb(info, cb_container->user_data);
249 API int iotcon_get_platform_info(const char *host_address, iotcon_platform_info_cb cb,
253 GError *error = NULL;
256 char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
257 icl_platform_info_s *cb_container;
259 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
260 RETV_IF(NULL == host_address, IOTCON_ERROR_INVALID_PARAMETER);
261 RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
263 signal_number = icl_dbus_generate_signal_number();
265 ic_dbus_call_get_platform_info_sync(icl_dbus_get_object(), host_address,
266 signal_number, &ret, NULL, &error);
268 ERR("ic_dbus_call_get_platform_info_sync() Fail(%s)", error->message);
270 return IOTCON_ERROR_DBUS;
273 if (IOTCON_ERROR_NONE != ret) {
274 ERR("iotcon-daemon Fail(%d)", ret);
275 return icl_dbus_convert_daemon_error(ret);
278 snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PLATFORM,
281 cb_container = calloc(1, sizeof(icl_platform_info_s));
282 if (NULL == cb_container) {
283 ERR("calloc() Fail(%d)", errno);
284 return IOTCON_ERROR_OUT_OF_MEMORY;
287 cb_container->cb = cb;
288 cb_container->user_data = user_data;
290 sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
291 _icl_platform_info_cb);
293 ERR("icl_dbus_subscribe_signal() Fail");
294 return IOTCON_ERROR_DBUS;
297 cb_container->id = sub_id;