szymski

Untitled

Apr 10th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. module packethandler;
  2.  
  3. public import std.socket;
  4. import std.conv, std.stdio, util;
  5.  
  6. /**
  7. Receives a specific type.
  8. */
  9. T read(T)(Socket socket) if(!is(T : string)) {
  10. T[1] arr;
  11. socket.receive(arr);
  12. return arr[0];
  13. }
  14.  
  15. /**
  16. Receives a null-terminated string.
  17. */
  18. string read(T)(Socket socket) if(is(T : string)) {
  19. char[] arr;
  20.  
  21. while(true) {
  22. char c = socket.read!char;
  23.  
  24. if(c != 0)
  25. arr ~= c;
  26. else
  27. break;
  28. }
  29.  
  30. return arr.idup;
  31. }
  32.  
  33. /**
  34. Writes data.
  35. */
  36. void write(T)(Socket socket, T data) if(!is(T : string)) {
  37. auto arr = [data];
  38. socket.send(arr);
  39. }
  40.  
  41. /**
  42. Writes null-terminated string.
  43. */
  44. void write(Socket socket, string data) {
  45. socket.send(data);
  46. socket.send(['\0']);
  47. }
  48.  
  49. /**
  50. Class which handles incoming packets.
  51. */
  52. final class PacketHandler {
  53.  
  54. __gshared private static:
  55.  
  56. void delegate(Socket socket)[short] delegates;
  57.  
  58. __gshared public static:
  59.  
  60. void RegisterHandler(short id, void delegate(Socket socket) dg) {
  61. delegates[id] = dg;
  62. }
  63.  
  64. // TODO:
  65. void HandlePacket(short id, Socket socket) {
  66. if(auto ptr = id in delegates)
  67. (*ptr)(socket);
  68. else
  69. DebugPrint("No handler for packet id ", id);
  70. }
  71.  
  72. }
  73.  
  74. mixin template RegisterHandler(short id, void function(Socket socket) dg) {
  75. static this() {
  76. PacketHandler.RegisterHandler(id, (socket) => dg(socket));
  77. }
  78. }
  79.  
  80. mixin template RegisterHandler(short id, void delegate(Socket socket) dg) {
  81. static this() {
  82. PacketHandler.RegisterHandler(id, dg);
  83. }
  84. }
Add Comment
Please, Sign In to add comment