picojson::object& out) {
ScopeLogger();
CHECK_PRIVILEGE_ACCESS(kPrivilegeContentWrite, &out);
- common::PlatformResult result = common::PlatformResult(common::ErrorCode::NO_ERROR);
-
- if (ContentManager::getInstance()->isConnected()) {
- result = ContentManager::getInstance()->createThumbnail(args);
- } else {
- result = LogAndCreateResult(common::ErrorCode::UNKNOWN_ERR, "DB Connection is failed.");
- }
- if (!result) {
- LogAndReportError(result, &out, ("Failed to create a thumbnail"));
- common::Instance::PostMessage(this, picojson::value(out).serialize().c_str());
+ double callback_id = args.get("callbackId").get<double>();
+
+ if (not ContentManager::getInstance()->isConnected()) {
+ TaskQueue::GetInstance().Async([this, callback_id]() {
+ PlatformResult result =
+ LogAndCreateResult(common::ErrorCode::ABORT_ERR, "DB Connection is not established.");
+ picojson::value response = picojson::value(picojson::object());
+ picojson::object& obj = response.get<picojson::object>();
+ obj.emplace("callbackId", picojson::value(callback_id));
+ LogAndReportError(result, &obj, ("DB Connection is not established."));
+ Instance::PostMessage(this, response.serialize().c_str());
+ });
+ return;
}
+
+ const std::string& id = args.get("id").get<std::string>();
+ auto work = [this, id, callback_id]() {
+ ScopeLogger();
+ picojson::value response = picojson::value(picojson::object());
+ picojson::object& obj = response.get<picojson::object>();
+ obj.emplace("callbackId", picojson::value(callback_id));
+ auto result = ContentManager::getInstance()->createThumbnail(id, &obj);
+ if (result) {
+ ReportSuccess(obj);
+ } else {
+ LogAndReportError(result, &obj);
+ }
+ Instance::PostMessage(this, response.serialize().c_str());
+ };
+ TaskQueue::GetInstance().Async(work);
+ ReportSuccess(out);
}
void ContentInstance::ContentManagerPlaylistAdd(const picojson::value& args,
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) {
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);
}
void ContentToJson(media_info_h info, picojson::object& o);
void ContentDirToJson(media_folder_h folder, picojson::object& o);
-struct CreateThumbnailCallbackData {
- double callback_id;
- media_info_h media;
- ~CreateThumbnailCallbackData() {
- media_info_destroy(media);
- }
-};
-
class ContentManager {
public:
virtual ~ContentManager();
// thumbnail
int getThumbnailUri(int id, std::string* result);
int setThumbnailUri(int id, const std::string& thb_uri);
- common::PlatformResult createThumbnail(const picojson::value& args);
+ common::PlatformResult createThumbnail(const std::string& id, picojson::object* obj);
private:
// int setContent(media_info_h media, picojson::value content);