[Widget] Added send/getContent implementation.
authorTomasz Marciniak <t.marciniak@samsung.com>
Thu, 10 Mar 2016 13:23:32 +0000 (14:23 +0100)
committerLukasz Bardeli <l.bardeli@samsung.com>
Thu, 14 Apr 2016 09:32:16 +0000 (11:32 +0200)
[Verification] Code compiles.

Change-Id: I3307b80692e5c70c25bf8f347ee95d79d13923a5
Signed-off-by: Tomasz Marciniak <t.marciniak@samsung.com>
src/widget/widget_api.js
src/widget/widget_instance.cc

index e4f59d8ee3bc74515e6c032e08505e91b869b2ad..a1c1fdad357e5eb32ee556232d705e1e9aedaa20 100755 (executable)
@@ -145,8 +145,7 @@ WidgetInstance.prototype.changeUpdatePeriod = function() {
 WidgetInstance.prototype.sendContent = function() {
   var args = validator.validateMethod(arguments, [{
     name : 'data',
-    type : types.ARRAY,
-    values: types.BYTE
+    type: types.DICTIONARY,
   }, {
     name : 'force',
     type : types.BOOLEAN,
@@ -265,7 +264,7 @@ Widget.prototype.getInstances = function() {
       var instances = createObjects(result, WidgetInstance, this);
       args.successCallback(instances);
     }
-  };
+  }.bind(this);
 
   var callArgs = {};
   callArgs.widgetId = this.id;
index 1a7bbc685681ae8ca2af777e3d1c2e39286cf8a2..36b0c67643c418d6b2ba0817b95419311b286363 100755 (executable)
@@ -20,6 +20,8 @@
 
 #include <widget_service.h>
 #include <widget_errno.h>
+#include <bundle.h>
+#include <bundle_internal.h>
 
 #include "widget/widget_utils.h"
 #include "common/scope_exit.h"
@@ -36,6 +38,8 @@ const std::string kPrivilegeWidget = "http://tizen.org/privilege/widget.viewer";
 const std::string kLang = "lang";
 const std::string kInstanceId = "instanceId";
 const std::string kPeriod = "period";
+const std::string kForce = "force";
+const std::string kData = "data";
 
 int WidgetListCb(const char* pkgid, const char* widget_id, int is_primary, void* data) {
   ScopeLogger();
@@ -418,13 +422,93 @@ TizenResult WidgetInstance::ChangeUpdatePeriod(picojson::object const& args) {
 TizenResult WidgetInstance::SendContent(picojson::object const& args) {
   ScopeLogger();
 
-  return common::NotSupportedError();
+  CHECK_EXIST(args, kWidgetId, out)
+  CHECK_EXIST(args, kInstanceId, out)
+  CHECK_EXIST(args, kData, out)
+  CHECK_EXIST(args, kForce, out)
+
+  const auto& widget_id = args.find(kWidgetId)->second.get<std::string>();
+  const auto& instance_id = args.find(kInstanceId)->second.get<std::string>();
+  const int force = args.find(kForce)->second.get<bool>() ? 1 : 0;
+
+  bundle* data = bundle_create();
+  int ret = get_last_result();
+  if (BUNDLE_ERROR_NONE != ret) {
+    LogAndReturnTizenError(common::AbortError(ret), ("bundle_create() failed"));
+  }
+
+  SCOPE_EXIT {
+    bundle_free(data);
+  };
+
+  ret = bundle_add(data, kData.c_str(), args.find(kData)->second.serialize().c_str());
+  if (BUNDLE_ERROR_NONE != ret) {
+    LogAndReturnTizenError(common::AbortError(ret), ("bundle_add() failed"));
+  }
+
+  ret = widget_service_trigger_update(widget_id.c_str(), instance_id.c_str(), data, force);
+  if (WIDGET_ERROR_NONE != ret) {
+    LogAndReturnTizenError(
+        WidgetUtils::ConvertErrorCode(ret), ("widget_service_trigger_update() failed"));
+  }
+
+  return TizenSuccess();
 }
 
 TizenResult WidgetInstance::GetContent(picojson::object const& args, const common::AsyncToken& token) {
   ScopeLogger();
 
-  return common::NotSupportedError();
+  CHECK_EXIST(args, kWidgetId, out)
+  CHECK_EXIST(args, kInstanceId, out)
+
+  const auto& widget_id = args.find(kWidgetId)->second.get<std::string>();
+  const auto& instance_id = args.find(kInstanceId)->second.get<std::string>();
+
+  auto get_content = [this, widget_id, instance_id](const common::AsyncToken& token) -> void {
+    bundle* bundle_data = bundle_create();
+
+    int ret = get_last_result();
+    if (BUNDLE_ERROR_NONE != ret) {
+      LoggerE("bundle_create() failed");
+      this->Post(token, common::AbortError(ret));
+      return;
+    }
+
+    SCOPE_EXIT {
+      bundle_free(bundle_data);
+    };
+
+    ret = widget_service_get_content_of_widget_instance(widget_id.c_str(),
+                                                        instance_id.c_str(), &bundle_data);
+    if (WIDGET_ERROR_NONE != ret) {
+      LoggerE("widget_service_get_content_of_widget_instance() failed");
+      this->Post(token, WidgetUtils::ConvertErrorCode(ret));
+      return;
+    }
+
+    char* data_str = nullptr;
+    ret = bundle_get_str(bundle_data, kData.c_str(), &data_str);
+    if (BUNDLE_ERROR_NONE != ret) {
+      LoggerE("bundle_get_str() failed");
+      this->Post(token, common::AbortError(ret));
+      return;
+    }
+
+    picojson::value response;
+    std::string err;
+    picojson::parse(response, data_str, data_str + strlen(data_str), &err);
+    if (!err.empty()) {
+      LoggerE("Failed to parse bundle data() failed [%s]", err.c_str());
+      this->Post(token, common::AbortError());
+      return;
+    }
+
+    this->Post(token, TizenSuccess{response});
+  };
+
+  std::thread(get_content, token).detach();
+
+  return TizenSuccess();
 }
 
 } // namespace widget