PeerMessageFactory.cc 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. /* <!-- copyright */
  2. /*
  3. * aria2 - The high speed download utility
  4. *
  5. * Copyright (C) 2006 Tatsuhiro Tsujikawa
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * In addition, as a special exception, the copyright holders give
  22. * permission to link the code of portions of this program with the
  23. * OpenSSL library under certain conditions as described in each
  24. * individual source file, and distribute linked combinations
  25. * including the two.
  26. * You must obey the GNU General Public License in all respects
  27. * for all of the code used other than OpenSSL. If you modify
  28. * file(s) with this exception, you may extend this exception to your
  29. * version of the file(s), but you are not obligated to do so. If you
  30. * do not wish to do so, delete this exception statement from your
  31. * version. If you delete this exception statement from all source
  32. * files in the program, then also delete it here.
  33. */
  34. /* copyright --> */
  35. #include "PeerMessageFactory.h"
  36. #include "PeerInteraction.h"
  37. #include "PeerMessageUtil.h"
  38. #include "ChokeMessage.h"
  39. #include "UnchokeMessage.h"
  40. #include "InterestedMessage.h"
  41. #include "NotInterestedMessage.h"
  42. #include "HaveMessage.h"
  43. #include "BitfieldMessage.h"
  44. #include "RequestMessage.h"
  45. #include "CancelMessage.h"
  46. #include "PieceMessage.h"
  47. #include "HandshakeMessage.h"
  48. #include "KeepAliveMessage.h"
  49. #include "PortMessage.h"
  50. #include "HaveAllMessage.h"
  51. #include "HaveNoneMessage.h"
  52. #include "RejectMessage.h"
  53. #include "AllowedFastMessage.h"
  54. #include "SuggestPieceMessage.h"
  55. #include "RequestSlot.h"
  56. #include "DlAbortEx.h"
  57. PeerMessageFactory::PeerMessageFactory(int cuid,
  58. PeerInteraction* peerInteraction,
  59. const PeerHandle& peer)
  60. :cuid(cuid),
  61. peerInteraction(peerInteraction),
  62. peer(peer) {}
  63. PeerMessageFactory::~PeerMessageFactory() {}
  64. PeerMessageHandle PeerMessageFactory::createPeerMessage(const char* msg, int msgLength) const {
  65. PeerMessage* peerMessage;
  66. if(msgLength == 0) {
  67. // keep-alive
  68. peerMessage = new KeepAliveMessage();
  69. } else {
  70. int id = PeerMessageUtil::getId(msg);
  71. switch(id) {
  72. case ChokeMessage::ID:
  73. peerMessage = ChokeMessage::create(msg, msgLength);
  74. break;
  75. case UnchokeMessage::ID:
  76. peerMessage = UnchokeMessage::create(msg, msgLength);
  77. break;
  78. case InterestedMessage::ID:
  79. peerMessage = InterestedMessage::create(msg, msgLength);
  80. break;
  81. case NotInterestedMessage::ID:
  82. peerMessage = NotInterestedMessage::create(msg, msgLength);
  83. break;
  84. case HaveMessage::ID:
  85. peerMessage = HaveMessage::create(msg, msgLength);
  86. ((HaveMessage*)peerMessage)->setPieces(peerInteraction->getTorrentMan()->
  87. pieces);
  88. break;
  89. case BitfieldMessage::ID:
  90. peerMessage = BitfieldMessage::create(msg, msgLength);
  91. ((BitfieldMessage*)peerMessage)->setPieces(peerInteraction->
  92. getTorrentMan()->pieces);
  93. break;
  94. case RequestMessage::ID:
  95. peerMessage = RequestMessage::create(msg, msgLength);
  96. ((RequestMessage*)peerMessage)->setPieces(peerInteraction->
  97. getTorrentMan()->pieces);
  98. ((RequestMessage*)peerMessage)->setPieceLength(peerInteraction->getTorrentMan()->getPieceLength(((RequestMessage*)peerMessage)->getIndex()));
  99. break;
  100. case CancelMessage::ID:
  101. peerMessage = CancelMessage::create(msg, msgLength);
  102. ((CancelMessage*)peerMessage)->setPieces(peerInteraction->getTorrentMan()->pieces);
  103. ((CancelMessage*)peerMessage)->setPieceLength(peerInteraction->getTorrentMan()->getPieceLength(((CancelMessage*)peerMessage)->getIndex()));
  104. break;
  105. case PieceMessage::ID:
  106. peerMessage = PieceMessage::create(msg, msgLength);
  107. ((PieceMessage*)peerMessage)->setPieces(peerInteraction->getTorrentMan()->pieces);
  108. ((PieceMessage*)peerMessage)->setPieceLength(peerInteraction->getTorrentMan()->getPieceLength(((PieceMessage*)peerMessage)->getIndex()));
  109. break;
  110. case PortMessage::ID:
  111. peerMessage = PortMessage::create(msg, msgLength);
  112. break;
  113. case HaveAllMessage::ID:
  114. peerMessage = HaveAllMessage::create(msg, msgLength);
  115. break;
  116. case HaveNoneMessage::ID:
  117. peerMessage = HaveNoneMessage::create(msg, msgLength);
  118. break;
  119. case RejectMessage::ID:
  120. peerMessage = RejectMessage::create(msg, msgLength);
  121. ((RejectMessage*)peerMessage)->setPieces(peerInteraction->getTorrentMan()->pieces);
  122. ((RejectMessage*)peerMessage)->setPieceLength(peerInteraction->getTorrentMan()->getPieceLength(((RejectMessage*)peerMessage)->getIndex()));
  123. break;
  124. case SuggestPieceMessage::ID:
  125. peerMessage = SuggestPieceMessage::create(msg, msgLength);
  126. ((SuggestPieceMessage*)peerMessage)->setPieces(peerInteraction->getTorrentMan()->pieces);
  127. break;
  128. case AllowedFastMessage::ID:
  129. peerMessage = AllowedFastMessage::create(msg, msgLength);
  130. ((AllowedFastMessage*)peerMessage)->setPieces(peerInteraction->getTorrentMan()->pieces);
  131. break;
  132. default:
  133. throw new DlAbortEx("Invalid message id. id = %d", id);
  134. }
  135. }
  136. PeerMessageHandle handle = PeerMessageHandle(peerMessage);
  137. setPeerMessageCommonProperty(handle);
  138. return handle;
  139. }
  140. PeerMessageHandle
  141. PeerMessageFactory::createHandshakeMessage(const char* msg, int msgLength) const
  142. {
  143. PeerMessageHandle handle =
  144. PeerMessageHandle(HandshakeMessage::create(msg, msgLength));
  145. setPeerMessageCommonProperty(handle);
  146. return handle;
  147. }
  148. PeerMessageHandle
  149. PeerMessageFactory::createHandshakeMessage(const unsigned char* infoHash,
  150. const char* peerId) const
  151. {
  152. PeerMessageHandle handle =
  153. PeerMessageHandle(new HandshakeMessage(infoHash, peerId));
  154. setPeerMessageCommonProperty(handle);
  155. return handle;
  156. }
  157. void
  158. PeerMessageFactory::setPeerMessageCommonProperty(PeerMessageHandle& peerMessage) const
  159. {
  160. peerMessage->setPeer(peer);
  161. peerMessage->setCuid(cuid);
  162. peerMessage->setPeerInteraction(peerInteraction);
  163. }
  164. PeerMessageHandle PeerMessageFactory::createRequestMessage(const Piece& piece,
  165. int blockIndex) const {
  166. PeerMessageHandle handle =
  167. PeerMessageHandle(new RequestMessage(piece.getIndex(),
  168. blockIndex*piece.getBlockLength(),
  169. piece.getBlockLength(blockIndex),
  170. blockIndex));
  171. setPeerMessageCommonProperty(handle);
  172. return handle;
  173. }
  174. PeerMessageHandle PeerMessageFactory::createCancelMessage(int index,
  175. int begin,
  176. int length) const {
  177. PeerMessageHandle handle =
  178. PeerMessageHandle(new CancelMessage(index, begin, length));
  179. setPeerMessageCommonProperty(handle);
  180. return handle;
  181. }
  182. PeerMessageHandle PeerMessageFactory::createPieceMessage(int index,
  183. int begin,
  184. int length) const {
  185. PeerMessageHandle handle =
  186. PeerMessageHandle(new PieceMessage(index, begin, length));
  187. setPeerMessageCommonProperty(handle);
  188. return handle;
  189. }
  190. PeerMessageHandle PeerMessageFactory::createHaveMessage(int index) const {
  191. PeerMessageHandle handle =
  192. PeerMessageHandle(new HaveMessage(index));
  193. setPeerMessageCommonProperty(handle);
  194. return handle;
  195. }
  196. PeerMessageHandle PeerMessageFactory::createChokeMessage() const {
  197. PeerMessageHandle handle =
  198. PeerMessageHandle(new ChokeMessage());
  199. setPeerMessageCommonProperty(handle);
  200. return handle;
  201. }
  202. PeerMessageHandle PeerMessageFactory::createUnchokeMessage() const {
  203. PeerMessageHandle handle =
  204. PeerMessageHandle(new UnchokeMessage());
  205. setPeerMessageCommonProperty(handle);
  206. return handle;
  207. }
  208. PeerMessageHandle PeerMessageFactory::createInterestedMessage() const {
  209. PeerMessageHandle handle =
  210. PeerMessageHandle(new InterestedMessage());
  211. setPeerMessageCommonProperty(handle);
  212. return handle;
  213. }
  214. PeerMessageHandle PeerMessageFactory::createNotInterestedMessage() const {
  215. PeerMessageHandle handle =
  216. PeerMessageHandle(new NotInterestedMessage());
  217. setPeerMessageCommonProperty(handle);
  218. return handle;
  219. }
  220. PeerMessageHandle PeerMessageFactory::createBitfieldMessage() const {
  221. PeerMessageHandle handle =
  222. PeerMessageHandle(new BitfieldMessage(peerInteraction->getTorrentMan()->
  223. getBitfield(),
  224. peerInteraction->getTorrentMan()->
  225. getBitfieldLength()));
  226. setPeerMessageCommonProperty(handle);
  227. return handle;
  228. }
  229. PeerMessageHandle PeerMessageFactory::createKeepAliveMessage() const {
  230. PeerMessageHandle handle =
  231. PeerMessageHandle(new KeepAliveMessage());
  232. setPeerMessageCommonProperty(handle);
  233. return handle;
  234. }
  235. PeerMessageHandle PeerMessageFactory::createHaveAllMessage() const {
  236. PeerMessageHandle handle =
  237. PeerMessageHandle(new HaveAllMessage());
  238. setPeerMessageCommonProperty(handle);
  239. return handle;
  240. }
  241. PeerMessageHandle PeerMessageFactory::createHaveNoneMessage() const {
  242. PeerMessageHandle handle =
  243. PeerMessageHandle(new HaveNoneMessage());
  244. setPeerMessageCommonProperty(handle);
  245. return handle;
  246. }
  247. PeerMessageHandle PeerMessageFactory::createRejectMessage(int index,
  248. int begin,
  249. int length) const {
  250. PeerMessageHandle handle =
  251. PeerMessageHandle(new RejectMessage(index, begin, length));
  252. setPeerMessageCommonProperty(handle);
  253. return handle;
  254. }
  255. PeerMessageHandle PeerMessageFactory::createAllowedFastMessage(int index) const {
  256. PeerMessageHandle handle =
  257. PeerMessageHandle(new AllowedFastMessage(index));
  258. setPeerMessageCommonProperty(handle);
  259. return handle;
  260. }