pqmsgheader.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "pqmsgheader.h"
  2. namespace PQ {
  3. MSGRead::MSGRead(bool errorContine, QObject * parent):QObject(parent),
  4. _errorContine(errorContine),_status(0),_bytePos(0),_needBytes(0)
  5. {}
  6. bool MSGRead::readMsg(const QByteArray data)
  7. {
  8. const int max = data.length();
  9. int pos = 0;
  10. while(pos < max){
  11. const char byte = data.at(pos);
  12. switch (_status) {
  13. case 0:
  14. {
  15. if(byte == 'P'){
  16. _status ++;
  17. } else {
  18. emit hasError();
  19. if(!_errorContine) return false;
  20. }
  21. ++pos;
  22. }
  23. break;
  24. case 1:
  25. { // Q
  26. if(byte == 'Q'){
  27. _status ++;
  28. _bytePos = 0;
  29. pos ++;
  30. } else {
  31. _status = 0;
  32. emit hasError();
  33. if(!_errorContine) return false;
  34. }
  35. }
  36. break;
  37. case 2:
  38. {
  39. if(readHeaderCloum(byte,4)){
  40. header.msgID = qFromBigEndian<uint>(reinterpret_cast<uchar *>(&byteBuffer[0]));
  41. _bytePos = 0;
  42. _status ++;
  43. }
  44. pos ++;
  45. }
  46. break;
  47. case 3:
  48. {
  49. if(readHeaderCloum(byte,2)){
  50. header.msgType = qFromBigEndian<ushort>(reinterpret_cast<uchar *>(&byteBuffer[0]));
  51. _bytePos = 0;
  52. _status ++;
  53. }
  54. pos ++;
  55. }
  56. break;
  57. case 4:
  58. {
  59. if(readHeaderCloum(byte,4)){
  60. header.length = qFromBigEndian<uint>(reinterpret_cast<uchar *>(&byteBuffer[0]));
  61. _bytePos = 0;
  62. _status ++;
  63. }
  64. pos ++;
  65. }
  66. break;
  67. case 5:{
  68. header.compress = byte;
  69. _status ++;
  70. pos ++;
  71. }
  72. break;
  73. case 6:{
  74. header.encrypt = byte;
  75. _status ++;
  76. pos ++;
  77. }
  78. break;
  79. case 7:
  80. {
  81. if(byte == 'p'){
  82. _status ++;
  83. pos ++;
  84. } else {
  85. _status = 0;
  86. emit hasError();
  87. if(!_errorContine) return false;
  88. }
  89. }
  90. break;
  91. case 8:
  92. {
  93. if(byte == 'q'){
  94. pos ++;
  95. _bytePos = 0;
  96. _needBytes = header.length;
  97. body.clear();
  98. if(header.length > 0){
  99. _status ++;
  100. } else {
  101. _status = 0;
  102. emit revicedMSG(header,body);
  103. }
  104. } else {
  105. _status = 0;
  106. emit hasError();
  107. if(!_errorContine) return false;
  108. }
  109. }
  110. break;
  111. case 9:{
  112. if(readData(data,pos,max)){
  113. _status = 0;
  114. emit revicedMSG(header, body);
  115. body.clear();
  116. }
  117. }
  118. default:
  119. _status = 0;
  120. break;
  121. }
  122. }
  123. return true;
  124. }
  125. bool MSGRead::readData(const QByteArray & data,int & pos, int max)
  126. {
  127. const int canRead = max - pos;
  128. if(canRead >= _needBytes){
  129. body.append(data.mid(pos,_needBytes));
  130. pos += _needBytes;
  131. _needBytes -= 0;
  132. return true;
  133. } else {
  134. body.append(data.mid(pos,canRead));
  135. pos += canRead;
  136. _needBytes -= canRead;
  137. return false;
  138. }
  139. }
  140. }