Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1147)

Side by Side Diff: components/translate/content/renderer/data_file_renderer_cld_data_provider.cc

Issue 333603002: Modularize Compact Language Detector 2 (CLD2) data sources (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Takashi's comments and virtual destructors Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "data_file_renderer_cld_data_provider.h"
6
7 #include "base/basictypes.h"
8 #include "base/files/file.h"
9 #include "base/files/memory_mapped_file.h"
10 #include "base/lazy_instance.h"
11 #include "components/translate/content/common/data_file_cld_data_provider_messag es.h"
12 #include "content/public/renderer/render_view_observer.h"
13 #include "ipc/ipc_message.h"
14 #include "ipc/ipc_message_macros.h"
15 #include "ipc/ipc_platform_file.h"
16 #include "third_party/cld_2/src/public/compact_lang_det.h"
17
18 namespace content {
19 // The mmap for the CLD2 data must be held forever once it is available in the
20 // process. This is declared static in the translate_helper.h.
21 base::LazyInstance<DataFileRendererCldDataProvider::CLDMmapWrapper>::Leaky
22 DataFileRendererCldDataProvider::s_cld_mmap_ = LAZY_INSTANCE_INITIALIZER;
23
24 // Implementation of the static factory method from RendererCldDataProvider,
25 // hooking up this specific implementation for all of Chromium.
26 RendererCldDataProvider* CreateRendererCldDataProviderFor(
27 content::RenderViewObserver* render_view_observer) {
28 return new DataFileRendererCldDataProvider(render_view_observer);
29 }
30
31 DataFileRendererCldDataProvider::DataFileRendererCldDataProvider(
32 content::RenderViewObserver* render_view_observer)
33 : render_view_observer (render_view_observer) {
34 }
35
36 DataFileRendererCldDataProvider::~DataFileRendererCldDataProvider() {
37 }
38
39
40 bool DataFileRendererCldDataProvider::OnMessageReceived(
41 const IPC::Message& message) {
42 bool handled = true;
43 IPC_BEGIN_MESSAGE_MAP(DataFileRendererCldDataProvider, message)
44 IPC_MESSAGE_HANDLER(ChromeViewMsg_CldDataFileAvailable, OnCldDataAvailable)
45 IPC_MESSAGE_UNHANDLED(handled = false)
46 IPC_END_MESSAGE_MAP()
47 return handled;
48 }
49
50 void DataFileRendererCldDataProvider::SendCldDataRequest() {
51 // Else, send the IPC message to the browser process requesting the data...
52 render_view_observer->Send(new ChromeViewHostMsg_NeedCldDataFile(
53 render_view_observer->routing_id()));
54 }
55
56 bool DataFileRendererCldDataProvider::IsCldDataAvailable() {
57 // This neatly removes the need for code that depends on the generalized
58 // RendererCldDataProvider to #ifdef on CLD2_DYNAMIC_MODE
59 return CLD2::isDataLoaded(); // ground truth, independent of our state.
60 }
61
62 void DataFileRendererCldDataProvider::SetCldAvailableCallback(
63 base::Callback<void(void)> callback) {
64 cld_available_callback = callback;
65 }
66
67 void DataFileRendererCldDataProvider::OnCldDataAvailable(
68 const IPC::PlatformFileForTransit ipc_file_handle,
69 const uint64 data_offset,
70 const uint64 data_length) {
71 LoadCldData(IPC::PlatformFileForTransitToFile(ipc_file_handle),
72 data_offset,
73 data_length);
74 }
75
76 void DataFileRendererCldDataProvider::LoadCldData(
77 base::File file,
78 const uint64 data_offset,
79 const uint64 data_length) {
80
81 // Terminate immediately if data is already loaded.
82 if (IsCldDataAvailable())
83 return;
84
85 if (!file.IsValid()) {
86 LOG(ERROR) << "Can't find the CLD data file.";
87 return;
88 }
89
90 // mmap the file
91 s_cld_mmap_.Get().value = new base::MemoryMappedFile();
92 bool initialized = s_cld_mmap_.Get().value->Initialize(file.Pass());
93 if (!initialized) {
94 LOG(ERROR) << "mmap initialization failed";
95 delete s_cld_mmap_.Get().value;
96 s_cld_mmap_.Get().value = NULL;
97 return;
98 }
99
100 // Sanity checks
101 uint64 max_int32 = std::numeric_limits<int32>::max();
102 if (data_length + data_offset > s_cld_mmap_.Get().value->length()
103 || data_length > max_int32) { // max signed 32 bit integer
104 LOG(ERROR) << "Illegal mmap config: data_offset="
105 << data_offset << ", data_length=" << data_length
106 << ", mmap->length()=" << s_cld_mmap_.Get().value->length();
107 delete s_cld_mmap_.Get().value;
108 s_cld_mmap_.Get().value = NULL;
109 return;
110 }
111
112 // Initialize the CLD subsystem... and it's all done!
113 const uint8* data_ptr = s_cld_mmap_.Get().value->data() + data_offset;
114 CLD2::loadDataFromRawAddress(data_ptr, data_length);
115 DCHECK(CLD2::isDataLoaded()) << "Failed to load CLD data from mmap";
116 if (!cld_available_callback.is_null()) {
117 cld_available_callback.Run();
118 }
119 }
120
121 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698