Index: content/browser/hyphenator/hyphenator_message_filter.cc |
=================================================================== |
--- content/browser/hyphenator/hyphenator_message_filter.cc (revision 0) |
+++ content/browser/hyphenator/hyphenator_message_filter.cc (revision 0) |
@@ -0,0 +1,110 @@ |
+// Copyright (c) 2012 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 "base/base_paths.h" |
+#include "base/bind.h" |
+#include "base/logging.h" |
+#include "base/path_service.h" |
+#include "base/string16.h" |
+#include "content/browser/hyphenator/hyphenator_message_filter.h" |
+#include "content/common/hyphenator_messages.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/common/content_paths.h" |
+ |
+namespace { |
+ |
+// A helper function that closes the specified file in the FILE thread. This |
+// function may be called after the HyphenatorMessageFilter object that owns the |
+// specified file is deleted, i.e. this function must not depend on the object. |
+void CloseDictionary(base::PlatformFile file) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
+ base::ClosePlatformFile(file); |
+} |
+ |
+} // namespace |
+ |
+namespace content { |
+ |
+HyphenatorMessageFilter::HyphenatorMessageFilter( |
+ content::RenderProcessHost* render_process_host) |
+ : render_process_host_(render_process_host), |
+ dictionary_file_(base::kInvalidPlatformFileValue), |
+ weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
+} |
+ |
+HyphenatorMessageFilter::~HyphenatorMessageFilter() { |
+ // Post a FILE task that deletes the dictionary file. This message filter is |
+ // usually deleted on the IO thread, which does not allow file operations. |
+ if (dictionary_file_ != base::kInvalidPlatformFileValue) { |
+ content::BrowserThread::PostTask( |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&CloseDictionary, dictionary_file_)); |
+ } |
+} |
+ |
+void HyphenatorMessageFilter::SetDictionaryBase(const FilePath& base) { |
+ dictionary_base_ = base; |
+} |
+ |
+void HyphenatorMessageFilter::OverrideThreadForMessage( |
+ const IPC::Message& message, |
+ BrowserThread::ID* thread) { |
+ if (message.type() == HyphenatorHostMsg_OpenDictionary::ID) |
+ *thread = BrowserThread::UI; |
+} |
+ |
+bool HyphenatorMessageFilter::OnMessageReceived( |
+ const IPC::Message& message, |
+ bool* message_was_ok) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP_EX(HyphenatorMessageFilter, |
+ message, |
+ *message_was_ok) |
+ IPC_MESSAGE_HANDLER(HyphenatorHostMsg_OpenDictionary, OnOpenDictionary) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP_EX() |
+ return handled; |
+} |
+ |
+void HyphenatorMessageFilter::OnOpenDictionary(const string16& locale) { |
+ if (dictionary_file_ != base::kInvalidPlatformFileValue) { |
+ SendDictionary(); |
+ return; |
+ } |
+ content::BrowserThread::PostTaskAndReply( |
+ content::BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&HyphenatorMessageFilter::OpenDictionary, this, locale), |
+ base::Bind(&HyphenatorMessageFilter::SendDictionary, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
+void HyphenatorMessageFilter::OpenDictionary(const string16& locale) { |
+ DCHECK(dictionary_file_ == base::kInvalidPlatformFileValue); |
+ |
+ if (dictionary_base_.empty()) |
+ PathService::Get(base::DIR_EXE, &dictionary_base_); |
+ std::string rule_file = locale.empty() ? "en-US" : UTF16ToASCII(locale); |
+ rule_file.append("-1-0.dic"); |
+ FilePath rule_path = dictionary_base_.AppendASCII(rule_file); |
+ dictionary_file_ = base::CreatePlatformFile( |
+ rule_path, |
+ base::PLATFORM_FILE_READ | base::PLATFORM_FILE_OPEN, |
+ NULL, NULL); |
+} |
+ |
+void HyphenatorMessageFilter::SendDictionary() { |
+ IPC::PlatformFileForTransit file = IPC::InvalidPlatformFileForTransit(); |
+ if (dictionary_file_ != base::kInvalidPlatformFileValue) { |
+ file = IPC::GetFileHandleForProcess( |
+ dictionary_file_, |
+ render_process_host_->GetHandle(), |
+ false); |
+ } |
+ Send(new HyphenatorMsg_SetDictionary(file)); |
+} |
+ |
+} // namespace content |
Property changes on: content\browser\hyphenator\hyphenator_message_filter.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |