(function() {
  var Command, LineTransform, LogcatCommand, Protocol,
    __hasProp = {}.hasOwnProperty,
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

  Command = require('../../command');

  Protocol = require('../../protocol');

  LineTransform = require('../../linetransform');

  LogcatCommand = (function(_super) {
    __extends(LogcatCommand, _super);

    function LogcatCommand() {
      return LogcatCommand.__super__.constructor.apply(this, arguments);
    }

    LogcatCommand.prototype.execute = function(options) {
      var cmd;
      if (options == null) {
        options = {};
      }
      cmd = 'logcat -B *:I 2>/dev/null';
      if (options.clear) {
        cmd = "logcat -c 2>/dev/null && " + cmd;
      }
      this._send("shell:" + cmd);
      return this.parser.readAscii(4).then((function(_this) {
        return function(reply) {
          switch (reply) {
            case Protocol.OKAY:
              return _this.parser.raw().pipe(new LineTransform);
            case Protocol.FAIL:
              return _this.parser.readError();
            default:
              return _this.parser.unexpected(reply, 'OKAY or FAIL');
          }
        };
      })(this));
    };

    return LogcatCommand;

  })(Command);

  module.exports = LogcatCommand;

}).call(this);
