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