text: // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
  
  var assert = require('assert-plus')
  var util = require('util')
  
  var LDAPMessage = require('./message')
  var Protocol = require('../protocol')
  
  /// --- API
  
  function AbandonRequest (options) {
    options = options || {}
    assert.object(options)
    assert.optionalNumber(options.abandonID)
  
    options.protocolOp = Protocol.LDAP_REQ_ABANDON
    LDAPMessage.call(this, options)
  
    this.abandonID = options.abandonID || 0
  }
  util.inherits(AbandonRequest, LDAPMessage)
  Object.defineProperties(AbandonRequest.prototype, {
    type: {
      get: function getType () { return 'AbandonRequest' },
      configurable: false
    }
  })
  
  AbandonRequest.prototype._parse = function (ber, length) {
    assert.ok(ber)
    assert.ok(length)
  
    // What a PITA - have to replicate ASN.1 integer logic to work around the
    // way abandon is encoded and the way ldapjs framework handles "normal"
    // messages
  
    var buf = ber.buffer
    var offset = 0
    var value = 0
  
    var fb = buf[offset++]
    value = fb & 0x7F
    for (var i = 1; i < length; i++) {
      value <<= 8
      value |= (buf[offset++] & 0xff)
    }
    if ((fb & 0x80) === 0x80) { value = -value }
  
    ber._offset += length
  
    this.abandonID = value
  
    return true
  }
  
  AbandonRequest.prototype._toBer = function (ber) {
    assert.ok(ber)
  
    var i = this.abandonID
    var sz = 4
  
    while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000)) &&
           (sz > 1)) {
      sz--
      i <<= 8
    }
    assert.ok(sz <= 4)
  
    while (sz-- > 0) {
      ber.writeByte((i & 0xff000000) >> 24)
      i <<= 8
    }
  
    return ber
  }
  
  AbandonRequest.prototype._json = function (j) {
    assert.ok(j)
  
    j.abandonID = this.abandonID
  
    return j
  }
  
  /// --- Exports
  
  module.exports = AbandonRequest
  