15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/time/time.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_node.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/clipboard/clipboard_types.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "url/gurl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass BookmarkModel;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pickle;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PickleIterator;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace bookmarks {
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BookmarkNodeData is used to represent the following:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . A single URL.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . A single node from the bookmark model.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . A set of nodes from the bookmark model.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BookmarkNodeData is used by bookmark related views to represent a dragged
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark or bookmarks.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Typical usage when writing data for a drag is:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   BookmarkNodeData data(node_user_is_dragging);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   data.Write(os_exchange_data_for_drag);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Typical usage to read is:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   BookmarkNodeData data;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   if (data.Read(os_exchange_data))
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     // data is valid, contents are in elements.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BookmarkNodeData {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Element represents a single node.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Element {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Element();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit Element(const BookmarkNode* node);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~Element();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If true, this element represents a URL.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_url;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The URL, only valid if is_url is true.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Title of the entry, used for both urls and folders.
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 title;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Date of when this node was created.
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::Time date_added;
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Date of the last modification. Only used for folders.
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::Time date_folder_modified;
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Children, only used for non-URL nodes.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<Element> children;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Meta info for the bookmark node.
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    BookmarkNode::MetaInfoMap meta_info_map;
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int64 id() const { return id_; }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend struct BookmarkNodeData;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For reading/writing this Element.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void WriteToPickle(Pickle* pickle) const;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ReadFromPickle(Pickle* pickle, PickleIterator* iterator);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ID of the node.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 id_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // The MIME type for the clipboard format for BookmarkNodeData.
87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  static const char* kClipboardFormatString;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  BookmarkNodeData();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Created a BookmarkNodeData populated from the arguments.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit BookmarkNodeData(const BookmarkNode* node);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit BookmarkNodeData(const std::vector<const BookmarkNode*>& nodes);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~BookmarkNodeData();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(TOOLKIT_VIEWS)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static const ui::OSExchangeData::CustomFormat& GetBookmarkCustomFormat();
99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif
100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  static bool ClipboardContainsBookmarks();
102a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads bookmarks from the given vector.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadFromVector(const std::vector<const BookmarkNode*>& nodes);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a single-bookmark DragData from url/title pair.
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool ReadFromTuple(const GURL& url, const base::string16& title);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Writes bookmarks to the specified clipboard.
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void WriteToClipboard(ui::ClipboardType type);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Reads bookmarks from the specified clipboard. Prefers data written via
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // WriteToClipboard() but will also attempt to read a plain bookmark.
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool ReadFromClipboard(ui::ClipboardType type);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes elements to data. If there is only one element and it is a URL
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the URL and title are written to the clipboard in a format other apps can
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use.
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // |profile_path| is used to identify which profile the data came from. Use an
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // empty path to indicate that the data is not associated with any profile.
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Write(const base::FilePath& profile_path,
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch             ui::OSExchangeData* data) const;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restores this data from the clipboard, returning true on success.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Read(const ui::OSExchangeData& data);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes the data for a drag to |pickle|.
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void WriteToPickle(const base::FilePath& profile_path, Pickle* pickle) const;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads the data for a drag from a |pickle|.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadFromPickle(Pickle* pickle);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the nodes represented by this DragData. If this DragData was
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // created from the same profile then the nodes from the model are returned.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the nodes can't be found (may have been deleted), an empty vector is
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned.
1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<const BookmarkNode*> GetNodes(
1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      BookmarkModel* model,
1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const base::FilePath& profile_path) const;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Convenience for getting the first node. Returns NULL if the data doesn't
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // match any nodes or there is more than one node.
1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const BookmarkNode* GetFirstNode(BookmarkModel* model,
1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                   const base::FilePath& profile_path) const;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do we contain valid data?
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid() const { return !elements.empty(); }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if there is a single url.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_single_url() const { return is_valid() && elements[0].is_url; }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of elements.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size() const { return elements.size(); }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears the data.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Sets |profile_path_|. This is useful for the constructors/readers that
1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // don't set it. This should only be called if the profile path is not
1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // already set.
1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void SetOriginatingProfilePath(const base::FilePath& profile_path);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Returns true if this data is from the specified profile path.
1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool IsFromProfilePath(const base::FilePath& profile_path) const;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The actual elements written to the clipboard.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Element> elements;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path of the profile we originated from.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_path_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace bookmarks
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_
179