message.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "message.hpp"
  2. void
  3. Message::set_string(string s){
  4. size=s.size()+3;
  5. assert(size<=MAX_MSG_SIZE);
  6. buffer[0]=STRING;
  7. uint16_t u=s.size();
  8. memcpy(&buffer[1],(char*)&u,2);
  9. memcpy(&buffer[3],s.c_str(),s.size());
  10. }
  11. void
  12. Message::set_integer(Integer i){
  13. size=1+sizeof(Integer);
  14. buffer[0]=INTEGER;
  15. memcpy(&buffer[1],(char*)&i,sizeof(Integer));
  16. }
  17. void
  18. Message::set_data(const char* data_buffer,size_t data_size){
  19. size=1+sizeof(size_t)+data_size;
  20. buffer[0]=DATA;
  21. size_t offset=1;
  22. memcpy(&buffer[1],&data_size,sizeof(size_t));
  23. memcpy(&buffer[1+sizeof(size_t)],data_buffer,data_size);
  24. }
  25. bool
  26. Message::add(char l){
  27. if(csize==0){
  28. csize=1;
  29. buffer[0]=l;
  30. switch(l){
  31. case CODE:
  32. size=2;
  33. break;
  34. case INTEGER:
  35. size=1+sizeof(Integer);
  36. break;
  37. case STRING:
  38. case DATA:
  39. break;
  40. default:
  41. cerr<<"[Error] Message type unkown ("<<l<<')'<<endl;
  42. return false;
  43. break;
  44. }
  45. return true;
  46. }
  47. switch(buffer[0]){
  48. case CODE:
  49. return add_to_code(l);
  50. break;
  51. case STRING:
  52. return add_to_string(l);
  53. break;
  54. case INTEGER:
  55. return add_to_integer(l);
  56. break;
  57. case DATA:
  58. return add_to_data(l);
  59. break;
  60. default:
  61. cerr<<"[Error] Message type unkown"<<endl;
  62. return false;
  63. break;
  64. }
  65. return false;
  66. }
  67. bool
  68. Message::add_to_code(char l){
  69. csize=2;
  70. buffer[1]=l;
  71. return false;
  72. }
  73. bool
  74. Message::add_to_string(char l){
  75. if(csize==1){
  76. buffer[csize++]=l;
  77. return true;
  78. }
  79. if(csize==2){
  80. buffer[csize++]=l;
  81. uint16_t s;
  82. memcpy(&s,&buffer[1],2);
  83. size=s+3;
  84. return true;
  85. }
  86. buffer[csize++]=l;
  87. return csize<size;
  88. }
  89. bool
  90. Message::add_to_integer(char l){
  91. buffer[csize++]=l;
  92. return csize<size;
  93. }
  94. bool
  95. Message::add_to_data(char l){
  96. if(csize==1+sizeof(size_t)){
  97. size_t s;
  98. memcpy(&s,&buffer[1],sizeof(size_t));
  99. size=csize+s;
  100. }
  101. buffer[csize++]=l;
  102. return csize<max(2+sizeof(size_t),size);
  103. }
  104. size_t
  105. Message::get_data_size(){
  106. assert(buffer[0]==DATA);
  107. size_t data_size;
  108. memcpy(&data_size,&buffer[1],sizeof(size_t));
  109. return data_size;
  110. }
  111. char*
  112. Message::get_data_buffer(){
  113. assert(buffer[0]==DATA);
  114. return &buffer[1+sizeof(size_t)];
  115. }