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

Side by Side Diff: base/event_recorder.cc

Issue 5009: Fix some issues found looking at the code.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 2 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
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "base/event_recorder.h" 5 #include "base/event_recorder.h"
6 6
7 #include <mmsystem.h> 7 #include <mmsystem.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/time.h" 10 #include "base/time.h"
(...skipping 22 matching lines...) Expand all
33 return EventRecorder::current()->PlaybackWndProc(nCode, wParam, lParam); 33 return EventRecorder::current()->PlaybackWndProc(nCode, wParam, lParam);
34 } 34 }
35 35
36 EventRecorder::~EventRecorder() { 36 EventRecorder::~EventRecorder() {
37 // Try to assert early if the caller deletes the recorder 37 // Try to assert early if the caller deletes the recorder
38 // while it is still in use. 38 // while it is still in use.
39 DCHECK(!journal_hook_); 39 DCHECK(!journal_hook_);
40 DCHECK(!is_recording_ && !is_playing_); 40 DCHECK(!is_recording_ && !is_playing_);
41 } 41 }
42 42
43 bool EventRecorder::StartRecording(std::wstring& filename) { 43 bool EventRecorder::StartRecording(const std::wstring& filename) {
44 if (journal_hook_ != NULL) 44 if (journal_hook_ != NULL)
45 return false; 45 return false;
46 if (is_recording_ || is_playing_) 46 if (is_recording_ || is_playing_)
47 return false; 47 return false;
48 48
49 // Open the recording file. 49 // Open the recording file.
50 DCHECK(file_ == NULL); 50 DCHECK(file_ == NULL);
51 if (_wfopen_s(&file_, filename.c_str(), L"wb+") != 0) { 51 if (_wfopen_s(&file_, filename.c_str(), L"wb+") != 0) {
52 DLOG(ERROR) << "EventRecorder could not open log file"; 52 DLOG(ERROR) << "EventRecorder could not open log file";
53 return false; 53 return false;
(...skipping 29 matching lines...) Expand all
83 83
84 DCHECK(file_ != NULL); 84 DCHECK(file_ != NULL);
85 fclose(file_); 85 fclose(file_);
86 file_ = NULL; 86 file_ = NULL;
87 87
88 journal_hook_ = NULL; 88 journal_hook_ = NULL;
89 is_recording_ = false; 89 is_recording_ = false;
90 } 90 }
91 } 91 }
92 92
93 bool EventRecorder::StartPlayback(std::wstring& filename) { 93 bool EventRecorder::StartPlayback(const std::wstring& filename) {
94 if (journal_hook_ != NULL) 94 if (journal_hook_ != NULL)
95 return false; 95 return false;
96 if (is_recording_ || is_playing_) 96 if (is_recording_ || is_playing_)
97 return false; 97 return false;
98 98
99 // Open the recording file. 99 // Open the recording file.
100 DCHECK(file_ == NULL); 100 DCHECK(file_ == NULL);
101 if (_wfopen_s(&file_, filename.c_str(), L"rb") != 0) { 101 if (_wfopen_s(&file_, filename.c_str(), L"rb") != 0) {
102 DLOG(ERROR) << "EventRecorder Playback could not open log file"; 102 DLOG(ERROR) << "EventRecorder Playback could not open log file";
103 return false; 103 return false;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 ::timeEndPeriod(1); 153 ::timeEndPeriod(1);
154 154
155 journal_hook_ = NULL; 155 journal_hook_ = NULL;
156 is_playing_ = false; 156 is_playing_ = false;
157 } 157 }
158 } 158 }
159 159
160 // Windows callback hook for the recorder. 160 // Windows callback hook for the recorder.
161 LRESULT EventRecorder::RecordWndProc(int nCode, WPARAM wParam, LPARAM lParam) { 161 LRESULT EventRecorder::RecordWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
162 static bool recording_enabled = true; 162 static bool recording_enabled = true;
163 EVENTMSG *msg_ptr = NULL; 163 EVENTMSG* msg_ptr = NULL;
164 164
165 // The API says we have to do this. 165 // The API says we have to do this.
166 // See http://msdn2.microsoft.com/en-us/library/ms644983(VS.85).aspx 166 // See http://msdn2.microsoft.com/en-us/library/ms644983(VS.85).aspx
167 if (nCode < 0) 167 if (nCode < 0)
168 return ::CallNextHookEx(journal_hook_, nCode, wParam, lParam); 168 return ::CallNextHookEx(journal_hook_, nCode, wParam, lParam);
169 169
170 // Check for the break key being pressed and stop recording. 170 // Check for the break key being pressed and stop recording.
171 if (::GetKeyState(VK_CANCEL) & 0x8000) { 171 if (::GetKeyState(VK_CANCEL) & 0x8000) {
172 StopRecording(); 172 StopRecording();
173 return ::CallNextHookEx(journal_hook_, nCode, wParam, lParam); 173 return ::CallNextHookEx(journal_hook_, nCode, wParam, lParam);
174 } 174 }
175 175
176 // The Journal Recorder must stop recording events when system modal 176 // The Journal Recorder must stop recording events when system modal
177 // dialogs are present. (see msdn link above) 177 // dialogs are present. (see msdn link above)
178 switch(nCode) 178 switch(nCode) {
179 {
180 case HC_SYSMODALON: 179 case HC_SYSMODALON:
181 » recording_enabled = false; 180 recording_enabled = false;
182 break; 181 break;
183 case HC_SYSMODALOFF: 182 case HC_SYSMODALOFF:
184 » recording_enabled = true; 183 recording_enabled = true;
185 break; 184 break;
186 } 185 }
187 186
188 if (nCode == HC_ACTION && recording_enabled) { 187 if (nCode == HC_ACTION && recording_enabled) {
189 // Aha - we have an event to record. 188 // Aha - we have an event to record.
190 msg_ptr = reinterpret_cast<EVENTMSG*>(lParam); 189 msg_ptr = reinterpret_cast<EVENTMSG*>(lParam);
191 msg_ptr->time = timeGetTime(); 190 msg_ptr->time = timeGetTime();
192 fwrite(msg_ptr, sizeof(EVENTMSG), 1, file_); 191 fwrite(msg_ptr, sizeof(EVENTMSG), 1, file_);
193 fflush(file_); 192 fflush(file_);
194 } 193 }
195 194
196 return CallNextHookEx(journal_hook_, nCode, wParam, lParam); 195 return CallNextHookEx(journal_hook_, nCode, wParam, lParam);
197 } 196 }
198 197
199 // Windows callback for the playback mode. 198 // Windows callback for the playback mode.
200 LRESULT EventRecorder::PlaybackWndProc(int nCode, WPARAM wParam, LPARAM lParam) 199 LRESULT EventRecorder::PlaybackWndProc(int nCode, WPARAM wParam,
201 { 200 LPARAM lParam) {
202 static bool playback_enabled = true; 201 static bool playback_enabled = true;
203 int delay = 0; 202 int delay = 0;
204 203
205 switch(nCode) 204 switch(nCode) {
206 {
207 // A system modal dialog box is being displayed. Stop playing back 205 // A system modal dialog box is being displayed. Stop playing back
208 // messages. 206 // messages.
209 case HC_SYSMODALON: 207 case HC_SYSMODALON:
210 » playback_enabled = false; 208 playback_enabled = false;
211 » break; 209 break;
212 210
213 // A system modal dialog box is destroyed. We can start playing back 211 // A system modal dialog box is destroyed. We can start playing back
214 // messages again. 212 // messages again.
215 case HC_SYSMODALOFF: 213 case HC_SYSMODALOFF:
216 » playback_enabled = true; 214 playback_enabled = true;
217 » break; 215 break;
218 216
219 // Prepare to copy the next mouse or keyboard event to playback. 217 // Prepare to copy the next mouse or keyboard event to playback.
220 case HC_SKIP: 218 case HC_SKIP:
221 » if (!playback_enabled) 219 if (!playback_enabled)
222 » break; 220 break;
223 221
224 // Read the next event from the record. 222 // Read the next event from the record.
225 if (fread(&playback_msg_, sizeof(EVENTMSG), 1, file_) != 1) 223 if (fread(&playback_msg_, sizeof(EVENTMSG), 1, file_) != 1)
226 this->StopPlayback(); 224 this->StopPlayback();
227 » break; 225 break;
228 226
229 // Copy the mouse or keyboard event to the EVENTMSG structure in lParam. 227 // Copy the mouse or keyboard event to the EVENTMSG structure in lParam.
230 case HC_GETNEXT: 228 case HC_GETNEXT:
231 » if (!playback_enabled) 229 if (!playback_enabled)
232 break; 230 break;
233 231
234 memcpy(reinterpret_cast<void*>(lParam), &playback_msg_, sizeof(playback_ms g_)); 232 memcpy(reinterpret_cast<void*>(lParam), &playback_msg_,
233 sizeof(playback_msg_));
235 234
236 // The return value is the amount of time (in milliseconds) to wait 235 // The return value is the amount of time (in milliseconds) to wait
237 // before playing back the next message in the playback queue. Each 236 // before playing back the next message in the playback queue. Each
238 // time this is called, we recalculate the delay relative to our current 237 // time this is called, we recalculate the delay relative to our current
239 // wall clock. 238 // wall clock.
240 delay = (playback_msg_.time - playback_first_msg_time_) - 239 delay = (playback_msg_.time - playback_first_msg_time_) -
241 (timeGetTime() - playback_start_time_); 240 (timeGetTime() - playback_start_time_);
242 if (delay < 0) 241 if (delay < 0)
243 delay = 0; 242 delay = 0;
244 return delay; 243 return delay;
245 244
246 // An application has called PeekMessage with wRemoveMsg set to PM_NOREMOVE 245 // An application has called PeekMessage with wRemoveMsg set to PM_NOREMOVE
247 // indicating that the message is not removed from the message queue after 246 // indicating that the message is not removed from the message queue after
248 // PeekMessage processing. 247 // PeekMessage processing.
249 case HC_NOREMOVE: 248 case HC_NOREMOVE:
250 break; 249 break;
251 } 250 }
252 251
253 return CallNextHookEx(journal_hook_, nCode, wParam, lParam); 252 return CallNextHookEx(journal_hook_, nCode, wParam, lParam);
254 } 253 }
255 254
256 } // namespace base 255 } // namespace base
257
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698