2 * Copyright (c) 2016 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.
17 #include "iotcon/iotcon_instance.h"
24 #include "common/logger.h"
25 #include "common/scope_exit.h"
26 #include "common/tools.h"
28 #include "iotcon/iotcon_client_manager.h"
29 #include "iotcon/iotcon_manager.h"
30 #include "iotcon/iotcon_server_manager.h"
31 #include "iotcon/iotcon_utils.h"
33 #include "common/filesystem/filesystem_provider.h"
39 const std::string kPrivilegeIotcon = "http://tizen.org/privilege/internet";
42 common::PostCallback fun;
43 CallbackData(common::PostCallback f) {
48 long long GetId(const picojson::object& args) {
49 return static_cast<long long>(args.find(kId)->second.get<double>());
52 // CallbackDataManager was created to prevent crash that may occur when
53 // the same callback will be called twice in RemoteResourceResponseCallback
54 // (The native api allow that same callback will be called more than once)
55 class CallbackDataManager {
57 static CallbackDataManager* GetInstance();
58 void Add(CallbackData* data);
59 bool IfExists(CallbackData* data);
62 CallbackDataManager(){};
63 CallbackDataManager(const CallbackDataManager&) = delete;
64 CallbackDataManager(const CallbackDataManager&&) = delete;
65 CallbackDataManager& operator=(const CallbackDataManager&) = delete;
66 CallbackDataManager& operator=(const CallbackDataManager&&) = delete;
67 ~CallbackDataManager(){};
68 std::vector<CallbackData*> callback_;
69 std::mutex callback_mtx_;
72 CallbackDataManager* CallbackDataManager::GetInstance() {
74 static CallbackDataManager instance;
78 void CallbackDataManager::Add(CallbackData* data) {
80 std::lock_guard<std::mutex> lock(callback_mtx_);
81 callback_.push_back(data);
84 bool CallbackDataManager::IfExists(CallbackData* data) {
86 std::lock_guard<std::mutex> lock(callback_mtx_);
87 std::vector<CallbackData*>::iterator it;
88 it = find(callback_.begin(), callback_.end(), data);
89 return (it != callback_.end());
92 void RemoteResourceResponseCallback(iotcon_remote_resource_h resource, iotcon_error_e err,
93 iotcon_request_type_e request_type, iotcon_response_h response,
97 std::unique_ptr<CallbackData> data{static_cast<CallbackData*>(user_data)};
100 picojson::value value{picojson::object{}};
101 common::TizenResult ret = common::TizenSuccess();
104 case IOTCON_ERROR_NONE:
105 ret = IotconUtils::ResponseToJson(response, &value.get<picojson::object>());
106 if (CallbackDataManager::GetInstance()->IfExists(data.get())) {
107 LoggerD("user_data was called earlier, so ignore.");
111 case IOTCON_ERROR_TIMEOUT:
112 LoggerD("IOTCON_TIMEOUT");
113 ret = IotconUtils::ConvertIotconError(err);
114 if (CallbackDataManager::GetInstance()->IfExists(data.get())) {
115 LoggerD("user_data was called earlier, so ignore.");
120 ret = IotconUtils::ConvertIotconError(err);
121 if (CallbackDataManager::GetInstance()->IfExists(data.get())) {
122 LoggerD("user_data was called earlier, so ignore.");
127 CallbackDataManager::GetInstance()->Add(data.get());
128 data->fun(ret, value);
131 LoggerE("Native callback data is null");
135 const common::ListenerToken kGeneratedPinToken{"GeneratedPinListener"};
136 const common::ListenerToken kResourceRequestListenerToken{"ResourceRequestListener"};
137 const common::ListenerToken kFindResourceListenerToken{"FindResourceListener"};
138 const common::ListenerToken kFindDeviceInfoListenerToken{"FindDeviceInfoListener"};
139 const common::ListenerToken kFindPlatformInfoListenerToken{"FindPlatformInfoListener"};
140 const common::ListenerToken kPresenceEventListenerToken{"PresenceEventListener"};
141 const common::ListenerToken kRemoteResourceStateChangeListener{"RemoteResourceStateChangeListener"};
142 const common::ListenerToken kRemoteResourceChangeListener{"RemoteResourceChangeListener"};
143 const common::ListenerToken kRemoteResourceCacheChangeListener{"RemoteResourceCacheChangeListener"};
145 const std::string kObserverIds = "observerIds";
146 const std::string kQos = "qos";
147 const std::string kChildId = "childId";
148 const std::string kTypes = "types";
149 const std::string kInterface = "iface";
150 const std::string kResult = "result";
151 const std::string kTimeout = "timeout";
152 const std::string kData = "data";
153 const std::string kFilePath = "filePath";
154 const std::string kTimeToLive = "timeToLive";
156 const std::string kTimeInterval = "timeInterval";
158 const std::string kVirtualResourcesHandlingPath = "/home/owner/share/tmp_file_iotcon.dat";
162 IotconInstance::IotconInstance()
163 : initialized_(false),
164 presence_started_(false),
165 observing_started_(false),
166 caching_started_(false),
167 monitoring_started_(false) {
170 using std::placeholders::_1;
171 using std::placeholders::_2;
173 #define REGISTER_SYNC(c, x) RegisterSyncHandler(c, std::bind(&IotconInstance::x, this, _1))
175 REGISTER_SYNC("IotconResource_getObserverIds", ResourceGetObserverIds);
176 REGISTER_SYNC("IotconResource_notify", ResourceNotify);
177 REGISTER_SYNC("IotconResource_addResourceTypes", ResourceAddResourceTypes);
178 REGISTER_SYNC("IotconResource_addResourceInterface", ResourceAddResourceInterface);
179 REGISTER_SYNC("IotconResource_addChildResource", ResourceAddChildResource);
180 REGISTER_SYNC("IotconResource_removeChildResource", ResourceRemoveChildResource);
181 REGISTER_SYNC("IotconResource_setRequestListener", ResourceSetRequestListener);
182 REGISTER_SYNC("IotconResource_unsetRequestListener", ResourceUnsetRequestListener);
183 REGISTER_SYNC("IotconResponse_send", ResponseSend);
184 REGISTER_SYNC("IotconRemoteResource_getCachedRepresentation",
185 RemoteResourceGetCachedRepresentation);
186 REGISTER_SYNC("IotconRemoteResource_getOptions", RemoteResourceGetOptions);
187 REGISTER_SYNC("IotconRemoteResource_setOptions", RemoteResourceSetOptions);
188 REGISTER_SYNC("IotconRemoteResource_startObserving", RemoteResourceStartObserving);
189 REGISTER_SYNC("IotconRemoteResource_stopObserving", RemoteResourceStopObserving);
190 REGISTER_SYNC("IotconRemoteResource_startCaching", RemoteResourceStartCaching);
191 REGISTER_SYNC("IotconRemoteResource_stopCaching", RemoteResourceStopCaching);
192 REGISTER_SYNC("IotconRemoteResource_setResourceStateChangeListener",
193 RemoteResourceSetResourceStateChangeListener);
194 REGISTER_SYNC("IotconRemoteResource_unsetResourceStateChangeListener",
195 RemoteResourceUnsetResourceStateChangeListener);
196 REGISTER_SYNC("IotconRemoteResource_getTimeInterval", RemoteResourceGetTimeInterval);
197 REGISTER_SYNC("IotconRemoteResource_setTimeInterval", RemoteResourceSetTimeInterval);
198 REGISTER_SYNC("IotconClient_addPresenceEventListener", ClientAddPresenceEventListener);
199 REGISTER_SYNC("IotconClient_removePresenceEventListener", ClientRemovePresenceEventListener);
200 REGISTER_SYNC("Iotcon_initialize", Initialize);
201 REGISTER_SYNC("Iotcon_getTimeout", GetTimeout);
202 REGISTER_SYNC("Iotcon_setTimeout", SetTimeout);
203 REGISTER_SYNC("Iotcon_addGeneratedPinListener", AddGeneratedPinListener);
204 REGISTER_SYNC("Iotcon_removeGeneratedPinListener", RemoveGeneratedPinListener);
205 REGISTER_SYNC("IotconServer_createResource", ServerCreateResource);
206 REGISTER_SYNC("IotconServer_removeResource", ServerRemoveResource);
207 REGISTER_SYNC("IotconServer_startPresence", ServerStartPresence);
208 REGISTER_SYNC("IotconServer_stopPresence", ServerStopPresence);
209 REGISTER_SYNC("Iotcon_setDeviceName", SetDeviceName);
210 REGISTER_SYNC("IotconClient_findResource", ClientFindResource);
211 REGISTER_SYNC("IotconClient_findDeviceInfo", ClientFindDeviceInfo);
212 REGISTER_SYNC("IotconClient_findPlatformInfo", ClientFindPlatformInfo);
215 #define REGISTER_ASYNC(c, x) RegisterHandler(c, std::bind(&IotconInstance::x, this, _1, _2));
217 REGISTER_ASYNC("IotconRemoteResource_methodGet", RemoteResourceMethodGet);
218 REGISTER_ASYNC("IotconRemoteResource_methodPut", RemoteResourceMethodPut);
219 REGISTER_ASYNC("IotconRemoteResource_methodPost", RemoteResourceMethodPost);
220 REGISTER_ASYNC("IotconRemoteResource_methodDelete", RemoteResourceMethodDelete);
222 #undef REGISTER_ASYNC
225 IotconInstance::~IotconInstance() {
228 if (presence_started_) {
229 iotcon_stop_presence();
230 presence_started_ = false;
231 LoggerD("Iotcon service presence stopped");
235 iotcon_deinitialize();
236 initialized_ = false;
237 LoggerD("Iotcon service deinitialized");
241 common::TizenResult IotconInstance::ResourceGetObserverIds(const picojson::object& args) {
244 CHECK_EXIST(args, kId);
246 ResourceInfoPtr resource;
247 auto result = IotconServerManager::GetInstance().GetResourceById(GetId(args), &resource);
250 LogAndReturnTizenError(result, ("GetResourceById() failed"));
253 picojson::value value{picojson::array{}};
254 auto& arr = value.get<picojson::array>();
256 for (auto id : resource->observers) {
257 arr.push_back(picojson::value{static_cast<double>(id)});
260 return common::TizenSuccess(value);
263 common::TizenResult IotconInstance::ResourceNotify(const picojson::object& args) {
266 CHECK_PRIVILEGE(kPrivilegeIotcon);
268 CHECK_EXIST(args, kId);
269 CHECK_EXIST(args, kQos);
270 CHECK_EXIST(args, kAttributes);
272 ResourceInfoPtr resource;
273 long long id = GetId(args);
274 auto result = IotconServerManager::GetInstance().GetResourceById(id, &resource);
277 LogAndReturnTizenError(result, ("GetResourceById() failed"));
280 auto& qos = IotconUtils::GetArg(args, kQos);
281 if (!qos.is<std::string>()) {
282 return common::TypeMismatchError("QOS needs to be a string");
285 // create observers to notify
286 auto& observer_ids = IotconUtils::GetArg(args, kObserverIds);
288 std::vector<int> observers;
290 if (observer_ids.is<picojson::array>()) {
291 // use provided list, make sure that observer exists
292 for (auto& id : observer_ids.get<picojson::array>()) {
293 if (id.is<double>()) {
294 auto v = static_cast<int>(id.get<double>());
295 if (resource->observers.end() != resource->observers.find(v)) {
296 observers.push_back(v);
302 observers.assign(resource->observers.begin(), resource->observers.end());
305 // create & initialize platform object
306 iotcon_observers_h observers_handle = nullptr;
307 result = IotconUtils::ConvertIotconError(iotcon_observers_create(&observers_handle));
309 LogAndReturnTizenError(result, ("iotcon_observers_create() failed"));
313 iotcon_observers_destroy(observers_handle);
316 for (auto& id : observers) {
317 result = IotconUtils::ConvertIotconError(iotcon_observers_add(observers_handle, id));
319 LogAndReturnTizenError(result, ("iotcon_observers_add() failed"));
323 // create representation from resource and attributes
324 iotcon_representation_h representation = nullptr;
326 result = IotconUtils::RepresentationFromResource(resource, IotconUtils::GetArg(args, kAttributes),
329 LogAndReturnTizenError(result, ("RepresentationFromResource() failed"));
333 iotcon_representation_destroy(representation);
336 result = IotconUtils::ConvertIotconError(
337 iotcon_resource_notify(resource->handle, representation, observers_handle,
338 IotconUtils::ToQos(qos.get<std::string>())));
340 LogAndReturnTizenError(result, ("iotcon_resource_notify() failed"));
343 return common::TizenSuccess();
346 common::TizenResult IotconInstance::ResourceAddResourceTypes(const picojson::object& args) {
349 CHECK_PRIVILEGE(kPrivilegeIotcon);
351 CHECK_EXIST(args, kId);
352 CHECK_EXIST(args, kTypes);
354 ResourceInfoPtr resource;
355 auto result = IotconServerManager::GetInstance().GetResourceById(GetId(args), &resource);
357 LogAndReturnTizenError(result, ("GetResourceById() failed"));
360 const auto& types = IotconUtils::GetArg(args, kTypes).get<picojson::array>();
362 for (const auto& type : types) {
363 int ret = iotcon_resource_bind_type(resource->handle, type.get<std::string>().c_str());
364 if (IOTCON_ERROR_NONE != ret && IOTCON_ERROR_ALREADY != ret) {
365 LogAndReturnTizenError(IotconUtils::ConvertIotconError(ret),
366 ("iotcon_resource_bind_type() failed"));
370 return common::TizenSuccess();
373 common::TizenResult IotconInstance::ResourceAddResourceInterface(const picojson::object& args) {
376 CHECK_PRIVILEGE(kPrivilegeIotcon);
378 CHECK_EXIST(args, kId);
379 CHECK_EXIST(args, kInterface);
381 ResourceInfoPtr resource;
382 auto result = IotconServerManager::GetInstance().GetResourceById(GetId(args), &resource);
384 LogAndReturnTizenError(result, ("GetResourceById() failed"));
387 int ret = iotcon_resource_bind_interface(
388 resource->handle, IotconUtils::GetArg(args, kInterface).get<std::string>().c_str());
389 if (IOTCON_ERROR_NONE != ret && IOTCON_ERROR_ALREADY != ret) {
390 LogAndReturnTizenError(IotconUtils::ConvertIotconError(ret),
391 ("iotcon_resource_bind_interface() failed"));
394 return common::TizenSuccess();
397 common::TizenResult IotconInstance::ResourceAddChildResource(const picojson::object& args) {
400 CHECK_PRIVILEGE(kPrivilegeIotcon);
402 CHECK_EXIST(args, kId);
403 CHECK_EXIST(args, kChildId);
405 ResourceInfoPtr parent;
406 auto result = IotconServerManager::GetInstance().GetResourceById(GetId(args), &parent);
408 LogAndReturnTizenError(result, ("GetResourceById() parent failed"));
411 long long child_id = static_cast<long long>(IotconUtils::GetArg(args, kChildId).get<double>());
412 ResourceInfoPtr child;
414 result = IotconServerManager::GetInstance().GetResourceById(child_id, &child);
416 LogAndReturnTizenError(result, ("GetResourceById() failed"));
419 int ret = iotcon_resource_bind_child_resource(parent->handle, child->handle);
420 if (IOTCON_ERROR_NONE != ret && IOTCON_ERROR_ALREADY != ret) {
421 LogAndReturnTizenError(IotconUtils::ConvertIotconError(ret),
422 ("iotcon_resource_bind_child_resource() failed"));
425 parent->children.insert(child);
426 child->parents.insert(parent);
428 return common::TizenSuccess();
431 common::TizenResult IotconInstance::ResourceRemoveChildResource(const picojson::object& args) {
434 CHECK_PRIVILEGE(kPrivilegeIotcon);
436 CHECK_EXIST(args, kId);
437 CHECK_EXIST(args, kChildId);
439 ResourceInfoPtr parent;
440 auto result = IotconServerManager::GetInstance().GetResourceById(GetId(args), &parent);
442 LogAndReturnTizenError(result, ("GetResourceById() parent failed"));
445 long long child_id = static_cast<long long>(IotconUtils::GetArg(args, kChildId).get<double>());
446 ResourceInfoPtr child;
448 result = IotconServerManager::GetInstance().GetResourceById(child_id, &child);
450 LogAndReturnTizenError(result, ("GetResourceById() failed"));
453 result = IotconUtils::ConvertIotconError(
454 iotcon_resource_unbind_child_resource(parent->handle, child->handle));
456 LogAndReturnTizenError(result, ("iotcon_resource_unbind_child_resource() failed"));
459 parent->children.erase(child);
460 child->parents.erase(parent);
462 return common::TizenSuccess();
465 common::TizenResult IotconInstance::ResourceSetRequestListener(const picojson::object& args) {
468 CHECK_EXIST(args, kId);
470 ResourceInfoPtr resource;
471 long long id = GetId(args);
472 auto result = IotconServerManager::GetInstance().GetResourceById(id, &resource);
478 if (!resource->request_listener) {
479 resource->request_listener = [this, id](const common::TizenResult&, const picojson::value& v) {
480 ScopeLogger("Entered into asynchronous function, resource->request_listener");
481 picojson::value request{picojson::object{}};
482 auto& obj = request.get<picojson::object>();
484 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(id)}));
485 obj.insert(std::make_pair(kData, v));
487 Post(kResourceRequestListenerToken, common::TizenSuccess{request});
491 return common::TizenSuccess();
494 common::TizenResult IotconInstance::ResourceUnsetRequestListener(const picojson::object& args) {
497 CHECK_EXIST(args, kId);
499 ResourceInfoPtr resource;
500 auto result = IotconServerManager::GetInstance().GetResourceById(GetId(args), &resource);
506 resource->request_listener = nullptr;
508 return common::TizenSuccess();
511 common::TizenResult IotconInstance::ResponseSend(const picojson::object& args) {
514 CHECK_EXIST(args, kId);
515 CHECK_EXIST(args, kResult);
516 CHECK_EXIST(args, kRepresentation);
517 CHECK_EXIST(args, kOptions);
519 ResponsePtr response = nullptr;
520 auto result = IotconServerManager::GetInstance().GetResponseById(GetId(args), &response);
522 LogAndReturnTizenError(result, ("GetResponseById() failed"));
526 const auto& js_response_result = IotconUtils::GetArg(args, kResult);
527 if (!js_response_result.is<std::string>()) {
528 return LogAndCreateTizenError(TypeMismatchError, "ResponseResult should be a string");
530 iotcon_response_result_e response_result =
531 IotconUtils::ToResponseResult(js_response_result.get<std::string>());
533 result = IotconUtils::ConvertIotconError(
534 iotcon_response_set_result(response.get(), response_result));
536 LogAndReturnTizenError(result, ("iotcon_response_set_result() failed"));
541 const auto& js_representation = IotconUtils::GetArg(args, kRepresentation);
542 if (!js_representation.is<picojson::object>()) {
543 return LogAndCreateTizenError(TypeMismatchError, "Representation should be an object");
545 iotcon_representation_h representation = nullptr;
546 result = IotconUtils::RepresentationFromJson(js_representation.get<picojson::object>(),
549 LogAndReturnTizenError(result, ("RepresentationFromJson() failed"));
552 iotcon_representation_destroy(representation);
555 result = IotconUtils::ConvertIotconError(
556 iotcon_response_set_representation(response.get(), representation));
558 LogAndReturnTizenError(result, ("iotcon_response_set_representation() failed"));
563 const auto& js_options = IotconUtils::GetArg(args, kOptions);
565 if (js_options.is<picojson::array>()) {
566 iotcon_options_h options = nullptr;
568 result = IotconUtils::OptionsFromJson(js_options.get<picojson::array>(), &options);
570 LogAndReturnTizenError(result, ("OptionsFromJson() failed"));
573 iotcon_options_destroy(options);
577 IotconUtils::ConvertIotconError(iotcon_response_set_options(response.get(), options));
579 LogAndReturnTizenError(result, ("iotcon_response_set_options() failed"));
584 result = IotconUtils::ConvertIotconError(iotcon_response_send(response.get()));
586 LogAndReturnTizenError(result, ("iotcon_response_send() failed"));
589 return common::TizenSuccess();
592 common::TizenResult IotconInstance::RemoteResourceGetCachedRepresentation(
593 const picojson::object& args) {
596 FoundRemoteInfoPtr ptr;
597 auto res = IotconUtils::RemoteResourceFromJson(args, &ptr);
599 LogAndReturnTizenError(res, ("Failed to build resource using json data"));
601 iotcon_representation_h representation = nullptr;
602 res = IotconUtils::ConvertIotconError(
603 iotcon_remote_resource_get_cached_representation(ptr->handle, &representation));
605 LogAndReturnTizenError(res, ("Gathering cached representation failed"));
607 if (representation) {
608 picojson::value repr_json{picojson::object{}};
609 res = IotconUtils::RepresentationToJson(representation, &repr_json.get<picojson::object>());
611 LogAndReturnTizenError(res, ("RepresentationToJson() failed"));
613 return common::TizenSuccess{repr_json};
615 return common::AbortError("Failed to gather cached representation");
618 common::TizenResult IotconInstance::RemoteResourceGetOptions(const picojson::object& args) {
621 FoundRemoteInfoPtr ptr;
622 auto res = IotconUtils::RemoteResourceFromJson(args, &ptr);
624 LogAndReturnTizenError(res, ("Failed to build resource using json data"));
627 iotcon_options_h options = nullptr;
628 res = IotconUtils::ConvertIotconError(iotcon_remote_resource_get_options(ptr->handle, &options));
630 LogAndReturnTizenError(res, ("Gathering options failed"));
634 picojson::array options_array;
635 res = IotconUtils::OptionsToJson(options, &options_array);
637 LogAndReturnTizenError(res, ("OptionsToJson() failed"));
639 return common::TizenSuccess{picojson::value(options_array)};
642 return common::AbortError("Failed to gather options");
645 common::TizenResult IotconInstance::RemoteResourceSetOptions(const picojson::object& args) {
647 CHECK_EXIST(args, kOptions);
649 FoundRemoteInfoPtr ptr;
650 auto res = IotconUtils::RemoteResourceFromJson(args, &ptr);
652 LogAndReturnTizenError(res, ("Failed to build resource using json data"));
655 // default value would be null (if provided value is not an array)
656 iotcon_options_h options = nullptr;
657 const auto& options_it = args.find(kOptions);
658 if (options_it->second.is<picojson::array>()) {
659 // if it is an array use provided values
660 const auto& options_array = options_it->second.get<picojson::array>();
661 res = IotconUtils::OptionsFromJson(options_array, &options);
667 res = IotconUtils::ConvertIotconError(iotcon_remote_resource_set_options(ptr->handle, options));
669 LogAndReturnTizenError(res, ("iotcon_response_set_options() failed"));
672 return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(ptr)};
675 common::TizenResult IotconInstance::RemoteResourceMethodGet(const picojson::object& args,
676 const common::AsyncToken& token) {
679 CHECK_PRIVILEGE(kPrivilegeIotcon);
681 FoundRemoteInfoPtr resource;
682 auto result = IotconUtils::RemoteResourceFromJson(args, &resource);
684 LogAndReturnTizenError(result, ("RemoteResourceFromJson() failed"));
687 iotcon_query_h query = nullptr;
688 const auto& query_it = args.find(kQuery);
689 if (args.end() != query_it) {
690 result = IotconUtils::QueryFromJson(query_it->second.get<picojson::object>(), &query);
692 LogAndReturnTizenError(result, ("QueryFromJson() failed"));
697 iotcon_query_destroy(query);
701 std::unique_ptr<CallbackData> data{new CallbackData{PostForMethodCall(token, resource)}};
703 // set options to the remote resource
704 const auto& js_options = IotconUtils::GetArg(args, kOptions);
706 if (js_options.is<picojson::array>()) {
707 iotcon_options_h options = nullptr;
709 result = IotconUtils::OptionsFromJson(js_options.get<picojson::array>(), &options);
711 LogAndReturnTizenError(result, ("OptionsFromJson() failed"));
714 iotcon_options_destroy(options);
717 result = IotconUtils::ConvertIotconError(
718 iotcon_remote_resource_set_options(resource->handle, options));
720 LogAndReturnTizenError(result, ("iotcon_response_set_options() failed"));
724 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_get(
725 resource->handle, query, RemoteResourceResponseCallback, data.get()));
727 LogAndReturnTizenError(result, ("iotcon_remote_resource_get() failed"));
730 // release memory ownership
733 return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(resource)};
736 common::TizenResult IotconInstance::RemoteResourceMethodPut(const picojson::object& args,
737 const common::AsyncToken& token) {
740 CHECK_PRIVILEGE(kPrivilegeIotcon);
742 CHECK_EXIST(args, kRepresentation);
744 FoundRemoteInfoPtr resource;
745 auto result = IotconUtils::RemoteResourceFromJson(args, &resource);
747 LogAndReturnTizenError(result, ("RemoteResourceFromJson() failed"));
750 iotcon_representation_h representation = nullptr;
751 result = IotconUtils::RepresentationFromJson(
752 IotconUtils::GetArg(args, kRepresentation).get<picojson::object>(), &representation);
754 LogAndReturnTizenError(result, ("RepresentationFromJson() failed"));
757 iotcon_representation_destroy(representation);
760 iotcon_query_h query = nullptr;
761 const auto& query_it = args.find(kQuery);
762 if (args.end() != query_it) {
763 result = IotconUtils::QueryFromJson(query_it->second.get<picojson::object>(), &query);
765 LogAndReturnTizenError(result, ("QueryFromJson() failed"));
770 iotcon_query_destroy(query);
774 std::unique_ptr<CallbackData> data{new CallbackData{PostForMethodCall(token, resource)}};
776 // set options to the remote resource
777 const auto& js_options = IotconUtils::GetArg(args, kOptions);
779 if (js_options.is<picojson::array>()) {
780 iotcon_options_h options = nullptr;
782 result = IotconUtils::OptionsFromJson(js_options.get<picojson::array>(), &options);
784 LogAndReturnTizenError(result, ("OptionsFromJson() failed"));
787 iotcon_options_destroy(options);
790 result = IotconUtils::ConvertIotconError(
791 iotcon_remote_resource_set_options(resource->handle, options));
793 LogAndReturnTizenError(result, ("iotcon_response_set_options() failed"));
797 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_put(
798 resource->handle, representation, query, RemoteResourceResponseCallback, data.get()));
800 LogAndReturnTizenError(result, ("iotcon_remote_resource_put() failed"));
803 // release memory ownership
806 return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(resource)};
809 common::TizenResult IotconInstance::RemoteResourceMethodPost(const picojson::object& args,
810 const common::AsyncToken& token) {
813 CHECK_PRIVILEGE(kPrivilegeIotcon);
815 CHECK_EXIST(args, kRepresentation);
817 FoundRemoteInfoPtr resource;
818 auto result = IotconUtils::RemoteResourceFromJson(args, &resource);
820 LogAndReturnTizenError(result, ("RemoteResourceFromJson() failed"));
823 iotcon_representation_h representation = nullptr;
824 result = IotconUtils::RepresentationFromJson(
825 IotconUtils::GetArg(args, kRepresentation).get<picojson::object>(), &representation);
827 LogAndReturnTizenError(result, ("RepresentationFromJson() failed"));
830 iotcon_representation_destroy(representation);
833 iotcon_query_h query = nullptr;
834 const auto& query_it = args.find(kQuery);
835 if (args.end() != query_it) {
836 result = IotconUtils::QueryFromJson(query_it->second.get<picojson::object>(), &query);
838 LogAndReturnTizenError(result, ("QueryFromJson() failed"));
843 iotcon_query_destroy(query);
847 std::unique_ptr<CallbackData> data{new CallbackData{PostForMethodCall(token, resource)}};
849 // set options to the remote resource
850 const auto& js_options = IotconUtils::GetArg(args, kOptions);
852 if (js_options.is<picojson::array>()) {
853 iotcon_options_h options = nullptr;
855 result = IotconUtils::OptionsFromJson(js_options.get<picojson::array>(), &options);
857 LogAndReturnTizenError(result, ("OptionsFromJson() failed"));
860 iotcon_options_destroy(options);
863 result = IotconUtils::ConvertIotconError(
864 iotcon_remote_resource_set_options(resource->handle, options));
866 LogAndReturnTizenError(result, ("iotcon_response_set_options() failed"));
870 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_post(
871 resource->handle, representation, query, RemoteResourceResponseCallback, data.get()));
873 LogAndReturnTizenError(result, ("iotcon_remote_resource_post() failed"));
876 // release memory ownership
879 return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(resource)};
882 common::TizenResult IotconInstance::RemoteResourceMethodDelete(const picojson::object& args,
883 const common::AsyncToken& token) {
886 CHECK_PRIVILEGE(kPrivilegeIotcon);
888 FoundRemoteInfoPtr resource;
889 auto result = IotconUtils::RemoteResourceFromJson(args, &resource);
891 LogAndReturnTizenError(result, ("RemoteResourceFromJson() failed"));
894 std::unique_ptr<CallbackData> data{new CallbackData{PostForMethodCall(token, resource)}};
896 // set options to the remote resource
897 const auto& js_options = IotconUtils::GetArg(args, kOptions);
899 if (js_options.is<picojson::array>()) {
900 iotcon_options_h options = nullptr;
902 result = IotconUtils::OptionsFromJson(js_options.get<picojson::array>(), &options);
904 LogAndReturnTizenError(result, ("OptionsFromJson() failed"));
907 iotcon_options_destroy(options);
910 result = IotconUtils::ConvertIotconError(
911 iotcon_remote_resource_set_options(resource->handle, options));
913 LogAndReturnTizenError(result, ("iotcon_response_set_options() failed"));
917 result = IotconUtils::ConvertIotconError(
918 iotcon_remote_resource_delete(resource->handle, RemoteResourceResponseCallback, data.get()));
920 LogAndReturnTizenError(result, ("iotcon_remote_resource_delete() failed"));
923 // release memory ownership
926 return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(resource)};
929 static void ObserveCallback(iotcon_remote_resource_h resource, iotcon_error_e err,
930 int sequence_number, iotcon_response_h response, void* user_data) {
932 long long* id = static_cast<long long*>(user_data);
934 FoundRemoteInfoPtr ptr = IotconClientManager::GetInstance().GetFoundRemoteInfoPtr(*id);
936 if (nullptr == ptr) {
937 LoggerE("ObserveCallback() failed. Ignoring callback");
941 if (ptr->observe_listener) {
942 picojson::value json_result = picojson::value(picojson::object());
944 auto result = IotconUtils::ResponseToJson(response, &json_result.get<picojson::object>());
946 ptr->observe_listener(common::TizenSuccess(), json_result);
948 LoggerD("Ignoring callback");
953 common::TizenResult IotconInstance::RemoteResourceStartObserving(const picojson::object& args) {
956 CHECK_PRIVILEGE(kPrivilegeIotcon);
958 CHECK_EXIST(args, kObservePolicy);
959 FoundRemoteInfoPtr ptr;
960 auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
962 LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
965 iotcon_query_h query = nullptr;
966 const auto& query_it = args.find(kQuery);
967 if (args.end() != query_it) {
968 result = IotconUtils::QueryFromJson(query_it->second.get<picojson::object>(), &query);
975 iotcon_query_destroy(query);
979 iotcon_observe_policy_e observe_policy =
980 IotconUtils::ToObservePolicy(args.find(kObservePolicy)->second.get<std::string>().c_str());
982 ptr->observe_listener = [this, ptr](const common::TizenResult& res, const picojson::value& v) {
983 ScopeLogger("Entered into asynchronous function, ptr->observe_listener");
984 picojson::value response{picojson::object{}};
985 auto& obj = response.get<picojson::object>();
987 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(ptr->id)}));
988 obj.insert(std::make_pair(kData, v));
990 Post(kRemoteResourceChangeListener, common::TizenSuccess{response});
993 // set options to the remote resource
994 const auto& js_options = IotconUtils::GetArg(args, kOptions);
996 if (js_options.is<picojson::array>()) {
997 iotcon_options_h options = nullptr;
999 result = IotconUtils::OptionsFromJson(js_options.get<picojson::array>(), &options);
1001 LogAndReturnTizenError(result, ("OptionsFromJson() failed"));
1004 iotcon_options_destroy(options);
1008 IotconUtils::ConvertIotconError(iotcon_remote_resource_set_options(ptr->handle, options));
1010 LogAndReturnTizenError(result, ("iotcon_response_set_options() failed"));
1014 picojson::value ret = IotconClientManager::GetInstance().StoreRemoteResource(ptr);
1015 result = IotconUtils::ConvertIotconError(
1016 iotcon_remote_resource_observe_register(ptr->handle, observe_policy, query, ObserveCallback,
1017 IotconClientManager::GetInstance().Add(ptr->id)));
1019 IotconClientManager::GetInstance().RemoveRemoteResource(ptr);
1023 observing_started_ = true;
1024 return common::TizenSuccess{ret};
1027 common::TizenResult IotconInstance::RemoteResourceStopObserving(const picojson::object& args) {
1030 CHECK_PRIVILEGE(kPrivilegeIotcon);
1032 if (!observing_started_) {
1033 LoggerD("Observing is not started. ignore stop observing");
1035 if (args.find(kId)->second.is<double>()) {
1036 id = static_cast<long long>(args.find(kId)->second.get<double>());
1038 return common::TizenSuccess{IotconClientManager::GetInstance().PrepareManageIdAnswer(true, id)};
1041 FoundRemoteInfoPtr ptr;
1042 auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
1044 LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
1047 // set options to the remote resource
1048 const auto& js_options = IotconUtils::GetArg(args, kOptions);
1050 if (js_options.is<picojson::array>()) {
1051 iotcon_options_h options = nullptr;
1053 result = IotconUtils::OptionsFromJson(js_options.get<picojson::array>(), &options);
1055 LogAndReturnTizenError(result, ("OptionsFromJson() failed"));
1058 iotcon_options_destroy(options);
1062 IotconUtils::ConvertIotconError(iotcon_remote_resource_set_options(ptr->handle, options));
1064 LogAndReturnTizenError(result, ("iotcon_response_set_options() failed"));
1068 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_observe_deregister(ptr->handle));
1072 observing_started_ = false;
1073 ptr->observe_listener = nullptr;
1074 return common::TizenSuccess{IotconClientManager::GetInstance().RemoveRemoteResource(ptr)};
1077 static void RepresentationChangedCallback(iotcon_remote_resource_h resource,
1078 iotcon_representation_h representation, void* user_data) {
1080 long long* id = static_cast<long long*>(user_data);
1082 FoundRemoteInfoPtr ptr = IotconClientManager::GetInstance().GetFoundRemoteInfoPtr(*id);
1084 if (nullptr == ptr) {
1085 LoggerE("RepresentationChangeCallback() failed. Ignoring callback");
1089 if (ptr->cache_change_listener) {
1090 picojson::value json_result = picojson::value(picojson::object());
1093 IotconUtils::RepresentationToJson(representation, &json_result.get<picojson::object>());
1095 ptr->cache_change_listener(common::TizenSuccess(), json_result);
1097 LoggerE("RepresentationToJson() failed. Ignoring callback");
1103 common::TizenResult IotconInstance::RemoteResourceStartCaching(const picojson::object& args) {
1106 CHECK_PRIVILEGE(kPrivilegeIotcon);
1108 FoundRemoteInfoPtr ptr;
1109 auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
1111 LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
1114 ptr->cache_change_listener = [this, ptr](const common::TizenResult& res,
1115 const picojson::value& v) {
1116 ScopeLogger("Entered into asynchronous function, ptr->cache_change_listener");
1117 picojson::value response{picojson::object{}};
1118 auto& obj = response.get<picojson::object>();
1120 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(ptr->id)}));
1121 obj.insert(std::make_pair(kData, v));
1123 Post(kRemoteResourceCacheChangeListener, common::TizenSuccess{response});
1126 picojson::value ret = IotconClientManager::GetInstance().StoreRemoteResource(ptr);
1127 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_start_caching(
1128 ptr->handle, RepresentationChangedCallback, IotconClientManager::GetInstance().Add(ptr->id)));
1130 IotconClientManager::GetInstance().RemoveRemoteResource(ptr);
1134 caching_started_ = true;
1135 return common::TizenSuccess{ret};
1138 common::TizenResult IotconInstance::RemoteResourceStopCaching(const picojson::object& args) {
1141 CHECK_PRIVILEGE(kPrivilegeIotcon);
1143 if (!caching_started_) {
1144 LoggerD("Caching is not started. ignore stop caching");
1146 if (args.find(kId)->second.is<double>()) {
1147 id = static_cast<long long>(args.find(kId)->second.get<double>());
1149 return common::TizenSuccess{IotconClientManager::GetInstance().PrepareManageIdAnswer(true, id)};
1152 FoundRemoteInfoPtr ptr;
1153 auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
1155 LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
1158 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_stop_caching(ptr->handle));
1163 caching_started_ = false;
1164 ptr->cache_change_listener = nullptr;
1165 return common::TizenSuccess{IotconClientManager::GetInstance().RemoveRemoteResource(ptr)};
1168 static void MonitoringCallback(iotcon_remote_resource_h resource,
1169 iotcon_remote_resource_state_e state, void* user_data) {
1171 long long* id = static_cast<long long*>(user_data);
1173 FoundRemoteInfoPtr ptr = IotconClientManager::GetInstance().GetFoundRemoteInfoPtr(*id);
1175 if (nullptr == ptr) {
1176 LoggerE("MonitoringCallback() failed. Ignoring callback");
1180 if (ptr->state_listener) {
1181 picojson::value json_result = picojson::value(IOTCON_REMOTE_RESOURCE_ALIVE == state);
1182 ptr->state_listener(common::TizenSuccess(), json_result);
1184 LoggerD("Post function not present, just ignoring");
1188 common::TizenResult IotconInstance::RemoteResourceSetResourceStateChangeListener(
1189 const picojson::object& args) {
1192 CHECK_PRIVILEGE(kPrivilegeIotcon);
1194 FoundRemoteInfoPtr ptr;
1195 auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
1197 LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
1200 ptr->state_listener = [this, ptr](const common::TizenResult& res, const picojson::value& v) {
1201 ScopeLogger("Entered into asynchronous function, ptr->state_listener");
1202 picojson::value response{picojson::object{}};
1203 auto& obj = response.get<picojson::object>();
1205 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(ptr->id)}));
1206 obj.insert(std::make_pair(kData, v));
1208 Post(kRemoteResourceStateChangeListener, common::TizenSuccess{response});
1211 picojson::value ret = IotconClientManager::GetInstance().StoreRemoteResource(ptr);
1212 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_start_monitoring(
1213 ptr->handle, MonitoringCallback, IotconClientManager::GetInstance().Add(ptr->id)));
1215 IotconClientManager::GetInstance().RemoveRemoteResource(ptr);
1218 monitoring_started_ = true;
1219 return common::TizenSuccess{ret};
1222 common::TizenResult IotconInstance::RemoteResourceUnsetResourceStateChangeListener(
1223 const picojson::object& args) {
1226 CHECK_PRIVILEGE(kPrivilegeIotcon);
1228 if (!monitoring_started_) {
1229 LoggerD("Monitoring is not started. ignore stop monitoring");
1231 if (args.find(kId)->second.is<double>()) {
1232 id = static_cast<long long>(args.find(kId)->second.get<double>());
1234 return common::TizenSuccess{IotconClientManager::GetInstance().PrepareManageIdAnswer(true, id)};
1237 FoundRemoteInfoPtr ptr;
1238 auto result = IotconUtils::RemoteResourceFromJson(args, &ptr);
1240 LogAndReturnTizenError(result, ("Failed to create remote resource handle"));
1242 result = IotconUtils::ConvertIotconError(iotcon_remote_resource_stop_monitoring(ptr->handle));
1246 monitoring_started_ = false;
1247 ptr->state_listener = nullptr;
1248 return common::TizenSuccess{IotconClientManager::GetInstance().RemoveRemoteResource(ptr)};
1251 common::TizenResult IotconInstance::RemoteResourceGetTimeInterval(const picojson::object& args) {
1254 CHECK_PRIVILEGE(kPrivilegeIotcon);
1256 FoundRemoteInfoPtr ptr;
1257 auto res = IotconUtils::RemoteResourceFromJson(args, &ptr);
1259 LogAndReturnTizenError(res, ("Failed to build resource using json data"));
1262 int time_interval = 0;
1264 res = IotconUtils::ConvertIotconError(
1265 iotcon_remote_resource_get_checking_interval(ptr->handle, &time_interval));
1267 LogAndReturnTizenError(res, ("iotcon_remote_resource_get_checking_interval() failed"));
1269 return common::TizenSuccess{picojson::value(static_cast<double>(time_interval))};
1272 common::TizenResult IotconInstance::RemoteResourceSetTimeInterval(const picojson::object& args) {
1275 CHECK_PRIVILEGE(kPrivilegeIotcon);
1276 CHECK_EXIST(args, kTimeInterval);
1278 int time_interval = static_cast<int>(IotconUtils::GetArg(args, kTimeInterval).get<double>());
1280 FoundRemoteInfoPtr ptr;
1281 auto res = IotconUtils::RemoteResourceFromJson(args, &ptr);
1283 LogAndReturnTizenError(res, ("Failed to build resource using json data"));
1286 res = IotconUtils::ConvertIotconError(
1287 iotcon_remote_resource_set_checking_interval(ptr->handle, time_interval));
1289 LogAndReturnTizenError(res, ("iotcon_remote_resource_set_checking_interval() failed"));
1292 return common::TizenSuccess{IotconClientManager::GetInstance().StoreRemoteResource(ptr)};
1295 bool IotconInstance::ResourceFoundCallback(iotcon_remote_resource_h resource, iotcon_error_e result,
1298 CallbackData* data = static_cast<CallbackData*>(user_data);
1299 if (nullptr == data) {
1300 LoggerE("ResourceFoundCallback() failed. Ignoring callback");
1301 return IOTCON_FUNC_STOP;
1304 picojson::value v{picojson::object{}};
1305 common::TizenResult ret = common::TizenSuccess();
1307 case IOTCON_ERROR_NONE:
1308 ret = IotconUtils::RemoteResourceToJson(resource, &v.get<picojson::object>());
1310 case IOTCON_ERROR_TIMEOUT:
1311 LoggerD("IOTCON_TIMEOUT");
1313 ret = IotconUtils::ConvertIotconError(result);
1318 return IOTCON_FUNC_STOP;
1321 return IOTCON_FUNC_CONTINUE;
1324 common::TizenResult IotconInstance::ClientFindResource(const picojson::object& args) {
1327 CHECK_PRIVILEGE(kPrivilegeIotcon);
1329 CHECK_EXIST(args, kHostAddress);
1330 char* host_address = nullptr;
1331 if (args.find(kHostAddress)->second.is<std::string>()) {
1332 host_address = const_cast<char*>(args.find(kHostAddress)->second.get<std::string>().c_str());
1334 host_address = IOTCON_MULTICAST_ADDRESS;
1337 CHECK_EXIST(args, kQuery);
1338 iotcon_query_h query = nullptr;
1339 const auto& query_obj = args.find(kQuery)->second;
1340 if (query_obj.is<picojson::object>()) {
1341 auto result = IotconUtils::QueryFromJson(query_obj.get<picojson::object>(), &query);
1343 LogAndReturnTizenError(result, ("QueryFromJson() failed"));
1348 iotcon_query_destroy(query);
1352 CHECK_EXIST(args, kConnectivityType);
1353 int connectivity_type =
1354 IotconUtils::ToConnectivityType2(args.find(kConnectivityType)->second.get<std::string>());
1356 long long id = GetId(args);
1357 auto response = [this, id](const common::TizenResult& res, const picojson::value& v) {
1358 ScopeLogger("Entered into asynchronous function, response");
1359 picojson::value response{picojson::object{}};
1360 auto& obj = response.get<picojson::object>();
1362 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(id)}));
1364 common::tools::ReportSuccess(v, obj);
1366 common::tools::ReportError(res, &obj);
1369 Post(kFindResourceListenerToken, common::TizenSuccess{response});
1372 CallbackData* data = new CallbackData{response};
1374 LoggerD("Running find with:\nhost_address: %s,\nconnectivity_type: %d", host_address,
1376 auto result = IotconUtils::ConvertIotconError(
1377 iotcon_find_resource(host_address, connectivity_type, query, ResourceFoundCallback, data));
1380 LogAndReturnTizenError(result);
1382 int timeout = 60; // default value set much bigger than default value for iotcon = 30s
1383 auto result = IotconUtils::ConvertIotconError(iotcon_get_timeout(&timeout));
1385 LoggerE("iotcon_get_timeout - function call failed, using default value %d", timeout);
1387 timeout = timeout + 10; // add 10 extra second to prevent too fast delete
1389 // adding listener to delete data, when find would be finished
1390 std::thread([data, timeout]() {
1391 std::this_thread::sleep_for(std::chrono::seconds(timeout));
1392 LoggerD("Deleting resource find data: %p", data);
1397 return common::TizenSuccess();
1400 common::TizenResult IotconInstance::ClientAddPresenceEventListener(const picojson::object& args) {
1403 CHECK_PRIVILEGE(kPrivilegeIotcon);
1405 CHECK_EXIST(args, kHostAddress);
1406 CHECK_EXIST(args, kResourceType);
1407 CHECK_EXIST(args, kConnectivityType);
1409 char* host = nullptr;
1410 if (args.find(kHostAddress)->second.is<std::string>()) {
1411 host = const_cast<char*>(args.find(kHostAddress)->second.get<std::string>().c_str());
1414 char* resource_type = nullptr;
1415 if (args.find(kResourceType)->second.is<std::string>()) {
1416 resource_type = const_cast<char*>(args.find(kResourceType)->second.get<std::string>().c_str());
1419 auto& con_type = IotconUtils::GetArg(args, kConnectivityType);
1420 if (!con_type.is<std::string>()) {
1421 return common::TypeMismatchError("connectivityType needs to be a string");
1423 iotcon_connectivity_type_e con_type_e =
1424 IotconUtils::ToConnectivityType(con_type.get<std::string>());
1426 PresenceEventPtr presence{new PresenceEvent()};
1427 auto ret = IotconClientManager::GetInstance().AddPresenceEventListener(host, con_type_e,
1428 resource_type, presence);
1433 long long id = presence->id;
1435 presence->presence_listener = [this, id](const common::TizenResult&, const picojson::value& v) {
1436 ScopeLogger("Entered into asynchronous function, presence->presence_listener");
1437 picojson::value response{picojson::object{}};
1438 auto& obj = response.get<picojson::object>();
1440 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(id)}));
1441 obj.insert(std::make_pair(kData, v));
1443 Post(kPresenceEventListenerToken, common::TizenSuccess{response});
1446 return common::TizenSuccess(picojson::value{static_cast<double>(id)});
1449 common::TizenResult IotconInstance::ClientRemovePresenceEventListener(
1450 const picojson::object& args) {
1453 CHECK_PRIVILEGE(kPrivilegeIotcon);
1455 CHECK_EXIST(args, kId);
1457 auto ret = IotconClientManager::GetInstance().RemovePresenceEventListener(GetId(args));
1463 return common::TizenSuccess();
1466 bool IotconDeviceInfoCb(iotcon_device_info_h device_info, iotcon_error_e result, void* user_data) {
1469 CallbackData* data = static_cast<CallbackData*>(user_data);
1470 if (nullptr == data) {
1471 LoggerE("IotconDeviceInfoCb() failed. Ignoring callback");
1472 return IOTCON_FUNC_STOP;
1475 picojson::value v{picojson::object{}};
1476 common::TizenResult ret = common::TizenSuccess();
1479 case IOTCON_ERROR_NONE:
1480 ret = IotconUtils::DeviceInfoToJson(device_info, &v.get<picojson::object>());
1482 case IOTCON_ERROR_TIMEOUT:
1483 LoggerD("IOTCON_TIMEOUT");
1485 ret = IotconUtils::ConvertIotconError(result);
1490 return IOTCON_FUNC_STOP;
1493 return IOTCON_FUNC_CONTINUE;
1496 common::TizenResult IotconInstance::ClientFindDeviceInfo(const picojson::object& args) {
1499 CHECK_PRIVILEGE(kPrivilegeIotcon);
1501 CHECK_EXIST(args, kHostAddress);
1502 char* host_address = nullptr;
1503 if (args.find(kHostAddress)->second.is<std::string>()) {
1504 host_address = const_cast<char*>(args.find(kHostAddress)->second.get<std::string>().c_str());
1506 host_address = IOTCON_MULTICAST_ADDRESS;
1509 CHECK_EXIST(args, kQuery);
1510 iotcon_query_h query = nullptr;
1511 const auto& query_obj = args.find(kQuery)->second;
1512 if (query_obj.is<picojson::object>()) {
1513 auto result = IotconUtils::QueryFromJson(query_obj.get<picojson::object>(), &query);
1515 LogAndReturnTizenError(result, ("QueryFromJson() failed"));
1520 iotcon_query_destroy(query);
1524 CHECK_EXIST(args, kConnectivityType);
1525 std::string con_type = args.find(kConnectivityType)->second.get<std::string>();
1526 int con_type_e = IotconUtils::ToConnectivityType2(con_type);
1528 long long id = GetId(args);
1529 auto response = [this, id](const common::TizenResult& res, const picojson::value& v) {
1530 ScopeLogger("Entered into asynchronous function, response");
1531 picojson::value response{picojson::object{}};
1532 auto& obj = response.get<picojson::object>();
1534 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(id)}));
1536 common::tools::ReportSuccess(v, obj);
1538 common::tools::ReportError(res, &obj);
1541 Post(kFindDeviceInfoListenerToken, common::TizenSuccess{response});
1544 CallbackData* data = new CallbackData{response};
1546 auto result = IotconUtils::ConvertIotconError(
1547 iotcon_find_device_info(host_address, con_type_e, query, IotconDeviceInfoCb, data));
1551 LogAndReturnTizenError(result);
1553 int timeout = 60; // default value set much bigger than default value for iotcon = 30s
1554 auto result = IotconUtils::ConvertIotconError(iotcon_get_timeout(&timeout));
1556 LoggerE("iotcon_get_timeout - function call failed, using default value %d", timeout);
1558 timeout = timeout + 10; // add 10 extra second to prevent too fast delete
1560 // adding listener to delete data, when find would be finished
1561 std::thread([data, timeout]() {
1562 std::this_thread::sleep_for(std::chrono::seconds(timeout));
1563 LoggerD("Deleting resource find data: %p", data);
1568 return common::TizenSuccess();
1571 bool IotconPlatformInfoCb(iotcon_platform_info_h platform_info, iotcon_error_e result,
1575 CallbackData* data = static_cast<CallbackData*>(user_data);
1576 if (nullptr == data) {
1577 LoggerE("IotconPlatformInfoCb() failed. Ignoring callback");
1578 return IOTCON_FUNC_STOP;
1581 picojson::value v{picojson::object{}};
1582 common::TizenResult ret = common::TizenSuccess();
1585 case IOTCON_ERROR_NONE:
1586 ret = IotconUtils::PlatformInfoToJson(platform_info, &v.get<picojson::object>());
1588 case IOTCON_ERROR_TIMEOUT:
1589 LoggerD("IOTCON_TIMEOUT");
1591 ret = IotconUtils::ConvertIotconError(result);
1596 return IOTCON_FUNC_STOP;
1599 return IOTCON_FUNC_CONTINUE;
1602 common::TizenResult IotconInstance::ClientFindPlatformInfo(const picojson::object& args) {
1605 CHECK_PRIVILEGE(kPrivilegeIotcon);
1607 CHECK_EXIST(args, kHostAddress);
1608 char* host_address = nullptr;
1609 if (args.find(kHostAddress)->second.is<std::string>()) {
1610 host_address = const_cast<char*>(args.find(kHostAddress)->second.get<std::string>().c_str());
1612 host_address = IOTCON_MULTICAST_ADDRESS;
1615 CHECK_EXIST(args, kQuery);
1616 iotcon_query_h query = nullptr;
1617 const auto& query_obj = args.find(kQuery)->second;
1618 if (query_obj.is<picojson::object>()) {
1619 auto result = IotconUtils::QueryFromJson(query_obj.get<picojson::object>(), &query);
1621 LogAndReturnTizenError(result, ("QueryFromJson() failed"));
1626 iotcon_query_destroy(query);
1630 CHECK_EXIST(args, kConnectivityType);
1631 std::string con_type = args.find(kConnectivityType)->second.get<std::string>();
1632 int con_type_e = IotconUtils::ToConnectivityType2(con_type);
1634 long long id = GetId(args);
1635 auto response = [this, id](const common::TizenResult& res, const picojson::value& v) {
1636 ScopeLogger("Entered into asynchronous function, response");
1637 picojson::value response{picojson::object{}};
1638 auto& obj = response.get<picojson::object>();
1640 obj.insert(std::make_pair(kId, picojson::value{static_cast<double>(id)}));
1642 common::tools::ReportSuccess(v, obj);
1644 common::tools::ReportError(res, &obj);
1647 Post(kFindPlatformInfoListenerToken, common::TizenSuccess{response});
1650 CallbackData* data = new CallbackData{response};
1652 auto result = IotconUtils::ConvertIotconError(
1653 iotcon_find_platform_info(host_address, con_type_e, query, IotconPlatformInfoCb, data));
1657 LogAndReturnTizenError(result);
1659 int timeout = 60; // default value set much bigger than default value for iotcon = 30s
1660 auto result = IotconUtils::ConvertIotconError(iotcon_get_timeout(&timeout));
1662 LoggerE("iotcon_get_timeout - function call failed, using default value %d", timeout);
1664 timeout = timeout + 10; // add 10 extra second to prevent too fast delete
1666 // adding listener to delete data, when find would be finished
1667 std::thread([data, timeout]() {
1668 std::this_thread::sleep_for(std::chrono::seconds(timeout));
1669 LoggerD("Deleting resource find data: %p", data);
1674 return common::TizenSuccess();
1677 common::TizenResult IotconInstance::ServerCreateResource(const picojson::object& args) {
1680 CHECK_PRIVILEGE(kPrivilegeIotcon);
1682 CHECK_EXIST(args, kUriPath);
1683 CHECK_EXIST(args, kResourceTypes);
1684 CHECK_EXIST(args, kResourceInterfaces);
1686 const std::string& uri_path = args.find(kUriPath)->second.get<std::string>();
1688 const auto& types = IotconUtils::GetArg(args, kResourceTypes);
1689 const auto& resource_types =
1690 types.is<picojson::array>() ? types.get<picojson::array>() : picojson::array();
1692 const auto& interfaces = IotconUtils::GetArg(args, kResourceInterfaces);
1693 const auto& resource_interfaces =
1694 interfaces.is<picojson::array>() ? interfaces.get<picojson::array>() : picojson::array();
1696 int properties = IotconUtils::GetProperties(args);
1698 ResourceInfoPtr resource{new ResourceInfo()};
1699 auto ret = IotconServerManager::GetInstance().CreateResource(
1700 uri_path, resource_interfaces, resource_types, properties, resource);
1705 LoggerD("RESOURCE\nid: %lld\nhandle: %p", resource->id, resource->handle);
1707 picojson::value result = picojson::value(picojson::object());
1708 ret = IotconUtils::ResourceToJson(resource, &(result.get<picojson::object>()));
1713 return common::TizenSuccess{result};
1716 common::TizenResult IotconInstance::ServerRemoveResource(const picojson::object& args) {
1719 CHECK_PRIVILEGE(kPrivilegeIotcon);
1721 CHECK_EXIST(args, kId);
1723 return IotconServerManager::GetInstance().DestroyResource(GetId(args));
1726 common::TizenResult IotconInstance::ServerStartPresence(const picojson::object& args) {
1729 CHECK_PRIVILEGE(kPrivilegeIotcon);
1730 CHECK_EXIST(args, kTimeToLive);
1732 if (!initialized_) {
1733 return LogAndCreateTizenError(AbortError, "Iotcon service not initialized");
1736 if (presence_started_) {
1737 LoggerD("Iotcon service presence has been already started");
1738 return common::TizenSuccess();
1741 unsigned int timeToLive =
1742 static_cast<unsigned int>(IotconUtils::GetArg(args, kTimeToLive).get<double>());
1744 auto result = IotconUtils::ConvertIotconError(iotcon_start_presence(timeToLive));
1746 LogAndReturnTizenError(result);
1749 presence_started_ = true;
1750 LoggerD("Iotcon service presence started");
1755 common::TizenResult IotconInstance::ServerStopPresence(const picojson::object& args) {
1758 CHECK_PRIVILEGE(kPrivilegeIotcon);
1760 if (!presence_started_) {
1761 LoggerD("Iotcon service presence not started before");
1762 return common::TizenSuccess();
1765 auto result = IotconUtils::ConvertIotconError(iotcon_stop_presence());
1767 LogAndReturnTizenError(result);
1770 presence_started_ = false;
1771 LoggerD("Iotcon service presence stopped");
1776 common::TizenResult IotconInstance::SetDeviceName(const picojson::object& args) {
1779 CHECK_PRIVILEGE(kPrivilegeIotcon);
1780 CHECK_EXIST(args, kDeviceName);
1782 if (!initialized_) {
1783 return LogAndCreateTizenError(AbortError, "Iotcon service not initialized");
1786 const std::string& name = IotconUtils::GetArg(args, kDeviceName).get<std::string>();
1788 auto result = IotconUtils::ConvertIotconError(iotcon_set_device_name(name.c_str()));
1790 LogAndReturnTizenError(result);
1793 LoggerD("Iotcon service device name set");
1798 common::TizenResult IotconInstance::Initialize(const picojson::object& args) {
1801 CHECK_PRIVILEGE(kPrivilegeIotcon);
1803 CHECK_EXIST(args, kFilePath);
1804 const auto& filePath = IotconUtils::GetArg(args, kFilePath);
1805 // convert virtual root (if present in path) for native iotcon_initialize function
1806 std::string realPath =
1807 common::FilesystemProvider::Create().GetRealPath(filePath.get<std::string>());
1809 auto result = IotconUtils::ConvertIotconError(iotcon_initialize(realPath.c_str()));
1811 LogAndReturnTizenError(result);
1814 initialized_ = true;
1815 LoggerD("Iotcon service initialized");
1820 common::TizenResult IotconInstance::GetTimeout(const picojson::object& args) {
1824 auto result = IotconUtils::ConvertIotconError(iotcon_get_timeout(&timeout));
1827 LogAndReturnTizenError(result);
1830 return common::TizenSuccess{picojson::value{static_cast<double>(timeout)}};
1833 common::TizenResult IotconInstance::SetTimeout(const picojson::object& args) {
1836 CHECK_EXIST(args, kTimeout);
1838 int timeout = static_cast<int>(args.find(kTimeout)->second.get<double>());
1839 auto result = IotconUtils::ConvertIotconError(iotcon_set_timeout(timeout));
1842 LogAndReturnTizenError(result);
1845 return common::TizenSuccess();
1848 common::TizenResult IotconInstance::AddGeneratedPinListener(const picojson::object& args) {
1851 auto listener = [this](const char* pin, long watchId) {
1852 ScopeLogger("Entered into asynchronous function, listener");
1853 picojson::object obj;
1854 obj[kId] = picojson::value{(double)watchId};
1855 obj["pin"] = picojson::value{pin};
1856 this->Post(kGeneratedPinToken, common::TizenSuccess{picojson::value{obj}});
1859 return IotconManager::GetInstance().addGeneratedPinListener(listener);
1862 common::TizenResult IotconInstance::RemoveGeneratedPinListener(const picojson::object& args) {
1865 CHECK_EXIST(args, "watchId");
1866 long watchId = args.find("watchId")->second.get<double>();
1868 return IotconManager::GetInstance().removeGeneratedPinListener(watchId);
1871 common::PostCallback IotconInstance::PostForMethodCall(const common::AsyncToken& token,
1872 const FoundRemoteInfoPtr& resource) {
1875 return [this, token, resource](const common::TizenResult& result, const picojson::value& v) {
1876 ScopeLogger("Entered into asynchronous function, returned value");
1877 auto value = IotconClientManager::GetInstance().RemoveRemoteResource(resource);
1878 auto& obj = value.get<picojson::object>();
1881 obj.insert(std::make_pair(kData, v));
1883 result.ToJson(&obj);
1886 Post(token, common::TizenSuccess{value});
1890 } // namespace iotcon
1891 } // namespace extension