icqpacket.cpp
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /***************************************************************************
  2.  *                                                                         *
  3.  *   This program 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 2 of the License, or     *
  6.  *   (at your option) any later version.                                   *
  7.  *                                                                         *
  8.  *   copyright            : (C) 2002 by Zhang Yong                         *
  9.  *   email                : z-yong163@163.com                              *
  10.  ***************************************************************************/
  11. #include <string.h>
  12. #include "icqpacket.h"
  13. #include "icqsocket.h"
  14. int IcqOutPacket::setCursor(int pos) {
  15. int old = cursor - data;
  16. cursor = data + pos;
  17. return old;
  18. }
  19. OutPacket &IcqOutPacket::operator <<(uint8 b)
  20. {
  21. if (cursor <= data + MAX_PACKET_SIZE - sizeof(b)) {
  22. *(uint8 *) cursor = b;
  23. cursor += sizeof(b);
  24. }
  25. return (*this);
  26. }
  27. OutPacket &IcqOutPacket::operator <<(uint16 w)
  28. {
  29. if (cursor <= data + MAX_PACKET_SIZE - sizeof(w)) {
  30. *(uint16 *) cursor = htons(w);
  31. cursor += sizeof(w);
  32. }
  33. return (*this);
  34. }
  35. OutPacket &IcqOutPacket::operator <<(uint32 dw)
  36. {
  37. if (cursor <= data + MAX_PACKET_SIZE - sizeof(dw)) {
  38. *(uint32 *) cursor = htonl(dw);
  39. cursor += sizeof(dw);
  40. }
  41. return (*this);
  42. }
  43. OutPacket &IcqOutPacket::operator <<(const char *str)
  44. {
  45. uint16 len = strlen(str) + 1;
  46. if (cursor <= data + MAX_PACKET_SIZE - sizeof(len) - len) {
  47. operator <<(len);
  48. strcpy(cursor, str);
  49. cursor += len;
  50. }
  51. return (*this);
  52. }
  53. void IcqOutPacket::writeData(const char *buf, int n)
  54. {
  55. if (cursor <= data + MAX_PACKET_SIZE - n) {
  56. memcpy(cursor, buf, n);
  57. cursor += n;
  58. }
  59. }
  60. InPacket &IcqInPacket::operator >>(uint8 &b)
  61. {
  62. if (cursor <= data + datalen - sizeof(b)) {
  63. b = *(uint8 *) cursor;
  64. cursor += sizeof(b);
  65. } else
  66. b = 0;
  67. return (*this);
  68. }
  69. InPacket &IcqInPacket::operator >>(uint16 &w)
  70. {
  71. if (cursor <= data + datalen - sizeof(w)) {
  72. w = ntohs(*(uint16 *) cursor);
  73. cursor += sizeof(w);
  74. } else
  75. w = 0;
  76. return (*this);
  77. }
  78. InPacket &IcqInPacket::operator >>(uint32 &dw)
  79. {
  80. if (cursor <= data + datalen - sizeof(dw)) {
  81. dw = ntohl(*(uint32 *) cursor);
  82. cursor += sizeof(dw);
  83. } else
  84. dw = 0;
  85. return (*this);
  86. }
  87. InPacket &IcqInPacket::operator >>(const char *&str)
  88. {
  89. uint16 len;
  90. operator >>(len);
  91. if (cursor <= data + datalen - len && !cursor[len - 1]) {
  92. str = cursor;
  93. cursor += len;
  94. } else
  95. str = "";
  96. return (*this);
  97. }
  98. InPacket &IcqInPacket::operator >>(string &str)
  99. {
  100. const char *p;
  101. operator >>(p);
  102. str = p;
  103. return (*this);
  104. }
  105. const char *IcqInPacket::readData(int &n)
  106. {
  107. n = datalen - (cursor - data);
  108. return cursor;
  109. }