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

Unified Diff: ui/base/win/open_file_name_win.cc

Issue 419523006: Experimentally isolate GetOpenFileName in a utility process. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: ui/base/win/open_file_name_win.cc
diff --git a/ui/base/win/open_file_name_win.cc b/ui/base/win/open_file_name_win.cc
index dd8130570efaf92f227d025bc2782af199f4e316..660f51c3527bb31fd07f5db27ac057f6bd3cbf09 100644
--- a/ui/base/win/open_file_name_win.cc
+++ b/ui/base/win/open_file_name_win.cc
@@ -27,6 +27,25 @@ OpenFileName::OpenFileName(HWND parent_window, DWORD flags) {
OpenFileName::~OpenFileName() {
}
+void OpenFileName::SetFilters(
+ const std::vector<Tuple2<base::string16, base::string16> >& filters) {
+ openfilename_.lpstrFilter = NULL;
+ filter_buffer_.clear();
+ if (filters.empty())
+ return;
+ for (std::vector<Tuple2<base::string16, base::string16> >::const_iterator
+ it = filters.begin();
+ it != filters.end();
+ ++it) {
+ filter_buffer_.append(it->a);
+ filter_buffer_.push_back(0);
+ filter_buffer_.append(it->b);
+ filter_buffer_.push_back(0);
+ }
+ filter_buffer_.push_back(0);
+ openfilename_.lpstrFilter = filter_buffer_.c_str();
+}
+
void OpenFileName::SetInitialSelection(const base::FilePath& initial_directory,
const base::FilePath& initial_filename) {
// First reset to the default case.
@@ -87,5 +106,61 @@ OPENFILENAME* OpenFileName::Get() {
return &openfilename_;
}
+const OPENFILENAME* OpenFileName::Get() const {
+ return &openfilename_;
sky 2014/07/31 20:47:46 nit: this is trivial enough that I would inline it
erikwright (departed) 2014/08/01 13:53:15 Done.
+}
+
+// static
+void OpenFileName::SetResult(const base::FilePath& directory,
+ const std::vector<base::FilePath>& filenames,
+ OPENFILENAME* openfilename) {
+ base::string16 filename_value;
+ if (filenames.size() == 1) {
+ filename_value = directory.Append(filenames[0]).value();
+ } else {
+ filename_value = directory.value();
+ filename_value.push_back(0);
+ for (std::vector<base::FilePath>::const_iterator it = filenames.begin();
+ it != filenames.end();
+ ++it) {
+ filename_value.append(it->value());
+ filename_value.push_back(0);
+ }
+ }
+ if (filename_value.size() + 1 < openfilename->nMaxFile) {
sky 2014/07/31 20:47:46 What about the else case here?
erikwright (departed) 2014/08/01 13:53:15 Done. Also added a test case.
+ // Because the result has embedded nulls, we must memcpy.
+ memcpy(openfilename->lpstrFile,
+ filename_value.c_str(),
+ (filename_value.size() + 1) * sizeof(filename_value[0]));
+ }
+}
+
+// static
+std::vector<Tuple2<base::string16, base::string16> > OpenFileName::GetFilters(
+ const OPENFILENAME* openfilename) {
+ std::vector<Tuple2<base::string16, base::string16> > filters;
+
+ const base::char16* name = openfilename->lpstrFilter;
sky 2014/07/31 20:47:46 Assigning 'name' to 'filter' is rather confusing.
erikwright (departed) 2014/08/01 13:53:15 Done.
+ if (!name)
+ return filters;
+
+ while (*name) {
+ const base::char16* name_end = name;
+ while (*name_end) {
sky 2014/07/31 20:47:46 nit: no {} here and 154
erikwright (departed) 2014/08/01 13:53:15 Done.
+ ++name_end;
+ }
+ const base::char16* value = name_end + 1;
+ const base::char16* value_end = value;
+ while (*value_end) {
+ ++value_end;
+ }
+ filters.push_back(MakeTuple(base::string16(name, name_end),
+ base::string16(value, value_end)));
+ name = value_end + 1;
+ }
+
+ return filters;
+}
+
} // namespace win
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698