1 // Copyright (c) 2011 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 #ifndef BASE_EVENT_RECORDER_H_ 6 #define BASE_EVENT_RECORDER_H_ 7 #pragma once 8 9 #include "base/base_api.h" 10 #include "base/basictypes.h" 11 #include "build/build_config.h" 12 13 #if defined(OS_WIN) 14 #include <stdio.h> 15 #include <string.h> 16 #include <windows.h> 17 #endif 18 19 class FilePath; 20 21 namespace base { 22 23 // A class for recording and playing back keyboard and mouse input events. 24 // 25 // Note - if you record events, and the playback with the windows in 26 // different sizes or positions, the playback will fail. When 27 // recording and playing, you should move the relevant windows 28 // to constant sizes and locations. 29 // TODO(mbelshe) For now this is a singleton. I believe that this class 30 // could be easily modified to: 31 // support two simultaneous recorders 32 // be playing back events while already recording events. 33 // Why? Imagine if the product had a "record a macro" feature. 34 // You might be recording globally, while recording or playing back 35 // a macro. I don't think two playbacks make sense. 36 class BASE_API EventRecorder { 37 public: 38 // Get the singleton EventRecorder. 39 // We can only handle one recorder/player at a time. 40 static EventRecorder* current() { 41 if (!current_) 42 current_ = new EventRecorder(); 43 return current_; 44 } 45 46 // Starts recording events. 47 // Will clobber the file if it already exists. 48 // Returns true on success, or false if an error occurred. 49 bool StartRecording(const FilePath& filename); 50 51 // Stops recording. 52 void StopRecording(); 53 54 // Is the EventRecorder currently recording. 55 bool is_recording() const { return is_recording_; } 56 57 // Plays events previously recorded. 58 // Returns true on success, or false if an error occurred. 59 bool StartPlayback(const FilePath& filename); 60 61 // Stops playback. 62 void StopPlayback(); 63 64 // Is the EventRecorder currently playing. 65 bool is_playing() const { return is_playing_; } 66 67 #if defined(OS_WIN) 68 // C-style callbacks for the EventRecorder. 69 // Used for internal purposes only. 70 LRESULT RecordWndProc(int nCode, WPARAM wParam, LPARAM lParam); 71 LRESULT PlaybackWndProc(int nCode, WPARAM wParam, LPARAM lParam); 72 #endif 73 74 private: 75 // Create a new EventRecorder. Events are saved to the file filename. 76 // If the file already exists, it will be deleted before recording 77 // starts. 78 explicit EventRecorder() 79 : is_recording_(false), 80 is_playing_(false), 81 #if defined(OS_WIN) 82 journal_hook_(NULL), 83 file_(NULL), 84 #endif 85 playback_first_msg_time_(0), 86 playback_start_time_(0) { 87 #if defined(OS_WIN) 88 memset(&playback_msg_, 0, sizeof(playback_msg_)); 89 #endif 90 } 91 ~EventRecorder(); 92 93 static EventRecorder* current_; // Our singleton. 94 95 bool is_recording_; 96 bool is_playing_; 97 #if defined(OS_WIN) 98 HHOOK journal_hook_; 99 FILE* file_; 100 EVENTMSG playback_msg_; 101 #endif 102 int playback_first_msg_time_; 103 int playback_start_time_; 104 105 DISALLOW_COPY_AND_ASSIGN(EventRecorder); 106 }; 107 108 } // namespace base 109 110 #endif // BASE_EVENT_RECORDER_H_ 111