OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/speech/speech_input_dispatcher_host.h" | 5 #include "chrome/browser/speech/speech_input_dispatcher_host.h" |
6 | 6 |
7 #include "base/singleton.h" | 7 #include "base/lazy_instance.h" |
8 #include "chrome/browser/renderer_host/render_process_host.h" | 8 #include "chrome/browser/renderer_host/render_process_host.h" |
9 #include "chrome/browser/renderer_host/render_view_host.h" | 9 #include "chrome/browser/renderer_host/render_view_host.h" |
10 #include "chrome/browser/renderer_host/render_view_host_notification_task.h" | 10 #include "chrome/browser/renderer_host/render_view_host_notification_task.h" |
11 #include "chrome/browser/renderer_host/resource_message_filter.h" | 11 #include "chrome/browser/renderer_host/resource_message_filter.h" |
12 #include "chrome/common/render_messages.h" | 12 #include "chrome/common/render_messages.h" |
13 | 13 |
14 namespace speech_input { | 14 namespace speech_input { |
15 | 15 |
16 //----------------------------- SpeechInputCallers ----------------------------- | 16 //----------------------------- SpeechInputCallers ----------------------------- |
17 | 17 |
(...skipping 15 matching lines...) Expand all Loading... |
33 int render_process_id(int id); | 33 int render_process_id(int id); |
34 int render_view_id(int id); | 34 int render_view_id(int id); |
35 int request_id(int id); | 35 int request_id(int id); |
36 | 36 |
37 private: | 37 private: |
38 struct CallerInfo { | 38 struct CallerInfo { |
39 int render_process_id; | 39 int render_process_id; |
40 int render_view_id; | 40 int render_view_id; |
41 int request_id; | 41 int request_id; |
42 }; | 42 }; |
43 friend struct DefaultSingletonTraits<SpeechInputCallers>; | 43 friend struct base::DefaultLazyInstanceTraits<SpeechInputCallers>; |
44 | 44 |
45 SpeechInputCallers(); | 45 SpeechInputCallers(); |
46 | 46 |
47 std::map<int, CallerInfo> callers_; | 47 std::map<int, CallerInfo> callers_; |
48 int next_id_; | 48 int next_id_; |
49 }; | 49 }; |
50 | 50 |
| 51 static base::LazyInstance<SpeechInputDispatcherHost::SpeechInputCallers> |
| 52 g_speech_input_callers(base::LINKER_INITIALIZED); |
| 53 |
51 SpeechInputDispatcherHost::SpeechInputCallers::SpeechInputCallers() | 54 SpeechInputDispatcherHost::SpeechInputCallers::SpeechInputCallers() |
52 : next_id_(1) { | 55 : next_id_(1) { |
53 } | 56 } |
54 | 57 |
55 int SpeechInputDispatcherHost::SpeechInputCallers::GetId(int render_process_id, | 58 int SpeechInputDispatcherHost::SpeechInputCallers::GetId(int render_process_id, |
56 int render_view_id, | 59 int render_view_id, |
57 int request_id) { | 60 int request_id) { |
58 for (std::map<int, CallerInfo>::iterator it = callers_.begin(); | 61 for (std::map<int, CallerInfo>::iterator it = callers_.begin(); |
59 it != callers_.end(); it++) { | 62 it != callers_.end(); it++) { |
60 const CallerInfo& item = it->second; | 63 const CallerInfo& item = it->second; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 return callers_[id].request_id; | 103 return callers_[id].request_id; |
101 } | 104 } |
102 | 105 |
103 //-------------------------- SpeechInputDispatcherHost ------------------------- | 106 //-------------------------- SpeechInputDispatcherHost ------------------------- |
104 | 107 |
105 SpeechInputManager::AccessorMethod* | 108 SpeechInputManager::AccessorMethod* |
106 SpeechInputDispatcherHost::manager_accessor_ = &SpeechInputManager::Get; | 109 SpeechInputDispatcherHost::manager_accessor_ = &SpeechInputManager::Get; |
107 | 110 |
108 SpeechInputDispatcherHost::SpeechInputDispatcherHost( | 111 SpeechInputDispatcherHost::SpeechInputDispatcherHost( |
109 int resource_message_filter_process_id) | 112 int resource_message_filter_process_id) |
110 : resource_message_filter_process_id_(resource_message_filter_process_id), | 113 : resource_message_filter_process_id_(resource_message_filter_process_id) { |
111 callers_(Singleton<SpeechInputCallers>::get()) { | |
112 // This is initialized by ResourceMessageFilter. Do not add any non-trivial | 114 // This is initialized by ResourceMessageFilter. Do not add any non-trivial |
113 // initialization here, instead do it lazily when required (e.g. see the | 115 // initialization here, instead do it lazily when required (e.g. see the |
114 // method |manager()|) or add an Init() method. | 116 // method |manager()|) or add an Init() method. |
115 } | 117 } |
116 | 118 |
117 SpeechInputDispatcherHost::~SpeechInputDispatcherHost() { | 119 SpeechInputDispatcherHost::~SpeechInputDispatcherHost() { |
118 } | 120 } |
119 | 121 |
120 SpeechInputManager* SpeechInputDispatcherHost::manager() { | 122 SpeechInputManager* SpeechInputDispatcherHost::manager() { |
121 return (*manager_accessor_)(); | 123 return (*manager_accessor_)(); |
(...skipping 14 matching lines...) Expand all Loading... |
136 IPC_END_MESSAGE_MAP() | 138 IPC_END_MESSAGE_MAP() |
137 return handled; | 139 return handled; |
138 } | 140 } |
139 | 141 |
140 void SpeechInputDispatcherHost::OnStartRecognition( | 142 void SpeechInputDispatcherHost::OnStartRecognition( |
141 int render_view_id, | 143 int render_view_id, |
142 int request_id, | 144 int request_id, |
143 const gfx::Rect& element_rect, | 145 const gfx::Rect& element_rect, |
144 const std::string& language, | 146 const std::string& language, |
145 const std::string& grammar) { | 147 const std::string& grammar) { |
146 int caller_id = callers_->CreateId(resource_message_filter_process_id_, | 148 int caller_id = g_speech_input_callers.Get().CreateId( |
147 render_view_id, request_id); | 149 resource_message_filter_process_id_, render_view_id, request_id); |
148 manager()->StartRecognition(this, caller_id, | 150 manager()->StartRecognition(this, caller_id, |
149 resource_message_filter_process_id_, | 151 resource_message_filter_process_id_, |
150 render_view_id, element_rect, | 152 render_view_id, element_rect, |
151 language, grammar); | 153 language, grammar); |
152 } | 154 } |
153 | 155 |
154 void SpeechInputDispatcherHost::OnCancelRecognition(int render_view_id, | 156 void SpeechInputDispatcherHost::OnCancelRecognition(int render_view_id, |
155 int request_id) { | 157 int request_id) { |
156 int caller_id = callers_->GetId(resource_message_filter_process_id_, | 158 int caller_id = g_speech_input_callers.Get().GetId( |
157 render_view_id, request_id); | 159 resource_message_filter_process_id_, render_view_id, request_id); |
158 if (caller_id) { | 160 if (caller_id) { |
159 manager()->CancelRecognition(caller_id); | 161 manager()->CancelRecognition(caller_id); |
160 callers_->RemoveId(caller_id); // Request sequence ended so remove mapping. | 162 // Request sequence ended so remove mapping. |
| 163 g_speech_input_callers.Get().RemoveId(caller_id); |
161 } | 164 } |
162 } | 165 } |
163 | 166 |
164 void SpeechInputDispatcherHost::OnStopRecording(int render_view_id, | 167 void SpeechInputDispatcherHost::OnStopRecording(int render_view_id, |
165 int request_id) { | 168 int request_id) { |
166 int caller_id = callers_->GetId(resource_message_filter_process_id_, | 169 int caller_id = g_speech_input_callers.Get().GetId( |
167 render_view_id, request_id); | 170 resource_message_filter_process_id_, render_view_id, request_id); |
168 if (caller_id) | 171 if (caller_id) |
169 manager()->StopRecording(caller_id); | 172 manager()->StopRecording(caller_id); |
170 } | 173 } |
171 | 174 |
172 void SpeechInputDispatcherHost::SendMessageToRenderView(IPC::Message* message, | 175 void SpeechInputDispatcherHost::SendMessageToRenderView(IPC::Message* message, |
173 int render_view_id) { | 176 int render_view_id) { |
174 CallRenderViewHost( | 177 CallRenderViewHost( |
175 resource_message_filter_process_id_, render_view_id, | 178 resource_message_filter_process_id_, render_view_id, |
176 &RenderViewHost::Send, message); | 179 &RenderViewHost::Send, message); |
177 } | 180 } |
178 | 181 |
179 void SpeechInputDispatcherHost::SetRecognitionResult( | 182 void SpeechInputDispatcherHost::SetRecognitionResult( |
180 int caller_id, const SpeechInputResultArray& result) { | 183 int caller_id, const SpeechInputResultArray& result) { |
181 VLOG(1) << "SpeechInputDispatcherHost::SetRecognitionResult enter"; | 184 VLOG(1) << "SpeechInputDispatcherHost::SetRecognitionResult enter"; |
182 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 185 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
183 int caller_render_view_id = callers_->render_view_id(caller_id); | 186 int caller_render_view_id = |
184 int caller_request_id = callers_->request_id(caller_id); | 187 g_speech_input_callers.Get().render_view_id(caller_id); |
| 188 int caller_request_id = g_speech_input_callers.Get().request_id(caller_id); |
185 SendMessageToRenderView( | 189 SendMessageToRenderView( |
186 new ViewMsg_SpeechInput_SetRecognitionResult(caller_render_view_id, | 190 new ViewMsg_SpeechInput_SetRecognitionResult(caller_render_view_id, |
187 caller_request_id, | 191 caller_request_id, |
188 result), | 192 result), |
189 caller_render_view_id); | 193 caller_render_view_id); |
190 VLOG(1) << "SpeechInputDispatcherHost::SetRecognitionResult exit"; | 194 VLOG(1) << "SpeechInputDispatcherHost::SetRecognitionResult exit"; |
191 } | 195 } |
192 | 196 |
193 void SpeechInputDispatcherHost::DidCompleteRecording(int caller_id) { | 197 void SpeechInputDispatcherHost::DidCompleteRecording(int caller_id) { |
194 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecording enter"; | 198 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecording enter"; |
195 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 199 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
196 int caller_render_view_id = callers_->render_view_id(caller_id); | 200 int caller_render_view_id = |
197 int caller_request_id = callers_->request_id(caller_id); | 201 g_speech_input_callers.Get().render_view_id(caller_id); |
| 202 int caller_request_id = g_speech_input_callers.Get().request_id(caller_id); |
198 SendMessageToRenderView( | 203 SendMessageToRenderView( |
199 new ViewMsg_SpeechInput_RecordingComplete(caller_render_view_id, | 204 new ViewMsg_SpeechInput_RecordingComplete(caller_render_view_id, |
200 caller_request_id), | 205 caller_request_id), |
201 caller_render_view_id); | 206 caller_render_view_id); |
202 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecording exit"; | 207 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecording exit"; |
203 } | 208 } |
204 | 209 |
205 void SpeechInputDispatcherHost::DidCompleteRecognition(int caller_id) { | 210 void SpeechInputDispatcherHost::DidCompleteRecognition(int caller_id) { |
206 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecognition enter"; | 211 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecognition enter"; |
207 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 212 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
208 int caller_render_view_id = callers_->render_view_id(caller_id); | 213 int caller_render_view_id = |
209 int caller_request_id = callers_->request_id(caller_id); | 214 g_speech_input_callers.Get().render_view_id(caller_id); |
| 215 int caller_request_id = g_speech_input_callers.Get().request_id(caller_id); |
210 SendMessageToRenderView( | 216 SendMessageToRenderView( |
211 new ViewMsg_SpeechInput_RecognitionComplete(caller_render_view_id, | 217 new ViewMsg_SpeechInput_RecognitionComplete(caller_render_view_id, |
212 caller_request_id), | 218 caller_request_id), |
213 caller_render_view_id); | 219 caller_render_view_id); |
214 callers_->RemoveId(caller_id); // Request sequence ended, so remove mapping. | 220 // Request sequence ended, so remove mapping. |
| 221 g_speech_input_callers.Get().RemoveId(caller_id); |
215 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecognition exit"; | 222 VLOG(1) << "SpeechInputDispatcherHost::DidCompleteRecognition exit"; |
216 } | 223 } |
217 | 224 |
218 } // namespace speech_input | 225 } // namespace speech_input |
OLD | NEW |