Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Side by Side Diff: base/clipboard.h

Issue 260003: Move the clipboard stuff out of base and into app/clipboard. I renamed... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/base.gyp ('k') | base/clipboard.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef BASE_CLIPBOARD_H_
6 #define BASE_CLIPBOARD_H_
7
8 #include <map>
9 #include <string>
10 #include <vector>
11
12 #include "base/process.h"
13 #include "base/string16.h"
14
15 namespace gfx {
16 class Size;
17 }
18
19 class FilePath;
20
21 class Clipboard {
22 public:
23 typedef std::string FormatType;
24 #if defined(USE_X11)
25 typedef struct _GtkClipboard GtkClipboard;
26 typedef std::map<FormatType, std::pair<char*, size_t> > TargetMap;
27 #endif
28
29 // ObjectType designates the type of data to be stored in the clipboard. This
30 // designation is shared across all OSes. The system-specific designation
31 // is defined by FormatType. A single ObjectType might be represented by
32 // several system-specific FormatTypes. For example, on Linux the CBF_TEXT
33 // ObjectType maps to "text/plain", "STRING", and several other formats. On
34 // windows it maps to CF_UNICODETEXT.
35 enum ObjectType {
36 CBF_TEXT,
37 CBF_HTML,
38 CBF_BOOKMARK,
39 CBF_FILES,
40 CBF_WEBKIT,
41 CBF_BITMAP,
42 CBF_SMBITMAP, // Bitmap from shared memory.
43 CBF_DATA, // Arbitrary block of bytes.
44 };
45
46 // ObjectMap is a map from ObjectType to associated data.
47 // The data is organized differently for each ObjectType. The following
48 // table summarizes what kind of data is stored for each key.
49 // * indicates an optional argument.
50 //
51 // Key Arguments Type
52 // -------------------------------------
53 // CBF_TEXT text char array
54 // CBF_HTML html char array
55 // url* char array
56 // CBF_BOOKMARK html char array
57 // url char array
58 // CBF_LINK html char array
59 // url char array
60 // CBF_FILES files char array representing multiple files.
61 // Filenames are separated by null characters and
62 // the final filename is double null terminated.
63 // The filenames are encoded in platform-specific
64 // encoding.
65 // CBF_WEBKIT none empty vector
66 // CBF_BITMAP pixels byte array
67 // size gfx::Size struct
68 // CBF_SMBITMAP shared_mem shared memory handle
69 // size gfx::Size struct
70 // CBF_DATA format char array
71 // data byte array
72 typedef std::vector<char> ObjectMapParam;
73 typedef std::vector<ObjectMapParam> ObjectMapParams;
74 typedef std::map<int /* ObjectType */, ObjectMapParams> ObjectMap;
75
76 // Buffer designates which clipboard the action should be applied to.
77 // Only platforms that use the X Window System support the selection
78 // buffer. Furthermore we currently only use a buffer other than the
79 // standard buffer when reading from the clipboard so only those
80 // functions accept a buffer parameter.
81 enum Buffer {
82 BUFFER_STANDARD,
83 #if defined(OS_LINUX)
84 BUFFER_SELECTION,
85 #endif
86 };
87
88 static bool IsValidBuffer(int32 buffer) {
89 switch (buffer) {
90 case BUFFER_STANDARD:
91 return true;
92 #if defined(OS_LINUX)
93 case BUFFER_SELECTION:
94 return true;
95 #endif
96 }
97 return false;
98 }
99
100 static Buffer FromInt(int32 buffer) {
101 return static_cast<Buffer>(buffer);
102 }
103
104 Clipboard();
105 ~Clipboard();
106
107 // Write a bunch of objects to the system clipboard. Copies are made of the
108 // contents of |objects|. On Windows they are copied to the system clipboard.
109 // On linux they are copied into a structure owned by the Clipboard object and
110 // kept until the system clipboard is set again.
111 void WriteObjects(const ObjectMap& objects);
112
113 // Behaves as above. If there is some shared memory handle passed as one of
114 // the objects, it came from the process designated by |process|. This will
115 // assist in turning it into a shared memory region that the current process
116 // can use.
117 void WriteObjects(const ObjectMap& objects, base::ProcessHandle process);
118
119 // On Linux, we need to know when the clipboard is set to a URL. Most
120 // platforms don't care.
121 #if !defined(OS_LINUX)
122 void DidWriteURL(const std::string& utf8_text) {}
123 #else // !defined(OS_LINUX)
124 void DidWriteURL(const std::string& utf8_text);
125 #endif
126
127 // Tests whether the clipboard contains a certain format
128 bool IsFormatAvailable(const FormatType& format, Buffer buffer) const;
129
130 // As above, but instead of interpreting |format| by some platform-specific
131 // definition, interpret it as a literal MIME type.
132 bool IsFormatAvailableByString(const std::string& format,
133 Buffer buffer) const;
134
135 // Reads UNICODE text from the clipboard, if available.
136 void ReadText(Buffer buffer, string16* result) const;
137
138 // Reads ASCII text from the clipboard, if available.
139 void ReadAsciiText(Buffer buffer, std::string* result) const;
140
141 // Reads HTML from the clipboard, if available.
142 void ReadHTML(Buffer buffer, string16* markup, std::string* src_url) const;
143
144 // Reads a bookmark from the clipboard, if available.
145 void ReadBookmark(string16* title, std::string* url) const;
146
147 // Reads a file or group of files from the clipboard, if available, into the
148 // out parameter.
149 void ReadFile(FilePath* file) const;
150 void ReadFiles(std::vector<FilePath>* files) const;
151
152 // Reads raw data from the clipboard with the given format type. Stores result
153 // as a byte vector.
154 void ReadData(const std::string& format, std::string* result);
155
156 // Get format Identifiers for various types.
157 static FormatType GetUrlFormatType();
158 static FormatType GetUrlWFormatType();
159 static FormatType GetMozUrlFormatType();
160 static FormatType GetPlainTextFormatType();
161 static FormatType GetPlainTextWFormatType();
162 static FormatType GetFilenameFormatType();
163 static FormatType GetFilenameWFormatType();
164 static FormatType GetWebKitSmartPasteFormatType();
165 // Win: MS HTML Format, Other: Generic HTML format
166 static FormatType GetHtmlFormatType();
167 #if defined(OS_WIN)
168 static FormatType GetBitmapFormatType();
169 // Firefox text/html
170 static FormatType GetTextHtmlFormatType();
171 static FormatType GetCFHDropFormatType();
172 static FormatType GetFileDescriptorFormatType();
173 static FormatType GetFileContentFormatZeroType();
174
175 // Duplicates any remote shared memory handle embedded inside |objects| that
176 // was created by |process| so that it can be used by this process.
177 static void DuplicateRemoteHandles(base::ProcessHandle process,
178 ObjectMap* objects);
179 #endif
180
181 private:
182 void DispatchObject(ObjectType type, const ObjectMapParams& params);
183
184 void WriteText(const char* text_data, size_t text_len);
185
186 void WriteHTML(const char* markup_data,
187 size_t markup_len,
188 const char* url_data,
189 size_t url_len);
190
191 void WriteBookmark(const char* title_data,
192 size_t title_len,
193 const char* url_data,
194 size_t url_len);
195
196 void WriteWebSmartPaste();
197
198 void WriteFiles(const char* file_data, size_t file_len);
199
200 void WriteBitmap(const char* pixel_data, const char* size_data);
201
202 #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_FREEBSD)
203 // |format_name| is an ASCII string and should be NULL-terminated.
204 // TODO(estade): port to mac.
205 void WriteData(const char* format_name, size_t format_len,
206 const char* data_data, size_t data_len);
207 #endif
208 #if defined(OS_WIN)
209 void WriteBitmapFromSharedMemory(const char* bitmap_data,
210 const char* size_data,
211 base::ProcessHandle handle);
212
213 void WriteBitmapFromHandle(HBITMAP source_hbitmap,
214 const gfx::Size& size);
215
216 // Safely write to system clipboard. Free |handle| on failure.
217 void WriteToClipboard(unsigned int format, HANDLE handle);
218
219 static void ParseBookmarkClipboardFormat(const string16& bookmark,
220 string16* title,
221 std::string* url);
222
223 // Free a handle depending on its type (as intuited from format)
224 static void FreeData(unsigned int format, HANDLE data);
225
226 // Return the window that should be the clipboard owner, creating it
227 // if neccessary. Marked const for lazily initialization by const methods.
228 HWND GetClipboardWindow() const;
229
230 // Mark this as mutable so const methods can still do lazy initialization.
231 mutable HWND clipboard_owner_;
232
233 // True if we can create a window.
234 bool create_window_;
235 #elif defined(USE_X11)
236 // Data is stored in the |clipboard_data_| map until it is saved to the system
237 // clipboard. The Store* functions save data to the |clipboard_data_| map. The
238 // SetGtkClipboard function replaces whatever is on the system clipboard with
239 // the contents of |clipboard_data_|.
240 // The Write* functions make a deep copy of the data passed to them an store
241 // it in |clipboard_data_|.
242
243 // Write changes to gtk clipboard.
244 void SetGtkClipboard();
245 // Insert a mapping into clipboard_data_.
246 void InsertMapping(const char* key, char* data, size_t data_len);
247
248 // find the gtk clipboard for the passed buffer enum
249 GtkClipboard* LookupBackingClipboard(Buffer clipboard) const;
250
251 TargetMap* clipboard_data_;
252 GtkClipboard* clipboard_;
253 GtkClipboard* primary_selection_;
254 #endif
255
256 DISALLOW_COPY_AND_ASSIGN(Clipboard);
257 };
258
259 #endif // BASE_CLIPBOARD_H_
OLDNEW
« no previous file with comments | « base/base.gyp ('k') | base/clipboard.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698