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

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 "icqclient.h"
  12. #include "icqdb.h"
  13. bool IcqMsg::isSysMsg()
  14. {
  15. return (uin < 1000 ||
  16. type == MSG_AUTH_ACCEPTED ||
  17. type == MSG_AUTH_REQUEST  ||
  18. type == MSG_AUTH_REJECTED ||
  19. type == MSG_ADDED);
  20. }
  21. void IcqMsg::save(DBOutStream &out)
  22. {
  23. out << type << flags << uin << when << text;
  24. }
  25. void IcqMsg::load(DBInStream &in)
  26. {
  27. in >> type >> flags >> uin >> when >> text;
  28. }
  29. IcqInfo::IcqInfo()
  30. {
  31. uin = 0;
  32. face = 0;
  33. gender = 0;
  34. age = 0;
  35. blood = 0;
  36. status = STATUS_OFFLINE;
  37. }
  38. void IcqInfo::load(DBInStream &in)
  39. {
  40. in >> uin >> face >> nick >> age >> gender >> country >> province >> city;
  41. in >> email >> address >> zipcode >> tel;
  42. in >> name >> blood >> college >> profession >> homepage >> intro;
  43. }
  44. void IcqInfo::save(DBOutStream &out)
  45. {
  46. out << uin << face << nick << age << gender << country << province << city;
  47. out << email << address << zipcode << tel;
  48. out << name << blood << college << profession << homepage << intro;
  49. }
  50. IcqContact::IcqContact()
  51. {
  52. type = CONTACT_FRIEND;
  53. ip = 
  54. realIP = 0;
  55. port = 0;
  56. winX = winY = -1;
  57. }
  58. IcqContact::~IcqContact()
  59. {
  60. }
  61. void IcqContact::load(DBInStream &in)
  62. {
  63. IcqInfo::load(in);
  64. uint32 f;
  65. in >> f;
  66. flags = bitset<NR_CONTACT_FLAGS>(f);
  67. in >> greeting;
  68. for (int i = 0; i < NR_CUSTOM_SOUNDS; i++)
  69. in >> soundFiles[i];
  70. }
  71. void IcqContact::save(DBOutStream &out)
  72. {
  73. IcqInfo::save(out);
  74. out << flags.to_ulong();
  75. out << greeting;
  76. for (int i = 0; i < NR_CUSTOM_SOUNDS; i++)
  77. out << soundFiles[i];
  78. }
  79. IcqUser::IcqUser()
  80. {
  81. auth = 0;
  82. }
  83. void IcqUser::load(DBInStream &in)
  84. {
  85. IcqInfo::load(in);
  86. in >> passwd >> auth;
  87. }
  88. void IcqUser::save(DBOutStream &out)
  89. {
  90. IcqInfo::save(out);
  91. out << passwd << auth;
  92. }
  93. void ProxyInfo::load(DBInStream &in)
  94. {
  95. in >> host >> port >> username >> passwd >> resolve;
  96. }
  97. void ProxyInfo::save(DBOutStream &out)
  98. {
  99. out << host << port << username << passwd << resolve;
  100. }
  101. IcqOption::IcqOption()
  102. {
  103. hotKey = 0;
  104. port = 0;
  105. }
  106. IcqOption::~IcqOption()
  107. {
  108. }
  109. void IcqOption::load(DBInStream &in)
  110. {
  111. uint32 f;
  112. in >> f;
  113. flags = bitset<NR_USER_FLAGS>(f);
  114. in >> hotKey;
  115. for (int i = 0; i < NR_SOUNDS; ++i)
  116. in >> soundFiles[i];
  117. in >> host >> port;
  118. in >> autoReplyText >> quickReplyText;
  119. in >> autoStatus >> autoStatusTime;
  120. in >> skin;
  121. in >> proxyType;
  122. for (i = 0; i < NR_PROXY_TYPES; ++i)
  123. proxy[i].load(in);
  124. }
  125. void IcqOption::save(DBOutStream &out)
  126. {
  127. out << flags.to_ulong();
  128. out << hotKey;
  129. for (int i = 0; i < NR_SOUNDS; i++)
  130. out << soundFiles[i];
  131. out << host << port;
  132. out << autoReplyText << quickReplyText;
  133. out << autoStatus << autoStatusTime;
  134. out << skin;
  135. out << proxyType;
  136. for (i = 0; i < NR_PROXY_TYPES; ++i)
  137. proxy[i].save(out);
  138. }
  139. void IcqOption::playSound(int sound, IcqContact *c)
  140. {
  141. if (sound < 0 || sound >= NR_SOUNDS || !flags.test(UF_SOUND_ON))
  142. return;
  143. if (c && c->flags.test(CF_CUSTOMSOUND) &&
  144. sound < NR_CUSTOM_SOUNDS &&
  145. !c->soundFiles[sound].empty()) {
  146. playSound(c->soundFiles[sound].c_str());
  147. } else
  148. playSound(soundFiles[sound].c_str());
  149. }
  150. const char TEXT_STREAM_SEP = (const char) 0xfe;
  151. TextOutStream &TextOutStream::operator <<(uint32 dw)
  152. {
  153. char tmp[11];
  154. sprintf(tmp, "%lu", dw);
  155. return (*this << tmp);
  156. }
  157. TextOutStream &TextOutStream::operator <<(const char *str)
  158. {
  159. if (cursor > text)
  160. *(cursor - 1) = TEXT_STREAM_SEP;
  161. int n = strlen(str) + 1;
  162. memcpy(cursor, str, n);
  163. cursor += n;
  164. return (*this);
  165. }
  166. TextInStream::TextInStream(const char *s)
  167. {
  168. strncpy(text, s, sizeof(text));
  169. cursor = text;
  170. }
  171. TextInStream &TextInStream::operator >>(uint8 &b)
  172. {
  173. uint32 dw;
  174. operator >>(dw);
  175. b = dw;
  176. return (*this);
  177. }
  178. TextInStream &TextInStream::operator >>(uint16 &w)
  179. {
  180. uint32 dw;
  181. operator >>(dw);
  182. w = dw;
  183. return (*this);
  184. }
  185. TextInStream &TextInStream::operator >>(uint32 &dw)
  186. {
  187. string s;
  188. *this >> s;
  189. dw = atol(s.c_str());
  190. return (*this);
  191. }
  192. TextInStream &TextInStream::operator >>(string &s)
  193. {
  194. char *p = cursor;
  195. if (*p == '')
  196. s = "";
  197. else {
  198. while (*p != TEXT_STREAM_SEP && *p)
  199. p++;
  200. s = string(cursor, p - cursor);
  201. cursor = p + 1;
  202. }
  203. return (*this);
  204. }