Advertisement
Guest User

Untitled

a guest
Aug 24th, 2018
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.21 KB | None | 0 0
  1. ; This file is part of tornado.
  2. ;
  3. ; tornado is free software: you can redistribute it And/Or modify
  4. ; it under the terms of the GNU General Public License As published by
  5. ; the Free Software Foundation, either version 3 of the License, Or
  6. ; any later version.
  7. ;
  8. ; tornado is distributed in the hope that it will be useful,
  9. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. ; MERCHANTABILITY Or FITNESS For A PARTICULAR PURPOSE. See the
  11. ; GNU General Public License For more details.
  12. ;
  13. ; You should have received a copy of the GNU General Public License
  14. ; along With tornado. If Not, see <http://www.gnu.org/licenses/>. 2
  15. ;
  16.  
  17. XIncludeFile "PacketManager.pbi"
  18.  
  19. ; /////////////////////////////////////////////////////////////////////////////
  20. ;
  21. ; /////////////////////////////////////////////////////////////////////////////
  22. Global PacketNumber.u = 0
  23.  
  24.  
  25. ; /////////////////////////////////////////////////////////////////////////////
  26. ;
  27. ; /////////////////////////////////////////////////////////////////////////////
  28. Procedure.i createPacket(type.a = #PACKET_CUSTOM)
  29. *p.sPacket = new(sPacket)
  30. If *p
  31. *p\mData = AllocateMemory(#PACKET_LIMIT)
  32. *p\mIsValid = #True
  33. PokeA(*p\mData,type)
  34. PokeU(*p\mData+1,PacketNumber)
  35. PacketNumber + 2
  36. PacketNumber % 65535
  37. *p\mOffset = 2
  38. ProcedureReturn *p
  39. EndIf
  40. ProcedureReturn #Null
  41. EndProcedure
  42.  
  43. ; /////////////////////////////////////////////////////////////////////////////
  44. ;
  45. ; /////////////////////////////////////////////////////////////////////////////
  46. ProcedureDLL.i createPacket2()
  47. *p.sPacket = new(sPacket)
  48. If *p
  49. *p\mData = AllocateMemory(#PACKET_LIMIT)
  50. *p\mIsValid = #True
  51. value.a = #PACKET_CUSTOM
  52. PokeA(*p\mData,value)
  53. PokeU(*p\mData+1,PacketNumber)
  54. PacketNumber + 2
  55. PacketNumber % 65535
  56. *p\mOffset = 2
  57. ProcedureReturn *p
  58. EndIf
  59. ProcedureReturn #Null
  60. EndProcedure
  61.  
  62. ; /////////////////////////////////////////////////////////////////////////////
  63. ;
  64. ; /////////////////////////////////////////////////////////////////////////////
  65. ProcedureDLL freePacket(*p.sPacket)
  66. FreeMemory(*p\mData)
  67. FreeMemory(*p)
  68. EndProcedure
  69.  
  70.  
  71. ; /////////////////////////////////////////////////////////////////////////////
  72. ;
  73. ; /////////////////////////////////////////////////////////////////////////////
  74. ProcedureDLL.i getPacketFromData(*memory)
  75. *p.sPacket = new(sPacket)
  76. If *p
  77. If (PeekA(*memory) = #PACKET_SYSTEM) Or (PeekA(*memory) = #PACKET_CUSTOM)
  78. *p\mData = AllocateMemory(#PACKET_LIMIT)
  79. CopyMemory(*memory,*p\mData,#PACKET_LIMIT)
  80. *p\mOffset = 2
  81. ProcedureReturn *p
  82. Else
  83. ProcedureReturn #Null
  84. EndIf
  85. EndIf
  86. ProcedureReturn #Null
  87. EndProcedure
  88.  
  89. ; /////////////////////////////////////////////////////////////////////////////
  90. ;
  91. ; /////////////////////////////////////////////////////////////////////////////
  92. ProcedureDLL.u getPacketNumber(*p.sPacket)
  93. If *p
  94. ProcedureReturn PeekW(*p\mData+1)
  95. EndIf
  96. ProcedureReturn #False
  97. EndProcedure
  98.  
  99. ; /////////////////////////////////////////////////////////////////////////////
  100. ;
  101. ; /////////////////////////////////////////////////////////////////////////////
  102. Procedure.l getPacketSize(*p.sPacket)
  103. If *p
  104. ProcedureReturn *p\mOffset
  105. EndIf
  106. EndProcedure
  107.  
  108. ; /////////////////////////////////////////////////////////////////////////////
  109. ;
  110. ; /////////////////////////////////////////////////////////////////////////////
  111. ; ProcedureDLL.l getPacketNumber(*p.sPacket)
  112. ; If *p
  113. ; ProcedureReturn PeekA(*p\mData+1)
  114. ; EndIf
  115. ; EndProcedure
  116.  
  117. ; /////////////////////////////////////////////////////////////////////////////
  118. ;
  119. ; /////////////////////////////////////////////////////////////////////////////
  120. Procedure.a getPacketType(*p.sPacket)
  121. If *p
  122. ProcedureReturn PeekA(*p\mData)
  123. EndIf
  124. EndProcedure
  125.  
  126. ; /////////////////////////////////////////////////////////////////////////////
  127. ;
  128. ; /////////////////////////////////////////////////////////////////////////////
  129. ProcedureDLL pushPacket(*p.sPacket, *data, type.a, size.l = 0)
  130. stringFormat.l = #PB_Ascii
  131. If *p
  132. Select type
  133. Case #TYPE_ASCII
  134. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  135. PokeA(*p\mData + *p\mOffset, PeekA(*data)) : *p\mOffset + 1
  136.  
  137. Case #TYPE_BYTE
  138. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  139. PokeB(*p\mData + *p\mOffset, PeekB(*data)) : *p\mOffset + 1
  140.  
  141. Case #TYPE_CHAR
  142. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  143.  
  144. CompilerIf #PB_Compiler_Unicode = 1
  145. PokeC(*p\mData + *p\mOffset, PeekC(*data)) : *p\mOffset + 2
  146. CompilerElse
  147. PokeC(*p\mData + *p\mOffset, PeekC(*data)) : *p\mOffset + 1
  148. CompilerEndIf
  149.  
  150. Case #TYPE_WORD
  151. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  152. PokeW(*p\mData + *p\mOffset, PeekW(*data)) : *p\mOffset + 2
  153.  
  154. Case #TYPE_UNICODE
  155. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  156. PokeU(*p\mData + *p\mOffset, PeekU(*data)) : *p\mOffset + 2
  157.  
  158. Case #TYPE_INTEGER
  159. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  160.  
  161. CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  162. PokeI(*p\mData + *p\mOffset, PeekI(*data)) : *p\mOffset + 4
  163. CompilerEndIf
  164.  
  165. CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
  166. PokeI(*p\mData + *p\mOffset, PeekI(*data)) : *p\mOffset + 8
  167. CompilerEndIf
  168.  
  169. Case #TYPE_FLOAT
  170. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  171. PokeF(*p\mData + *p\mOffset, PeekF(*data)) : *p\mOffset + 4
  172.  
  173. Case #TYPE_DOUBLE
  174. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  175. PokeD(*p\mData + *p\mOffset, PeekD(*data)) : *p\mOffset + 8
  176.  
  177. Case #TYPE_QUAD
  178. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  179. PokeQ(*p\mData + *p\mOffset, PeekQ(*data)) : *p\mOffset + 8
  180.  
  181. Case #TYPE_LONG
  182. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  183. PokeL(*p\mData + *p\mOffset, PeekL(*data)) : *p\mOffset + 4
  184.  
  185. Case #TYPE_STRING ; Check for last character ( bug ? )
  186. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  187. If *data
  188. PokeL(*p\mData + *p\mOffset, Len(PeekS(*data))) : *p\mOffset + 4 ; IAM
  189. PokeS(*p\mData + *p\mOffset, PeekS(*data,Len(PeekS(*data)),stringFormat),Len(PeekS(*data)),stringFormat) : *p\mOffset + Len(PeekS(*data))
  190. Else
  191. PokeL(*p\mData + *p\mOffset, 0) : *p\mOffset + 4
  192. PokeS(*p\mData + *p\mOffset, "",stringFormat) : *p\mOffset + 0
  193. EndIf
  194. Case #TYPE_STRUCT
  195. PokeA(*p\mData + *p\mOffset, type) : *p\mOffset + 1
  196. PokeL(*p\mData + *p\mOffset, size) : *p\mOffset + 4
  197. CopyMemory(*data,*p\mData+ *p\mOffset, size) : *p\mOffset + size
  198.  
  199.  
  200. EndSelect
  201.  
  202. If *p\mOffset < #PACKET_LIMIT
  203. *p\mIsValid = #True
  204. ProcedureReturn #False
  205. Else
  206. *p\mIsValid = #False
  207. ProcedureReturn #True
  208. EndIf
  209. Else
  210. ProcedureReturn #False
  211. EndIf
  212. EndProcedure
  213.  
  214. ; /////////////////////////////////////////////////////////////////////////////
  215. ;
  216. ; /////////////////////////////////////////////////////////////////////////////
  217. ProcedureDLL popPacket(*p.sPacket, *data)
  218. stringFormat.l = #PB_Ascii
  219. If *p
  220.  
  221. type.a = PeekA(*p\mData + *p\mOffset) : *p\mOffset + 1
  222.  
  223. Select type
  224. Case #TYPE_ASCII
  225. PokeA(*data, PeekA(*p\mData + *p\mOffset)) : *p\mOffset + 1
  226. Case #TYPE_BYTE
  227. PokeB(*data, PeekB(*p\mData + *p\mOffset)) : *p\mOffset + 1
  228. Case #TYPE_CHAR
  229. CompilerIf #PB_Compiler_Unicode = 1
  230. PokeC(*data, PeekC(*p\mData + *p\mOffset)) : *p\mOffset + 2
  231. CompilerElse
  232. PokeC(*data, PeekC(*p\mData + *p\mOffset)) : *p\mOffset + 1
  233. CompilerEndIf
  234. Case #TYPE_WORD
  235. PokeW(*data, PeekW(*p\mData + *p\mOffset)) : *p\mOffset + 2
  236. Case #TYPE_UNICODE
  237. PokeU(*data, PeekU(*p\mData + *p\mOffset)) : *p\mOffset + 2
  238. Case #TYPE_INTEGER
  239. CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  240. PokeI(*data, PeekI(*p\mData + *p\mOffset)) : *p\mOffset + 4
  241. CompilerEndIf
  242.  
  243. CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
  244. PokeI(*data, PeekI(*p\mData + *p\mOffset)) : *p\mOffset + 8
  245. CompilerEndIf
  246. Case #TYPE_FLOAT
  247. PokeF(*data, PeekF(*p\mData + *p\mOffset)) : *p\mOffset + 4
  248. Case #TYPE_DOUBLE
  249. PokeD(*data, PeekD(*p\mData + *p\mOffset)) : *p\mOffset + 8
  250. Case #TYPE_QUAD
  251. PokeQ(*data, PeekQ(*p\mData + *p\mOffset)) : *p\mOffset + 8
  252. Case #TYPE_LONG
  253. PokeL(*data, PeekL(*p\mData + *p\mOffset)) : *p\mOffset + 4
  254. Case #TYPE_STRING
  255. size.l = PeekL(*p\mData + *p\mOffset) : *p\mOffset + 4
  256. PokeS(*data,PeekS(*p\mData + *p\mOffset,size,stringFormat),size,stringFormat) : *p\mOffset + size
  257. Case #TYPE_STRUCT
  258. size.l = PeekL(*p\mData + *p\mOffset) : *p\mOffset + 4
  259. CopyMemory(*p\mData + *p\mOffset, *data, size) : *p\mOffset + size
  260.  
  261. EndSelect
  262. EndIf
  263. EndProcedure
  264.  
  265. ; /////////////////////////////////////////////////////////////////////////////
  266. ;
  267. ; /////////////////////////////////////////////////////////////////////////////
  268. Procedure.i receivePacket(connectionID.i)
  269.  
  270. *buffer = AllocateMemory(#PACKET_LIMIT)
  271. ReceiveNetworkData(connectionID,*buffer,#PACKET_LIMIT)
  272. *packet.sPacket = getPacketFromData(*buffer)
  273.  
  274. If *packet <> #Null
  275. FreeMemory(*buffer)
  276. ProcedureReturn *packet
  277. Else
  278. FreeMemory(*buffer)
  279. ProcedureReturn #Null
  280. EndIf
  281.  
  282.  
  283. EndProcedure
  284.  
  285. ; /////////////////////////////////////////////////////////////////////////////
  286. ;
  287. ; /////////////////////////////////////////////////////////////////////////////
  288. ProcedureDLL.b serverPacketQueued(*s.sTornadoServer)
  289. If *s
  290. If ListSize(*s\mCustomPacketReceived()) > 0
  291. ProcedureReturn #True
  292. Else
  293. ProcedureReturn #False
  294. EndIf
  295. EndIf
  296. ProcedureReturn #False
  297. EndProcedure
  298.  
  299. ; /////////////////////////////////////////////////////////////////////////////
  300. ;
  301. ; /////////////////////////////////////////////////////////////////////////////
  302. ProcedureDLL.i serverGetReceivedPacket(*s.sTornadoServer)
  303. If *s
  304. FirstElement(*s\mCustomPacketReceived())
  305. *packet.sPacket = getPacketFromData( *s\mCustomPacketReceived()\mData )
  306. FreeMemory(*s\mCustomPacketReceived()\mData)
  307. DeleteElement(*s\mCustomPacketReceived())
  308. ProcedureReturn *packet
  309. EndIf
  310. EndProcedure
  311.  
  312. ; /////////////////////////////////////////////////////////////////////////////
  313. ;
  314. ; /////////////////////////////////////////////////////////////////////////////
  315. ProcedureDLL.b clientPacketQueued(*c.sTornadoClient)
  316. If *c
  317. If ListSize(*c\mCustomPacketReceived()) > 0
  318. ProcedureReturn #True
  319. Else
  320. ProcedureReturn #False
  321. EndIf
  322. EndIf
  323. ProcedureReturn #False
  324. EndProcedure
  325.  
  326. ; /////////////////////////////////////////////////////////////////////////////
  327. ;
  328. ; /////////////////////////////////////////////////////////////////////////////
  329. ProcedureDLL.i clientGetReceivedPacket(*c.sTornadoClient)
  330. If *c
  331. FirstElement(*c\mCustomPacketReceived())
  332. *packet.sPacket = getPacketFromData( *c\mCustomPacketReceived()\mData )
  333. FreeMemory(*c\mCustomPacketReceived()\mData)
  334. DeleteElement(*c\mCustomPacketReceived())
  335. ProcedureReturn *packet
  336. EndIf
  337. EndProcedure
  338.  
  339. ; /////////////////////////////////////////////////////////////////////////////
  340. ;
  341. ; /////////////////////////////////////////////////////////////////////////////
  342. ProcedureDLL.l getPacketFromSlot(*p.sPacket)
  343. If *p
  344. ProcedureReturn PeekL(*p\mData + #PACKET_LIMIT - 4)
  345. EndIf
  346. EndProcedure
  347.  
  348.  
  349. ; /////////////////////////////////////////////////////////////////////////////
  350. ;
  351. ; /////////////////////////////////////////////////////////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement