bluefire
Version:
Lightweight tcp framework
276 lines (196 loc) • 6.2 kB
text/coffeescript
module.exports = class Packet
constructor: (, ) ->
= [ ] # array to store parse objects
= { }
###
Adds key-value pairs into the packet structure specifiing their name and type
structure [Array] array of key-value pairs where key is name and value is type
[Packet] current packet
###
add: (structure) ->
for node in structure
for field, type of node
# try to add predefined value, if field already exists, we should continue
continue if
switch type
when "uint8" then field
when "int8" then field
when "uint16le" then field
when "uint32le" then field
when "int16le" then field
when "int32le" then field
when "floatle" then field
when "doublele" then field
when "stringle" then field
when /uint8 array [0-9]+:[0-9]+/ then field, field.split(' ')[2]
when /uint16le array [0-9]+:[0-9]+/ then field, field.split(' ')[2]
when /uint32le array [0-9]+:[0-9]+/ then field, field.split(' ')[2]
return @
isDefined: (name) =>
if ?
for parser in .packetParseData
return true if parser.name is name
for parser in
return true if parser.name is name
return false
addPredefinedValue: (field, value) =>
if
[field] = value # already defined (wants default value assign)
return true
else
return false
addUInt8: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readUInt8(index), index + 1 ]
write: (data) ->
addBuffer = new Buffer(1)
addBuffer.writeUInt8(data, 0)
return addBuffer
}
return @
addInt8: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readInt8(index), index + 1 ]
write: (data) ->
addBuffer = new Buffer(1)
addBuffer.writeInt8(data, index)
return addBuffer
}
return @
addUInt16LE: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readUInt16LE(index), index + 2 ]
write: (data) ->
addBuffer = new Buffer(2)
addBuffer.writeUInt16LE(data, 0)
return addBuffer
}
return @
addUInt32LE: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readUInt32LE(index), index + 4 ]
write: (data) ->
addBuffer = new Buffer(4)
addBuffer.writeUInt32LE(data, 0)
return addBuffer
}
return @
addInt16LE: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readInt16LE(index), index + 2 ]
write: (data) ->
addBuffer = new Buffer(2)
addBuffer.writeInt16LE(data, buffer.length)
return addBuffer
}
return @
addInt32LE: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readInt32LE(index), index + 4 ]
write: (data) ->
addBuffer = new Buffer(4)
addBuffer.writeInt32LE(data, 0)
return addBuffer
}
return @
addDoubleLE: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readDoubleLE(index), index + 8 ]
write: (data) ->
addBuffer = new Buffer(8)
addBuffer.writeDoubleLE(data, 0)
return addBuffer
}
return @
addFloatLE: (name) ->
.push {
name: name
read: (buffer, index) ->
return [ buffer.readFloatLE(index), index + 4 ]
write: (data) ->
addBuffer = new Buffer(4)
addBuffer.writeFloatLE(data, 0)
return addBuffer
}
return @
# change return type on above method (write)
addStringLE: (name) ->
.push {
name: name
read: (buffer, index) ->
data = ""
i = 0
loop
char = buffer.readUInt8(index+i)
break if char is 0
data += String.fromCharCode(char)
i++
return [ data, index + i + 1];
write: (data) ->
buffer = new Buffer(data.length + 1)
#for i in [0..data.length-1]
# buffer.writeUInt8(data.charCodeAt(i), i) # copy each character to the uint8 array
buffer.write(data, "ascii")
buffer.writeUInt8(0, buffer.length-1) # terminate by zero
return buffer
}
return @
addUInt8Array: (name, count) ->
.push {
name: name
read: (buffer, index) ->
data = []
for i in [0..count-1]
data.push(buffer.readUInt8(index + i))
return [ data, index + count ]
write: (data) ->
addBuffer = new Buffer(count)
for i in [0..count-1]
addBuffer.writeUInt8(data[i], i)
return addBuffer
}
return @
addUInt16LEArray: (name, count) ->
.push {
name: name
read: (buffer, index) ->
data = []
for i in [0..count-1]
data.push(buffer.readUInt16LE(index + i))
return [ data, index + count ]
write: (data) ->
addBuffer = new Buffer(count)
for i in [0..count-1]
addBuffer.writeUInt16LE(data[i], i)
return addBuffer
}
return @
addUInt32LEArray: (name, count) ->
.push {
name: name
read: (buffer, index) ->
data = []
for i in [0..count-1]
data.push(buffer.readUInt32LE(index + i))
return [ data, index + count ]
write: (data) ->
addBuffer = new Buffer(count)
for i in [0..count-1]
addBuffer.writeUInt32LE(data[i], i)
return addBuffer
}
return @