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

Side by Side Diff: ui/base/clipboard/clipboard_win.cc

Issue 8801038: Make Clipboard::FormatType an opaque handle type. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years 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 | « ui/base/clipboard/clipboard_unittest.cc ('k') | ui/base/clipboard/scoped_clipboard_writer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Many of these functions are based on those found in 5 // Many of these functions are based on those found in
6 // webkit/port/platform/PasteboardWin.cpp 6 // webkit/port/platform/PasteboardWin.cpp
7 7
8 #include "ui/base/clipboard/clipboard.h" 8 #include "ui/base/clipboard/clipboard.h"
9 9
10 #include <shlobj.h> 10 #include <shlobj.h>
11 #include <shellapi.h> 11 #include <shellapi.h>
12 12
13 #include "base/basictypes.h"
13 #include "base/file_path.h" 14 #include "base/file_path.h"
14 #include "base/logging.h" 15 #include "base/logging.h"
15 #include "base/message_loop.h" 16 #include "base/message_loop.h"
16 #include "base/shared_memory.h" 17 #include "base/shared_memory.h"
17 #include "base/stl_util.h" 18 #include "base/stl_util.h"
19 #include "base/string_number_conversions.h"
18 #include "base/string_util.h" 20 #include "base/string_util.h"
19 #include "base/string_number_conversions.h"
20 #include "base/utf_offset_string_conversions.h" 21 #include "base/utf_offset_string_conversions.h"
21 #include "base/utf_string_conversions.h" 22 #include "base/utf_string_conversions.h"
22 #include "base/win/scoped_gdi_object.h" 23 #include "base/win/scoped_gdi_object.h"
23 #include "base/win/scoped_hdc.h" 24 #include "base/win/scoped_hdc.h"
24 #include "base/win/wrapped_window_proc.h" 25 #include "base/win/wrapped_window_proc.h"
25 #include "third_party/skia/include/core/SkBitmap.h" 26 #include "third_party/skia/include/core/SkBitmap.h"
26 #include "ui/base/clipboard/clipboard_util_win.h" 27 #include "ui/base/clipboard/clipboard_util_win.h"
27 #include "ui/base/clipboard/custom_data_helper.h" 28 #include "ui/base/clipboard/custom_data_helper.h"
28 #include "ui/gfx/canvas_skia.h" 29 #include "ui/gfx/canvas_skia.h"
29 #include "ui/gfx/size.h" 30 #include "ui/gfx/size.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 void MakeBitmapOpaque(const SkBitmap& bitmap) { 153 void MakeBitmapOpaque(const SkBitmap& bitmap) {
153 for (int x = 0; x < bitmap.width(); ++x) { 154 for (int x = 0; x < bitmap.width(); ++x) {
154 for (int y = 0; y < bitmap.height(); ++y) { 155 for (int y = 0; y < bitmap.height(); ++y) {
155 *bitmap.getAddr32(x, y) = SkColorSetA(*bitmap.getAddr32(x, y), 0xFF); 156 *bitmap.getAddr32(x, y) = SkColorSetA(*bitmap.getAddr32(x, y), 0xFF);
156 } 157 }
157 } 158 }
158 } 159 }
159 160
160 } // namespace 161 } // namespace
161 162
163 Clipboard::FormatType::FormatType() {
164 }
165
166 Clipboard::FormatType::FormatType(UINT native_format) : data_(native_format) {
167 }
168
169 Clipboard::FormatType::~FormatType() {
170 }
171
172 std::string Clipboard::FormatType::Serialize() const {
173 return base::IntToString(data_);
174 }
175
176 // static
177 Clipboard::FormatType Clipboard::FormatType::Deserialize(
178 const std::string& serialization) {
179 int clipboard_format = -1;
180 if (!base::StringToInt(serialization, &clipboard_format)) {
181 NOTREACHED();
182 return FormatType();
183 }
184 return FormatType(clipboard_format);
185 }
186
162 Clipboard::Clipboard() : create_window_(false) { 187 Clipboard::Clipboard() : create_window_(false) {
163 if (MessageLoop::current()->type() == MessageLoop::TYPE_UI) { 188 if (MessageLoop::current()->type() == MessageLoop::TYPE_UI) {
164 // Make a dummy HWND to be the clipboard's owner. 189 // Make a dummy HWND to be the clipboard's owner.
165 WNDCLASSEX wcex = {0}; 190 WNDCLASSEX wcex = {0};
166 wcex.cbSize = sizeof(WNDCLASSEX); 191 wcex.cbSize = sizeof(WNDCLASSEX);
167 wcex.lpfnWndProc = base::win::WrappedWindowProc<ClipboardOwnerWndProc>; 192 wcex.lpfnWndProc = base::win::WrappedWindowProc<ClipboardOwnerWndProc>;
168 wcex.hInstance = GetModuleHandle(NULL); 193 wcex.hInstance = GetModuleHandle(NULL);
169 wcex.lpszClassName = L"ClipboardOwnerWindowClass"; 194 wcex.lpszClassName = L"ClipboardOwnerWindowClass";
170 ::RegisterClassEx(&wcex); 195 ::RegisterClassEx(&wcex);
171 create_window_ = true; 196 create_window_ = true;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 ::SelectObject(source_dc, old_source); 332 ::SelectObject(source_dc, old_source);
308 ::DeleteObject(old_hbitmap); 333 ::DeleteObject(old_hbitmap);
309 ::DeleteObject(old_source); 334 ::DeleteObject(old_source);
310 ::DeleteDC(compatible_dc); 335 ::DeleteDC(compatible_dc);
311 ::DeleteDC(source_dc); 336 ::DeleteDC(source_dc);
312 ::ReleaseDC(NULL, dc); 337 ::ReleaseDC(NULL, dc);
313 338
314 WriteToClipboard(CF_BITMAP, hbitmap); 339 WriteToClipboard(CF_BITMAP, hbitmap);
315 } 340 }
316 341
317 void Clipboard::WriteData(const char* format_name, size_t format_len, 342 void Clipboard::WriteData(const FormatType& format,
318 const char* data_data, size_t data_len) { 343 const char* data_data,
319 std::string format(format_name, format_len); 344 size_t data_len) {
320 CLIPFORMAT clip_format =
321 ::RegisterClipboardFormat(ASCIIToWide(format).c_str());
322
323 HGLOBAL hdata = ::GlobalAlloc(GMEM_MOVEABLE, data_len); 345 HGLOBAL hdata = ::GlobalAlloc(GMEM_MOVEABLE, data_len);
324 if (!hdata) 346 if (!hdata)
325 return; 347 return;
326 348
327 char* data = static_cast<char*>(::GlobalLock(hdata)); 349 char* data = static_cast<char*>(::GlobalLock(hdata));
328 memcpy(data, data_data, data_len); 350 memcpy(data, data_data, data_len);
329 ::GlobalUnlock(data); 351 ::GlobalUnlock(data);
330 WriteToClipboard(clip_format, hdata); 352 WriteToClipboard(format.ToUINT(), hdata);
331 } 353 }
332 354
333 void Clipboard::WriteToClipboard(unsigned int format, HANDLE handle) { 355 void Clipboard::WriteToClipboard(unsigned int format, HANDLE handle) {
334 DCHECK(clipboard_owner_); 356 DCHECK(clipboard_owner_);
335 if (handle && !::SetClipboardData(format, handle)) { 357 if (handle && !::SetClipboardData(format, handle)) {
336 DCHECK(ERROR_CLIPBOARD_NOT_OPEN != GetLastError()); 358 DCHECK(ERROR_CLIPBOARD_NOT_OPEN != GetLastError());
337 FreeData(format, handle); 359 FreeData(format, handle);
338 } 360 }
339 } 361 }
340 362
341 uint64 Clipboard::GetSequenceNumber(Buffer buffer) { 363 uint64 Clipboard::GetSequenceNumber(Buffer buffer) {
342 DCHECK_EQ(buffer, BUFFER_STANDARD); 364 DCHECK_EQ(buffer, BUFFER_STANDARD);
343 return ::GetClipboardSequenceNumber(); 365 return ::GetClipboardSequenceNumber();
344 } 366 }
345 367
346 bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format, 368 bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format,
347 Clipboard::Buffer buffer) const { 369 Clipboard::Buffer buffer) const {
348 DCHECK_EQ(buffer, BUFFER_STANDARD); 370 DCHECK_EQ(buffer, BUFFER_STANDARD);
349 int f; 371 return ::IsClipboardFormatAvailable(format.ToUINT()) != FALSE;
350 if (!base::StringToInt(format, &f))
351 return false;
352 return ::IsClipboardFormatAvailable(f) != FALSE;
353 }
354
355 bool Clipboard::IsFormatAvailableByString(
356 const std::string& ascii_format, Clipboard::Buffer buffer) const {
357 DCHECK_EQ(buffer, BUFFER_STANDARD);
358 std::wstring wide_format = ASCIIToWide(ascii_format);
359 CLIPFORMAT format = ::RegisterClipboardFormat(wide_format.c_str());
360 return ::IsClipboardFormatAvailable(format) != FALSE;
361 } 372 }
362 373
363 void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer, 374 void Clipboard::ReadAvailableTypes(Clipboard::Buffer buffer,
364 std::vector<string16>* types, 375 std::vector<string16>* types,
365 bool* contains_filenames) const { 376 bool* contains_filenames) const {
366 if (!types || !contains_filenames) { 377 if (!types || !contains_filenames) {
367 NOTREACHED(); 378 NOTREACHED();
368 return; 379 return;
369 } 380 }
370 381
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 for (int i = 0; i < count; ++i) { 650 for (int i = 0; i < count; ++i) {
640 UINT size = ::DragQueryFile(drop, i, NULL, 0) + 1; 651 UINT size = ::DragQueryFile(drop, i, NULL, 0) + 1;
641 DCHECK_GT(size, 1u); 652 DCHECK_GT(size, 1u);
642 std::wstring file; 653 std::wstring file;
643 ::DragQueryFile(drop, i, WriteInto(&file, size), size); 654 ::DragQueryFile(drop, i, WriteInto(&file, size), size);
644 files->push_back(FilePath(file)); 655 files->push_back(FilePath(file));
645 } 656 }
646 } 657 }
647 } 658 }
648 659
649 void Clipboard::ReadData(const std::string& format, std::string* result) const { 660 void Clipboard::ReadData(const FormatType& format, std::string* result) const {
650 if (!result) { 661 if (!result) {
651 NOTREACHED(); 662 NOTREACHED();
652 return; 663 return;
653 } 664 }
654 665
655 CLIPFORMAT clip_format =
656 ::RegisterClipboardFormat(ASCIIToWide(format).c_str());
657
658 ScopedClipboard clipboard; 666 ScopedClipboard clipboard;
659 if (!clipboard.Acquire(GetClipboardWindow())) 667 if (!clipboard.Acquire(GetClipboardWindow()))
660 return; 668 return;
661 669
662 HANDLE data = ::GetClipboardData(clip_format); 670 HANDLE data = ::GetClipboardData(format.ToUINT());
663 if (!data) 671 if (!data)
664 return; 672 return;
665 673
666 result->assign(static_cast<const char*>(::GlobalLock(data)), 674 result->assign(static_cast<const char*>(::GlobalLock(data)),
667 ::GlobalSize(data)); 675 ::GlobalSize(data));
668 ::GlobalUnlock(data); 676 ::GlobalUnlock(data);
669 } 677 }
670 678
671 // static 679 // static
672 void Clipboard::ParseBookmarkClipboardFormat(const string16& bookmark, 680 void Clipboard::ParseBookmarkClipboardFormat(const string16& bookmark,
673 string16* title, 681 string16* title,
674 std::string* url) { 682 std::string* url) {
675 const string16 kDelim = ASCIIToUTF16("\r\n"); 683 const string16 kDelim = ASCIIToUTF16("\r\n");
676 684
677 const size_t title_end = bookmark.find_first_of(kDelim); 685 const size_t title_end = bookmark.find_first_of(kDelim);
678 if (title) 686 if (title)
679 title->assign(bookmark.substr(0, title_end)); 687 title->assign(bookmark.substr(0, title_end));
680 688
681 if (url) { 689 if (url) {
682 const size_t url_start = bookmark.find_first_not_of(kDelim, title_end); 690 const size_t url_start = bookmark.find_first_not_of(kDelim, title_end);
683 if (url_start != string16::npos) 691 if (url_start != string16::npos)
684 *url = UTF16ToUTF8(bookmark.substr(url_start, string16::npos)); 692 *url = UTF16ToUTF8(bookmark.substr(url_start, string16::npos));
685 } 693 }
686 } 694 }
687 695
688 // static 696 // static
689 Clipboard::FormatType Clipboard::GetUrlFormatType() { 697 Clipboard::FormatType Clipboard::GetFormatType(
690 return base::IntToString(ClipboardUtil::GetUrlFormat()->cfFormat); 698 const std::string& format_string) {
699 return FormatType(
700 ::RegisterClipboardFormat(ASCIIToWide(format_string).c_str()));
691 } 701 }
692 702
693 // static 703 // static
694 Clipboard::FormatType Clipboard::GetUrlWFormatType() { 704 // TODO(dcheng): Just substitue the appropriate constants here.
695 return base::IntToString(ClipboardUtil::GetUrlWFormat()->cfFormat); 705 const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
706 CR_DEFINE_STATIC_LOCAL(
707 FormatType,
708 type,
709 (ClipboardUtil::GetUrlFormat()->cfFormat));
710 return type;
696 } 711 }
697 712
698 // static 713 // static
699 Clipboard::FormatType Clipboard::GetMozUrlFormatType() { 714 const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
700 return base::IntToString(ClipboardUtil::GetMozUrlFormat()->cfFormat); 715 CR_DEFINE_STATIC_LOCAL(
716 FormatType,
717 type,
718 (ClipboardUtil::GetUrlWFormat()->cfFormat));
719 return type;
701 } 720 }
702 721
703 // static 722 // static
704 Clipboard::FormatType Clipboard::GetPlainTextFormatType() { 723 const Clipboard::FormatType& Clipboard::GetMozUrlFormatType() {
705 return base::IntToString(ClipboardUtil::GetPlainTextFormat()->cfFormat); 724 CR_DEFINE_STATIC_LOCAL(
725 FormatType,
726 type,
727 (ClipboardUtil::GetMozUrlFormat()->cfFormat));
728 return type;
706 } 729 }
707 730
708 // static 731 // static
709 Clipboard::FormatType Clipboard::GetPlainTextWFormatType() { 732 const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
710 return base::IntToString(ClipboardUtil::GetPlainTextWFormat()->cfFormat); 733 CR_DEFINE_STATIC_LOCAL(
734 FormatType,
735 type,
736 (ClipboardUtil::GetPlainTextFormat()->cfFormat));
737 return type;
711 } 738 }
712 739
713 // static 740 // static
714 Clipboard::FormatType Clipboard::GetFilenameFormatType() { 741 const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
715 return base::IntToString(ClipboardUtil::GetFilenameFormat()->cfFormat); 742 CR_DEFINE_STATIC_LOCAL(
743 FormatType,
744 type,
745 (ClipboardUtil::GetPlainTextWFormat()->cfFormat));
746 return type;
716 } 747 }
717 748
718 // static 749 // static
719 Clipboard::FormatType Clipboard::GetFilenameWFormatType() { 750 const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
720 return base::IntToString(ClipboardUtil::GetFilenameWFormat()->cfFormat); 751 CR_DEFINE_STATIC_LOCAL(
752 FormatType,
753 type,
754 (ClipboardUtil::GetFilenameFormat()->cfFormat));
755 return type;
756 }
757
758 // static
759 const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
760 CR_DEFINE_STATIC_LOCAL(
761 FormatType,
762 type,
763 (ClipboardUtil::GetFilenameWFormat()->cfFormat));
764 return type;
721 } 765 }
722 766
723 // MS HTML Format 767 // MS HTML Format
724 // static 768 // static
725 Clipboard::FormatType Clipboard::GetHtmlFormatType() { 769 const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
726 return base::IntToString(ClipboardUtil::GetHtmlFormat()->cfFormat); 770 CR_DEFINE_STATIC_LOCAL(
771 FormatType,
772 type,
773 (ClipboardUtil::GetHtmlFormat()->cfFormat));
774 return type;
727 } 775 }
728 776
729 // static 777 // static
730 Clipboard::FormatType Clipboard::GetBitmapFormatType() { 778 const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
731 return base::IntToString(CF_BITMAP); 779 CR_DEFINE_STATIC_LOCAL(FormatType, type, (CF_BITMAP));
780 return type;
732 } 781 }
733 782
734 // Firefox text/html 783 // Firefox text/html
735 // static 784 // static
736 Clipboard::FormatType Clipboard::GetTextHtmlFormatType() { 785 const Clipboard::FormatType& Clipboard::GetTextHtmlFormatType() {
737 return base::IntToString(ClipboardUtil::GetTextHtmlFormat()->cfFormat); 786 CR_DEFINE_STATIC_LOCAL(
787 FormatType,
788 type,
789 (ClipboardUtil::GetTextHtmlFormat()->cfFormat));
790 return type;
738 } 791 }
739 792
740 // static 793 // static
741 Clipboard::FormatType Clipboard::GetCFHDropFormatType() { 794 const Clipboard::FormatType& Clipboard::GetCFHDropFormatType() {
742 return base::IntToString(ClipboardUtil::GetCFHDropFormat()->cfFormat); 795 CR_DEFINE_STATIC_LOCAL(
796 FormatType,
797 type,
798 (ClipboardUtil::GetCFHDropFormat()->cfFormat));
799 return type;
743 } 800 }
744 801
745 // static 802 // static
746 Clipboard::FormatType Clipboard::GetFileDescriptorFormatType() { 803 const Clipboard::FormatType& Clipboard::GetFileDescriptorFormatType() {
747 return base::IntToString(ClipboardUtil::GetFileDescriptorFormat()->cfFormat); 804 CR_DEFINE_STATIC_LOCAL(
805 FormatType,
806 type,
807 (ClipboardUtil::GetFileDescriptorFormat()->cfFormat));
808 return type;
748 } 809 }
749 810
750 // static 811 // static
751 Clipboard::FormatType Clipboard::GetFileContentFormatZeroType() { 812 const Clipboard::FormatType& Clipboard::GetFileContentFormatZeroType() {
752 return base::IntToString(ClipboardUtil::GetFileContentFormatZero()->cfFormat); 813 CR_DEFINE_STATIC_LOCAL(
814 FormatType,
815 type,
816 (ClipboardUtil::GetFileContentFormatZero()->cfFormat));
817 return type;
753 } 818 }
754 819
755 // static 820 // static
756 Clipboard::FormatType Clipboard::GetWebKitSmartPasteFormatType() { 821 const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
757 return base::IntToString( 822 CR_DEFINE_STATIC_LOCAL(
758 ClipboardUtil::GetWebKitSmartPasteFormat()->cfFormat); 823 FormatType,
824 type,
825 (ClipboardUtil::GetWebKitSmartPasteFormat()->cfFormat));
826 return type;
759 } 827 }
760 828
761 // static 829 // static
762 Clipboard::FormatType Clipboard::GetWebCustomDataFormatType() { 830 const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
763 // TODO(dcheng): Clean up the duplicated constant. 831 CR_DEFINE_STATIC_LOCAL(
764 // Clipboard::WritePickledData() takes a FormatType, but all the callers 832 FormatType,
765 // assume that it's a raw string. As a result, we return the format name here 833 type,
766 // rather than returning a string-ified version of the registered clipboard 834 (ClipboardUtil::GetWebCustomDataFormat()->cfFormat));
767 // format ID. 835 return type;
768 return "Chromium Web Custom MIME Data Format";
769 } 836 }
770 837
771 // static 838 // static
772 void Clipboard::FreeData(unsigned int format, HANDLE data) { 839 void Clipboard::FreeData(unsigned int format, HANDLE data) {
773 if (format == CF_BITMAP) 840 if (format == CF_BITMAP)
774 ::DeleteObject(static_cast<HBITMAP>(data)); 841 ::DeleteObject(static_cast<HBITMAP>(data));
775 else 842 else
776 ::GlobalFree(data); 843 ::GlobalFree(data);
777 } 844 }
778 845
779 HWND Clipboard::GetClipboardWindow() const { 846 HWND Clipboard::GetClipboardWindow() const {
780 if (!clipboard_owner_ && create_window_) { 847 if (!clipboard_owner_ && create_window_) {
781 clipboard_owner_ = ::CreateWindow(L"ClipboardOwnerWindowClass", 848 clipboard_owner_ = ::CreateWindow(L"ClipboardOwnerWindowClass",
782 L"ClipboardOwnerWindow", 849 L"ClipboardOwnerWindow",
783 0, 0, 0, 0, 0, 850 0, 0, 0, 0, 0,
784 HWND_MESSAGE, 851 HWND_MESSAGE,
785 0, 0, 0); 852 0, 0, 0);
786 } 853 }
787 return clipboard_owner_; 854 return clipboard_owner_;
788 } 855 }
789 856
790 } // namespace ui 857 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/clipboard/clipboard_unittest.cc ('k') | ui/base/clipboard/scoped_clipboard_writer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698