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

Side by Side Diff: ui/base/dragdrop/os_exchange_data_provider_win.cc

Issue 7778008: Truncate file name longer than MAX_PATH(260) on D2D (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Take leading MAX_PATH-1 instead of considering file extension Created 9 years, 3 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 | « no previous file | no next file » | 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 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" 5 #include "ui/base/dragdrop/os_exchange_data_provider_win.h"
6 6
7 #include <algorithm>
8 #include <vector>
9
7 #include "base/file_path.h" 10 #include "base/file_path.h"
8 #include "base/i18n/file_util_icu.h" 11 #include "base/i18n/file_util_icu.h"
9 #include "base/logging.h" 12 #include "base/logging.h"
10 #include "base/memory/scoped_handle.h" 13 #include "base/memory/scoped_handle.h"
11 #include "base/pickle.h" 14 #include "base/pickle.h"
12 #include "base/stl_util.h" 15 #include "base/stl_util.h"
13 #include "base/utf_string_conversions.h" 16 #include "base/utf_string_conversions.h"
14 #include "base/win/scoped_hglobal.h" 17 #include "base/win/scoped_hglobal.h"
15 #include "googleurl/src/gurl.h" 18 #include "googleurl/src/gurl.h"
16 #include "grit/ui_strings.h" 19 #include "grit/ui_strings.h"
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 } 120 }
118 121
119 FormatEtcEnumerator::~FormatEtcEnumerator() { 122 FormatEtcEnumerator::~FormatEtcEnumerator() {
120 STLDeleteContainerPointers(contents_.begin(), contents_.end()); 123 STLDeleteContainerPointers(contents_.begin(), contents_.end());
121 } 124 }
122 125
123 STDMETHODIMP FormatEtcEnumerator::Next( 126 STDMETHODIMP FormatEtcEnumerator::Next(
124 ULONG count, FORMATETC* elements_array, ULONG* elements_fetched) { 127 ULONG count, FORMATETC* elements_array, ULONG* elements_fetched) {
125 // MSDN says |elements_fetched| is allowed to be NULL if count is 1. 128 // MSDN says |elements_fetched| is allowed to be NULL if count is 1.
126 if (!elements_fetched) 129 if (!elements_fetched)
127 DCHECK(count == 1); 130 DCHECK_EQ(count, 1ul);
128 131
129 // This method copies count elements into |elements_array|. 132 // This method copies count elements into |elements_array|.
130 ULONG index = 0; 133 ULONG index = 0;
131 while (cursor_ < contents_.size() && index < count) { 134 while (cursor_ < contents_.size() && index < count) {
132 CloneFormatEtc(contents_[cursor_], &elements_array[index]); 135 CloneFormatEtc(contents_[cursor_], &elements_array[index]);
133 ++cursor_; 136 ++cursor_;
134 ++index; 137 ++index;
135 } 138 }
136 // The out param is for how many we actually copied. 139 // The out param is for how many we actually copied.
137 if (elements_fetched) 140 if (elements_fetched)
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 bool OSExchangeDataProviderWin::GetPickledData(CLIPFORMAT format, 399 bool OSExchangeDataProviderWin::GetPickledData(CLIPFORMAT format,
397 Pickle* data) const { 400 Pickle* data) const {
398 DCHECK(data); 401 DCHECK(data);
399 FORMATETC format_etc = 402 FORMATETC format_etc =
400 { format, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 403 { format, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
401 bool success = false; 404 bool success = false;
402 STGMEDIUM medium; 405 STGMEDIUM medium;
403 if (SUCCEEDED(source_object_->GetData(&format_etc, &medium))) { 406 if (SUCCEEDED(source_object_->GetData(&format_etc, &medium))) {
404 if (medium.tymed & TYMED_HGLOBAL) { 407 if (medium.tymed & TYMED_HGLOBAL) {
405 base::win::ScopedHGlobal<char> c_data(medium.hGlobal); 408 base::win::ScopedHGlobal<char> c_data(medium.hGlobal);
406 DCHECK(c_data.Size() > 0); 409 DCHECK_GT(c_data.Size(), 0u);
407 // Need to subtract 1 as SetPickledData adds an extra byte to the end. 410 // Need to subtract 1 as SetPickledData adds an extra byte to the end.
408 *data = Pickle(c_data.get(), static_cast<int>(c_data.Size() - 1)); 411 *data = Pickle(c_data.get(), static_cast<int>(c_data.Size() - 1));
409 success = true; 412 success = true;
410 } 413 }
411 ReleaseStgMedium(&medium); 414 ReleaseStgMedium(&medium);
412 } 415 }
413 return success; 416 return success;
414 } 417 }
415 418
416 bool OSExchangeDataProviderWin::GetFileContents( 419 bool OSExchangeDataProviderWin::GetFileContents(
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 drop_files->pFiles = sizeof(DROPFILES); 899 drop_files->pFiles = sizeof(DROPFILES);
897 drop_files->fWide = TRUE; 900 drop_files->fWide = TRUE;
898 wchar_t* data = reinterpret_cast<wchar_t*>( 901 wchar_t* data = reinterpret_cast<wchar_t*>(
899 reinterpret_cast<BYTE*>(drop_files) + kDropSize); 902 reinterpret_cast<BYTE*>(drop_files) + kDropSize);
900 const size_t copy_size = (path.value().length() + 1) * sizeof(wchar_t); 903 const size_t copy_size = (path.value().length() + 1) * sizeof(wchar_t);
901 memcpy(data, path.value().c_str(), copy_size); 904 memcpy(data, path.value().c_str(), copy_size);
902 data[path.value().length() + 1] = L'\0'; // Double NULL 905 data[path.value().length() + 1] = L'\0'; // Double NULL
903 906
904 STGMEDIUM* storage = new STGMEDIUM; 907 STGMEDIUM* storage = new STGMEDIUM;
905 storage->tymed = TYMED_HGLOBAL; 908 storage->tymed = TYMED_HGLOBAL;
906 storage->hGlobal = drop_files; 909 storage->hGlobal = hdata;
907 storage->pUnkForRelease = NULL; 910 storage->pUnkForRelease = NULL;
908 return storage; 911 return storage;
909 } 912 }
910 913
911 static STGMEDIUM* GetStorageForFileDescriptor( 914 static STGMEDIUM* GetStorageForFileDescriptor(
912 const FilePath& path) { 915 const FilePath& path) {
913 string16 valid_file_name = path.value(); 916 string16 file_name = path.value();
914 DCHECK(!valid_file_name.empty() && valid_file_name.size() + 1 <= MAX_PATH); 917 DCHECK(!file_name.empty());
915 HANDLE handle = GlobalAlloc(GPTR, sizeof(FILEGROUPDESCRIPTOR)); 918 HANDLE hdata = GlobalAlloc(GPTR, sizeof(FILEGROUPDESCRIPTOR));
916 FILEGROUPDESCRIPTOR* descriptor = 919 base::win::ScopedHGlobal<FILEGROUPDESCRIPTOR> locked_mem(hdata);
917 reinterpret_cast<FILEGROUPDESCRIPTOR*>(GlobalLock(handle));
918 920
921 FILEGROUPDESCRIPTOR* descriptor = locked_mem.get();
919 descriptor->cItems = 1; 922 descriptor->cItems = 1;
920 wcscpy_s(descriptor->fgd[0].cFileName,
921 valid_file_name.size() + 1,
922 valid_file_name.c_str());
923 descriptor->fgd[0].dwFlags = FD_LINKUI; 923 descriptor->fgd[0].dwFlags = FD_LINKUI;
924 924 wcsncpy_s(descriptor->fgd[0].cFileName,
925 GlobalUnlock(handle); 925 MAX_PATH,
926 file_name.c_str(),
927 std::min(file_name.size(), MAX_PATH - 1u));
926 928
927 STGMEDIUM* storage = new STGMEDIUM; 929 STGMEDIUM* storage = new STGMEDIUM;
928 storage->hGlobal = handle;
929 storage->tymed = TYMED_HGLOBAL; 930 storage->tymed = TYMED_HGLOBAL;
931 storage->hGlobal = hdata;
930 storage->pUnkForRelease = NULL; 932 storage->pUnkForRelease = NULL;
931 return storage; 933 return storage;
932 } 934 }
933 935
934
935 /////////////////////////////////////////////////////////////////////////////// 936 ///////////////////////////////////////////////////////////////////////////////
936 // OSExchangeData, public: 937 // OSExchangeData, public:
937 938
938 // static 939 // static
939 OSExchangeData::Provider* OSExchangeData::CreateProvider() { 940 OSExchangeData::Provider* OSExchangeData::CreateProvider() {
940 return new OSExchangeDataProviderWin(); 941 return new OSExchangeDataProviderWin();
941 } 942 }
942 943
943 // static 944 // static
944 OSExchangeData::CustomFormat OSExchangeData::RegisterCustomFormat( 945 OSExchangeData::CustomFormat OSExchangeData::RegisterCustomFormat(
945 const std::string& type) { 946 const std::string& type) {
946 return RegisterClipboardFormat(ASCIIToUTF16(type).c_str()); 947 return RegisterClipboardFormat(ASCIIToUTF16(type).c_str());
947 } 948 }
948 949
949 } // namespace ui 950 } // namespace ui
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698