#pragma once #include #include #include #include #include #include "dvlnet/abstract_net.h" namespace devilution { namespace net { template class cdwrap : public abstract_net { private: std::unique_ptr dvlnet_wrap; std::map registered_handlers; buffer_t game_init_info; void reset(); public: virtual int create(std::string addrstr, std::string passwd); virtual int join(std::string addrstr, std::string passwd); virtual bool SNetReceiveMessage(int *sender, char **data, int *size); virtual bool SNetSendMessage(int dest, void *data, unsigned int size); virtual bool SNetReceiveTurns(char **data, unsigned int *size, DWORD *status); virtual bool SNetSendTurn(char *data, unsigned int size); virtual int SNetGetProviderCaps(struct _SNETCAPS *caps); virtual bool SNetRegisterEventHandler(event_type evtype, SEVTHANDLER func); virtual bool SNetUnregisterEventHandler(event_type evtype, SEVTHANDLER func); virtual bool SNetLeaveGame(int type); virtual bool SNetDropPlayer(int playerid, DWORD flags); virtual bool SNetGetOwnerTurnsWaiting(DWORD *turns); virtual bool SNetGetTurnsInTransit(DWORD *turns); virtual void setup_gameinfo(buffer_t info); virtual std::string make_default_gamename(); cdwrap(); virtual ~cdwrap() = default; }; template cdwrap::cdwrap() { reset(); } template void cdwrap::reset() { dvlnet_wrap.reset(new T); dvlnet_wrap->setup_gameinfo(game_init_info); for (const auto &pair : registered_handlers) dvlnet_wrap->SNetRegisterEventHandler(pair.first, pair.second); } template int cdwrap::create(std::string addrstr, std::string passwd) { reset(); return dvlnet_wrap->create(addrstr, passwd); } template int cdwrap::join(std::string addrstr, std::string passwd) { game_init_info = buffer_t(); reset(); return dvlnet_wrap->join(addrstr, passwd); } template void cdwrap::setup_gameinfo(buffer_t info) { game_init_info = std::move(info); if (dvlnet_wrap) dvlnet_wrap->setup_gameinfo(game_init_info); } template bool cdwrap::SNetReceiveMessage(int *sender, char **data, int *size) { return dvlnet_wrap->SNetReceiveMessage(sender, data, size); } template bool cdwrap::SNetSendMessage(int playerID, void *data, unsigned int size) { return dvlnet_wrap->SNetSendMessage(playerID, data, size); } template bool cdwrap::SNetReceiveTurns(char **data, unsigned int *size, DWORD *status) { return dvlnet_wrap->SNetReceiveTurns(data, size, status); } template bool cdwrap::SNetSendTurn(char *data, unsigned int size) { return dvlnet_wrap->SNetSendTurn(data, size); } template int cdwrap::SNetGetProviderCaps(struct _SNETCAPS *caps) { return dvlnet_wrap->SNetGetProviderCaps(caps); } template bool cdwrap::SNetUnregisterEventHandler(event_type evtype, SEVTHANDLER func) { registered_handlers.erase(evtype); if (dvlnet_wrap) return dvlnet_wrap->SNetUnregisterEventHandler(evtype, func); else return true; } template bool cdwrap::SNetRegisterEventHandler(event_type evtype, SEVTHANDLER func) { registered_handlers[evtype] = func; if (dvlnet_wrap) return dvlnet_wrap->SNetRegisterEventHandler(evtype, func); else return true; } template bool cdwrap::SNetLeaveGame(int type) { return dvlnet_wrap->SNetLeaveGame(type); } template bool cdwrap::SNetDropPlayer(int playerid, DWORD flags) { return dvlnet_wrap->SNetDropPlayer(playerid, flags); } template bool cdwrap::SNetGetOwnerTurnsWaiting(DWORD *turns) { return dvlnet_wrap->SNetGetOwnerTurnsWaiting(turns); } template bool cdwrap::SNetGetTurnsInTransit(DWORD *turns) { return dvlnet_wrap->SNetGetTurnsInTransit(turns); } template std::string cdwrap::make_default_gamename() { return dvlnet_wrap->make_default_gamename(); } } // namespace net } // namespace devilution