Chromium Code Reviews| Index: content/browser/hyphenation/hyphenation_impl.cc |
| diff --git a/content/browser/hyphenation/hyphenation_impl.cc b/content/browser/hyphenation/hyphenation_impl.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..461e65c4eb7590d806d901ca803e14e3ab8bfd12 |
| --- /dev/null |
| +++ b/content/browser/hyphenation/hyphenation_impl.cc |
| @@ -0,0 +1,76 @@ |
| +// Copyright 2016 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 "content/browser/hyphenation/hyphenation_impl.h" |
| + |
| +#include <algorithm> |
| +#include <map> |
| +#include <utility> |
| + |
| +#include "base/files/file.h" |
| +#include "base/files/file_path.h" |
| +#include "base/strings/stringprintf.h" |
| +#include "mojo/public/cpp/system/platform_handle.h" |
| + |
| +namespace { |
| + |
| +using DictionaryFileMap = std::unordered_map<std::string, base::File>; |
| + |
| +static bool IsValidLocale(const std::string& locale) { |
| + return std::all_of(locale.cbegin(), locale.cend(), |
| + [](const char ch) { return isalpha(ch) || ch == '-'; }); |
| +} |
| + |
| +static base::File& GetDictionaryFile(const std::string& locale) { |
| + // Keep Files open in the cache for subsequent calls. |
| + CR_DEFINE_STATIC_LOCAL(DictionaryFileMap, cache, ()); |
| + |
| + // TODO(kojii): Replace find+insert with emplace()+std::piecewise_construct |
| + // when std::map::emplace() is fully supported on all configurations. |
|
dcheng
2016/07/13 02:56:28
FWIW, the C++ style owners don't really like piece
kojii
2016/07/13 05:02:28
Oh, thanks for the info. Removed the TODO. I origi
|
| + const auto& it = cache.find(locale); |
| + if (it != cache.end()) |
| + return it->second; |
| + base::File file_on_stack; |
| + const auto& inserted = cache.insert( |
| + std::make_pair(locale, std::move(file_on_stack))); |
|
dcheng
2016/07/13 02:56:29
Slightly shorter to write:
const auto& inserted =
kojii
2016/07/13 05:02:29
Thought some compiler complained, but it looks lik
|
| + base::File& file = inserted.first->second; |
| + DCHECK(!file.IsValid()); |
| + |
| +#if defined(OS_ANDROID) |
| + base::FilePath dir("/system/usr/hyphen-data"); |
| +#else |
| +#error "This configuration is not supported." |
| +#endif |
| + std::string filename = base::StringPrintf("hyph-%s.hyb", locale.c_str()); |
| + base::FilePath path = dir.AppendASCII(filename); |
| + file.Initialize(path, base::File::FLAG_OPEN | base::File::FLAG_READ); |
| + return file; |
| +} |
| + |
| +} // namespace |
| + |
| +namespace hyphenation { |
| + |
| +HyphenationImpl::HyphenationImpl(blink::mojom::HyphenationRequest request) |
| + : binding_(this, std::move(request)) {} |
| + |
| +HyphenationImpl::~HyphenationImpl() {} |
| + |
| +// static |
| +void HyphenationImpl::Create(blink::mojom::HyphenationRequest request) { |
| + new HyphenationImpl(std::move(request)); |
| +} |
| + |
| +void HyphenationImpl::OpenDictionary(const mojo::String& locale, |
| + const OpenDictionaryCallback& callback) { |
| + mojo::ScopedHandle handle; |
| + if (IsValidLocale(locale)) { |
| + base::File& file = GetDictionaryFile(locale); |
| + if (file.IsValid()) |
| + handle = mojo::WrapPlatformFile(file.Duplicate().TakePlatformFile()); |
| + } |
| + callback.Run(std::move(handle)); |
| +} |
| + |
| +} // namespace hyphenation |