1 // Copyright (c) 2012 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 // This file implements the ScopedClipboardWriter class. Documentation on its 6 // purpose can be found in our header. Documentation on the format of the 7 // parameters for each clipboard target can be found in clipboard.h. 8 9 #include "ui/base/clipboard/scoped_clipboard_writer.h" 10 11 #include "base/pickle.h" 12 #include "base/strings/utf_string_conversions.h" 13 #include "ui/gfx/size.h" 14 15 namespace ui { 16 17 ScopedClipboardWriter::ScopedClipboardWriter(Clipboard* clipboard, 18 Clipboard::Buffer buffer) 19 : clipboard_(clipboard), 20 buffer_(buffer) { 21 } 22 23 ScopedClipboardWriter::~ScopedClipboardWriter() { 24 if (!objects_.empty() && clipboard_) 25 clipboard_->WriteObjects(buffer_, objects_); 26 } 27 28 void ScopedClipboardWriter::WriteText(const string16& text) { 29 WriteTextOrURL(text, false); 30 } 31 32 void ScopedClipboardWriter::WriteURL(const string16& text) { 33 WriteTextOrURL(text, true); 34 } 35 36 void ScopedClipboardWriter::WriteHTML(const string16& markup, 37 const std::string& source_url) { 38 std::string utf8_markup = UTF16ToUTF8(markup); 39 40 Clipboard::ObjectMapParams parameters; 41 parameters.push_back( 42 Clipboard::ObjectMapParam(utf8_markup.begin(), 43 utf8_markup.end())); 44 if (!source_url.empty()) { 45 parameters.push_back(Clipboard::ObjectMapParam(source_url.begin(), 46 source_url.end())); 47 } 48 49 objects_[Clipboard::CBF_HTML] = parameters; 50 } 51 52 void ScopedClipboardWriter::WriteRTF(const std::string& rtf_data) { 53 Clipboard::ObjectMapParams parameters; 54 parameters.push_back(Clipboard::ObjectMapParam(rtf_data.begin(), 55 rtf_data.end())); 56 objects_[Clipboard::CBF_RTF] = parameters; 57 } 58 59 void ScopedClipboardWriter::WriteBookmark(const string16& bookmark_title, 60 const std::string& url) { 61 if (bookmark_title.empty() || url.empty()) 62 return; 63 64 std::string utf8_markup = UTF16ToUTF8(bookmark_title); 65 66 Clipboard::ObjectMapParams parameters; 67 parameters.push_back(Clipboard::ObjectMapParam(utf8_markup.begin(), 68 utf8_markup.end())); 69 parameters.push_back(Clipboard::ObjectMapParam(url.begin(), url.end())); 70 objects_[Clipboard::CBF_BOOKMARK] = parameters; 71 } 72 73 void ScopedClipboardWriter::WriteHyperlink(const string16& anchor_text, 74 const std::string& url) { 75 if (anchor_text.empty() || url.empty()) 76 return; 77 78 // Construct the hyperlink. 79 std::string html("<a href=\""); 80 html.append(url); 81 html.append("\">"); 82 html.append(UTF16ToUTF8(anchor_text)); 83 html.append("</a>"); 84 WriteHTML(UTF8ToUTF16(html), std::string()); 85 } 86 87 void ScopedClipboardWriter::WriteWebSmartPaste() { 88 objects_[Clipboard::CBF_WEBKIT] = Clipboard::ObjectMapParams(); 89 } 90 91 void ScopedClipboardWriter::WriteBitmapFromPixels(const void* pixels, 92 const gfx::Size& size) { 93 Clipboard::ObjectMapParam pixels_parameter, size_parameter; 94 const char* pixels_data = static_cast<const char*>(pixels); 95 size_t pixels_length = 4 * size.width() * size.height(); 96 for (size_t i = 0; i < pixels_length; i++) 97 pixels_parameter.push_back(pixels_data[i]); 98 99 const char* size_data = reinterpret_cast<const char*>(&size); 100 size_t size_length = sizeof(gfx::Size); 101 for (size_t i = 0; i < size_length; i++) 102 size_parameter.push_back(size_data[i]); 103 104 Clipboard::ObjectMapParams parameters; 105 parameters.push_back(pixels_parameter); 106 parameters.push_back(size_parameter); 107 objects_[Clipboard::CBF_BITMAP] = parameters; 108 } 109 110 void ScopedClipboardWriter::WritePickledData( 111 const Pickle& pickle, const Clipboard::FormatType& format) { 112 std::string format_string = format.Serialize(); 113 Clipboard::ObjectMapParam format_parameter(format_string.begin(), 114 format_string.end()); 115 Clipboard::ObjectMapParam data_parameter; 116 117 data_parameter.resize(pickle.size()); 118 memcpy(const_cast<char*>(&data_parameter.front()), 119 pickle.data(), pickle.size()); 120 121 Clipboard::ObjectMapParams parameters; 122 parameters.push_back(format_parameter); 123 parameters.push_back(data_parameter); 124 objects_[Clipboard::CBF_DATA] = parameters; 125 } 126 127 void ScopedClipboardWriter::Reset() { 128 url_text_.clear(); 129 objects_.clear(); 130 } 131 132 void ScopedClipboardWriter::WriteTextOrURL(const string16& text, bool is_url) { 133 std::string utf8_text = UTF16ToUTF8(text); 134 135 Clipboard::ObjectMapParams parameters; 136 parameters.push_back(Clipboard::ObjectMapParam(utf8_text.begin(), 137 utf8_text.end())); 138 objects_[Clipboard::CBF_TEXT] = parameters; 139 140 if (is_url) { 141 url_text_ = utf8_text; 142 } else { 143 url_text_.clear(); 144 } 145 } 146 147 } // namespace ui 148