1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef UI_BASE_X_SELECTION_UTILS_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define UI_BASE_X_SELECTION_UTILS_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <X11/Xlib.h>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class.
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#undef RootWindow
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted_memory.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui {
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SelectionData;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class X11AtomCache;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kMimeTypeMozillaURL[];
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kString[];
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kText[];
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern const char kUtf8String[];
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns a list of all text atoms that we handle.
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector< ::Atom> GetTextAtomsFrom(
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const X11AtomCache* atom_cache);
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector< ::Atom> GetURLAtomsFrom(
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const X11AtomCache* atom_cache);
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector< ::Atom> GetURIListAtomsFrom(
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const X11AtomCache* atom_cache);
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Places the intersection of |desired| and |offered| into |output|.
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void GetAtomIntersection(const std::vector< ::Atom>& desired,
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const std::vector< ::Atom>& offered,
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        std::vector< ::Atom>* output);
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Takes the raw bytes of the base::string16 and copies them into |bytes|.
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void AddString16ToVector(const base::string16& str,
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        std::vector<unsigned char>* bytes);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tokenizes and parses the Selection Data as if it is a URI List.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::vector<std::string> ParseURIList(const SelectionData& data);
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::string RefCountedMemoryToString(
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const scoped_refptr<base::RefCountedMemory>& memory);
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT base::string16 RefCountedMemoryToString16(
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const scoped_refptr<base::RefCountedMemory>& memory);
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Represents the selection in different data formats. Binary data passed in is
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// assumed to be allocated with new char[], and is owned by SelectionFormatMap.
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT SelectionFormatMap {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Our internal data store, which we only expose through iterators.
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::map< ::Atom, scoped_refptr<base::RefCountedMemory> > InternalMap;
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef InternalMap::const_iterator const_iterator;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SelectionFormatMap();
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~SelectionFormatMap();
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Copy and assignment deliberately open.
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Adds the selection in the format |atom|. Ownership of |data| is passed to
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // us.
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Insert(::Atom atom, const scoped_refptr<base::RefCountedMemory>& item);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the first of the requested_types or NULL if missing.
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui::SelectionData GetFirstOf(
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::vector< ::Atom>& requested_types) const;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns all the selected types.
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector< ::Atom> GetTypes() const;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Pass through to STL map. Only allow non-mutation access.
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const_iterator begin() const { return data_.begin(); }
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const_iterator end() const { return data_.end(); }
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const_iterator find(::Atom atom) const { return data_.find(atom); }
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t size() const { return data_.size(); }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InternalMap data_;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A holder for data with optional X11 deletion semantics.
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT SelectionData {
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |atom_cache| is still owned by caller.
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SelectionData();
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SelectionData(::Atom type,
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                const scoped_refptr<base::RefCountedMemory>& memory);
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SelectionData(const SelectionData& rhs);
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~SelectionData();
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SelectionData& operator=(const SelectionData& rhs);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsValid() const;
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ::Atom GetType() const;
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const unsigned char* GetData() const;
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t GetSize() const;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |type_| is a string type, convert the data to UTF8 and return it.
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string GetText() const;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |type_| is the HTML type, returns the data as a string16. This detects
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // guesses the character encoding of the source.
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 GetHtml() const;
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Assigns the raw data to the string.
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AssignTo(std::string* result) const;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AssignTo(base::string16* result) const;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ::Atom type_;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<base::RefCountedMemory> memory_;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  X11AtomCache atom_cache_;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace ui
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // UI_BASE_X_SELECTION_UTILS_H_
132