| 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 |