Skip to content

Commit

Permalink
Separate packet payload out from *Packet classes in to *Payload class…
Browse files Browse the repository at this point in the history
…es. The Packet class is therefore no longer extended.
  • Loading branch information
pekim committed Oct 12, 2011
1 parent 404c8e6 commit a68820c
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 84 deletions.
20 changes: 15 additions & 5 deletions lib/connection.coffee
@@ -1,7 +1,7 @@
EventEmitter = require('events').EventEmitter
Packet = require('./packet').Packet
PreloginPacket = require('./packet-prelogin').PreloginPacket
packetFromBuffer = require('./packet-util').packetFromBuffer
TYPE = require('./packet').TYPE
PreloginPayload = require('./payload-prelogin').PreloginPayload
isPacketComplete = require('./packet').isPacketComplete
Socket = require('net').Socket

Expand Down Expand Up @@ -36,9 +36,14 @@ class Connection extends EventEmitter
@packetBuffer = new Buffer(@packetBuffer.concat(data))

if isPacketComplete(@packetBuffer)
packet = packetFromBuffer(@packetBuffer)
packet = new Packet(@packetBuffer)
@logPacket('Received', packet);

preloginPayload = new PreloginPayload(packet.data())
@debug((log) ->
log(preloginPayload.toString(' '))
)

@packetBuffer = new Buffer(0)

eventEnd: =>
Expand All @@ -61,10 +66,16 @@ class Connection extends EventEmitter
callback: callback

sendPreLoginPacket: ->
packet = new PreloginPacket()
#packet = new PreloginPacket()
preloginPayload = new PreloginPayload()
packet = new Packet(TYPE.PRELOGIN)
packet.addData(preloginPayload.data)
packet.last(true)

@sendPacket(packet)
@debug((log) ->
log(preloginPayload.toString(' '))
)
#@state = STATE.SENT_PRELOGIN

sendPacket: (packet) =>
Expand All @@ -79,7 +90,6 @@ class Connection extends EventEmitter
log('')
log(packet.dataToString(' '))
log('')
log(packet.payloadString(' '))
)

debug: (debugFunction) =>
Expand Down
17 changes: 0 additions & 17 deletions lib/packet-util.coffee

This file was deleted.

83 changes: 38 additions & 45 deletions lib/packet-prelogin.coffee → lib/payload-prelogin.coffee
@@ -1,8 +1,6 @@
assert = require('assert')
buildBuffer = require('./build-buffer')
Packet = require('./packet').Packet
sprintf = require('sprintf').sprintf
TYPE = require('./packet').TYPE

VERSION = 0x000000001
SUBBUILD = 0x0001
Expand Down Expand Up @@ -33,18 +31,16 @@ marsByValue = {}
for name, value of MARS
marsByValue[value] = name

class PreloginPacket extends Packet
class PreloginPayload
constructor: (buffer) ->
if buffer instanceof Buffer
super(buffer)
@data = buffer
else
super(TYPE.PRELOGIN)

@addOptions()
@createOptions()

@extractOptions()

addOptions: ->
createOptions: ->
options = [
@createVersionOption(),
@createEncryptionOption(),
Expand All @@ -58,21 +54,19 @@ class PreloginPacket extends Packet
length += 5 + option.data.length
length++ # terminator

data = new Buffer(length)
@data = new Buffer(length)
optionOffset = 0
optionDataOffset = 5 * options.length + 1
for option in options
data.writeUInt8(option.token, optionOffset + 0)
data.writeUInt16BE(optionDataOffset, optionOffset + 1)
data.writeUInt16BE(option.data.length, optionOffset + 3)
@data.writeUInt8(option.token, optionOffset + 0)
@data.writeUInt16BE(optionDataOffset, optionOffset + 1)
@data.writeUInt16BE(option.data.length, optionOffset + 3)
optionOffset += 5

option.data.copy(data, optionDataOffset)
option.data.copy(@data, optionDataOffset)
optionDataOffset += option.data.length

data.writeUInt8(TOKEN.TERMINATOR, optionOffset)

@addData(data)
@data.writeUInt8(TOKEN.TERMINATOR, optionOffset)

createVersionOption: () ->
token: TOKEN.VERSION,
Expand All @@ -95,51 +89,50 @@ class PreloginPacket extends Packet
data: buildBuffer('8', MARS.OFF)

extractOptions: ->
data = @data()

offset = 0;
while data[offset] != TOKEN.TERMINATOR
dataOffset = data.readUInt16BE(offset + 1)
dataLength = data.readUInt16BE(offset + 3)
while @data[offset] != TOKEN.TERMINATOR
dataOffset = @data.readUInt16BE(offset + 1)
dataLength = @data.readUInt16BE(offset + 3)

switch data[offset]
switch @data[offset]
when TOKEN.VERSION
@extractVersion(data, dataOffset)
@extractVersion(dataOffset)
when TOKEN.ENCRYPTION
@extractEncryption(data, dataOffset)
@extractEncryption(dataOffset)
when TOKEN.INSTOPT
@extractInstance(data, dataOffset)
@extractInstance(dataOffset)
when TOKEN.THREADID
@extractThreadId(data, dataOffset)
if (dataLength > 0)
@extractThreadId(dataOffset)
when TOKEN.MARS
@extractMars(data, dataOffset)
@extractMars(dataOffset)

offset += 5
dataOffset += dataLength

extractVersion: (data, offset) ->
extractVersion: (offset) ->
@version =
major: data.readUInt8(offset + 0),
minor: data.readUInt8(offset + 1),
patch: data.readUInt8(offset + 2),
trivial: data.readUInt8(offset + 3),
subbuild: data.readUInt16BE(offset + 4)

extractEncryption: (data, offset) ->
@encryption = data.readUInt8(offset)
major: @data.readUInt8(offset + 0),
minor: @data.readUInt8(offset + 1),
patch: @data.readUInt8(offset + 2),
trivial: @data.readUInt8(offset + 3),
subbuild: @data.readUInt16BE(offset + 4)

extractEncryption: (offset) ->
@encryption = @data.readUInt8(offset)
@encryptionString = encryptByValue[@encryption]

extractInstance: (data, offset) ->
@instance = data.readUInt8(offset)
extractInstance: (offset) ->
@instance = @data.readUInt8(offset)

extractThreadId: (data, offset) ->
@threadId = data.readUInt32BE(offset)
extractThreadId: (offset) ->
@threadId = @data.readUInt32BE(offset)

extractMars: (data, offset) ->
@mars = data.readUInt8(offset)
extractMars: (offset) ->
@mars = @data.readUInt8(offset)
@marsString = marsByValue[@mars]

payloadString: (indent) ->
toString: (indent) ->
indent ||= ''

indent + 'PreLogin - ' +
Expand All @@ -151,8 +144,8 @@ class PreloginPacket extends Packet
@version.subbuild,
@encryption, @encryptionString,
@instance,
@threadId,
if @threadId then @threadId else 0,
@mars, @marsString
)

exports.PreloginPacket = PreloginPacket
exports.PreloginPayload = PreloginPayload
17 changes: 0 additions & 17 deletions test/unit/packet-prelogin-test.coffee

This file was deleted.

28 changes: 28 additions & 0 deletions test/unit/payload-prelogin-test.coffee
@@ -0,0 +1,28 @@
PreloginPayload = require('../../lib/payload-prelogin').PreloginPayload

exports.createFromScratch = (test) ->
payload = new PreloginPayload()

assertPayload(test, payload)

test.done()

exports.createFromBuffer = (test) ->
payload = new PreloginPayload()
new PreloginPayload(payload.data)

assertPayload(test, payload)

test.done()

assertPayload = (test, payload) ->
test.strictEqual(payload.version.major, 0)
test.strictEqual(payload.version.minor, 0)
test.strictEqual(payload.version.patch, 0)
test.strictEqual(payload.version.trivial, 1)
test.strictEqual(payload.version.subbuild, 1)

test.strictEqual(payload.encryptionString, 'NOT_SUP')
test.strictEqual(payload.instance, 0)
test.strictEqual(payload.threadId, 0)
test.strictEqual(payload.marsString, 'OFF')

0 comments on commit a68820c

Please sign in to comment.