[Notification] get
authorRyszard Matuszyk <r.matuszyk@samsung.com>
Fri, 13 Mar 2015 12:52:15 +0000 (13:52 +0100)
committerRafal Galka <r.galka@samsung.com>
Mon, 16 Mar 2015 14:41:57 +0000 (23:41 +0900)
[Verification] Build required

Change-Id: Id3ba2e6782226fb6ba796afffb7601a2852e2778
Signed-off-by: Ryszard Matuszyk <r.matuszyk@samsung.com>
src/notification/notification.gyp
src/notification/notification_instance.cc
src/notification/notification_manager.cc
src/notification/notification_manager.h
src/notification/status_notification.cc [new file with mode: 0644]
src/notification/status_notification.h [new file with mode: 0644]

index 02daf3a06c69ba5ba29823059dfb5a5d6a625913..908fa320ed1fb9b3617e1604c85e96d82fe53623 100755 (executable)
@@ -13,7 +13,9 @@
         'notification_instance.cc',
         'notification_instance.h',
         'notification_manager.h',
-        'notification_manager.cc'
+        'notification_manager.cc',
+        'status_notification.cc',
+        'status_notification.h'
       ],
       'conditions': [
         ['tizen == 1', {
index c1f9bae42fc3f13bfeb3dcc06fa2a521a7e8d88c..dd2a2eaef6911ed35770cf24fafdd9491af975d5 100644 (file)
@@ -6,8 +6,8 @@
 
 #include <functional>
 
-#include "common/picojson.h"
 #include "common/logger.h"
+#include "common/picojson.h"
 #include "common/platform_result.h"
 
 #include "notification/notification_manager.h"
index 3be8b23735a0653f7b344cf7588746a31519833f..dfbe73db2b7f424b6d22bd895866924d2bcb8ac5 100644 (file)
@@ -2,9 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "notification/notification_instance.h"
-#include "common/logger.h"
+#include "notification/notification_manager.h"
+
+#include <notification_internal.h>
+#include <app_control_internal.h>
+
 #include "common/converter.h"
+#include "common/logger.h"
+
+#include "notification/status_notification.h"
+
 
 namespace extension {
 namespace notification {
@@ -20,31 +27,45 @@ NotificationManager* NotificationManager::GetInstance() {
   return &instance;
 }
 
-common::PlatformResult NotificationManager::Post(const picojson::object& args,
-                                                 int* id) {
+PlatformResult NotificationManager::Post(const picojson::object& args,
+                                         int* id) {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-common::PlatformResult NotificationManager::Update(
-    const picojson::object& args) {
+PlatformResult NotificationManager::Update(const picojson::object& args) {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-common::PlatformResult NotificationManager::Remove(
-    const picojson::object& args) {
+PlatformResult NotificationManager::Remove(const picojson::object& args) {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-common::PlatformResult NotificationManager::RemoveAll() {
+PlatformResult NotificationManager::RemoveAll() {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-common::PlatformResult NotificationManager::Get(const picojson::object& args,
-                                                picojson::object& out) {
+PlatformResult NotificationManager::Get(const picojson::object& args,
+                                        picojson::object& out) {
+  int id = common::stol(FromJson<std::string>(args, "id"));
+
+  notification_h noti = notification_load(NULL, id);
+  if (NULL == noti) {
+    LoggerE("Not found or removed notification id");
+    return PlatformResult(ErrorCode::NOT_FOUND_ERR,
+                          "Not found or removed notification id");
+  }
+
+  app_control_h app_control;
+  PlatformResult status = StatusNotification::GetAppControl(noti, &app_control);
+  if (status.IsError()) return status;
+
+  status = StatusNotification::ToJson(id, noti, app_control, &out);
+  if (status.IsError()) return status;
+
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-common::PlatformResult NotificationManager::GetAll(picojson::array& out) {
+PlatformResult NotificationManager::GetAll(picojson::array& out) {
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
index f92c83cc3a5859905d19384a8095518a966f9c16..7dcf0f37c6b1caf38cc911e9113e35687d75f44b 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef NOTIFICATION_NOTIFICATION_MANAGER_H_
 #define NOTIFICATION_NOTIFICATION_MANAGER_H_
 
+#include <notification.h>
+
 #include "common/picojson.h"
 #include "common/platform_result.h"
 
diff --git a/src/notification/status_notification.cc b/src/notification/status_notification.cc
new file mode 100644 (file)
index 0000000..248501e
--- /dev/null
@@ -0,0 +1,630 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "notification/status_notification.h"
+
+#include <notification_internal.h>
+#include <app_control_internal.h>
+
+#include "common/converter.h"
+#include "common/logger.h"
+#include "common/scope_exit.h"
+
+namespace extension {
+namespace notification {
+
+using namespace common;
+
+const std::string kProgressTypePercentage = "PERCENTAGE";
+const std::string kProgressTypeByte = "BYTE";
+
+const InformationEnumMap StatusNotification::info_map_ = {
+    {0, NOTIFICATION_TEXT_TYPE_INFO_1},
+    {1, NOTIFICATION_TEXT_TYPE_INFO_2},
+    {2, NOTIFICATION_TEXT_TYPE_INFO_3}};
+
+const InformationEnumMap StatusNotification::info_sub_map_ = {
+    {0, NOTIFICATION_TEXT_TYPE_INFO_SUB_1},
+    {1, NOTIFICATION_TEXT_TYPE_INFO_SUB_2},
+    {2, NOTIFICATION_TEXT_TYPE_INFO_SUB_3}};
+
+const ImageEnumMap StatusNotification::thumbnails_map_ = {
+    {0, NOTIFICATION_IMAGE_TYPE_LIST_1},
+    {1, NOTIFICATION_IMAGE_TYPE_LIST_2},
+    {2, NOTIFICATION_IMAGE_TYPE_LIST_3},
+    {3, NOTIFICATION_IMAGE_TYPE_LIST_4},
+    {4, NOTIFICATION_IMAGE_TYPE_LIST_5}};
+
+StatusNotification::StatusNotification() {}
+
+StatusNotification::~StatusNotification() {}
+
+static bool ServiceExtraDataCb(app_control_h service, const char* key,
+                                  void* user_data) {
+  if (user_data != NULL && key != NULL) {
+    LoggerE("User data or key not exist");
+    return true;
+  }
+
+  picojson::array* control_data = static_cast<picojson::array*>(user_data);
+
+  int length = 0;
+  char** value = NULL;
+  SCOPE_EXIT {
+      free(value);
+  };
+
+  int ret = app_control_get_extra_data_array(service, key, &value, &length);
+  if (ret != APP_CONTROL_ERROR_NONE) {
+    LoggerE("Get app control extra data error: %d", ret);
+    return true;
+  }
+
+  if (!value || !length) {
+    LoggerE("Get app control extra data value error");
+    return true;
+  }
+
+  picojson::array values = picojson::array();
+  for (int index = 0; index < length; ++index) {
+    values.push_back(picojson::value(value[index]));
+  }
+
+  picojson::object data_control_elem = picojson::object();
+  data_control_elem["key"] = picojson::value(key);
+  data_control_elem["value"] = picojson::value(values);
+
+  control_data->push_back(picojson::value(data_control_elem));
+
+  return true;
+}
+
+PlatformResult StatusNotification::StatusTypeFromPlatform(
+    notification_type_e noti_type, notification_ly_type_e noti_layout,
+    std::string* type) {
+  if (noti_type == NOTIFICATION_TYPE_NOTI) {
+    if (noti_layout == NOTIFICATION_LY_NOTI_EVENT_SINGLE ||
+        noti_layout == NOTIFICATION_LY_NOTI_EVENT_MULTIPLE) {
+      *type = "SIMPLE";
+    } else if (noti_layout == NOTIFICATION_LY_NOTI_THUMBNAIL) {
+      *type = "THUMBNAIL";
+    }
+  } else if (noti_type == NOTIFICATION_TYPE_ONGOING) {
+    if (noti_layout == NOTIFICATION_LY_ONGOING_EVENT) {
+      *type = "ONGOING";
+    } else if (noti_layout == NOTIFICATION_LY_ONGOING_PROGRESS) {
+      *type = "PROGRESS";
+    }
+  } else {
+    LoggerE("Notification type not found");
+    return PlatformResult(ErrorCode::NOT_FOUND_ERR,
+                          "Notification type not found");
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetImage(
+    notification_h noti_handle, notification_image_type_e image_type,
+    std::string* image_path) {
+  char* path = NULL;
+
+  if (notification_get_image(noti_handle, image_type, &path) !=
+      NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification image error, image_type: %d", image_type);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get notification image error");
+  }
+
+  *image_path = path;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetText(notification_h noti_handle,
+                                           notification_text_type_e text_type,
+                                           std::string* noti_text) {
+  char* text = NULL;
+
+  *noti_text = "";
+
+  if (notification_get_text(noti_handle, text_type, &text) !=
+      NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification text error, text_type: %d", text_type);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get notification text error");
+  }
+
+  if (text) *noti_text = text;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetNumber(notification_h noti_handle,
+                                             notification_text_type_e text_type,
+                                             long* number) {
+  std::string text;
+  PlatformResult status = GetText(noti_handle, text_type, &text);
+  if (status.IsError()) return status;
+
+  if (text.length())
+    *number = std::stol(text);
+  else
+    *number = -1;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetDetailInfos(notification_h noti_handle,
+                                                  picojson::array* out) {
+  if (info_map_.size() != info_sub_map_.size()) {
+    LoggerE("Different notification information types element size");
+    return PlatformResult(
+        ErrorCode::VALIDATION_ERR,
+        "Different notification information types element size");
+  }
+
+  picojson::value detail_info = picojson::value(picojson::object());
+  picojson::object& detail_info_obj = detail_info.get<picojson::object>();
+
+  std::string text;
+  for (int idx = 0; idx < info_map_.size(); ++idx) {
+    PlatformResult status = GetText(noti_handle, info_map_.at(idx), &text);
+    if (status.IsError()) return status;
+
+    if (!text.length()) break;
+
+    detail_info_obj["mainText"] = picojson::value(text);
+
+    status = GetText(noti_handle, info_sub_map_.at(idx), &text);
+    if (status.IsError()) return status;
+
+    if (text.length()) {
+      detail_info_obj["subText"] = picojson::value(text);
+    }
+
+    out->push_back(detail_info);
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetLedColor(notification_h noti_handle,
+                                               std::string* led_color) {
+  unsigned int color = 0;
+  notification_led_op_e type = NOTIFICATION_LED_OP_ON;
+
+  if (notification_get_led(noti_handle, &type, (int*)&color) !=
+      NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification led displaying option error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get notification led displaying option error");
+  }
+
+  *led_color = "";
+  std::stringstream stream;
+
+  if (NOTIFICATION_LED_OP_OFF != type) {
+    color = 0x00FFFFFF & color;
+    stream << std::hex << color;
+    *led_color = "#" + stream.str();
+
+    while (led_color->length() < 7) {
+      (*led_color).insert(1, "0");
+    }
+
+    std::transform(led_color->begin(), led_color->end(), led_color->begin(),
+                   ::tolower);
+  }
+
+  LoggerD("color:%s", led_color->c_str());
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetLedPeriod(notification_h noti_handle,
+                                                unsigned long* on_period,
+                                                unsigned long* off_period) {
+  int on_time = 0;
+  int off_time = 0;
+
+  if (notification_get_led_time_period(noti_handle, &on_time, &off_time) !=
+      NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification led on/off period error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get notification led on/off period error");
+  }
+
+  if (on_period) *on_period = on_time;
+  if (off_period) *off_period = off_time;
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetThumbnails(notification_h noti_handle,
+                                                 picojson::array* out) {
+  std::string text;
+  for (int idx = 0; idx < thumbnails_map_.size(); ++idx) {
+    PlatformResult status =
+        GetImage(noti_handle, thumbnails_map_.at(idx), &text);
+    if (status.IsError()) return status;
+
+    if (!text.length()) break;
+
+    out->push_back(picojson::value(text));
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetSoundPath(notification_h noti_handle,
+                                                std::string* sound_path) {
+  *sound_path = "";
+
+  if (noti_handle) {
+    LoggerE("Null notification handle");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Null notification handle");
+  }
+
+  const char* path = NULL;
+  notification_sound_type_e type = NOTIFICATION_SOUND_TYPE_NONE;
+
+  if (notification_get_sound(noti_handle, &type, &path) !=
+      NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification sound error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get notification sound error");
+  }
+
+  LoggerD("Sound type = %d", type);
+
+  if (path && (type == NOTIFICATION_SOUND_TYPE_USER_DATA)) {
+    *sound_path = path;
+  }
+
+  LoggerD("Sound path = %s", sound_path->c_str());
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetVibration(notification_h noti_handle,
+                                                bool* vibration) {
+  notification_vibration_type_e vib_type = NOTIFICATION_VIBRATION_TYPE_NONE;
+
+  if (notification_get_vibration(noti_handle, &vib_type, NULL) !=
+      NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification vibration error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get notification vibration error");
+  }
+
+  if (NOTIFICATION_VIBRATION_TYPE_DEFAULT == vib_type ||
+      NOTIFICATION_VIBRATION_TYPE_USER_DATA == vib_type) {
+    *vibration = true;
+  } else {
+    *vibration = false;
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetApplicationControl(
+    app_control_h app_handle, picojson::object* out_ptr) {
+  picojson::object& out = *out_ptr;
+
+  char* operation = NULL;
+  char* uri = NULL;
+  char* mime = NULL;
+  char* category = NULL;
+  SCOPE_EXIT {
+    free(operation);
+    free(uri);
+    free(mime);
+    free(category);
+  };
+
+  if (app_control_get_operation(app_handle, &operation) !=
+      APP_CONTROL_ERROR_NONE) {
+    LoggerE("Get application control operation error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get application control operation error");
+  }
+  out["operation"] = picojson::value(operation);
+  LoggerD("operation = %s", operation);
+
+  if (app_control_get_uri(app_handle, &uri) != APP_CONTROL_ERROR_NONE) {
+    LoggerE("Get application control uri error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get application control uri error");
+  }
+  if (uri) {
+    out["uri"] = picojson::value(uri);
+    LoggerD("uri = %s", uri);
+  }
+
+  if (app_control_get_mime(app_handle, &mime) != APP_CONTROL_ERROR_NONE) {
+    LoggerE("Get application control mime error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get application control mime error");
+  }
+  if (mime) {
+    out["mime"] = picojson::value(mime);
+    LoggerD("mime = %s", mime);
+  }
+
+  if (app_control_get_category(app_handle, &category) !=
+      APP_CONTROL_ERROR_NONE) {
+    LoggerE("Get application control category error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get application control category error");
+  }
+  if (category) {
+    out["category"] = picojson::value(category);
+    LoggerD("category = %s", category);
+  }
+
+  picojson::array app_control_data = picojson::array();
+  if (app_control_foreach_extra_data(app_handle, ServiceExtraDataCb,
+                                     (void*)&app_control_data) !=
+      APP_CONTROL_ERROR_NONE) {
+    LoggerE("Get application control data error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get application control data error");
+  }
+  out["data"] = picojson::value(app_control_data);
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetApplicationId(app_control_h app_handle,
+                                                    std::string* app_id) {
+  char* app_id_str = NULL;
+  SCOPE_EXIT {
+      free(app_id_str);
+  };
+
+  if (app_control_get_app_id(app_handle, &app_id_str) !=
+      APP_CONTROL_ERROR_NONE) {
+    LoggerE("Get applicaiton ID failed");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Get applicaiton ID failed");
+  }
+
+  if (app_id_str != NULL) {
+    *app_id = app_id_str;
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetProgressValue(
+    notification_h noti_handle, const std::string& progess_type,
+    double* progress_value) {
+  *progress_value = 0.0;
+
+  if (progess_type == kProgressTypeByte) {
+    if (notification_get_size(noti_handle, progress_value) !=
+        NOTIFICATION_ERROR_NONE) {
+      LoggerE("Get notification size error");
+      return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                            "Get notification size error");
+    }
+    LoggerD("Size value = %f", *progress_value);
+  } else if (progess_type == kProgressTypePercentage) {
+    if (notification_get_progress(noti_handle, progress_value) !=
+        NOTIFICATION_ERROR_NONE) {
+      LoggerE("Get notification progress error");
+      return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                            "Get notification progress error");
+    }
+    LoggerD("Percentage value = %f", *progress_value);
+  } else {
+    LoggerE("Unknown notification progress type: %s ", progess_type.c_str());
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Unknown notification progress type");
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetPostedTime(notification_h noti_handle,
+                                                 time_t* posted_time) {
+  *posted_time = 0;
+
+  if (notification_get_insert_time(noti_handle, posted_time) !=
+      NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification posted time error");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Get notification posted time error");
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::GetAppControl(notification_h noti_handle,
+                                                 app_control_h* app_control) {
+  bundle* service = NULL;
+
+  int ret = notification_get_execute_option(
+      noti_handle, NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, NULL, &service);
+  if (ret == NOTIFICATION_ERROR_NONE) {
+    LoggerE("Get notification execute option error: %d", ret);
+    return PlatformResult(ErrorCode::INVALID_VALUES_ERR,
+                          "Get notification execute option error");
+  }
+
+  if (!service) {
+    LoggerE("Null service_handle Appsvc bundle data");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Null service_handle Appsvc bundle data");
+  }
+
+  ret = app_control_create(app_control);
+  if (ret != APP_CONTROL_ERROR_NONE) {
+    LoggerE("Fail to create app_control");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Fail to create app_control");
+  }
+
+  ret = app_control_import_from_bundle(*app_control, service);
+  if (ret != APP_CONTROL_ERROR_NONE) {
+    LoggerI("Application control create event error: %d", ret);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Application control create event error");
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult StatusNotification::ToJson(int id, notification_h noti_handle,
+                                          app_control_h app_handle,
+                                          picojson::object* out_ptr) {
+  if (noti_handle) {
+    LoggerE("Null notification handle");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR, "Null notification handle");
+  }
+
+  if (app_handle) {
+    LoggerE("Null application control handle");
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Null application control handle");
+  }
+
+  picojson::object& out = *out_ptr;
+
+  out["id"] = picojson::value(std::to_string(id));
+  out["type"] = picojson::value("STATUS");
+
+  // Nitification type
+  notification_type_e noti_type = NOTIFICATION_TYPE_NONE;
+  int ret = notification_get_type(noti_handle, &noti_type);
+  if (ret != NOTIFICATION_ERROR_NONE) {
+    LoggerE("Notification get type error: %d", ret);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Notification get type error");
+  }
+
+  notification_ly_type_e noti_layout = NOTIFICATION_LY_NONE;
+  ret = notification_get_layout(noti_handle, &noti_layout);
+  if (ret != NOTIFICATION_ERROR_NONE) {
+    LoggerE("Notification get layout error: %d", ret);
+    return PlatformResult(ErrorCode::UNKNOWN_ERR,
+                          "Notification get layout error");
+  }
+
+  std::string noti_type_str;
+  PlatformResult status =
+      StatusTypeFromPlatform(noti_type, noti_layout, &noti_type_str);
+  if (status.IsError()) return status;
+  out["statusType"] = picojson::value(noti_type_str);
+
+  std::string value_str;
+  status = GetImage(noti_handle, NOTIFICATION_IMAGE_TYPE_ICON, &value_str);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["iconPath"] = picojson::value(value_str);
+  }
+
+  status = GetImage(noti_handle, NOTIFICATION_IMAGE_TYPE_ICON_SUB, &value_str);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["subIconPath"] = picojson::value(value_str);
+  }
+
+  long number;
+  status = GetNumber(noti_handle, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, &number);
+  if (status.IsError()) return status;
+  if (number >= 0) {
+    out["number"] = picojson::value(static_cast<double>(number));
+  }
+
+  picojson::array detail_infos = picojson::array();
+  status = GetDetailInfos(noti_handle, &detail_infos);
+  if (status.IsError()) return status;
+  if (detail_infos.size()) {
+    out["detailInfo"] = picojson::value(detail_infos);
+  }
+
+  status = GetLedColor(noti_handle, &value_str);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["ledColor"] = picojson::value(value_str);
+  }
+
+  unsigned long on_period;
+  unsigned long off_period;
+  status = GetLedPeriod(noti_handle, &on_period, &off_period);
+  if (status.IsError()) return status;
+  out["ledOnPeriod"] = picojson::value(static_cast<double>(on_period));
+  out["ledOffPeriod"] = picojson::value(static_cast<double>(off_period));
+
+  status =
+      GetImage(noti_handle, NOTIFICATION_IMAGE_TYPE_BACKGROUND, &value_str);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["backgroundImagePath"] = picojson::value(value_str);
+  }
+
+  picojson::array thumbnails = picojson::array();
+  status = GetThumbnails(noti_handle, &thumbnails);
+  if (status.IsError()) return status;
+  if (thumbnails.size()) {
+    out["thumbnails"] = picojson::value(thumbnails);
+  }
+
+  status = GetSoundPath(noti_handle, &value_str);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["soundPath"] = picojson::value(value_str);
+  }
+
+  bool vibration;
+  status = GetVibration(noti_handle, &vibration);
+  if (status.IsError()) return status;
+  out["vibration"] = picojson::value(vibration);
+
+  picojson::object app_control = picojson::object();
+  status = GetApplicationControl(app_handle, &app_control);
+  if (status.IsError()) return status;
+  if (app_control.size()) {
+    out["appControl"] = picojson::value(app_control);
+  }
+
+  status = GetApplicationId(app_handle, &value_str);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["appId"] = picojson::value(value_str);
+  }
+
+  std::string progress_type;
+  status =
+      GetImage(noti_handle, NOTIFICATION_IMAGE_TYPE_LIST_5, &progress_type);
+  if (status.IsError()) return status;
+  out["progressType"] = picojson::value(progress_type);
+
+  double progress_value;
+  status = GetProgressValue(noti_handle, progress_type, &progress_value);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["progressValue"] = picojson::value(progress_value);
+  }
+
+  time_t posted_time;
+  status = GetPostedTime(noti_handle, &posted_time);
+  if (status.IsError()) return status;
+  out["postedTime"] = picojson::value(static_cast<double>(posted_time));
+
+  status = GetText(noti_handle, NOTIFICATION_TEXT_TYPE_TITLE, &value_str);
+  if (status.IsError()) return status;
+  out["title"] = picojson::value(value_str);
+
+  status = GetText(noti_handle, NOTIFICATION_TEXT_TYPE_CONTENT, &value_str);
+  if (status.IsError()) return status;
+  if (value_str.length()) {
+    out["content"] = picojson::value(value_str);
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+}  // namespace notification
+}  // namespace extension
diff --git a/src/notification/status_notification.h b/src/notification/status_notification.h
new file mode 100644 (file)
index 0000000..844a581
--- /dev/null
@@ -0,0 +1,78 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NOTIFICATION_STATUS_NOTIFICATION_H_
+#define NOTIFICATION_STATUS_NOTIFICATION_H_
+
+#include <notification.h>
+#include <app_control.h>
+
+#include "common/picojson.h"
+#include "common/platform_result.h"
+
+namespace extension {
+namespace notification {
+
+typedef std::map<int, notification_text_type_e> InformationEnumMap;
+typedef std::map<int, notification_image_type_e> ImageEnumMap;
+
+class StatusNotification {
+ public:
+  static common::PlatformResult ToJson(int id, notification_h noti_handle,
+                                       app_control_h app_handle,
+                                       picojson::object* out_ptr);
+  static common::PlatformResult GetAppControl(notification_h noti_handle,
+                                              app_control_h* app_control);
+
+ private:
+  StatusNotification();
+  virtual ~StatusNotification();
+
+  static const InformationEnumMap info_map_;
+  static const InformationEnumMap info_sub_map_;
+  static const ImageEnumMap thumbnails_map_;
+
+  static common::PlatformResult StatusTypeFromPlatform(
+      notification_type_e noti_type,
+      notification_ly_type_e noti_layout,
+      std::string* type);
+  static common::PlatformResult GetImage(notification_h noti_handle,
+                                         notification_image_type_e image_type,
+                                         std::string* image_path);
+  static common::PlatformResult GetText(notification_h noti_handle,
+                                        notification_text_type_e text_type,
+                                        std::string* noti_text);
+  static common::PlatformResult GetNumber(notification_h noti_handle,
+                                          notification_text_type_e text_type,
+                                          long* number);
+  static common::PlatformResult GetDetailInfos(notification_h noti_handle,
+                                               picojson::array* out);
+  static common::PlatformResult GetLedColor(notification_h noti_handle,
+                                            std::string* led_color);
+  static common::PlatformResult GetLedPeriod(notification_h noti_handle,
+                                             unsigned long* on_period,
+                                             unsigned long* off_period);
+  static common::PlatformResult GetThumbnails(notification_h noti_handle,
+                                              picojson::array* out);
+  static common::PlatformResult GetSoundPath(notification_h noti_handle,
+                                             std::string* sound_path);
+  static common::PlatformResult GetVibration(notification_h noti_handle,
+                                             bool* vibration);
+  static common::PlatformResult GetApplicationControl(
+      app_control_h app_handle,
+      picojson::object* out_ptr);
+  static common::PlatformResult GetApplicationId(app_control_h app_handle,
+                                                 std::string* app_id);
+  static common::PlatformResult GetProgressValue(
+      notification_h noti_handle,
+      const std::string& progess_type,
+      double* progress_value);
+  static common::PlatformResult GetPostedTime(notification_h noti_handle,
+                                              time_t* posted_time);
+};
+
+}  // namespace notification
+}  // namespace extension
+
+#endif /* NOTIFICATION_STATUS_NOTIFICATION_H_ */