[Application] Make sure that the whole encoded_bundle is read.
authorPawel Andruszkiewicz <p.andruszkie@samsung.com>
Thu, 14 May 2015 09:17:21 +0000 (11:17 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Thu, 14 May 2015 13:56:17 +0000 (22:56 +0900)
Change-Id: I6c805bfec061d2596d283cb0a154496dde0335af
Signed-off-by: Pawel Andruszkiewicz <p.andruszkie@samsung.com>
src/application/application.cc
src/application/requested_application_control.cc
src/application/requested_application_control.h

index b5ae237a6d1d708083398ed6a2a83daa9c30851f..9ebe0805875721946c4dc372499af25f2d23c73f 100644 (file)
@@ -21,8 +21,7 @@ RequestedApplicationControl& Application::app_control() {
 void Application::GetRequestedAppControl(const picojson::value& args, picojson::object* out) {
   LoggerD("Entered");
 
-  const std::string& encoded_bundle =
-      GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", 1024);
+  const std::string& encoded_bundle = RequestedApplicationControl::GetEncodedBundle();
 
   picojson::value result = picojson::value(picojson::object());
 
index 56a1d46f2d3a005cfa81e4cee51d319aeb987cae..9b9d4340dd87e2d9b4a9417aaf321468c3039355 100644 (file)
@@ -85,8 +85,7 @@ void RequestedApplicationControl::ReplyResult(const picojson::value& args, picoj
   PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
   const picojson::array& data = data_arr.get<picojson::array>();
 
-  const std::string& encoded_bundle =
-      GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", 1024);
+  const std::string& encoded_bundle = GetEncodedBundle();
 
   result = set_bundle(encoded_bundle);
   if (result.IsError()) {
@@ -136,8 +135,7 @@ void RequestedApplicationControl::ReplyFailure(picojson::object* out) {
 
   // read input data
   PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
-  const std::string& encoded_bundle =
-      GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", 1024);
+  const std::string& encoded_bundle = GetEncodedBundle();
 
   result = set_bundle(encoded_bundle);
   if (result.IsError()) {
@@ -169,6 +167,22 @@ void RequestedApplicationControl::ReplyFailure(picojson::object* out) {
   ReportSuccess(*out);
 }
 
+std::string RequestedApplicationControl::GetEncodedBundle() {
+  LoggerD("Entered");
+
+  std::string result;
+  std::size_t size = 512;
+
+  // make sure we read whole variable, if the length of read variable is equal
+  // to the size we were trying to obtain, the variable is likely to be longer
+  do {
+    size <<= 1;
+    result = GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", size);
+  } while (strlen(result.c_str()) == size);
+
+  return result;
+}
+
 PlatformResult RequestedApplicationControl::VerifyCallerPresence() {
   LoggerD("Entered");
 
index 0f50186d099e06447409b14771f354d8a157b197..d8ed2f6f712be5363a21833d0be51a5753486935 100644 (file)
@@ -26,6 +26,8 @@ class RequestedApplicationControl {
   void ReplyResult(const picojson::value& args, picojson::object* out);
   void ReplyFailure(picojson::object* out);
 
+  static std::string GetEncodedBundle();
+
  private:
   void set_app_control(app_control_h app_control);
   common::PlatformResult VerifyCallerPresence();