| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "app/clipboard/clipboard_util_win.h" | 5 #include "app/clipboard/clipboard_util_win.h" |
| 6 | 6 |
| 7 #include <shellapi.h> | 7 #include <shellapi.h> |
| 8 #include <shlwapi.h> | 8 #include <shlwapi.h> |
| 9 #include <wininet.h> | 9 #include <wininet.h> |
| 10 | 10 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 size_t newline_pos = str.find('\n'); | 57 size_t newline_pos = str.find('\n'); |
| 58 if (newline_pos != std::wstring::npos) { | 58 if (newline_pos != std::wstring::npos) { |
| 59 url->assign(str, 0, newline_pos); | 59 url->assign(str, 0, newline_pos); |
| 60 title->assign(str, newline_pos + 1, std::wstring::npos); | 60 title->assign(str, newline_pos + 1, std::wstring::npos); |
| 61 } else { | 61 } else { |
| 62 url->assign(str); | 62 url->assign(str); |
| 63 title->assign(str); | 63 title->assign(str); |
| 64 } | 64 } |
| 65 } | 65 } |
| 66 | 66 |
| 67 bool GetFileUrl(IDataObject* data_object, std::wstring* url, |
| 68 std::wstring* title) { |
| 69 STGMEDIUM store; |
| 70 if (SUCCEEDED(data_object->GetData(ClipboardUtil::GetFilenameWFormat(), |
| 71 &store))) { |
| 72 bool success = false; |
| 73 { |
| 74 // filename using unicode |
| 75 ScopedHGlobal<wchar_t> data(store.hGlobal); |
| 76 if (data.get() && data.get()[0] && |
| 77 (PathFileExists(data.get()) || PathIsUNC(data.get()))) { |
| 78 wchar_t file_url[INTERNET_MAX_URL_LENGTH]; |
| 79 DWORD file_url_len = arraysize(file_url); |
| 80 if (SUCCEEDED(::UrlCreateFromPathW(data.get(), file_url, &file_url_len, |
| 81 0))) { |
| 82 url->assign(file_url); |
| 83 title->assign(file_url); |
| 84 success = true; |
| 85 } |
| 86 } |
| 87 } |
| 88 ReleaseStgMedium(&store); |
| 89 if (success) |
| 90 return true; |
| 91 } |
| 92 |
| 93 if (SUCCEEDED(data_object->GetData(ClipboardUtil::GetFilenameFormat(), |
| 94 &store))) { |
| 95 bool success = false; |
| 96 { |
| 97 // filename using ascii |
| 98 ScopedHGlobal<char> data(store.hGlobal); |
| 99 if (data.get() && data.get()[0] && (PathFileExistsA(data.get()) || |
| 100 PathIsUNCA(data.get()))) { |
| 101 char file_url[INTERNET_MAX_URL_LENGTH]; |
| 102 DWORD file_url_len = arraysize(file_url); |
| 103 if (SUCCEEDED(::UrlCreateFromPathA(data.get(), file_url, &file_url_len, |
| 104 0))) { |
| 105 url->assign(UTF8ToWide(file_url)); |
| 106 title->assign(*url); |
| 107 success = true; |
| 108 } |
| 109 } |
| 110 } |
| 111 ReleaseStgMedium(&store); |
| 112 if (success) |
| 113 return true; |
| 114 } |
| 115 return false; |
| 116 } |
| 117 |
| 67 } // namespace | 118 } // namespace |
| 68 | 119 |
| 69 | 120 |
| 70 FORMATETC* ClipboardUtil::GetUrlFormat() { | 121 FORMATETC* ClipboardUtil::GetUrlFormat() { |
| 71 static UINT cf = RegisterClipboardFormat(CFSTR_INETURLA); | 122 static UINT cf = RegisterClipboardFormat(CFSTR_INETURLA); |
| 72 static FORMATETC format = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; | 123 static FORMATETC format = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; |
| 73 return &format; | 124 return &format; |
| 74 } | 125 } |
| 75 | 126 |
| 76 FORMATETC* ClipboardUtil::GetUrlWFormat() { | 127 FORMATETC* ClipboardUtil::GetUrlWFormat() { |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 } | 226 } |
| 176 | 227 |
| 177 bool ClipboardUtil::HasPlainText(IDataObject* data_object) { | 228 bool ClipboardUtil::HasPlainText(IDataObject* data_object) { |
| 178 DCHECK(data_object); | 229 DCHECK(data_object); |
| 179 return SUCCEEDED(data_object->QueryGetData(GetPlainTextWFormat())) || | 230 return SUCCEEDED(data_object->QueryGetData(GetPlainTextWFormat())) || |
| 180 SUCCEEDED(data_object->QueryGetData(GetPlainTextFormat())); | 231 SUCCEEDED(data_object->QueryGetData(GetPlainTextFormat())); |
| 181 } | 232 } |
| 182 | 233 |
| 183 | 234 |
| 184 bool ClipboardUtil::GetUrl(IDataObject* data_object, | 235 bool ClipboardUtil::GetUrl(IDataObject* data_object, |
| 185 std::wstring* url, std::wstring* title) { | 236 std::wstring* url, std::wstring* title, bool convert_filenames) { |
| 186 DCHECK(data_object && url && title); | 237 DCHECK(data_object && url && title); |
| 187 if (!HasUrl(data_object)) | 238 if (!HasUrl(data_object)) |
| 188 return false; | 239 return false; |
| 189 | 240 |
| 190 // Try to extract a URL from |data_object| in a variety of formats. | 241 // Try to extract a URL from |data_object| in a variety of formats. |
| 191 STGMEDIUM store; | 242 STGMEDIUM store; |
| 192 if (GetUrlFromHDrop(data_object, url, title)) | 243 if (GetUrlFromHDrop(data_object, url, title)) |
| 193 return true; | 244 return true; |
| 194 | 245 |
| 195 if (SUCCEEDED(data_object->GetData(GetMozUrlFormat(), &store)) || | 246 if (SUCCEEDED(data_object->GetData(GetMozUrlFormat(), &store)) || |
| (...skipping 10 matching lines...) Expand all Loading... |
| 206 if (SUCCEEDED(data_object->GetData(GetUrlFormat(), &store))) { | 257 if (SUCCEEDED(data_object->GetData(GetUrlFormat(), &store))) { |
| 207 { | 258 { |
| 208 // URL using ascii | 259 // URL using ascii |
| 209 ScopedHGlobal<char> data(store.hGlobal); | 260 ScopedHGlobal<char> data(store.hGlobal); |
| 210 SplitUrlAndTitle(UTF8ToWide(data.get()), url, title); | 261 SplitUrlAndTitle(UTF8ToWide(data.get()), url, title); |
| 211 } | 262 } |
| 212 ReleaseStgMedium(&store); | 263 ReleaseStgMedium(&store); |
| 213 return true; | 264 return true; |
| 214 } | 265 } |
| 215 | 266 |
| 216 if (SUCCEEDED(data_object->GetData(GetFilenameWFormat(), &store))) { | 267 if (convert_filenames) { |
| 217 bool success = false; | 268 return GetFileUrl(data_object, url, title); |
| 218 { | 269 } else { |
| 219 // filename using unicode | 270 return false; |
| 220 ScopedHGlobal<wchar_t> data(store.hGlobal); | |
| 221 if (data.get() && data.get()[0] && | |
| 222 (PathFileExists(data.get()) || PathIsUNC(data.get()))) { | |
| 223 wchar_t file_url[INTERNET_MAX_URL_LENGTH]; | |
| 224 DWORD file_url_len = arraysize(file_url); | |
| 225 if (SUCCEEDED(::UrlCreateFromPathW(data.get(), file_url, &file_url_len, | |
| 226 0))) { | |
| 227 url->assign(file_url); | |
| 228 title->assign(file_url); | |
| 229 success = true; | |
| 230 } | |
| 231 } | |
| 232 } | |
| 233 ReleaseStgMedium(&store); | |
| 234 if (success) | |
| 235 return true; | |
| 236 } | 271 } |
| 237 | |
| 238 if (SUCCEEDED(data_object->GetData(GetFilenameFormat(), &store))) { | |
| 239 bool success = false; | |
| 240 { | |
| 241 // filename using ascii | |
| 242 ScopedHGlobal<char> data(store.hGlobal); | |
| 243 if (data.get() && data.get()[0] && (PathFileExistsA(data.get()) || | |
| 244 PathIsUNCA(data.get()))) { | |
| 245 char file_url[INTERNET_MAX_URL_LENGTH]; | |
| 246 DWORD file_url_len = arraysize(file_url); | |
| 247 if (SUCCEEDED(::UrlCreateFromPathA(data.get(), file_url, &file_url_len, | |
| 248 0))) { | |
| 249 url->assign(UTF8ToWide(file_url)); | |
| 250 title->assign(*url); | |
| 251 success = true; | |
| 252 } | |
| 253 } | |
| 254 } | |
| 255 ReleaseStgMedium(&store); | |
| 256 if (success) | |
| 257 return true; | |
| 258 } | |
| 259 | |
| 260 return false; | |
| 261 } | 272 } |
| 262 | 273 |
| 263 bool ClipboardUtil::GetFilenames(IDataObject* data_object, | 274 bool ClipboardUtil::GetFilenames(IDataObject* data_object, |
| 264 std::vector<std::wstring>* filenames) { | 275 std::vector<std::wstring>* filenames) { |
| 265 DCHECK(data_object && filenames); | 276 DCHECK(data_object && filenames); |
| 266 if (!HasFilenames(data_object)) | 277 if (!HasFilenames(data_object)) |
| 267 return false; | 278 return false; |
| 268 | 279 |
| 269 STGMEDIUM medium; | 280 STGMEDIUM medium; |
| 270 if (FAILED(data_object->GetData(GetCFHDropFormat(), &medium))) | 281 if (FAILED(data_object->GetData(GetCFHDropFormat(), &medium))) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 ScopedHGlobal<char> data(store.hGlobal); | 324 ScopedHGlobal<char> data(store.hGlobal); |
| 314 plain_text->assign(UTF8ToWide(data.get())); | 325 plain_text->assign(UTF8ToWide(data.get())); |
| 315 } | 326 } |
| 316 ReleaseStgMedium(&store); | 327 ReleaseStgMedium(&store); |
| 317 return true; | 328 return true; |
| 318 } | 329 } |
| 319 | 330 |
| 320 // If a file is dropped on the window, it does not provide either of the | 331 // If a file is dropped on the window, it does not provide either of the |
| 321 // plain text formats, so here we try to forcibly get a url. | 332 // plain text formats, so here we try to forcibly get a url. |
| 322 std::wstring title; | 333 std::wstring title; |
| 323 return GetUrl(data_object, plain_text, &title); | 334 return GetUrl(data_object, plain_text, &title, false); |
| 324 } | 335 } |
| 325 | 336 |
| 326 bool ClipboardUtil::GetHtml(IDataObject* data_object, | 337 bool ClipboardUtil::GetHtml(IDataObject* data_object, |
| 327 std::wstring* html, std::string* base_url) { | 338 std::wstring* html, std::string* base_url) { |
| 328 DCHECK(data_object && html && base_url); | 339 DCHECK(data_object && html && base_url); |
| 329 | 340 |
| 330 STGMEDIUM store; | 341 STGMEDIUM store; |
| 331 if (SUCCEEDED(data_object->QueryGetData(GetHtmlFormat())) && | 342 if (SUCCEEDED(data_object->QueryGetData(GetHtmlFormat())) && |
| 332 SUCCEEDED(data_object->GetData(GetHtmlFormat(), &store))) { | 343 SUCCEEDED(data_object->GetData(GetHtmlFormat(), &store))) { |
| 333 { | 344 { |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 size_t tag_end = cf_html.rfind("<!--EndFragment", std::string::npos); | 530 size_t tag_end = cf_html.rfind("<!--EndFragment", std::string::npos); |
| 520 fragment_end = cf_html.rfind('<', tag_end); | 531 fragment_end = cf_html.rfind('<', tag_end); |
| 521 } | 532 } |
| 522 if (fragment_start != std::string::npos && | 533 if (fragment_start != std::string::npos && |
| 523 fragment_end != std::string::npos) { | 534 fragment_end != std::string::npos) { |
| 524 *html = cf_html.substr(fragment_start, fragment_end - fragment_start); | 535 *html = cf_html.substr(fragment_start, fragment_end - fragment_start); |
| 525 TrimWhitespace(*html, TRIM_ALL, html); | 536 TrimWhitespace(*html, TRIM_ALL, html); |
| 526 } | 537 } |
| 527 } | 538 } |
| 528 } | 539 } |
| OLD | NEW |