blob: 126d0ee28d79139d4581984c39e13821df9ccba0 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fstream>
#include <getopt.h>
#include <iostream>
#include <limits>
#include "replay_device.h"
#include "stream.h"
#include "trimmer.h"
// this function will open a stream.
// In case the stream cannot be opened an error message will be printed
// and the program will be forced to exit.
void SafeOpen(replay::Stream* stream, const char* filename, const char* mode) {
stream->OpenFile(filename, mode);
if (!stream->Good()) {
std::cerr << "Cannot open stream to '" << filename << "'" << std::endl;
exit(-1);
}
}
int main(int argc, char** argv) {
replay::ReplayDeviceConfig config;
replay::Stream events;
replay::Stream trim_out;
std::ifstream props;
config.device_class = GESTURES_DEVCLASS_TOUCHPAD;
bool trim_enabled = false;
double trim_from = -std::numeric_limits<double>::infinity();
double trim_to = std::numeric_limits<double>::infinity();
while (1) {
static struct option long_options[] = {
{ "evdev-log", required_argument, 0, 'v' },
{ "gestures-log", required_argument, 0, 'g' },
{ "activity-log", required_argument, 0, 'a' },
{ "device", required_argument, 0, 'd'},
{ "events", required_argument, 0, 'e'},
{ "properties", required_argument, 0, 'p'},
{ "trim-from", required_argument, 0, 'b'},
{ "trim-to", required_argument, 0, 's'},
{ "trim-out", required_argument, 0, 't'},
{ "class", required_argument, 0, 'c'},
{ 0, 0, 0, 0 }
};
int option_index = 0;
int c = getopt_long(argc, argv, "", long_options, &option_index);
// end of options
if (c == -1)
break;
switch (c) {
// evdev-log
case 'v':
SafeOpen(&config.log[replay::ReplayDeviceConfig::kLogEvdev],
optarg, "w");
break;
// gestures-log
case 'g':
SafeOpen(&config.log[replay::ReplayDeviceConfig::kLogGestures],
optarg, "w");
break;
// activity-log
case 'a':
SafeOpen(&config.log[replay::ReplayDeviceConfig::kLogActivity],
optarg, "w");
break;
// device
case 'd':
SafeOpen(&config.device, optarg, "r");
break;
// events
case 'e':
SafeOpen(&events, optarg, "r");
break;
// properties
case 'p':
props.open(optarg);
if (!props.good()) {
std::cerr << "Cannot open stream to '" << optarg << "'" << std::endl;
exit(-1);
}
config.properties = std::string((std::istreambuf_iterator<char>(props)),
std::istreambuf_iterator<char>());;
break;
// trim-from
case 'b':
trim_enabled = true;
trim_from = atof(optarg);
break;
// trim-to
case 's':
trim_enabled = true;
trim_to = atof(optarg);
break;
// trim-out
case 't':
trim_enabled = true;
SafeOpen(&trim_out, optarg, "w");
break;
// class
case 'c':
if (strcmp(optarg, "touchpad") == 0)
config.device_class = GESTURES_DEVCLASS_TOUCHPAD;
else if (strcmp(optarg, "mouse") == 0)
config.device_class = GESTURES_DEVCLASS_MOUSE;
else if (strcmp(optarg, "multitouch_mouse") == 0)
config.device_class = GESTURES_DEVCLASS_MULTITOUCH_MOUSE;
else {
std::cerr << "--class should be touchpad, mouse or multitouch_mouse"
<< std::endl;
return -1;
}
break;
case '?':
return -1;
}
}
if (!events.Good()) {
std::cerr << "events file is required" << std::endl;
return -1;
}
// execute: replay or trim
replay::ReplayDevice device(&config);
if (trim_enabled) {
if (!trim_out.Good()) {
std::cerr << "--trim-out is required for trimming" << std::endl;
return -1;
}
replay::Trimmer trimmer(&device);
trimmer.Trim(&events, &trim_out, trim_from, trim_to);
} else {
device.ReplayEvents(&events);
}
return 0;
}