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

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
« no previous file with comments | « ui/base/win/open_file_name_win.h ('k') | ui/base/win/open_file_name_win_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2d67b1f6cc0e136cdcbd4ea9db37ebef66b62ab1..b63eb47be640c772dbe5f2529eb9962dc0b9ae83 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.
@@ -83,5 +102,58 @@ void OpenFileName::GetResult(base::FilePath* directory,
}
}
+// 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) {
+ // Because the result has embedded nulls, we must memcpy.
+ memcpy(openfilename->lpstrFile,
+ filename_value.c_str(),
+ (filename_value.size() + 1) * sizeof(filename_value[0]));
+ } else if (openfilename->nMaxFile) {
+ openfilename->lpstrFile[0] = 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* display_string = openfilename->lpstrFilter;
+ if (!display_string)
+ return filters;
+
+ while (*display_string) {
+ const base::char16* display_string_end = display_string;
+ while (*display_string_end)
+ ++display_string_end;
+ const base::char16* pattern = display_string_end + 1;
+ const base::char16* pattern_end = pattern;
+ while (*pattern_end)
+ ++pattern_end;
+ filters.push_back(
+ MakeTuple(base::string16(display_string, display_string_end),
+ base::string16(pattern, pattern_end)));
+ display_string = pattern_end + 1;
+ }
+
+ return filters;
+}
+
} // namespace win
} // namespace ui
« no previous file with comments | « ui/base/win/open_file_name_win.h ('k') | ui/base/win/open_file_name_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698