| Index: chrome/browser/chromeos/system_logs/touch_log_source_ozone.cc
|
| diff --git a/chrome/browser/chromeos/system_logs/touch_log_source_ozone.cc b/chrome/browser/chromeos/system_logs/touch_log_source_ozone.cc
|
| index 078b692ee0a62ff3bcf2c38ddabecc91883906a4..f38845e3a36d57030573ade71850f80de2bcaf39 100644
|
| --- a/chrome/browser/chromeos/system_logs/touch_log_source_ozone.cc
|
| +++ b/chrome/browser/chromeos/system_logs/touch_log_source_ozone.cc
|
| @@ -9,6 +9,8 @@
|
| #include "base/bind_helpers.h"
|
| #include "base/callback.h"
|
| #include "base/command_line.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/files/file_util.h"
|
| #include "base/json/json_string_value_serializer.h"
|
| #include "base/logging.h"
|
| #include "base/message_loop/message_loop.h"
|
| @@ -28,18 +30,111 @@ const char kHUDLogDataKey[] = "hud_log";
|
| // We continue to go with it in order to be compatible with the existing touch
|
| // log processing toolchain.
|
| const char kDeviceStatusLogDataKey[] = "hack-33025-touchpad";
|
| +const char kTouchpadEventLogDataKey[] = "hack-33025-touchpad_activity";
|
|
|
| -// Callback for handing the outcome of GetTouchDeviceStatus(). Appends the
|
| -// collected log to the SystemLogsResponse map.
|
| +// Directory for temp touch event logs.
|
| +const char kTouchEventLogDir[] = "/home/chronos/user/log";
|
| +
|
| +// Prefixes of touch event logs.
|
| +const char kTouchpadGestureLogPrefix[] = "touchpad_activity_";
|
| +const char kTouchpadEvdevLogPrefix[] = "cmt_input_events_";
|
| +
|
| +// Binary paths.
|
| +const char kShellCommand[] = "/bin/sh";
|
| +const char kTarCommand[] = "/bin/tar";
|
| +const char kUuencodeCommand[] = "/usr/bin/uuencode";
|
| +
|
| +const int kMaxDeviceTouchEventLogs = 7;
|
| +
|
| +void CleanupEventLog(scoped_ptr<std::vector<base::FilePath>> log_paths) {
|
| + for (size_t i = 0; i < log_paths->size(); ++i)
|
| + base::DeleteFile((*log_paths)[i], false);
|
| +}
|
| +
|
| +std::string GetEventLogListOfOnePrefix(
|
| + const std::vector<base::FilePath>* log_paths,
|
| + const std::string& prefix) {
|
| + int collected = 0;
|
| + std::string log_list;
|
| + for (size_t i = 0; i < log_paths->size(); ++i) {
|
| + std::string basename = (*log_paths)[i].BaseName().MaybeAsASCII();
|
| + if (StartsWithASCII(basename, prefix, true)) {
|
| + log_list.append(" " + (*log_paths)[i].MaybeAsASCII());
|
| +
|
| + // Limit the max number of collected logs to shorten the log collection
|
| + // process.
|
| + ++collected;
|
| + if (collected >= kMaxDeviceTouchEventLogs)
|
| + break;
|
| + }
|
| + }
|
| +
|
| + return log_list;
|
| +}
|
| +
|
| +// Pack the collected event logs in a way that is compatible with the log
|
| +// analysis tools.
|
| +void PackEventLog(system_logs::SystemLogsResponse* response,
|
| + scoped_ptr<std::vector<base::FilePath>> log_paths) {
|
| + // Combine logs with a command line call that tars them up and uuencode the
|
| + // result in one string. This is to be compatible with the X11 behavior.
|
| + std::vector<std::pair<std::string, base::CommandLine>> commands;
|
| + base::CommandLine command = base::CommandLine(base::FilePath(kShellCommand));
|
| + command.AppendArg("-c");
|
| +
|
| + // Make a list that contains touchpad (and mouse) event logs only.
|
| + std::string touchpad_log_list =
|
| + GetEventLogListOfOnePrefix(log_paths.get(), kTouchpadGestureLogPrefix) +
|
| + GetEventLogListOfOnePrefix(log_paths.get(), kTouchpadEvdevLogPrefix);
|
| + command.AppendArg(std::string(kTarCommand) + " cf -" + touchpad_log_list +
|
| + " 2>/dev/null | " + kUuencodeCommand +
|
| + " -m touchpad_activity_log.tar");
|
| + commands.push_back(std::make_pair(kTouchpadEventLogDataKey, command));
|
| +
|
| + // For now only touchpad (and mouse) logs are actually collected.
|
| + for (size_t i = 0; i < commands.size(); ++i) {
|
| + std::string output;
|
| + base::GetAppOutput(commands[i].second, &output);
|
| + (*response)[commands[i].first] = output;
|
| + }
|
| +
|
| + // Cleanup these temporary log files.
|
| + BrowserThread::PostBlockingPoolTask(
|
| + FROM_HERE, base::Bind(CleanupEventLog, base::Passed(&log_paths)));
|
| +}
|
| +
|
| +// Callback for handing the outcome of GetTouchEventLog().
|
| +//
|
| +// This is the end of the whole touch log collection process.
|
| +void OnEventLogCollected(scoped_ptr<system_logs::SystemLogsResponse> response,
|
| + const system_logs::SysLogsSourceCallback& callback,
|
| + scoped_ptr<std::vector<base::FilePath>> log_paths) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + base::Closure pack_closure =
|
| + base::Bind(&PackEventLog, base::Unretained(response.get()),
|
| + base::Passed(&log_paths));
|
| + base::Closure callback_closure =
|
| + base::Bind(callback, base::Owned(response.release()));
|
| + BrowserThread::PostBlockingPoolTaskAndReply(FROM_HERE, pack_closure,
|
| + callback_closure);
|
| +}
|
| +
|
| +// Callback for handing the outcome of GetTouchDeviceStatus().
|
| +//
|
| +// Appends the collected log to the SystemLogsResponse map. Also goes on to
|
| +// collect touch event logs.
|
| void OnStatusLogCollected(scoped_ptr<system_logs::SystemLogsResponse> response,
|
| const system_logs::SysLogsSourceCallback& callback,
|
| scoped_ptr<std::string> log) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| (*response)[kDeviceStatusLogDataKey] = *log;
|
|
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(callback, base::Owned(response.release())));
|
| + // Collect touch event logs.
|
| + const base::FilePath kBaseLogPath(kTouchEventLogDir);
|
| + ui::OzonePlatform::GetInstance()->GetInputController()->GetTouchEventLog(
|
| + kBaseLogPath,
|
| + base::Bind(&OnEventLogCollected, base::Passed(&response), callback));
|
| }
|
|
|
| // Collect touch HUD debug logs. This needs to be done on the UI thread.
|
|
|