BitMessage.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. #include <cassert>
  2. #include <cstring>
  3. #include "BitMessage.h"
  4. namespace crown
  5. {
  6. namespace network
  7. {
  8. BitMessage::BitMessage(Allocator& allocator) :
  9. m_allocator(&allocator),
  10. m_header(NULL),
  11. m_data(NULL),
  12. m_write(NULL),
  13. m_read(NULL),
  14. m_max_size(0),
  15. m_cur_size(0),
  16. m_read_count(0),
  17. m_write_bit(0),
  18. m_read_bit(0),
  19. m_overflowed(false)
  20. {
  21. }
  22. //---------------------------------------------------------------------------------------------
  23. BitMessage::~BitMessage()
  24. {
  25. if (m_data)
  26. {
  27. m_allocator->deallocate((void*)m_data);
  28. }
  29. }
  30. //---------------------------------------------------------------------------------------------
  31. uint8_t* BitMessage::get_byte_space(int32_t len)
  32. {
  33. uint8_t *ptr;
  34. if (!m_write)
  35. {
  36. printf("cannot write to message");
  37. }
  38. // round up to the next byte
  39. write_byte_align();
  40. // check for overflow
  41. check_overflow(len << 3);
  42. // allocate space
  43. ptr = m_write + m_cur_size;
  44. m_cur_size += len;
  45. return ptr;
  46. }
  47. //---------------------------------------------------------------------------------------------
  48. bool BitMessage::check_overflow(int32_t num_bits)
  49. {
  50. assert( num_bits >= 0 );
  51. if (num_bits > get_remaining_write_bits())
  52. {
  53. if (num_bits > (m_max_size << 3))
  54. {
  55. printf(" %i bits is > full message size", num_bits );
  56. }
  57. printf("overflow\n");
  58. begin_writing();
  59. m_overflowed = true;
  60. return true;
  61. }
  62. return false;
  63. }
  64. //---------------------------------------------------------------------------------------------
  65. void BitMessage::init(int32_t len)
  66. {
  67. m_data = (uint8_t*)m_allocator->allocate(len);
  68. m_write = m_data;
  69. m_read = m_data;
  70. m_max_size = len;
  71. }
  72. //---------------------------------------------------------------------------------------------
  73. uint8_t* BitMessage::get_data()
  74. {
  75. return m_write;
  76. }
  77. //---------------------------------------------------------------------------------------------
  78. const uint8_t* BitMessage::get_data() const
  79. {
  80. return m_read;
  81. }
  82. //---------------------------------------------------------------------------------------------
  83. size_t BitMessage::get_max_size() const
  84. {
  85. return m_max_size;
  86. }
  87. //---------------------------------------------------------------------------------------------
  88. bool BitMessage::is_overflowed()
  89. {
  90. return m_overflowed;
  91. }
  92. //---------------------------------------------------------------------------------------------
  93. size_t BitMessage::get_size() const
  94. {
  95. return m_cur_size;
  96. }
  97. //---------------------------------------------------------------------------------------------
  98. void BitMessage::set_size(size_t size)
  99. {
  100. if (size > m_max_size)
  101. {
  102. m_cur_size = m_max_size;
  103. }
  104. else
  105. {
  106. m_cur_size = size;
  107. }
  108. }
  109. //---------------------------------------------------------------------------------------------
  110. int32_t BitMessage::get_write_bit() const
  111. {
  112. return m_write_bit;
  113. }
  114. //---------------------------------------------------------------------------------------------
  115. void BitMessage::set_write_bit(int32_t bit)
  116. {
  117. m_write_bit = bit & 7;
  118. if (m_write_bit)
  119. {
  120. m_write[m_cur_size-1] &= (1 << m_write_bit) - 1;
  121. }
  122. }
  123. //---------------------------------------------------------------------------------------------
  124. int32_t BitMessage::get_num_bits_written() const
  125. {
  126. return ((m_cur_size << 3) - ((8 - m_write_bit) & 7));
  127. }
  128. //---------------------------------------------------------------------------------------------
  129. int32_t BitMessage::get_remaining_write_bits() const
  130. {
  131. return (m_max_size << 3) - get_num_bits_written();
  132. }
  133. //---------------------------------------------------------------------------------------------
  134. void BitMessage::save_write_state(int32_t& s,int32_t& b) const
  135. {
  136. s = m_cur_size;
  137. b = m_write_bit;
  138. }
  139. //---------------------------------------------------------------------------------------------
  140. void BitMessage::restore_write_state(int32_t s,int32_t b)
  141. {
  142. m_cur_size = s;
  143. m_write_bit = b & 7;
  144. if (m_write_bit)
  145. {
  146. m_write[m_cur_size-1] &= (1 << m_write_bit) - 1;
  147. }
  148. }
  149. //---------------------------------------------------------------------------------------------
  150. int32_t BitMessage::get_read_count() const
  151. {
  152. return m_read_count;
  153. }
  154. //---------------------------------------------------------------------------------------------
  155. void BitMessage::set_read_count(int32_t bytes)
  156. {
  157. m_read_count = bytes;
  158. }
  159. //---------------------------------------------------------------------------------------------
  160. int32_t BitMessage::get_read_bit() const
  161. {
  162. return m_read_bit;
  163. }
  164. //---------------------------------------------------------------------------------------------
  165. void BitMessage::set_read_bit(int32_t bit)
  166. {
  167. m_read_bit = bit & 7;
  168. }
  169. //---------------------------------------------------------------------------------------------
  170. int32_t BitMessage::get_num_bits_read() const
  171. {
  172. return ((m_read_count << 3) - ((8 - m_read_bit) & 7));
  173. }
  174. //---------------------------------------------------------------------------------------------
  175. int32_t BitMessage::get_remaining_read_bits() const
  176. {
  177. return (m_cur_size << 3) - get_num_bits_read();
  178. }
  179. //---------------------------------------------------------------------------------------------
  180. void BitMessage::save_read_state(int32_t& c, int32_t& b) const
  181. {
  182. c = m_read_count;
  183. b = m_read_bit;
  184. }
  185. //---------------------------------------------------------------------------------------------
  186. void BitMessage::restore_read_state(int32_t c, int32_t b)
  187. {
  188. m_read_count = c;
  189. m_read_bit = b & 7;
  190. }
  191. //---------------------------------------------------------------------------------------------
  192. void BitMessage::begin_writing()
  193. {
  194. m_cur_size = 0;
  195. m_write_bit = 0;
  196. m_overflowed = false;
  197. }
  198. //---------------------------------------------------------------------------------------------
  199. int32_t BitMessage::get_remaining_space() const
  200. {
  201. return m_max_size - m_cur_size;
  202. }
  203. //---------------------------------------------------------------------------------------------
  204. void BitMessage::write_byte_align()
  205. {
  206. m_write_bit = 0;
  207. }
  208. //---------------------------------------------------------------------------------------------
  209. void BitMessage::write_bits(int32_t value, int32_t num_bits)
  210. {
  211. int32_t put;
  212. int32_t fraction;
  213. // check if m_write is void
  214. if (!m_write)
  215. {
  216. printf( "cannot write to message" );
  217. }
  218. // check if the number of bits is valid
  219. if (num_bits == 0 || num_bits < -31 || num_bits > 32)
  220. {
  221. printf( "bad numBits %i", num_bits);
  222. }
  223. // check for value overflows
  224. // this should be an error really, as it can go unnoticed and cause either bandwidth or corrupted data transmitted
  225. if (num_bits != 32)
  226. {
  227. if (num_bits > 0)
  228. {
  229. if (value > (1 << num_bits) - 1)
  230. {
  231. printf( "value overflow %d %d", value, num_bits );
  232. }
  233. else if (value < 0)
  234. {
  235. printf( "value overflow %d %d", value, num_bits );
  236. }
  237. }
  238. else
  239. {
  240. int32_t r = 1 << (-1 - num_bits);
  241. if (value > r - 1)
  242. {
  243. printf( "value overflow %d %d", value, num_bits );
  244. }
  245. else if (value < -r)
  246. {
  247. printf( "value overflow %d %d", value, num_bits );
  248. }
  249. }
  250. }
  251. // Change sign if it is negative
  252. if (num_bits < 0 )
  253. {
  254. num_bits = -num_bits;
  255. }
  256. // check for msg overflow
  257. if (check_overflow(num_bits))
  258. {
  259. return;
  260. }
  261. // write the bits
  262. while(num_bits)
  263. {
  264. if (m_write_bit == 0)
  265. {
  266. m_write[m_cur_size] = 0;
  267. m_cur_size++;
  268. }
  269. put = 8 - m_write_bit;
  270. if (put > num_bits)
  271. {
  272. put = num_bits;
  273. }
  274. fraction = value & ((1 << put) - 1);
  275. m_write[m_cur_size - 1] |= fraction << m_write_bit;
  276. num_bits -= put;
  277. value >>= put;
  278. m_write_bit = (m_write_bit + put) & 7;
  279. }
  280. }
  281. //---------------------------------------------------------------------------------------------
  282. void BitMessage::write_int8(int32_t c)
  283. {
  284. write_bits(c, -8);
  285. }
  286. //---------------------------------------------------------------------------------------------
  287. void BitMessage::write_uint8(int32_t c)
  288. {
  289. write_bits(c, 8);
  290. }
  291. //---------------------------------------------------------------------------------------------
  292. void BitMessage::write_int16(int32_t c)
  293. {
  294. write_bits(c, -16);
  295. }
  296. //---------------------------------------------------------------------------------------------
  297. void BitMessage::write_uint16(int32_t c)
  298. {
  299. write_bits(c, 16);
  300. }
  301. //---------------------------------------------------------------------------------------------
  302. void BitMessage::write_int32(int32_t c)
  303. {
  304. write_bits(c, 32);
  305. }
  306. //---------------------------------------------------------------------------------------------
  307. void BitMessage::write_real(real f)
  308. {
  309. write_bits(*reinterpret_cast<int32_t *>(&f), 32);
  310. }
  311. //---------------------------------------------------------------------------------------------
  312. void BitMessage::write_vec3(const Vec3& v)
  313. {
  314. write_real(v.x);
  315. write_real(v.y);
  316. write_real(v.z);
  317. }
  318. //---------------------------------------------------------------------------------------------
  319. void BitMessage::write_string(const char* s, int32_t max_len, bool make_7_bit)
  320. {
  321. if (!s)
  322. {
  323. write_data("", 1);
  324. }
  325. else
  326. {
  327. int32_t i;
  328. int32_t l;
  329. uint8_t* data_ptr;
  330. const uint8_t* byte_ptr;
  331. // calculates length
  332. for (l = 0; s[l]; l++) {}
  333. if (max_len >= 0 && l >= max_len)
  334. {
  335. l = max_len - 1;
  336. }
  337. data_ptr = get_byte_space(l + 1);
  338. byte_ptr = reinterpret_cast<const uint8_t*>(s);
  339. if (make_7_bit)
  340. {
  341. for (i = 0; i < l; i++)
  342. {
  343. if ( byte_ptr[i] > 127 )
  344. {
  345. data_ptr[i] = '.';
  346. }
  347. else
  348. {
  349. data_ptr[i] = byte_ptr[i];
  350. }
  351. }
  352. }
  353. else
  354. {
  355. for (i = 0; i < l; i++)
  356. {
  357. data_ptr[i] = byte_ptr[i];
  358. }
  359. }
  360. data_ptr[i] = '\0';
  361. }
  362. }
  363. //---------------------------------------------------------------------------------------------
  364. void BitMessage::write_data(const void* data, int32_t length)
  365. {
  366. memcpy(get_byte_space(length), data, length);
  367. }
  368. //---------------------------------------------------------------------------------------------
  369. void BitMessage::write_netaddr(const os::NetAddress addr)
  370. {
  371. uint8_t* ptr;
  372. ptr = get_byte_space(4);
  373. memcpy(ptr, addr.address, 4);
  374. write_uint16(addr.port);
  375. }
  376. //---------------------------------------------------------------------------------------------
  377. void BitMessage::begin_reading() const
  378. {
  379. m_read_count = 0;
  380. m_read_bit = 0;
  381. }
  382. //---------------------------------------------------------------------------------------------
  383. int32_t BitMessage::get_remaing_data() const
  384. {
  385. m_cur_size - m_read_count;
  386. }
  387. //---------------------------------------------------------------------------------------------
  388. void BitMessage::read_byte_align() const
  389. {
  390. m_read_bit = 0;
  391. }
  392. //---------------------------------------------------------------------------------------------
  393. int32_t BitMessage::read_bits(int32_t num_bits) const
  394. {
  395. int32_t value;
  396. int32_t value_bits;
  397. int32_t get;
  398. int32_t fraction;
  399. bool sgn;
  400. if (!m_read)
  401. {
  402. printf("cannot read from message");
  403. }
  404. // check if the number of bits is valid
  405. if ( num_bits == 0 || num_bits < -31 || num_bits > 32 )
  406. {
  407. printf("bad number of bits %i", num_bits );
  408. }
  409. value = 0;
  410. value_bits = 0;
  411. // change sign if it is negative
  412. if (num_bits < 0)
  413. {
  414. num_bits = -num_bits;
  415. sgn = true;
  416. }
  417. else
  418. {
  419. sgn = false;
  420. }
  421. // check for overflow
  422. if (num_bits > get_remaining_read_bits())
  423. {
  424. return -1;
  425. }
  426. while (value_bits < num_bits)
  427. {
  428. if (m_read_bit == 0)
  429. {
  430. m_read_count++;
  431. }
  432. get = 8 - m_read_bit;
  433. if (get > (num_bits - value_bits))
  434. {
  435. get = num_bits - value_bits;
  436. }
  437. fraction = m_read[m_read_count - 1];
  438. fraction >>= m_read_bit;
  439. fraction &= (1 << get) - 1;
  440. value |= fraction << value_bits;
  441. value_bits += get;
  442. m_read_bit = (m_read_bit + get) & 7;
  443. }
  444. if (sgn)
  445. {
  446. if (value & (1 << (num_bits - 1)))
  447. {
  448. value |= -1 ^ (( 1 << num_bits) - 1);
  449. }
  450. }
  451. return value;
  452. }
  453. //---------------------------------------------------------------------------------------------
  454. int32_t BitMessage::read_int8() const
  455. {
  456. return (int32_t)read_bits(-8);
  457. }
  458. //---------------------------------------------------------------------------------------------
  459. int32_t BitMessage::read_uint8() const
  460. {
  461. return (int32_t)read_bits(8);
  462. }
  463. //---------------------------------------------------------------------------------------------
  464. int32_t BitMessage::read_int16() const
  465. {
  466. return (int32_t)read_bits(-16);
  467. }
  468. //---------------------------------------------------------------------------------------------
  469. int32_t BitMessage::read_uint16() const
  470. {
  471. return (int32_t)read_bits(16);
  472. }
  473. //---------------------------------------------------------------------------------------------
  474. int32_t BitMessage::read_int32() const
  475. {
  476. return (int32_t)read_bits(32);
  477. }
  478. //---------------------------------------------------------------------------------------------
  479. real BitMessage::read_real() const
  480. {
  481. float value;
  482. *reinterpret_cast<int*>(&value) = read_bits(32);
  483. return value;
  484. }
  485. //---------------------------------------------------------------------------------------------
  486. Vec3 BitMessage::read_vec3() const
  487. {
  488. Vec3 v;
  489. v.x = read_real();
  490. v.y = read_real();
  491. v.z = read_real();
  492. return v;
  493. }
  494. //---------------------------------------------------------------------------------------------
  495. int32_t BitMessage::read_string(char* buffer, int32_t buffer_size) const
  496. {
  497. int l = 0;
  498. int c;
  499. read_byte_align();
  500. while(1)
  501. {
  502. c = read_uint8();
  503. if (c <= 0 || c >= 255)
  504. {
  505. break;
  506. }
  507. // translate all fmt spec to avoid crash bugs in string routines
  508. if ( c == '%' )
  509. {
  510. c = '.';
  511. }
  512. // we will read past any excessively long string, so
  513. // the following data can be read, but the string will
  514. // be truncated
  515. if (l < buffer_size - 1)
  516. {
  517. buffer[l] = c;
  518. l++;
  519. }
  520. }
  521. buffer[l] = 0;
  522. return l;
  523. }
  524. //---------------------------------------------------------------------------------------------
  525. int32_t BitMessage::read_data(void* data, int32_t length) const
  526. {
  527. int count;
  528. read_byte_align();
  529. count = m_read_count;
  530. if (m_read_count + length > m_cur_size)
  531. {
  532. if (data)
  533. {
  534. memcpy(data, m_read + m_read_count, get_remaing_data());
  535. }
  536. m_read_count = m_cur_size;
  537. }
  538. else
  539. {
  540. if (data)
  541. {
  542. memcpy(data, m_read + m_read_count, length);
  543. }
  544. m_read_count += length;
  545. }
  546. return (m_read_count - count);
  547. }
  548. //---------------------------------------------------------------------------------------------
  549. void BitMessage::read_netaddr(os::NetAddress* addr) const
  550. {
  551. for (int i = 0; i < 4; i++)
  552. {
  553. addr->address[i] = read_uint8();
  554. }
  555. addr->port = read_uint16();
  556. }
  557. //---------------------------------------------------------------------------------------------
  558. void BitMessage::write_header(Header& header)
  559. {
  560. // write header only on top of BitMessage
  561. if (m_cur_size == 0)
  562. {
  563. write_int32(header.protocol_id);
  564. write_uint16(header.sequence);
  565. write_uint16(header.ack);
  566. write_int32(header.ack_bits);
  567. write_uint16(header.size);
  568. }
  569. }
  570. //---------------------------------------------------------------------------------------------
  571. size_t BitMessage::read_header(Header& header)
  572. {
  573. header.protocol_id = read_int32();
  574. header.sequence = read_uint16();
  575. header.ack = read_uint16();
  576. header.ack_bits = read_int32();
  577. header.size = (size_t)read_uint16();
  578. }
  579. } //namespace network
  580. } //namespace crown