[Systeminfo] Uptime feature added 33/293033/1 accepted/tizen/unified/20230605.170322
authorPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Thu, 18 May 2023 09:13:59 +0000 (11:13 +0200)
committerPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Thu, 18 May 2023 09:19:14 +0000 (11:19 +0200)
[ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-291

[Verification] Code compiles without errors.
Checked in chrome console. Code returns seconds since uptime.

> tizen.systeminfo.getDeviceUptime()
2567

Change-Id: I968ee8e19cdb07f031d543161fcf24f62d9047fd

src/systeminfo/systeminfo-utils.cpp
src/systeminfo/systeminfo-utils.h
src/systeminfo/systeminfo_api.js
src/systeminfo/systeminfo_instance.cc
src/systeminfo/systeminfo_instance.h
src/systeminfo/systeminfo_manager.cc
src/systeminfo/systeminfo_manager.h

index 5b43229..ef87379 100644 (file)
  */
 
 #include "systeminfo-utils.h"
-#include "systeminfo/systeminfo_instance.h"
-
-#include <memory>
 
 #include <net_connection.h>
 #include <runtime_info.h>
 
+#include <fstream>
+#include <memory>
+
 #include "common/logger.h"
 #include "common/platform_exception.h"
 #include "common/scope_exit.h"
+#include "common/tools.h"
+#include "systeminfo/systeminfo_instance.h"
 
 namespace extension {
 namespace systeminfo {
@@ -33,8 +35,9 @@ namespace {
 const short MEMORY_TO_BYTE = 1024;
 }  // namespace
 
-using common::PlatformResult;
 using common::ErrorCode;
+using common::PlatformResult;
+using common::tools::GetErrorString;
 
 PlatformResult SysteminfoUtils::GetVconfInt(const char *key, int *value) {
   ScopeLogger();
@@ -182,6 +185,22 @@ PlatformResult SysteminfoUtils::GetAvailableMemory(long long *result) {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
+PlatformResult SysteminfoUtils::GetDeviceUptime(unsigned long long *result) {
+  ScopeLogger();
+
+  double uptime_seconds;
+  if (std::ifstream("/proc/uptime", std::ios::in) >> uptime_seconds) {
+    *result = static_cast<unsigned long long>(llround(uptime_seconds));
+    return PlatformResult(ErrorCode::NO_ERROR);
+  }
+  int ret = errno;
+  std::string log_msg =
+      "Failed to get uptime from /proc/uptime: " + GetErrorString(ret);
+  return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, log_msg,
+                            ("Failed to get uptime from /proc/uptime: %d (%s)",
+                             ret, GetErrorString(ret).c_str()));
+}
+
 PlatformResult SysteminfoUtils::RegisterVconfCallback(const char *in_key, vconf_callback_fn cb,
                                                       void *event_ptr) {
   ScopeLogger();
index 004d4b1..ddad26f 100644 (file)
@@ -50,6 +50,7 @@ class SysteminfoUtils {
   static common::PlatformResult GetTotalMemory(long long *result);
   static common::PlatformResult GetServiceCountry(std::string *result);
   static common::PlatformResult GetAvailableMemory(long long *result);
+  static common::PlatformResult GetDeviceUptime(unsigned long long *result);
   static common::PlatformResult RegisterVconfCallback(const char *in_key, vconf_callback_fn cb,
                                                       void *event_ptr);
   static common::PlatformResult UnregisterVconfCallback(const char *in_key, vconf_callback_fn cb);
index 679e99b..a304639 100644 (file)
@@ -1570,6 +1570,14 @@ SystemInfo.prototype.getAvailableMemory = function() {
     return native_.getResultObject(result).availableMemory;
 };
 
+SystemInfo.prototype.getDeviceUptime = function () {
+    var result = native_.callSync('SystemInfoGetDeviceUptime', {});
+    if (native_.isFailure(result)) {
+        throw native_.getErrorObject(result);
+    }
+    return native_.getResultObject(result).uptime;
+};
+
 SystemInfo.prototype.getCount = function() {
     var args = validator_.validateArgs(arguments, [
         {
index 7a4905f..44ea590 100644 (file)
@@ -61,6 +61,7 @@ SysteminfoInstance::SysteminfoInstance() : manager_(this) {
   REGISTER_METHOD(SystemInfoRemovePropertyValueChangeListener);
   REGISTER_METHOD(SystemInfoGetTotalMemory);
   REGISTER_METHOD(SystemInfoGetAvailableMemory);
+  REGISTER_METHOD(SystemInfoGetDeviceUptime);
   REGISTER_METHOD(SystemInfoGetCount);
   REGISTER_METHOD(SystemInfoSetBrightness);
   REGISTER_METHOD(SystemInfoGetBrightness);
@@ -127,6 +128,12 @@ void SysteminfoInstance::SystemInfoGetAvailableMemory(const picojson::value& arg
   manager_.GetAvailableMemory(args, &out);
 }
 
+void SysteminfoInstance::SystemInfoGetDeviceUptime(const picojson::value& args,
+                                                   picojson::object& out) {
+  ScopeLogger();
+  manager_.GetDeviceUptime(args, &out);
+}
+
 void SysteminfoInstance::SystemInfoGetCount(const picojson::value& args, picojson::object& out) {
   ScopeLogger();
   manager_.GetCount(args, &out);
index 2ce40c6..18e3810 100644 (file)
@@ -41,6 +41,7 @@ class SysteminfoInstance : public common::ParsedInstance {
   void SystemInfoSetBrightness(const picojson::value& args, picojson::object& out);
   void SystemInfoGetTotalMemory(const picojson::value& args, picojson::object& out);
   void SystemInfoGetAvailableMemory(const picojson::value& args, picojson::object& out);
+  void SystemInfoGetDeviceUptime(const picojson::value &args, picojson::object &out);
   void SystemInfoGetCount(const picojson::value& args, picojson::object& out);
 
   SysteminfoManager manager_;
index ca333f2..ed84565 100644 (file)
@@ -732,6 +732,25 @@ void SysteminfoManager::GetAvailableMemory(const picojson::value& args, picojson
   LoggerD("Success");
 }
 
+void SysteminfoManager::GetDeviceUptime(const picojson::value& args,
+                                        picojson::object* out) {
+  ScopeLogger();
+  picojson::value result = picojson::value(picojson::object());
+  picojson::object& result_obj = result.get<picojson::object>();
+
+  unsigned long long return_value = 0;
+  PlatformResult ret = SysteminfoUtils::GetDeviceUptime(&return_value);
+  if (ret.IsError()) {
+    LogAndReportError(ret, out);
+    return;
+  }
+  result_obj.insert(std::make_pair(
+      "uptime", picojson::value(static_cast<double>(return_value))));
+
+  ReportSuccess(result, *out);
+  LoggerD("Success");
+}
+
 void SysteminfoManager::GetCount(const picojson::value& args, picojson::object* out) {
   ScopeLogger();
   CHECK_EXIST(args, "property", out)
index 7fb97db..0d3b802 100644 (file)
@@ -50,6 +50,7 @@ class SysteminfoManager {
   void SetBrightness(const picojson::value& args, picojson::object* out);
   void GetTotalMemory(const picojson::value& args, picojson::object* out);
   void GetAvailableMemory(const picojson::value& args, picojson::object* out);
+  void GetDeviceUptime(const picojson::value& args, picojson::object* out);
   void GetCount(const picojson::value& args, picojson::object* out);
 
   common::PlatformResult GetPropertyCount(const std::string& property, unsigned long* count);