text: var Packet = require('../packets/packet');
  
  function Handshake(args) {
    this.protocolVersion = args.protocolVersion;
    this.serverVersion   = args.serverVersion;
    this.capabilityFlags = args.capabilityFlags;
    this.connectionId    = args.connectionId;
    this.authPluginData1 = args.authPluginData1;
    this.authPluginData2 = args.authPluginData2;
    this.characterSet    = args.characterSet;
    this.statusFlags     = args.statusFlags;
  }
  
  Handshake.fromPacket = function(packet)
  {
    var args = {};
    args.protocolVersion = packet.readInt8();
    args.serverVersion   = packet.readNullTerminatedString();
    args.connectionId    = packet.readInt32();
    args.authPluginData1 = packet.readBuffer(8);
    packet.skip(1);
    args.capabilityFlags = packet.readInt16();
    if (packet.haveMoreData()) {
      args.characterSet = packet.readInt8();
      args.statusFlags  = packet.readInt16();
      // upper 2 bytes
      args.capabilityFlags += packet.readInt16() << 16;
      args.authPluginDataLength = packet.readInt8();
      packet.skip(10);
    }
    //var len = Math.max(12, args.authPluginDataLength - 8);
    args.authPluginData2 = packet.readBuffer(12);
    return new Handshake(args);
  };
  
  Handshake.prototype.setScrambleData = function(cb) {
    var self = this;
    require('crypto').randomBytes(20, function(err, data) {
      if (err) return cb(err);
      self.authPluginData1 = data.slice(0, 8);
      self.authPluginData2 = data.slice(8,20);
      cb();
    });
  };
  
  Handshake.prototype.toPacket = function(sequenceId) {
    var buffer, packet;
    var length = 68 + Buffer.byteLength(this.serverVersion, 'utf8');
    buffer = new Buffer(length + 4);
    packet  = new Packet(sequenceId, buffer, 0, length + 4);
    packet.offset = 4;
    packet.writeInt8(this.protocolVersion);
    packet.writeString(this.serverVersion);
    packet.writeInt8(0);
    packet.writeInt32(this.connectionId);
    packet.writeBuffer(this.authPluginData1);
    packet.writeInt8(0);
    packet.writeInt16(this.capabilityFlags & 0xffff);
    packet.writeInt8(this.characterSet);
    packet.writeInt16(this.statusFlags);
    packet.writeInt16(this.capabilityFlags >> 16);
    packet.writeInt8(21); // authPluginDataLength
    var filler = new Buffer(10);
    filler.fill(0);
    packet.writeBuffer(filler);
    packet.writeBuffer(this.authPluginData2);
    packet.writeInt8(0);
    packet.writeString('mysql_native_password');
    packet.writeInt8(0);
    return packet;
  };
  
  module.exports = Handshake;
  