2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "bookmark/bookmark_instance.h"
19 #include <web/bookmark-adaptor.h>
22 #include "common/platform_exception.h"
23 #include "common/converter.h"
24 #include "common/logger.h"
26 using common::ErrorCode;
27 using common::PlatformResult;
33 const char kId[] = "id";
34 const char kTitle[] = "title";
35 const char kType[] = "type";
36 const char kParentId[] = "parentId";
37 const char kUrl[] = "url";
40 BookmarkInstance::BookmarkInstance() {
42 using std::placeholders::_1;
43 using std::placeholders::_2;
45 #define REGISTER_SYNC(c,x) \
46 RegisterSyncHandler(c, std::bind(&BookmarkInstance::x, this, _1, _2));
47 REGISTER_SYNC("Bookmark_get", BookmarkGet);
48 REGISTER_SYNC("Bookmark_add", BookmarkAdd);
49 REGISTER_SYNC("Bookmark_remove", BookmarkRemove);
50 REGISTER_SYNC("Bookmark_removeAll", BookmarkRemoveAll);
51 REGISTER_SYNC("Bookmark_getRootId", BookmarkGetRootId);
55 BookmarkInstance::~BookmarkInstance() {
59 bool BookmarkInstance::bookmark_foreach(
60 Context& ctx, bp_bookmark_info_fmt& info) {
66 if (bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, -1, -1, -1, -1,
67 BP_BOOKMARK_O_DATE_CREATED, 0) < 0)
72 for (int i = 0; i < ids_count; i++) {
73 bp_bookmark_adaptor_get_easy_all(ids[i], &info);
75 item.bookmark_info = info;
76 if ((ctx.shouldGetItems && item.bookmark_info.parent != ctx.id) ||
77 (!ctx.shouldGetItems && item.id != ctx.id))
79 ctx.folders.push_back(item);
86 PlatformResult BookmarkInstance::BookmarkUrlExists(const char* url,
91 char* compare_url = nullptr;
93 int ntv_ret = bp_bookmark_adaptor_get_ids_p(
102 BP_BOOKMARK_O_DATE_CREATED, // order_offset
106 return LogAndCreateResult(
107 ErrorCode::UNKNOWN_ERR, "Failed to obtain bookmarks",
108 ("bp_bookmark_adaptor_get_ids_p error: %d (%s)", ntv_ret, get_error_message(ntv_ret)));
111 PlatformResult result{ErrorCode::NO_ERROR};
112 bool url_found = false;
113 for (int i = 0; (i < ids_count) && result && !url_found; ++i) {
114 ntv_ret = bp_bookmark_adaptor_get_url(ids[i], &compare_url);
116 result = LogAndCreateResult(
117 ErrorCode::UNKNOWN_ERR, "Failed to obtain URL",
118 ("bp_bookmark_adaptor_get_url error: %d (%s)", ntv_ret, get_error_message(ntv_ret)));
120 url_found = (0 == strcmp(url, compare_url));
122 compare_url = nullptr;
135 PlatformResult BookmarkInstance::BookmarkTitleExistsInParent(const char* title,
141 int compare_parent = -1;
143 char* compare_title = nullptr;
145 int ntv_ret = bp_bookmark_adaptor_get_ids_p(
154 BP_BOOKMARK_O_DATE_CREATED, // order_offset
158 return LogAndCreateResult(
159 ErrorCode::UNKNOWN_ERR, "Failed to obtain bookmarks",
160 ("bp_bookmark_adaptor_get_ids_p error: %d (%s)",
161 ntv_ret, get_error_message(ntv_ret)));
164 PlatformResult result{ErrorCode::NO_ERROR};
165 bool title_found = false;
166 for (int i = 0; (i < ids_count) && result && !title_found; ++i) {
167 if ((ntv_ret = bp_bookmark_adaptor_get_parent_id(ids[i], &compare_parent)) < 0) {
168 result = LogAndCreateResult(
169 ErrorCode::UNKNOWN_ERR, "Failed to obtain parent ID",
170 ("bp_bookmark_adaptor_get_parent_id error: %d (%s)",
171 ntv_ret, get_error_message(ntv_ret)));
172 } else if ((ntv_ret = bp_bookmark_adaptor_get_title(ids[i], &compare_title)) < 0) {
173 result = LogAndCreateResult(
174 ErrorCode::UNKNOWN_ERR, "Failed to obtain title",
175 ("bp_bookmark_adaptor_get_title error: %d (%s)",
176 ntv_ret, get_error_message(ntv_ret)));
178 title_found = (parent == compare_parent) && (0 == strcmp(title, compare_title));
180 compare_title = nullptr;
186 *exists = title_found;
194 void BookmarkInstance::BookmarkGet(
195 const picojson::value& arg, picojson::object& o) {
199 bp_bookmark_info_fmt info = {0};
200 picojson::value::array arr;
202 ctx.shouldGetItems = arg.get("shouldGetItems").get<double>();
203 ctx.id = arg.get(kId).get<double>();
205 if (!bookmark_foreach(ctx, info)) {
206 LoggerE("BookmarkGet error");
211 std::vector<BookmarkObject>::iterator it;
212 for (it = ctx.folders.begin(); it!= ctx.folders.end(); ++it) {
213 picojson::object obj;
214 BookmarkObject entry = *it;
216 obj[kTitle] = picojson::value(entry.bookmark_info.title);
217 obj[kId] = picojson::value(std::to_string(entry.id));
218 obj[kType] = picojson::value(std::to_string(entry.bookmark_info.type));
219 obj[kParentId] = picojson::value(std::to_string(
220 entry.bookmark_info.parent));
221 if (!entry.bookmark_info.type)
222 obj[kUrl] = picojson::value(entry.bookmark_info.url);
224 arr.push_back(picojson::value(obj));
226 ReportSuccess(picojson::value(arr), o);
229 void BookmarkInstance::BookmarkAdd(
230 const picojson::value& arg, picojson::object& o) {
235 const auto& title = arg.get(kTitle).get<std::string>();
236 const int parent = static_cast<int>(arg.get(kParentId).get<double>());
237 const int type = static_cast<int>(arg.get(kType).get<double>());
238 const auto& url = arg.get(kUrl).get<std::string>();
240 if (0 == type) { // bookmark
242 auto result = BookmarkUrlExists(url.c_str(), &exists);
244 LogAndReportError(result, &o);
247 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Bookmark already exists"), &o);
252 if (1 == type) { // folder
254 auto result = BookmarkTitleExistsInParent(title.c_str(), parent, &exists);
256 LogAndReportError(result, &o);
259 LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Bookmark already exists"), &o);
266 ntv_ret = bp_bookmark_adaptor_create(&saved_id);
268 LoggerE("bp_bookmark_adaptor_create error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
273 ntv_ret = bp_bookmark_adaptor_set_title(saved_id, title.c_str());
275 bp_bookmark_adaptor_delete(saved_id);
276 LoggerE("bp_bookmark_adaptor_set_title error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
281 ntv_ret = bp_bookmark_adaptor_set_parent_id(saved_id, parent);
283 bp_bookmark_adaptor_delete(saved_id);
284 LoggerE("bp_bookmark_adaptor_set_parent_id error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
289 ntv_ret = bp_bookmark_adaptor_set_type(saved_id, type);
291 bp_bookmark_adaptor_delete(saved_id);
292 LoggerE("bp_bookmark_adaptor_set_type error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
297 ntv_ret = bp_bookmark_adaptor_set_url(saved_id, url.c_str());
299 bp_bookmark_adaptor_delete(saved_id);
300 LoggerE("bp_bookmark_adaptor_set_url error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
304 ReportSuccess(picojson::value(std::to_string(saved_id)), o);
307 void BookmarkInstance::BookmarkRemove(
308 const picojson::value& arg, picojson::object& o) {
311 int id = common::stol(
312 common::FromJson<std::string>(arg.get<picojson::object>(), kId));
314 int ntv_ret = bp_bookmark_adaptor_delete(id);
316 LoggerE("bp_bookmark_adaptor_delete error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
323 void BookmarkInstance::BookmarkRemoveAll(
324 const picojson::value& msg, picojson::object& o) {
327 int ntv_ret = bp_bookmark_adaptor_reset();
329 LoggerE("bp_bookmark_adaptor_reset error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
336 void BookmarkInstance::BookmarkGetRootId(
337 const picojson::value& msg, picojson::object& o) {
341 int ntv_ret = bp_bookmark_adaptor_get_root(&rootId);
343 LoggerE("bp_bookmark_adaptor_get_root error: %d (%s)", ntv_ret, get_error_message(ntv_ret));
347 ReportSuccess(picojson::value(std::to_string(rootId)), o);
349 } // namespace bookmark
350 } // namespace extension