1
0
mirror of https://github.com/solemnwarning/directplay-lite synced 2024-12-30 16:45:37 +01:00
directplay-lite/src/SendQueue.cpp

105 lines
2.4 KiB
C++
Raw Normal View History

#include <assert.h>
#include <winsock2.h>
#include <windows.h>
#include "SendQueue.hpp"
2018-09-20 00:58:41 +01:00
void SendQueue::send(SendPriority priority, const PacketSerialiser &ps, const struct sockaddr_in *dest_addr, const std::function<void(std::unique_lock<std::mutex>&, HRESULT)> &callback)
{
2018-09-20 00:58:41 +01:00
std::pair<const void*, size_t> data = ps.raw_packet();
SendOp *op = new SendOp(
data.first, data.second,
(const struct sockaddr*)(dest_addr), (dest_addr != NULL ? sizeof(*dest_addr) : 0),
callback);
switch(priority)
{
case SEND_PRI_LOW:
2018-09-20 00:58:41 +01:00
low_queue.push_back(op);
break;
case SEND_PRI_MEDIUM:
2018-09-20 00:58:41 +01:00
medium_queue.push_back(op);
break;
case SEND_PRI_HIGH:
2018-09-20 00:58:41 +01:00
high_queue.push_back(op);
break;
}
SetEvent(signal_on_queue);
}
2018-09-20 00:58:41 +01:00
SendQueue::SendOp *SendQueue::get_pending()
{
if(current != NULL)
{
return current;
}
if(!high_queue.empty())
{
current = high_queue.front();
high_queue.pop_front();
}
else if(!medium_queue.empty())
{
current = medium_queue.front();
medium_queue.pop_front();
}
else if(!low_queue.empty())
{
current = low_queue.front();
low_queue.pop_front();
}
return current;
}
2018-09-20 00:58:41 +01:00
void SendQueue::pop_pending(SendQueue::SendOp *op)
{
2018-09-20 00:58:41 +01:00
assert(op == current);
current = NULL;
}
2018-09-20 00:58:41 +01:00
SendQueue::SendOp::SendOp(const void *data, size_t data_size,
const struct sockaddr *dest_addr, size_t dest_addr_size,
const std::function<void(std::unique_lock<std::mutex>&, HRESULT)> &callback):
data((const unsigned char*)(data), (const unsigned char*)(data) + data_size),
sent_data(0),
callback(callback)
{
2018-09-20 00:58:41 +01:00
assert((size_t)(dest_addr_size) <= sizeof(this->dest_addr));
2018-09-20 00:58:41 +01:00
memcpy(&(this->dest_addr), dest_addr, dest_addr_size);
this->dest_addr_size = dest_addr_size;
}
2018-09-20 00:58:41 +01:00
std::pair<const void*, size_t> SendQueue::SendOp::get_data() const
{
return std::make_pair<const void*, size_t>(data.data(), data.size());
}
2018-09-20 00:58:41 +01:00
std::pair<const struct sockaddr*, size_t> SendQueue::SendOp::get_dest_addr() const
{
return std::make_pair((const struct sockaddr*)(&dest_addr), dest_addr_size);
}
void SendQueue::SendOp::inc_sent_data(size_t sent)
{
sent_data += sent;
assert(sent_data <= data.size());
}
std::pair<const void*, size_t> SendQueue::SendOp::get_pending_data() const
{
return std::make_pair<const void*, size_t>(data.data() + sent_data, data.size() - sent_data);
}
void SendQueue::SendOp::invoke_callback(std::unique_lock<std::mutex> &l, HRESULT result) const
{
2018-09-20 00:58:41 +01:00
callback(l, result);
}