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..5049836632e5243463a1580cdcd7d950b296f6d4 |
--- /dev/null |
+++ b/content/browser/hyphenation/hyphenation_impl.cc |
@@ -0,0 +1,72 @@ |
+// 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, ()); |
+ |
+ const auto& it = cache.find(locale); |
+ if (it != cache.end()) |
+ return it->second; |
+ const auto& inserted = cache.insert(std::make_pair(locale, base::File())); |
+ 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 |