| Index: chrome/common/win_util.cc
|
| ===================================================================
|
| --- chrome/common/win_util.cc (revision 13572)
|
| +++ chrome/common/win_util.cc (working copy)
|
| @@ -219,107 +219,63 @@
|
| return false;
|
| }
|
|
|
| -// Set up a filter for a Save/Open dialog, which will consist of 'file_ext'
|
| -// file extension, 'ext_desc' as the text description of the 'file_ext' type,
|
| -// and (optionally) the default 'All Files' view. The purpose of the filter is
|
| -// to show only files of a particular type in a Windows Save/Open dialog box.
|
| -// The resulting filter is stored in 'buffer', which is a vector since multiple
|
| -// NULLs are embedded. The filters created here are:
|
| -// 1. only files that have 'file_ext' as their extension
|
| -// 2. all files (only added if 'include_all_files' is true)
|
| -// Example:
|
| -// file_ext: ".txt"
|
| -// ext_desc: "Text Document"
|
| -// returned (in buffer): "Text Document\0*.txt\0All Files\0*.*\0\0"
|
| -// This is painful to build, as you will soon see.
|
| -static void FormatFilterForExtension(const std::wstring& file_ext,
|
| - const std::wstring& ext_desc,
|
| - bool include_all_files,
|
| - std::vector<wchar_t>* buffer) {
|
| - DCHECK(buffer);
|
| -
|
| - // Force something reasonable to appear in the dialog box if there is no
|
| - // description provided.
|
| - if (file_ext.empty() || ext_desc.empty())
|
| - include_all_files = true;
|
| -
|
| - size_t size;
|
| - size_t offset = 0;
|
| +std::wstring FormatFilterForExtensions(
|
| + const std::vector<std::wstring>& file_ext,
|
| + const std::vector<std::wstring>& ext_desc,
|
| + bool include_all_files) {
|
| const std::wstring all_ext = L"*.*";
|
| const std::wstring all_desc = l10n_util::GetString(IDS_SAVEAS_ALL_FILES);
|
|
|
| - // Includes 2 internal NULLs + "*".
|
| - const size_t ext_size = ext_desc.length() + file_ext.length() + 3;
|
| - // Includes 2 internal NULLs.
|
| - const size_t all_size = all_desc.length() + all_ext.length() + 2;
|
| - // Includes double terminating NULL.
|
| - const size_t buf_size = (!ext_desc.empty() ? ext_size : 0) +
|
| - (include_all_files ? all_size : 0) + 1;
|
| - buffer->resize(buf_size);
|
| + DCHECK(file_ext.size()>=ext_desc.size());
|
|
|
| - if (!file_ext.empty() && !ext_desc.empty()) {
|
| - // Copy in the text description ("JPEG Image") + NULL.
|
| - size = ext_desc.length() + 1;
|
| - memcpy(&(*buffer)[offset], ext_desc.c_str(), size * sizeof(wchar_t));
|
| - offset += size;
|
| + std::wstring result;
|
|
|
| - // Copy in the file type ("*.jpg") + NULL.
|
| - const std::wstring wildcard_ext = L"*" + file_ext;
|
| - size = wildcard_ext.length() + 1;
|
| - memcpy(&(*buffer)[offset], wildcard_ext.c_str(), size * sizeof(wchar_t));
|
| - offset += size;
|
| - }
|
| + for (size_t i=0; i<file_ext.size(); ++i) {
|
| + std::wstring ext = file_ext[i];
|
| + std::wstring desc;
|
| + if (i<ext_desc.size())
|
| + desc = ext_desc[i];
|
|
|
| - if (include_all_files) {
|
| - // Copy in the default description ("All Files") + NULL.
|
| - size = all_desc.length() + 1;
|
| - memcpy(&(*buffer)[offset], all_desc.c_str(), size * sizeof(wchar_t));
|
| - offset += size;
|
| + if (ext.empty()) {
|
| + // Force something reasonable to appear in the dialog box if there is no
|
| + // extension provided.
|
| + include_all_files = true;
|
| + continue;
|
| + }
|
|
|
| - // Copy in the default file extension ("*.*") + NULL.
|
| - size = all_ext.length() + 1;
|
| - memcpy(&(*buffer)[offset], all_ext.c_str(), size * sizeof(wchar_t));
|
| - offset += size;
|
| + if (desc.empty()) {
|
| + DCHECK(ext.find(L'.') != std::wstring::npos);
|
| + std::wstring first_extension = ext.substr(ext.find(L'.'));
|
| + size_t first_separator_index = first_extension.find(L';');
|
| + if (first_separator_index != std::wstring::npos)
|
| + first_extension = first_extension.substr(0, first_separator_index);
|
| + GetRegistryDescriptionFromExtension(first_extension, &desc);
|
| + if (desc.empty())
|
| + desc = L"*." + first_extension;
|
| + }
|
| +
|
| + result.append(desc.c_str(), desc.size()+1); // Append NULL too.
|
| + result.append(ext.c_str(), ext.size()+1);
|
| }
|
|
|
| - (*buffer)[offset] = L'\0'; // Double NULL required.
|
| -}
|
| -
|
| -std::wstring GetFileFilterFromPath(const std::wstring& file_name) {
|
| - std::wstring reg_description;
|
| - std::wstring file_ext = file_util::GetFileExtensionFromPath(file_name);
|
| - if (!file_ext.empty()) {
|
| - file_ext = L"." + file_ext;
|
| - GetRegistryDescriptionFromExtension(file_ext, ®_description);
|
| + if (include_all_files) {
|
| + result.append(all_desc.c_str(), all_desc.size()+1);
|
| + result.append(all_ext.c_str(), all_ext.size()+1);
|
| }
|
|
|
| - std::vector<wchar_t> filter;
|
| - FormatFilterForExtension(file_ext, reg_description, true, &filter);
|
| - return std::wstring(&filter[0], filter.size());
|
| + result.append(1, '\0'); // Double NULL required.
|
| + return result;
|
| }
|
|
|
| -std::wstring GetFileFilterFromExtensions(const std::wstring& extensions,
|
| - bool include_all_files) {
|
| - DCHECK(extensions.find(L'.') != std::wstring::npos);
|
| - std::wstring first_extension = extensions.substr(extensions.find(L'.'));
|
| - size_t first_separator_index = first_extension.find(L';');
|
| - if (first_separator_index != std::wstring::npos)
|
| - first_extension = first_extension.substr(0, first_separator_index);
|
| -
|
| - std::wstring description;
|
| - GetRegistryDescriptionFromExtension(first_extension, &description);
|
| - if (description.empty())
|
| - description = L"*." + first_extension;
|
| -
|
| - std::vector<wchar_t> filter;
|
| - FormatFilterForExtension(extensions, description, true, &filter);
|
| - return std::wstring(&filter[0], filter.size());
|
| -}
|
| -
|
| bool SaveFileAs(HWND owner,
|
| const std::wstring& suggested_name,
|
| std::wstring* final_name) {
|
| - std::wstring filter = GetFileFilterFromPath(suggested_name);
|
| + std::wstring file_ext = file_util::GetFileExtensionFromPath(suggested_name);
|
| + file_ext.insert(L'.', 0);
|
| + std::wstring filter = FormatFilterForExtensions(
|
| + std::vector<std::wstring>(1, file_ext),
|
| + std::vector<std::wstring>(),
|
| + true);
|
| unsigned index = 1;
|
| return SaveFileAsWithFilter(owner,
|
| suggested_name,
|
|
|