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 ICL_MANUFACTURER_NAME_LENGTH_MAX 15
37 * @brief The maximum length which can be held in a manufacturer url.
41 #define ICL_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);
71 ret = icl_dbus_convert_dbus_error(error->code);
73 g_variant_unref(arg_info);
77 if (IOTCON_ERROR_NONE != ret) {
78 ERR("iotcon-daemon Fail(%d)", ret);
79 return icl_dbus_convert_daemon_error(ret);
86 static void _icl_device_info_cb(GDBusConnection *connection,
87 const gchar *sender_name,
88 const gchar *object_path,
89 const gchar *interface_name,
90 const gchar *signal_name,
94 icl_device_info_s *cb_container = user_data;
95 iotcon_device_info_cb cb = cb_container->cb;
96 char *device_name, *sid, *spec_version, *data_model_version;
98 g_variant_get(parameters, "(&s&s&s&s)", &device_name, &sid, &spec_version,
102 cb(device_name, sid, spec_version, data_model_version, cb_container->user_data);
106 API int iotcon_get_device_info(const char *host_address, iotcon_device_info_cb cb,
109 GError *error = NULL;
111 int ret, signal_number;
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);
125 ret = icl_dbus_convert_dbus_error(error->code);
130 if (IOTCON_ERROR_NONE != ret) {
131 ERR("iotcon-daemon Fail(%d)", ret);
132 return icl_dbus_convert_daemon_error(ret);
135 snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_DEVICE,
138 cb_container = calloc(1, sizeof(icl_device_info_s));
139 if (NULL == cb_container) {
140 ERR("calloc() Fail(%d)", errno);
141 return IOTCON_ERROR_OUT_OF_MEMORY;
144 cb_container->cb = cb;
145 cb_container->user_data = user_data;
147 sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
148 _icl_device_info_cb);
150 ERR("icl_dbus_subscribe_signal() Fail");
152 return IOTCON_ERROR_DBUS;
155 cb_container->id = sub_id;
161 /* The length of manufacturer_name should be less than and equal to 16.
162 * The length of manufacturer_url should be less than and equal to 32. */
163 API int iotcon_register_platform_info(iotcon_platform_info_s *platform_info)
166 GError *error = NULL;
169 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
171 if (NULL == platform_info->platform_id
172 || NULL == platform_info->manuf_name
173 || NULL == platform_info->manuf_url
174 || NULL == platform_info->model_number
175 || NULL == platform_info->date_of_manufacture
176 || NULL == platform_info->platform_ver
177 || NULL == platform_info->os_ver
178 || NULL == platform_info->hardware_ver
179 || NULL == platform_info->firmware_ver
180 || NULL == platform_info->support_url
181 || NULL == platform_info->system_time) {
182 ERR("one of parameter is NULL");
183 return IOTCON_ERROR_INVALID_PARAMETER;
186 if (platform_info->manuf_name
187 && (ICL_MANUFACTURER_NAME_LENGTH_MAX < strlen(platform_info->manuf_name))) {
188 ERR("The length of manufacturer_name(%s) is invalid.", platform_info->manuf_name);
189 return IOTCON_ERROR_INVALID_PARAMETER;
192 if (platform_info->manuf_url
193 && (ICL_MANUFACTURER_URL_LENGTH_MAX < strlen(platform_info->manuf_url))) {
194 ERR("The length of manufacturer_url(%s) is invalid.", platform_info->manuf_url);
195 return IOTCON_ERROR_INVALID_PARAMETER;
198 arg_info = icl_dbus_platform_info_to_gvariant(platform_info);
199 ic_dbus_call_register_platform_info_sync(icl_dbus_get_object(), arg_info, &ret,
202 ERR("ic_dbus_call_register_platform_info_sync() Fail(%s)", error->message);
203 ret = icl_dbus_convert_dbus_error(error->code);
205 g_variant_unref(arg_info);
209 if (IOTCON_ERROR_NONE != ret) {
210 ERR("iotcon-daemon Fail(%d)", ret);
211 return icl_dbus_convert_daemon_error(ret);
218 static void _icl_platform_info_cb(GDBusConnection *connection,
219 const gchar *sender_name,
220 const gchar *object_path,
221 const gchar *interface_name,
222 const gchar *signal_name,
223 GVariant *parameters,
227 iotcon_platform_info_s *info;
228 icl_platform_info_s *cb_container = user_data;
229 iotcon_platform_info_cb cb = cb_container->cb;
231 info = calloc(1, sizeof(iotcon_platform_info_s));
233 ERR("calloc(client) Fail(%d)", errno);
237 g_variant_get(parameters, "(&s&s&s&s&s&s&s&s&s&s&s&s)",
243 &info->date_of_manufacture,
251 /* From iotivity, we can get uri_path. But, the value is always "/oic/p". */
254 cb(info, cb_container->user_data);
260 API int iotcon_get_platform_info(const char *host_address, iotcon_platform_info_cb cb,
263 GError *error = NULL;
265 int ret, signal_number;
266 char signal_name[IC_DBUS_SIGNAL_LENGTH] = {0};
267 icl_platform_info_s *cb_container;
269 RETV_IF(NULL == icl_dbus_get_object(), IOTCON_ERROR_DBUS);
270 RETV_IF(NULL == host_address, IOTCON_ERROR_INVALID_PARAMETER);
271 RETV_IF(NULL == cb, IOTCON_ERROR_INVALID_PARAMETER);
273 signal_number = icl_dbus_generate_signal_number();
275 ic_dbus_call_get_platform_info_sync(icl_dbus_get_object(), host_address,
276 signal_number, &ret, NULL, &error);
278 ERR("ic_dbus_call_get_platform_info_sync() Fail(%s)", error->message);
279 ret = icl_dbus_convert_dbus_error(error->code);
284 if (IOTCON_ERROR_NONE != ret) {
285 ERR("iotcon-daemon Fail(%d)", ret);
286 return icl_dbus_convert_daemon_error(ret);
289 snprintf(signal_name, sizeof(signal_name), "%s_%u", IC_DBUS_SIGNAL_PLATFORM,
292 cb_container = calloc(1, sizeof(icl_platform_info_s));
293 if (NULL == cb_container) {
294 ERR("calloc() Fail(%d)", errno);
295 return IOTCON_ERROR_OUT_OF_MEMORY;
298 cb_container->cb = cb;
299 cb_container->user_data = user_data;
301 sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
302 _icl_platform_info_cb);
304 ERR("icl_dbus_subscribe_signal() Fail");
306 return IOTCON_ERROR_DBUS;
309 cb_container->id = sub_id;