mirror of
https://github.com/celisej567/mcpe.git
synced 2026-01-09 10:09:54 +03:00
221 lines
6.2 KiB
C++
221 lines
6.2 KiB
C++
/*
|
|
* Copyright (c) 2014, Oculus VR, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
|
|
#include "PluginInterface2.h"
|
|
#include "PacketizedTCP.h"
|
|
#include "RakPeerInterface.h"
|
|
#include "BitStream.h"
|
|
|
|
using namespace RakNet;
|
|
|
|
PluginInterface2::PluginInterface2()
|
|
{
|
|
rakPeerInterface=0;
|
|
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
tcpInterface=0;
|
|
#endif
|
|
}
|
|
PluginInterface2::~PluginInterface2()
|
|
{
|
|
|
|
}
|
|
void PluginInterface2::SendUnified( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast )
|
|
{
|
|
if (rakPeerInterface)
|
|
{
|
|
rakPeerInterface->Send(bitStream,priority,reliability,orderingChannel,systemIdentifier,broadcast);
|
|
return;
|
|
}
|
|
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
else if (tcpInterface)
|
|
{
|
|
tcpInterface->Send((const char*) bitStream->GetData(), bitStream->GetNumberOfBytesUsed(), systemIdentifier.systemAddress, broadcast);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
// Offline mode
|
|
if (broadcast==false && systemIdentifier.rakNetGuid==GetMyGUIDUnified())
|
|
{
|
|
// Packet *packet = AllocatePacketUnified(bitStream->GetNumberOfBytesUsed());
|
|
// memcpy(packet->data, bitStream->GetData(), bitStream->GetNumberOfBytesUsed());
|
|
Packet packet;
|
|
packet.bitSize=bitStream->GetNumberOfBitsUsed();
|
|
packet.data=bitStream->GetData();
|
|
packet.deleteData=false;
|
|
packet.guid=UNASSIGNED_RAKNET_GUID;
|
|
packet.length=bitStream->GetNumberOfBytesUsed();
|
|
packet.systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
|
|
packet.wasGeneratedLocally=false;
|
|
OnReceive(&packet);
|
|
// DeallocPacketUnified(packet);
|
|
|
|
Update();
|
|
}
|
|
}
|
|
void PluginInterface2::SendUnified( const char * data, const int length, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast )
|
|
{
|
|
if (rakPeerInterface)
|
|
{
|
|
rakPeerInterface->Send(data, length, priority,reliability,orderingChannel,systemIdentifier,broadcast);
|
|
return;
|
|
}
|
|
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
else if (tcpInterface)
|
|
{
|
|
tcpInterface->Send(data, length, systemIdentifier.systemAddress, broadcast);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
// Offline mode
|
|
if (broadcast==false && systemIdentifier.rakNetGuid==GetMyGUIDUnified())
|
|
{
|
|
// Packet *packet = AllocatePacketUnified(bitStream->GetNumberOfBytesUsed());
|
|
// memcpy(packet->data, bitStream->GetData(), bitStream->GetNumberOfBytesUsed());
|
|
Packet packet;
|
|
packet.bitSize=BYTES_TO_BITS(length);
|
|
packet.data=(unsigned char*) data;
|
|
packet.deleteData=false;
|
|
packet.guid=UNASSIGNED_RAKNET_GUID;
|
|
packet.length=length;
|
|
packet.systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
|
|
packet.wasGeneratedLocally=false;
|
|
OnReceive(&packet);
|
|
// DeallocPacketUnified(packet);
|
|
|
|
Update();
|
|
}
|
|
}
|
|
Packet *PluginInterface2::AllocatePacketUnified(unsigned dataSize)
|
|
{
|
|
if (rakPeerInterface)
|
|
{
|
|
return rakPeerInterface->AllocatePacket(dataSize);
|
|
}
|
|
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
else if (tcpInterface)
|
|
{
|
|
return tcpInterface->AllocatePacket(dataSize);
|
|
}
|
|
#endif
|
|
|
|
Packet *packet = RakNet::OP_NEW<Packet>(_FILE_AND_LINE_);
|
|
packet->data = (unsigned char*) rakMalloc_Ex(dataSize, _FILE_AND_LINE_);
|
|
packet->bitSize=BYTES_TO_BITS(dataSize);
|
|
packet->deleteData=true;
|
|
packet->guid=UNASSIGNED_RAKNET_GUID;
|
|
packet->systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
|
|
packet->wasGeneratedLocally=false;
|
|
return packet;
|
|
}
|
|
void PluginInterface2::PushBackPacketUnified(Packet *packet, bool pushAtHead)
|
|
{
|
|
if (rakPeerInterface)
|
|
{
|
|
rakPeerInterface->PushBackPacket(packet,pushAtHead);
|
|
return;
|
|
}
|
|
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
else if (tcpInterface)
|
|
{
|
|
tcpInterface->PushBackPacket(packet,pushAtHead);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
OnReceive(packet);
|
|
Update();
|
|
}
|
|
void PluginInterface2::DeallocPacketUnified(Packet *packet)
|
|
{
|
|
if (rakPeerInterface)
|
|
{
|
|
rakPeerInterface->DeallocatePacket(packet);
|
|
return;
|
|
}
|
|
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
else if (tcpInterface)
|
|
{
|
|
tcpInterface->DeallocatePacket(packet);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
rakFree_Ex(packet->data, _FILE_AND_LINE_);
|
|
RakNet::OP_DELETE(packet, _FILE_AND_LINE_);
|
|
}
|
|
bool PluginInterface2::SendListUnified( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast )
|
|
{
|
|
if (rakPeerInterface)
|
|
{
|
|
return rakPeerInterface->SendList(data,lengths,numParameters,priority,reliability,orderingChannel,systemIdentifier,broadcast)!=0;
|
|
}
|
|
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
|
|
else if (tcpInterface)
|
|
{
|
|
return tcpInterface->SendList(data,(const unsigned int *) lengths,numParameters,systemIdentifier.systemAddress,broadcast );
|
|
}
|
|
#endif
|
|
|
|
if (broadcast==false && systemIdentifier.rakNetGuid==GetMyGUIDUnified())
|
|
{
|
|
|
|
unsigned int totalLength=0;
|
|
unsigned int lengthOffset;
|
|
int i;
|
|
for (i=0; i < numParameters; i++)
|
|
{
|
|
if (lengths[i]>0)
|
|
totalLength+=lengths[i];
|
|
}
|
|
if (totalLength==0)
|
|
return false;
|
|
|
|
char *dataAggregate;
|
|
dataAggregate = (char*) rakMalloc_Ex( (size_t) totalLength, _FILE_AND_LINE_ );
|
|
if (dataAggregate==0)
|
|
{
|
|
notifyOutOfMemory(_FILE_AND_LINE_);
|
|
return false;
|
|
}
|
|
for (i=0, lengthOffset=0; i < numParameters; i++)
|
|
{
|
|
if (lengths[i]>0)
|
|
{
|
|
memcpy(dataAggregate+lengthOffset, data[i], lengths[i]);
|
|
lengthOffset+=lengths[i];
|
|
}
|
|
}
|
|
|
|
SendUnified(dataAggregate, totalLength, priority, reliability,orderingChannel, systemIdentifier, broadcast);
|
|
rakFree_Ex(dataAggregate, _FILE_AND_LINE_);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
void PluginInterface2::SetRakPeerInterface( RakPeerInterface *ptr )
|
|
{
|
|
rakPeerInterface=ptr;
|
|
}
|
|
#if _RAKNET_SUPPORT_TCPInterface==1
|
|
void PluginInterface2::SetTCPInterface( TCPInterface *ptr )
|
|
{
|
|
tcpInterface=ptr;
|
|
}
|
|
#endif
|
|
RakNetGUID PluginInterface2::GetMyGUIDUnified(void) const
|
|
{
|
|
if (rakPeerInterface)
|
|
return rakPeerInterface->GetMyGUID();
|
|
return UNASSIGNED_RAKNET_GUID;
|
|
} |