[Content] Storage type usage removed
[platform/core/api/webapi-plugins.git] / src / content / content_manager.cc
index 9c069ed..ae956a8 100644 (file)
 
 #include "content/content_manager.h"
 
+#include <media_content_internal.h>
 #include <metadata_extractor.h>
 #include <stdlib.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #include <algorithm>
 #include <cstring>
@@ -47,17 +49,6 @@ static const std::string uri_prefix = "file://";
 static const std::string uri_absolute_prefix = "file:///";
 }
 
-const std::map<std::string, media_content_orientation_e> orientationMap = {
-    {"NORMAL", MEDIA_CONTENT_ORIENTATION_NORMAL},
-    {"FLIP_HORIZONTAL", MEDIA_CONTENT_ORIENTATION_HFLIP},
-    {"ROTATE_180", MEDIA_CONTENT_ORIENTATION_ROT_180},
-    {"FLIP_VERTICAL", MEDIA_CONTENT_ORIENTATION_VFLIP},
-    {"TRANSPOSE", MEDIA_CONTENT_ORIENTATION_TRANSPOSE},
-    {"ROTATE_90", MEDIA_CONTENT_ORIENTATION_ROT_90},
-    {"TRANSVERSE", MEDIA_CONTENT_ORIENTATION_TRANSVERSE},
-    {"ROTATE_270", MEDIA_CONTENT_ORIENTATION_ROT_270},
-};
-
 std::string get_date(char* tmpStr) {
   ScopeLogger();
   if (tmpStr) {
@@ -358,9 +349,7 @@ void ContentToJson(media_info_h info, picojson::object& o) {
 void ContentDirToJson(media_folder_h folder, picojson::object& o) {
   ScopeLogger();
   int ret;
-  char* tmpStr = NULL;
-  media_content_storage_e storage_type;
-  time_t tmpDate;
+  char *tmpStr = NULL;
 
   // id
   ret = media_folder_get_folder_id(folder, &tmpStr);
@@ -373,10 +362,13 @@ void ContentDirToJson(media_folder_h folder, picojson::object& o) {
   }
 
   // directoryURI
+  std::string folder_path;
   ret = media_folder_get_path(folder, &tmpStr);
   if (ret == MEDIA_CONTENT_ERROR_NONE) {
     if (tmpStr) {
       o["directoryURI"] = picojson::value(std::string(tmpStr));
+      // folder_path value kept for modifiedDate property gathering
+      folder_path = tmpStr;
       free(tmpStr);
       tmpStr = NULL;
     }
@@ -392,32 +384,18 @@ void ContentDirToJson(media_folder_h folder, picojson::object& o) {
     }
   }
 
-  // storageType
-  ret = media_folder_get_storage_type(folder, &storage_type);
-  if (ret == MEDIA_CONTENT_ERROR_NONE) {
-    if (storage_type == MEDIA_CONTENT_STORAGE_INTERNAL) {
-      o["storageType"] = picojson::value(std::string("INTERNAL"));
-    } else if (storage_type == MEDIA_CONTENT_STORAGE_EXTERNAL) {
-      o["storageType"] = picojson::value(std::string("EXTERNAL"));
-    } else if (storage_type == MEDIA_CONTENT_STORAGE_CLOUD) {
-      o["storageType"] = picojson::value(std::string("CLOUD"));
-    }
-  }
-
-  // modifiedData
-  ret = media_folder_get_modified_time(folder, &tmpDate);
-  if (ret == MEDIA_CONTENT_ERROR_NONE) {
-    o["modifiedDate"] = picojson::value(static_cast<double>(tmpDate));
+  // modifiedDate
+  struct stat stat_res;
+  if (stat(folder_path.c_str(), &stat_res) == 0) {
+    auto mod_time = stat_res.st_mtime;
+    o["modifiedDate"] = picojson::value(static_cast<double>(mod_time));
   }
 }
 
 static int setContent(media_info_h media, const picojson::value& content) {
   ScopeLogger();
 
-  int ret;
-  std::string name = content.get("name").to_str();
-  std::string description = content.get("description").to_str();
-  int rating = std::stoi(content.get("rating").to_str());
+  int ret = MEDIA_CONTENT_ERROR_NONE;
   bool is_fav = content.get("isFavorite").get<bool>();
 
   if (NULL == media) {
@@ -432,21 +410,6 @@ static int setContent(media_info_h media, const picojson::value& content) {
     return ret;
   }
 
-  ret = media_info_set_display_name(media, name.c_str());
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    LoggerE("Updating name failed.");
-  }
-
-  ret = media_info_set_description(media, description.c_str());
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    LoggerE("Updating description failed.");
-  }
-
-  ret = media_info_set_rating(media, rating);
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    LoggerE("Updating rating failed.");
-  }
-
   ret = media_info_set_favorite(media, is_fav);
   if (ret != MEDIA_CONTENT_ERROR_NONE) {
     LoggerE("Updating isFavorite failed.");
@@ -456,43 +419,38 @@ static int setContent(media_info_h media, const picojson::value& content) {
     LoggerE("Updating favorite failed.");
   }
 
-  if (type == MEDIA_CONTENT_TYPE_IMAGE) {
-    std::string orientation = content.get("orientation").to_str();
-    auto orientationToSet = orientationMap.find(orientation);
-
-    if (orientationToSet != orientationMap.end()) {
-      image_meta_h img;
-      if (MEDIA_CONTENT_ERROR_NONE == media_info_get_image(media, &img) &&
-          MEDIA_CONTENT_ERROR_NONE == image_meta_set_orientation(img, orientationToSet->second) &&
-          MEDIA_CONTENT_ERROR_NONE == image_meta_update_to_db(img)) {
-        LoggerD("orientation update was successful");
-      } else {
-        LoggerE("orientation update failed");
-      }
-      image_meta_destroy(img);
-    }
-  }
+  return MEDIA_CONTENT_ERROR_NONE;
+}
 
-  if (type == MEDIA_CONTENT_TYPE_IMAGE || type == MEDIA_CONTENT_TYPE_VIDEO) {
-    picojson::value geo = content.get("geolocation");
-    if (geo.evaluate_as_boolean()) {
-      LoggerD("geolocation is not null");
-      double latitude = atof(geo.get("latitude").to_str().c_str());
-      double longitude = atof(geo.get("longitude").to_str().c_str());
-      ret = media_info_set_latitude(media, latitude);
-      if (ret != MEDIA_CONTENT_ERROR_NONE) {
-        LoggerE("Updating geolocation is failed.");
-      }
-      ret = media_info_set_longitude(media, longitude);
-      if (ret != MEDIA_CONTENT_ERROR_NONE) {
-        LoggerD("Updating geolocation is failed.");
-      }
-    } else {
-      LoggerD("geolocation is null");
+static int updateContent(const picojson::value& content) {
+  ScopeLogger();
+
+  int ret = MEDIA_CONTENT_ERROR_NONE;
+  std::string id = content.get("id").to_str();
+  media_info_h media = nullptr;
+  SCOPE_EXIT {
+    if (media) {
+      media_info_destroy(media);
     }
+  };
+
+  ret = media_info_get_media_from_db(id.c_str(), &media);
+  if (ret != MEDIA_CONTENT_ERROR_NONE) {
+    LoggerE("media_info_get_media_from_db failed: %d", ret);
+    return ret;
+  }
+  ret = setContent(media, content);
+  if (ret != MEDIA_CONTENT_ERROR_NONE) {
+    LoggerE("setContent failed: %d", ret);
+    return ret;
+  }
+  ret = media_info_update_to_db(media);
+  if (ret != MEDIA_CONTENT_ERROR_NONE) {
+    LoggerE("media_info_update_to_db failed: %d", ret);
+    return ret;
   }
 
-  return MEDIA_CONTENT_ERROR_NONE;
+  return ret;
 }
 
 static void FolderToJson(media_folder_h folder, picojson::object* out) {
@@ -502,7 +460,6 @@ static void FolderToJson(media_folder_h folder, picojson::object* out) {
   char* id = NULL;
   char* path = NULL;
   time_t date;
-  media_content_storage_e storageType;
 
   int ret;
 
@@ -512,56 +469,35 @@ static void FolderToJson(media_folder_h folder, picojson::object* out) {
                       ("Failed: media_folder_get_folder_id"));
     return;
   }
+  std::unique_ptr<char, decltype(&free)> id_ptr(id, &free);
 
   ret = media_folder_get_name(folder, &name);
   if (ret != MEDIA_CONTENT_ERROR_NONE) {
     LogAndReportError(ContentManager::convertError(ret), out, ("Failed: media_folder_get_name"));
-    free(id);
     return;
   }
+  std::unique_ptr<char, decltype(&free)> name_ptr(name, &free);
 
   ret = media_folder_get_path(folder, &path);
   if (ret != MEDIA_CONTENT_ERROR_NONE) {
     LogAndReportError(ContentManager::convertError(ret), out, ("Failed: media_folder_get_path"));
-    free(id);
-    free(name);
-    return;
-  }
-
-  ret = media_folder_get_modified_time(folder, &date);
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    LogAndReportError(ContentManager::convertError(ret), out, ("Failed: media_folder_get_path"));
-    free(id);
-    free(name);
-    free(path);
     return;
   }
+  std::unique_ptr<char, decltype(&free)> path_ptr(path, &free);
 
-  ret = media_folder_get_storage_type(folder, &storageType);
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    free(id);
-    free(name);
-    free(path);
-    LogAndReportError(ContentManager::convertError(ret), out,
-                      ("Failed: media_folder_get_storage_type"));
+  struct stat stat_res;
+  ret = stat(path, &stat_res);
+  if (0 != ret) {
+    LogAndReportError(ContentManager::convertError(errno), out, ("Failed: stat"));
     return;
   }
+  date = stat_res.st_mtime;
 
   (*out)["id"] = picojson::value(std::string(id));
   (*out)["directoryURI"] = picojson::value(std::string(path));
   (*out)["title"] = picojson::value(std::string(name));
 
-  if (storageType == MEDIA_CONTENT_STORAGE_INTERNAL) {
-    (*out)["storageType"] = picojson::value(std::string("INTERNAL"));
-  } else if (storageType == MEDIA_CONTENT_STORAGE_EXTERNAL) {
-    (*out)["storageType"] = picojson::value(std::string("EXTERNAL"));
-  }
-
   (*out)["modifiedDate"] = picojson::value(static_cast<double>(date));
-
-  free(name);
-  free(id);
-  free(path);
 }
 
 static bool media_foreach_directory_cb(media_folder_h folder, void* user_data) {
@@ -644,38 +580,6 @@ static bool playlist_content_member_cb(int playlist_member_id, media_info_h medi
   return true;
 }
 
-void CreateThumbnailCallback(media_content_error_e err, const char* path, void* user_data) {
-  ScopeLogger();
-
-  std::unique_ptr<CreateThumbnailCallbackData> callback_data_ptr(
-      (CreateThumbnailCallbackData*)user_data);
-  if (0 == callback_data_ptr->callback_id) {
-    LoggerD("Callback id is 0");
-    return;
-  }
-
-  if (!(ContentManager::getInstance()->getContentInstance())) {
-    // There is not instance already
-    LoggerD("There is not instance now");
-    return;
-  }
-
-  picojson::object out;
-
-  out["callbackId"] = picojson::value(callback_data_ptr->callback_id);
-
-  if (MEDIA_CONTENT_ERROR_NONE == err) {
-    out["result"] = picojson::value(std::string(path));
-    ReportSuccess(out);
-  } else {
-    PlatformResult result = ContentManager::getInstance()->convertError(err);
-    LogAndReportError(result, &out, ("Failed to create a thumbnail"));
-  }
-
-  common::Instance::PostMessage(ContentManager::getInstance()->getContentInstance(),
-                                picojson::value(out).serialize().c_str());
-}
-
 ContentManager::ContentManager() {
   ScopeLogger("ContentManager called");
   if (media_content_connect() == MEDIA_CONTENT_ERROR_NONE) {
@@ -719,22 +623,10 @@ bool ContentManager::isConnected() {
 void ContentManager::getDirectories(const std::shared_ptr<ReplyCallbackData>& user_data) {
   ScopeLogger();
   int ret;
-  filter_h filter = NULL;
-  ret = media_filter_create(&filter);
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    LoggerE("Failed: media_filter_create failed");
-    return;
-  }
-
-  SCOPE_EXIT {
-    media_filter_destroy(filter);
-  };
-
-  std::string condition = "(FOLDER_STORAGE_TYPE = 0 OR FOLDER_STORAGE_TYPE = 1)";
-  media_filter_set_condition(filter, condition.c_str(), MEDIA_CONTENT_COLLATE_DEFAULT);
 
   picojson::array pico_dirs;
-  ret = media_folder_foreach_folder_from_db(filter, media_foreach_directory_cb, &pico_dirs);
+  ret = media_folder_foreach_folder_from_db(nullptr, media_foreach_directory_cb,
+                                            &pico_dirs);
   if (ret != MEDIA_CONTENT_ERROR_NONE) {
     PlatformResult err = LogAndCreateResult(
         ErrorCode::UNKNOWN_ERR, "Getting the directories failed.",
@@ -910,31 +802,6 @@ PlatformResult ContentManager::removeChangeListener(media_content_noti_h noti_ha
   }
 }
 
-PlatformResult ContentManager::setChangeListener(media_content_db_update_cb callback,
-                                                 void* user_data) {
-  ScopeLogger();
-
-  int ret = media_content_set_db_updated_cb(callback, user_data);
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    return LogAndCreateResult(
-        ErrorCode::UNKNOWN_ERR, "registering the listener is failed.",
-        ("Failed: registering the listener is failed %d (%s)", ret, get_error_message(ret)));
-  }
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
-PlatformResult ContentManager::unSetChangeListener() {
-  ScopeLogger();
-
-  int ret = media_content_unset_db_updated_cb();
-  if (ret != MEDIA_CONTENT_ERROR_NONE) {
-    return LogAndCreateResult(
-        ErrorCode::UNKNOWN_ERR, "unregistering the listener is failed.",
-        ("Failed: unregistering the listener is failed: %d (%s)", ret, get_error_message(ret)));
-  }
-  return PlatformResult(ErrorCode::NO_ERROR);
-}
-
 void ContentManager::createPlaylist(std::string name,
                                     const std::shared_ptr<ReplyCallbackData>& user_data) {
   ScopeLogger();
@@ -1038,48 +905,27 @@ void ContentManager::removePlaylist(std::string playlistId,
   }
 }
 
-int ContentManager::update(picojson::value args) {
+int ContentManager::update(const picojson::value& args) {
   ScopeLogger();
-
-  int ret;
-  picojson::value content = args.get("content");
-  std::string id = content.get("id").to_str();
-
-  media_info_h media = NULL;
-  ret = media_info_get_media_from_db(id.c_str(), &media);
-  if (ret == MEDIA_CONTENT_ERROR_NONE) {
-    setContent(media, content);
-    ret = media_info_update_to_db(media);
-    media_info_destroy(media);
+  const picojson::value content = args.get("content");
+  int ret = updateContent(content);
+  if (ret != MEDIA_CONTENT_ERROR_NONE) {
+    LoggerE("updateContent failed: %d", ret);
   }
-
   return ret;
 }
 
-int ContentManager::updateBatch(picojson::value args) {
+int ContentManager::updateBatch(const picojson::value& args) {
   ScopeLogger();
-  int ret = 0;
+  int ret = MEDIA_CONTENT_ERROR_NONE;
   std::vector<picojson::value> contents = args.get("contents").get<picojson::array>();
 
   for (picojson::value::array::iterator it = contents.begin(); it != contents.end(); ++it) {
-    picojson::value content = *it;
-    std::string id = content.get("id").to_str();
-    media_info_h media = NULL;
-    ret = media_info_get_media_from_db(id.c_str(), &media);
-    if (media != NULL && ret == MEDIA_CONTENT_ERROR_NONE) {
-      ret = setContent(media, content);
-      if (ret != MEDIA_CONTENT_ERROR_NONE) {
-        LoggerE("setContent failed");
-        return ret;
-      }
-
-      ret = media_info_update_to_db(media);
-      if (ret != MEDIA_CONTENT_ERROR_NONE) {
-        LoggerE("update to db failed");
-      }
-      media_info_destroy(media);
-    } else {
-      return ret;
+    const picojson::value content = *it;
+    ret = updateContent(content);
+    if (ret != MEDIA_CONTENT_ERROR_NONE) {
+      LoggerE("updateContent failed: %d", ret);
+      break;
     }
   }
   return ret;
@@ -1171,7 +1017,7 @@ void ContentManager::playlistGet(const std::shared_ptr<ReplyCallbackData>& user_
   ScopeLogger();
   media_playlist_h playlist = NULL;
   media_content_order_e order = MEDIA_CONTENT_ORDER_ASC;
-  const std::string playOrder("play_order");
+  const std::string playOrder("playlist_member_order");
 
   SCOPE_EXIT {
     if (playlist) {
@@ -1455,7 +1301,7 @@ media_playlist_h getPlaylistHandle(int id) {
   return playlist_handle;
 }
 
-void destroyMediaPlaylistHandle(media_playlist_h& playlist_handle) {
+void destroyMediaPlaylistHandle(media_playlist_h playlist_handle) {
   ScopeLogger();
   if (playlist_handle) {
     int ret_code = media_playlist_destroy(playlist_handle);
@@ -1602,27 +1448,35 @@ int ContentManager::getNumberOfTracks(int id, int* result) {
   return MEDIA_CONTENT_ERROR_NONE;
 }
 
-common::PlatformResult ContentManager::createThumbnail(const picojson::value& args) {
+common::PlatformResult ContentManager::createThumbnail(const std::string& id,
+                                                       picojson::object* obj) {
   ScopeLogger();
 
-  std::unique_ptr<CreateThumbnailCallbackData> callback_data_ptr{new CreateThumbnailCallbackData};
-  callback_data_ptr->callback_id = args.get("callbackId").get<double>();
-  std::string id = args.get("id").get<std::string>();
-
-  int ret = media_info_get_media_from_db(id.c_str(), &callback_data_ptr->media);
-  if (MEDIA_CONTENT_ERROR_NONE != ret && nullptr == callback_data_ptr->media) {
-    return LogAndCreateResult(ErrorCode::ABORT_ERR, "Getting media is failed.",
-                              ("Getting media is failed: %d (%s)", ret, get_error_message(ret)));
+  media_info_h media_h = nullptr;
+  int ret = media_info_get_media_from_db(id.c_str(), &media_h);
+  if (MEDIA_CONTENT_ERROR_NONE != ret || nullptr == media_h) {
+    return LogAndCreateResult(ErrorCode::ABORT_ERR, "Getting media failed.",
+                              ("Getting media failed: %d (%s)", ret, get_error_message(ret)));
   }
+  SCOPE_EXIT {
+    media_info_destroy(media_h);
+  };
 
-  ret = media_info_create_thumbnail(callback_data_ptr->media, CreateThumbnailCallback,
-                                    static_cast<void*>(callback_data_ptr.get()));
-
+  ret = media_info_generate_thumbnail(media_h);
   if (MEDIA_CONTENT_ERROR_NONE != ret) {
     return LogAndCreateResult(ErrorCode::ABORT_ERR, "Creating thumbnail failed.",
                               ("Creating thumbnail failed: %d (%s)", ret, get_error_message(ret)));
   }
-  callback_data_ptr.release();
+
+  char* path = nullptr;
+  ret = media_info_get_thumbnail_path(media_h, &path);
+  if (MEDIA_CONTENT_ERROR_NONE != ret) {
+    return LogAndCreateResult(
+        ErrorCode::ABORT_ERR, "Creating thumbnail succeeded, but failed to get thumbnail path.",
+        ("Getting thumbnail path failed: %d (%s)", ret, get_error_message(ret)));
+  }
+  obj->emplace("result", picojson::value(path));
+  std::unique_ptr<char[], decltype(&free)>(path, free);
   return PlatformResult(ErrorCode::NO_ERROR);
 }