Home | History | Annotate | Download | only in base
      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