Advertisement
dalvorsn

Untitled

Apr 26th, 2014
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.58 KB | None | 0 0
  1. NetworkMessage = {}
  2.  
  3.  
  4. function NetworkMessage.create(pdata)
  5.     -- NetworkMessage.create([pdata])
  6.     -- @params
  7.     --  'pdata': string
  8.     -- Instancia a classe NetworkMessage, se pdata é fornecido é definido o atributo data igual a pdata e size igual a #pdata
  9.     return setmetatable({ data = pdata or "", size = pdata and #pdata or 0, pos = 1}, { __index = NetworkMessage })
  10. end
  11.  
  12. function NetworkMessage:reset()
  13.     -- NetworkMessage.reset(self)
  14.     -- self:reset()
  15.     -- @params
  16.     --  'self': table
  17.     -- Reinicia os atributos do objeto
  18.     self.data = ""
  19.     self.size = 0
  20.     self.pos  = 1
  21. end
  22.  
  23. function NetworkMessage:setBuffer(buffer)
  24.     -- NetworkMessage.setBuffer(self, buffer)
  25.     -- self:setBuffer(buffer)
  26.     -- @params
  27.     --  'self': table
  28.     --  'buffer': string
  29.     -- Define 'buffer' como atributo data
  30.     if not type(buffer) == "string" then
  31.         return false
  32.     end
  33.  
  34.     self.data = buffer
  35.     self.size = #buffer
  36.     self.pos = 1
  37. end
  38.  
  39. function NetworkMessage:getBuffer()
  40.     -- NetworkMessage.getBuffer(self)
  41.     -- self:getBuffer()
  42.     -- @params
  43.     --  'self': table
  44.     -- Retorna o atributo 'data'
  45.     return self.data
  46. end
  47.  
  48. function NetworkMessage:getSize()
  49.     -- NetworkMessage.getSize(self)
  50.     -- self:getSize()
  51.     -- @params
  52.     --  'self': table
  53.     -- Retorna o atributo 'size'
  54.     return self.size
  55. end
  56.  
  57. function NetworkMessage:getRanges(byteCount, signed)
  58.     -- NetworkMessage.getRanges(self, byteCount, signed)
  59.     -- self:getRanges(byteCount, signed)
  60.     -- @params
  61.     --  'self': table
  62.     --  'byteCount': number
  63.     --  'signed': boolean
  64.     -- Função interna usada para calcular o limite do valor de 'byteCount' bytes, se signed é true reajusta seu valor para signed
  65.     local min, max = 0, ((256^byteCount) -1)
  66.     if(signed)then
  67.         max = math.floor(max/2)
  68.         min = -max-1
  69.     end
  70.     return -min, max
  71. end
  72.  
  73. function NetworkMessage:canRead(size)
  74.     -- NetworkMessage.canRead(self, size)
  75.     -- self:canRead(size)
  76.     -- @params
  77.     --  'self': table
  78.     --  'size': number
  79.     -- Verifica se pode ser lido o numero 'size' de bytes, retorna um booleano
  80.     return (self.pos + size) > (self.size + 1)
  81. end
  82.  
  83. function NetworkMessage:readBytes(byteCount, signed)
  84.     -- NetworkMessage.readBytes(self, byteCount, signed)
  85.     -- self:readBytes(byteCount, signed)
  86.     -- @params
  87.     --  'self': table
  88.     --  'byteCount': number
  89.     --  'signed': boolean
  90.     -- Tenta ler 'byteCount' numero de bytes, retorna o valor numerico dos bytes
  91.     -- se possivel a leitura, e false se não. Se signed é true reajusta valor para signed
  92.     if self:canRead(byteCount) then return false end
  93.  
  94.     local min, _ = self:getRanges(byteCount, signed)
  95.     local value = 0
  96.  
  97.     for byte = 1, byteCount do
  98.         value = value + ( self.data:byte(self.pos) * (256^(byte-1)) )
  99.         self.pos = self.pos + 1
  100.     end
  101.  
  102.     return value + min
  103. end
  104.  
  105. function NetworkMessage:addBytes(value, count, signed)
  106.     -- NetworkMessage.addBytes(self, value, count, signed)
  107.     -- self:addBytes(value, count, signed)
  108.     -- @params
  109.     --  'self': table
  110.     --  'value': number
  111.     --  'count':number
  112.     --  'signed':boolean
  113.     -- Tenta escrever 'value' em 'count' bytes, se 'value' for maior que o numero de bytes
  114.     -- suporta retorna false. Se signed é true reajusta valor para signed
  115.     if signed then
  116.         value = value * 2
  117.     end
  118.  
  119.     if value >= (256^count) then
  120.         return false
  121.     end
  122.  
  123.     for byte = count, 1, -1 do
  124.         local power = (256 ^ (byte-1))
  125.         self.data = self.data .. string.char( math.floor(value/power) )
  126.         value = value % power
  127.     end
  128.  
  129.     self.size = self.size + count
  130.     self.pos = self.pos + count
  131.     return true
  132. end
  133.  
  134. -- Metodos para pegar valores
  135. function NetworkMessage:getU8()
  136.     return self:readBytes(1, false)
  137. end
  138.  
  139. function NetworkMessage:getU16()
  140.     return self:readBytes(2, false)
  141. end
  142.  
  143. function NetworkMessage:getU32()
  144.     return self:readBytes(4, false)
  145. end
  146.  
  147. function NetworkMessage:getU64()
  148.     return self:readBytes(8, false)
  149. end
  150.  
  151. function NetworkMessage:getI8()
  152.     return self:readBytes(1, true)
  153. end
  154.  
  155. function NetworkMessage:getI16()
  156.     return self:readBytes(2, true)
  157. end
  158.  
  159. function NetworkMessage:getI32()
  160.     return self:readBytes(4, true)
  161. end
  162.  
  163. function NetworkMessage:getI64()
  164.     return self:readBytes(8, true)
  165. end
  166.  
  167. -- Metodos para adição de valores
  168. function NetworkMessage:addU8(value)
  169.     return self:addBytes(value, 1, false)
  170. end
  171.  
  172. function NetworkMessage:addU16(value)
  173.     return self:addBytes(value, 2, false)
  174. end
  175.  
  176. function NetworkMessage:addU32(value)
  177.     return self:addBytes(value, 4, false)
  178. end
  179.  
  180. function NetworkMessage:addU64(value)
  181.     return self:addBytes(value, 8, false)
  182. end
  183.  
  184. function NetworkMessage:addI8(value)
  185.     return self:addBytes(value, 1, true)
  186. end
  187.  
  188. function NetworkMessage:addI16(value)
  189.     return self:addBytes(value, 2, true)
  190. end
  191.  
  192. function NetworkMessage:addI32(value)
  193.     return self:addBytes(value, 4, true)
  194. end
  195.  
  196. function NetworkMessage:addI64(value)
  197.     return self:addBytes(value, 8, true)
  198. end
  199.  
  200. function NetworkMessage:addString(str)
  201.     -- NetworkMessage.addString(self, str)
  202.     -- self:addString(str)
  203.     -- @params
  204.     --  'self': table
  205.     --  'str': string
  206.     -- Tenta adicionar 'str', se o tamanho supera dois bytes, retorna false
  207.     if not self:addU16(#str) then
  208.         return false
  209.     end
  210.  
  211.     self.data = self.data .. str
  212.  
  213.     self.size = self.size + #str
  214.     self.pos = self.pos + #str
  215.     return true
  216. end
  217.  
  218. function NetworkMessage:getString()
  219.     -- NetworkMessage.getString(self)
  220.     -- self:getString()
  221.     -- @params
  222.     --  'self': table
  223.     -- Tenta ler a string e retorna-la em caso de sucesso, se falho retorna false
  224.     local size = self:getU16()
  225.     if not (size and self:canRead(size)) then return false end
  226.  
  227.     local str = ""
  228.     for byte=0, size-1 do
  229.         str = str .. string.char(self.data:byte(self.pos + byte))
  230.     end
  231.     self.pos = self.pos + size
  232.     return str
  233. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement