1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/bookmarks/bookmark_node_data.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <string>
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/pickle.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/url_constants.h"
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/escape.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/clipboard/scoped_clipboard_writer.h"
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_pasteboard_helper_mac.h"
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#else
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h"
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char* BookmarkNodeData::kClipboardFormatString =
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "chromium/x-bookmark-entries";
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::Element::Element() : is_url(false), id_(0) {
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::Element::Element(const BookmarkNode* node)
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : is_url(node->is_url()),
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      url(node->GetURL()),
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      title(node->GetTitle()),
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      id_(node->id()) {
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (int i = 0; i < node->child_count(); ++i)
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    children.push_back(Element(node->GetChild(i)));
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::Element::~Element() {
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::Element::WriteToPickle(Pickle* pickle) const {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteBool(is_url);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteString(url.spec());
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteString16(title);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteInt64(id_);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!is_url) {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pickle->WriteSize(children.size());
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (std::vector<Element>::const_iterator i = children.begin();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         i != children.end(); ++i) {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      i->WriteToPickle(pickle);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::Element::ReadFromPickle(Pickle* pickle,
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               void** iterator) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string url_spec;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!pickle->ReadBool(iterator, &is_url) ||
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !pickle->ReadString(iterator, &url_spec) ||
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !pickle->ReadString16(iterator, &title) ||
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      !pickle->ReadInt64(iterator, &id_)) {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url = GURL(url_spec);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  children.clear();
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!is_url) {
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    size_t children_count;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!pickle->ReadSize(iterator, &children_count))
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    children.resize(children_count);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (std::vector<Element>::iterator i = children.begin();
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         i != children.end(); ++i) {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!i->ReadFromPickle(pickle, iterator))
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return false;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenui::OSExchangeData::CustomFormat BookmarkNodeData::GetBookmarkCustomFormat() {
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static ui::OSExchangeData::CustomFormat format;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool format_valid = false;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!format_valid) {
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    format_valid = true;
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    format = ui::OSExchangeData::RegisterCustomFormat(
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        BookmarkNodeData::kClipboardFormatString);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return format;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::BookmarkNodeData() {
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::BookmarkNodeData(const BookmarkNode* node) {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  elements.push_back(Element(node));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::BookmarkNodeData(
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::vector<const BookmarkNode*>& nodes) {
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ReadFromVector(nodes);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::~BookmarkNodeData() {
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromVector(
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::vector<const BookmarkNode*>& nodes) {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Clear();
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (nodes.empty())
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < nodes.size(); ++i)
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    elements.push_back(Element(nodes[i]));
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromTuple(const GURL& url, const string16& title) {
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Clear();
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!url.is_valid())
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Element element;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  element.title = title;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  element.url = url;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  element.is_url = true;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  elements.push_back(element);
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_MACOSX)
142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::WriteToClipboard(Profile* profile) const {
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::ScopedClipboardWriter scw(g_browser_process->clipboard());
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there is only one element and it is a URL, write the URL to the
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // clipboard.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (elements.size() == 1 && elements[0].is_url) {
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const string16& title = elements[0].title;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string url = elements[0].url.spec();
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scw.WriteBookmark(title, url);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scw.WriteHyperlink(EscapeForHTML(title), url);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Also write the URL to the clipboard as text so that it can be pasted
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // into text fields. We use WriteText instead of WriteURL because we don't
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // want to clobber the X clipboard when the user copies out of the omnibox
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // on Linux (on Windows and Mac, there is no difference between these
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // functions).
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scw.WriteText(UTF8ToUTF16(url));
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Pickle pickle;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteToPickle(profile, &pickle);
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scw.WritePickledData(pickle, kClipboardFormatString);
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromClipboard() {
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string data;
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::Clipboard* clipboard = g_browser_process->clipboard();
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  clipboard->ReadData(kClipboardFormatString, &data);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!data.empty()) {
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Pickle pickle(data.data(), data.size());
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (ReadFromPickle(&pickle))
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 title;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string url;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  clipboard->ReadBookmark(&title, &url);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!url.empty()) {
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Element element;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    element.is_url = true;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    element.url = GURL(url);
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    element.title = title;
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    elements.clear();
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    elements.push_back(element);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ClipboardContainsBookmarks() {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return g_browser_process->clipboard()->IsFormatAvailableByString(
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      BookmarkNodeData::kClipboardFormatString, ui::Clipboard::BUFFER_STANDARD);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::WriteToClipboard(Profile* profile) const {
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bookmark_pasteboard_helper_mac::WriteToClipboard(elements, profile_path_);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromClipboard() {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return bookmark_pasteboard_helper_mac::ReadFromClipboard(elements,
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                           &profile_path_);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromDragClipboard() {
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return bookmark_pasteboard_helper_mac::ReadFromDragClipboard(elements,
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                               &profile_path_);
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ClipboardContainsBookmarks() {
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return bookmark_pasteboard_helper_mac::ClipboardContainsBookmarks();
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !defined(OS_MACOSX)
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BookmarkNodeData::Write(Profile* profile, ui::OSExchangeData* data) const {
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(data);
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there is only one element and it is a URL, write the URL to the
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // clipboard.
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (elements.size() == 1 && elements[0].is_url) {
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (elements[0].url.SchemeIs(chrome::kJavaScriptScheme)) {
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data->SetString(UTF8ToUTF16(elements[0].url.spec()));
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data->SetURL(elements[0].url, elements[0].title);
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Pickle data_pickle;
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WriteToPickle(profile, &data_pickle);
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data->SetPickledData(GetBookmarkCustomFormat(), data_pickle);
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool BookmarkNodeData::Read(const ui::OSExchangeData& data) {
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  elements.clear();
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile_path_.clear();
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (data.HasCustomFormat(GetBookmarkCustomFormat())) {
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Pickle drag_data_pickle;
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (data.GetPickledData(GetBookmarkCustomFormat(), &drag_data_pickle)) {
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!ReadFromPickle(&drag_data_pickle))
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return false;
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // See if there is a URL on the clipboard.
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Element element;
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url;
254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    string16 title;
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (data.GetURLAndTitle(&url, &title))
256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ReadFromTuple(url, title);
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return is_valid();
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::WriteToPickle(Profile* profile, Pickle* pickle) const {
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath path = profile ? profile->GetPath() : FilePath();
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath::WriteStringTypeToPickle(pickle, path.value());
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pickle->WriteSize(elements.size());
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < elements.size(); ++i)
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    elements[i].WriteToPickle(pickle);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromPickle(Pickle* pickle) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void* data_iterator = NULL;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t element_count;
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (FilePath::ReadStringTypeFromPickle(pickle, &data_iterator,
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         &profile_path_) &&
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pickle->ReadSize(&data_iterator, &element_count)) {
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<Element> tmp_elements;
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tmp_elements.resize(element_count);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t i = 0; i < element_count; ++i) {
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!tmp_elements[i].ReadFromPickle(pickle, &data_iterator)) {
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return false;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    elements.swap(tmp_elements);
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstd::vector<const BookmarkNode*> BookmarkNodeData::GetNodes(
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile) const {
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<const BookmarkNode*> nodes;
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!IsFromProfile(profile))
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return nodes;
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < elements.size(); ++i) {
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const BookmarkNode* node =
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        profile->GetBookmarkModel()->GetNodeByID(elements[i].id_);
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!node) {
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      nodes.clear();
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return nodes;
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    nodes.push_back(node);
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return nodes;
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst BookmarkNode* BookmarkNodeData::GetFirstNode(Profile* profile) const {
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<const BookmarkNode*> nodes = GetNodes(profile);
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return nodes.size() == 1 ? nodes[0] : NULL;
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::Clear() {
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile_path_.clear();
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  elements.clear();
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::SetOriginatingProfile(Profile* profile) {
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(profile_path_.empty());
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (profile)
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    profile_path_ = profile->GetPath().value();
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::IsFromProfile(Profile* profile) const {
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // An empty path means the data is not associated with any profile.
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return !profile_path_.empty() && profile_path_ == profile->GetPath().value();
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
331