RakNetTransport2.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 "NativeFeatureIncludes.h"
  11. #if _RAKNET_SUPPORT_TelnetTransport==1
  12. #include "RakNetTransport2.h"
  13. #include "RakPeerInterface.h"
  14. #include "BitStream.h"
  15. #include "MessageIdentifiers.h"
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <stdarg.h>
  19. #include "LinuxStrings.h"
  20. #ifdef _MSC_VER
  21. #pragma warning( push )
  22. #endif
  23. using namespace RakNet;
  24. STATIC_FACTORY_DEFINITIONS(RakNetTransport2,RakNetTransport2);
  25. RakNetTransport2::RakNetTransport2()
  26. {
  27. }
  28. RakNetTransport2::~RakNetTransport2()
  29. {
  30. Stop();
  31. }
  32. bool RakNetTransport2::Start(unsigned short port, bool serverMode)
  33. {
  34. (void) port;
  35. (void) serverMode;
  36. return true;
  37. }
  38. void RakNetTransport2::Stop(void)
  39. {
  40. newConnections.Clear(_FILE_AND_LINE_);
  41. lostConnections.Clear(_FILE_AND_LINE_);
  42. for (unsigned int i=0; i < packetQueue.Size(); i++)
  43. {
  44. rakFree_Ex(packetQueue[i]->data,_FILE_AND_LINE_);
  45. RakNet::OP_DELETE(packetQueue[i],_FILE_AND_LINE_);
  46. }
  47. packetQueue.Clear(_FILE_AND_LINE_);
  48. }
  49. void RakNetTransport2::Send( SystemAddress systemAddress, const char *data, ... )
  50. {
  51. if (data==0 || data[0]==0) return;
  52. char text[REMOTE_MAX_TEXT_INPUT];
  53. va_list ap;
  54. va_start(ap, data);
  55. _vsnprintf(text, REMOTE_MAX_TEXT_INPUT, data, ap);
  56. va_end(ap);
  57. text[REMOTE_MAX_TEXT_INPUT-1]=0;
  58. RakNet::BitStream str;
  59. str.Write((MessageID)ID_TRANSPORT_STRING);
  60. str.Write(text, (int) strlen(text));
  61. str.Write((unsigned char) 0); // Null terminate the string
  62. rakPeerInterface->Send(&str, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, systemAddress, (systemAddress==UNASSIGNED_SYSTEM_ADDRESS)!=0);
  63. }
  64. void RakNetTransport2::CloseConnection( SystemAddress systemAddress )
  65. {
  66. rakPeerInterface->CloseConnection(systemAddress, true, 0);
  67. }
  68. Packet* RakNetTransport2::Receive( void )
  69. {
  70. if (packetQueue.Size()==0)
  71. return 0;
  72. return packetQueue.Pop();
  73. }
  74. SystemAddress RakNetTransport2::HasNewIncomingConnection(void)
  75. {
  76. if (newConnections.Size())
  77. return newConnections.Pop();
  78. return UNASSIGNED_SYSTEM_ADDRESS;
  79. }
  80. SystemAddress RakNetTransport2::HasLostConnection(void)
  81. {
  82. if (lostConnections.Size())
  83. return lostConnections.Pop();
  84. return UNASSIGNED_SYSTEM_ADDRESS;
  85. }
  86. void RakNetTransport2::DeallocatePacket( Packet *packet )
  87. {
  88. rakFree_Ex(packet->data, _FILE_AND_LINE_ );
  89. RakNet::OP_DELETE(packet, _FILE_AND_LINE_ );
  90. }
  91. PluginReceiveResult RakNetTransport2::OnReceive(Packet *packet)
  92. {
  93. switch (packet->data[0])
  94. {
  95. case ID_TRANSPORT_STRING:
  96. {
  97. if (packet->length==sizeof(MessageID))
  98. return RR_STOP_PROCESSING_AND_DEALLOCATE;
  99. Packet *p = RakNet::OP_NEW<Packet>(_FILE_AND_LINE_);
  100. *p=*packet;
  101. p->bitSize-=8;
  102. p->length--;
  103. p->data=(unsigned char*) rakMalloc_Ex(p->length,_FILE_AND_LINE_);
  104. memcpy(p->data, packet->data+1, p->length);
  105. packetQueue.Push(p, _FILE_AND_LINE_ );
  106. }
  107. return RR_STOP_PROCESSING_AND_DEALLOCATE;
  108. }
  109. return RR_CONTINUE_PROCESSING;
  110. }
  111. void RakNetTransport2::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason )
  112. {
  113. (void) rakNetGUID;
  114. (void) lostConnectionReason;
  115. lostConnections.Push(systemAddress, _FILE_AND_LINE_ );
  116. }
  117. void RakNetTransport2::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming)
  118. {
  119. (void) rakNetGUID;
  120. (void) isIncoming;
  121. newConnections.Push(systemAddress, _FILE_AND_LINE_ );
  122. }
  123. #ifdef _MSC_VER
  124. #pragma warning( pop )
  125. #endif
  126. #endif // _RAKNET_SUPPORT_*
粤ICP备19079148号