PluginInterface2.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * Copyright (c) 2014, Oculus VR, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. *
  9. */
  10. #include "PluginInterface2.h"
  11. #include "PacketizedTCP.h"
  12. #include "RakPeerInterface.h"
  13. #include "BitStream.h"
  14. using namespace RakNet;
  15. PluginInterface2::PluginInterface2()
  16. {
  17. rakPeerInterface=0;
  18. #if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
  19. tcpInterface=0;
  20. #endif
  21. }
  22. PluginInterface2::~PluginInterface2()
  23. {
  24. }
  25. void PluginInterface2::SendUnified( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast )
  26. {
  27. if (rakPeerInterface)
  28. {
  29. rakPeerInterface->Send(bitStream,priority,reliability,orderingChannel,systemIdentifier,broadcast);
  30. return;
  31. }
  32. #if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
  33. else if (tcpInterface)
  34. {
  35. tcpInterface->Send((const char*) bitStream->GetData(), bitStream->GetNumberOfBytesUsed(), systemIdentifier.systemAddress, broadcast);
  36. return;
  37. }
  38. #endif
  39. // Offline mode
  40. if (broadcast==false && systemIdentifier.rakNetGuid==GetMyGUIDUnified())
  41. {
  42. // Packet *packet = AllocatePacketUnified(bitStream->GetNumberOfBytesUsed());
  43. // memcpy(packet->data, bitStream->GetData(), bitStream->GetNumberOfBytesUsed());
  44. Packet packet;
  45. packet.bitSize=bitStream->GetNumberOfBitsUsed();
  46. packet.data=bitStream->GetData();
  47. packet.deleteData=false;
  48. packet.guid=UNASSIGNED_RAKNET_GUID;
  49. packet.length=bitStream->GetNumberOfBytesUsed();
  50. packet.systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
  51. packet.wasGeneratedLocally=false;
  52. OnReceive(&packet);
  53. // DeallocPacketUnified(packet);
  54. Update();
  55. }
  56. }
  57. void PluginInterface2::SendUnified( const char * data, const int length, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast )
  58. {
  59. if (rakPeerInterface)
  60. {
  61. rakPeerInterface->Send(data, length, priority,reliability,orderingChannel,systemIdentifier,broadcast);
  62. return;
  63. }
  64. #if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
  65. else if (tcpInterface)
  66. {
  67. tcpInterface->Send(data, length, systemIdentifier.systemAddress, broadcast);
  68. return;
  69. }
  70. #endif
  71. // Offline mode
  72. if (broadcast==false && systemIdentifier.rakNetGuid==GetMyGUIDUnified())
  73. {
  74. // Packet *packet = AllocatePacketUnified(bitStream->GetNumberOfBytesUsed());
  75. // memcpy(packet->data, bitStream->GetData(), bitStream->GetNumberOfBytesUsed());
  76. Packet packet;
  77. packet.bitSize=BYTES_TO_BITS(length);
  78. packet.data=(unsigned char*) data;
  79. packet.deleteData=false;
  80. packet.guid=UNASSIGNED_RAKNET_GUID;
  81. packet.length=length;
  82. packet.systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
  83. packet.wasGeneratedLocally=false;
  84. OnReceive(&packet);
  85. // DeallocPacketUnified(packet);
  86. Update();
  87. }
  88. }
  89. Packet *PluginInterface2::AllocatePacketUnified(unsigned dataSize)
  90. {
  91. if (rakPeerInterface)
  92. {
  93. return rakPeerInterface->AllocatePacket(dataSize);
  94. }
  95. #if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
  96. else if (tcpInterface)
  97. {
  98. return tcpInterface->AllocatePacket(dataSize);
  99. }
  100. #endif
  101. Packet *packet = RakNet::OP_NEW<Packet>(_FILE_AND_LINE_);
  102. packet->data = (unsigned char*) rakMalloc_Ex(dataSize, _FILE_AND_LINE_);
  103. packet->bitSize=BYTES_TO_BITS(dataSize);
  104. packet->deleteData=true;
  105. packet->guid=UNASSIGNED_RAKNET_GUID;
  106. packet->systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
  107. packet->wasGeneratedLocally=false;
  108. return packet;
  109. }
  110. void PluginInterface2::PushBackPacketUnified(Packet *packet, bool pushAtHead)
  111. {
  112. if (rakPeerInterface)
  113. {
  114. rakPeerInterface->PushBackPacket(packet,pushAtHead);
  115. return;
  116. }
  117. #if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
  118. else if (tcpInterface)
  119. {
  120. tcpInterface->PushBackPacket(packet,pushAtHead);
  121. return;
  122. }
  123. #endif
  124. OnReceive(packet);
  125. Update();
  126. }
  127. void PluginInterface2::DeallocPacketUnified(Packet *packet)
  128. {
  129. if (rakPeerInterface)
  130. {
  131. rakPeerInterface->DeallocatePacket(packet);
  132. return;
  133. }
  134. #if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
  135. else if (tcpInterface)
  136. {
  137. tcpInterface->DeallocatePacket(packet);
  138. return;
  139. }
  140. #endif
  141. rakFree_Ex(packet->data, _FILE_AND_LINE_);
  142. RakNet::OP_DELETE(packet, _FILE_AND_LINE_);
  143. }
  144. bool PluginInterface2::SendListUnified( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast )
  145. {
  146. if (rakPeerInterface)
  147. {
  148. return rakPeerInterface->SendList(data,lengths,numParameters,priority,reliability,orderingChannel,systemIdentifier,broadcast)!=0;
  149. }
  150. #if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
  151. else if (tcpInterface)
  152. {
  153. return tcpInterface->SendList(data,(const unsigned int *) lengths,numParameters,systemIdentifier.systemAddress,broadcast );
  154. }
  155. #endif
  156. if (broadcast==false && systemIdentifier.rakNetGuid==GetMyGUIDUnified())
  157. {
  158. unsigned int totalLength=0;
  159. unsigned int lengthOffset;
  160. int i;
  161. for (i=0; i < numParameters; i++)
  162. {
  163. if (lengths[i]>0)
  164. totalLength+=lengths[i];
  165. }
  166. if (totalLength==0)
  167. return false;
  168. char *dataAggregate;
  169. dataAggregate = (char*) rakMalloc_Ex( (size_t) totalLength, _FILE_AND_LINE_ );
  170. if (dataAggregate==0)
  171. {
  172. notifyOutOfMemory(_FILE_AND_LINE_);
  173. return false;
  174. }
  175. for (i=0, lengthOffset=0; i < numParameters; i++)
  176. {
  177. if (lengths[i]>0)
  178. {
  179. memcpy(dataAggregate+lengthOffset, data[i], lengths[i]);
  180. lengthOffset+=lengths[i];
  181. }
  182. }
  183. SendUnified(dataAggregate, totalLength, priority, reliability,orderingChannel, systemIdentifier, broadcast);
  184. rakFree_Ex(dataAggregate, _FILE_AND_LINE_);
  185. return true;
  186. }
  187. return false;
  188. }
  189. void PluginInterface2::SetRakPeerInterface( RakPeerInterface *ptr )
  190. {
  191. rakPeerInterface=ptr;
  192. }
  193. #if _RAKNET_SUPPORT_TCPInterface==1
  194. void PluginInterface2::SetTCPInterface( TCPInterface *ptr )
  195. {
  196. tcpInterface=ptr;
  197. }
  198. #endif
  199. RakNetGUID PluginInterface2::GetMyGUIDUnified(void) const
  200. {
  201. if (rakPeerInterface)
  202. return rakPeerInterface->GetMyGUID();
  203. return UNASSIGNED_RAKNET_GUID;
  204. }
粤ICP备19079148号