• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
current()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.
is_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.
is_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.
EventRecorder()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