12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // Copyright 2022 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "pdf/file_extension.h"
- #include <algorithm>
- #include <array>
- #include <iterator>
- #include <string>
- #include "base/check_op.h"
- #include "base/files/file_path.h"
- #include "base/strings/string_util.h"
- #if BUILDFLAG(IS_WIN)
- #include "base/strings/utf_string_conversions.h"
- #endif
- namespace chrome_pdf {
- // The order of the entries should always match `ViewFileType` in
- // tools/metrics/histograms/enums.xml and the indexes defined in
- // `ExtensionIndex`.
- constexpr std::array<const char*, 76> kFileExtensions = {
- "other", ".3ga", ".3gp",
- ".aac", ".alac", ".asf",
- ".avi", ".bmp", ".csv",
- ".doc", ".docx", ".flac",
- ".gif", ".jpeg", ".jpg",
- ".log", ".m3u", ".m3u8",
- ".m4a", ".m4v", ".mid",
- ".mkv", ".mov", ".mp3",
- ".mp4", ".mpg", ".odf",
- ".odp", ".ods", ".odt",
- ".oga", ".ogg", ".ogv",
- ".pdf", ".png", ".ppt",
- ".pptx", ".ra", ".ram",
- ".rar", ".rm", ".rtf",
- ".wav", ".webm", ".webp",
- ".wma", ".wmv", ".xls",
- ".xlsx", ".crdownload", ".crx",
- ".dmg", ".exe", ".html",
- ".htm", ".jar", ".ps",
- ".torrent", ".txt", ".zip",
- "directory", "no extension", "unknown extension",
- ".mhtml", ".gdoc", ".gsheet",
- ".gslides", ".arw", ".cr2",
- ".dng", ".nef", ".nrw",
- ".orf", ".raf", ".rw2",
- ".tini",
- };
- static_assert(kFileExtensions.size() ==
- static_cast<size_t>(ExtensionIndex::kMaxValue) + 1);
- enum ExtensionIndex FileNameToExtensionIndex(const std::u16string& file_name) {
- const base::FilePath::StringType extension_str =
- base::FilePath::FromUTF16Unsafe(file_name).Extension();
- if (extension_str.empty())
- return ExtensionIndex::kEmptyExt;
- // All known extensions are ASCII characters. So when an extension contains
- // non-ASCII characters, this extension is not recognizable.
- if (!base::IsStringASCII(extension_str))
- return ExtensionIndex::kOtherExt;
- const base::FilePath::StringType extension_str_lower =
- base::ToLowerASCII(extension_str);
- #if BUILDFLAG(IS_WIN)
- const std::string extension = base::WideToUTF8(extension_str_lower);
- #else
- const std::string& extension = extension_str_lower;
- #endif
- auto* const* it =
- std::find(kFileExtensions.begin(), kFileExtensions.end(), extension);
- if (it == kFileExtensions.end())
- return ExtensionIndex::kOtherExt;
- const int distance = std::distance(kFileExtensions.begin(), it);
- DCHECK_GT(distance, 0);
- DCHECK_LT(static_cast<size_t>(distance), kFileExtensions.size());
- return static_cast<enum ExtensionIndex>(distance);
- }
- } // namespace chrome_pdf
|