1 /* 2 3 Boost Software License - Version 1.0 - August 17th, 2003 4 5 Permission is hereby granted, free of charge, to any person or organization 6 obtaining a copy of the software and accompanying documentation covered by 7 this license (the "Software") to use, reproduce, display, distribute, 8 execute, and transmit the Software, and to prepare derivative works of the 9 Software, and to permit third-parties to whom the Software is furnished to 10 do so, all subject to the following: 11 12 The copyright notices in the Software and this entire statement, including 13 the above license grant, this restriction and the following disclaimer, 14 must be included in all copies of the Software, in whole or in part, and 15 all derivative works of the Software, unless such copies or derivative 16 works are solely in the form of machine-executable object code generated by 17 a source language processor. 18 19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 22 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 23 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 24 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 DEALINGS IN THE SOFTWARE. 26 27 */ 28 module derelict.sdl.net; 29 30 private 31 { 32 import derelict.util.loader; 33 import derelict.util.exception; 34 import derelict.util.compat; 35 import derelict.sdl.sdl; 36 } 37 38 enum : Uint8 39 { 40 SDL_NET_MAJOR_VERSION = 1, 41 SDL_NET_MINOR_VERSION = 2, 42 SDL_NET_PATCHLEVEL = 7, 43 } 44 45 struct IPaddress 46 { 47 Uint32 host; 48 Uint16 port; 49 } 50 51 // this is a hack to get around the removal of typedefs in D2. 52 struct TCPsocketStruct {} 53 alias TCPsocketStruct* TCPsocket; 54 55 enum : uint 56 { 57 INADDR_ANY = 0x00000000, 58 INADDR_NONE = 0xFFFFFFFF, 59 INADDR_BROADCAST = 0xFFFFFFFF, 60 SDLNET_MAX_UDPCHANNELS = 32, 61 SDLNET_MAX_UDPADDRESSES = 4, 62 } 63 64 // hack again 65 struct UDPsocketStruct {} 66 alias UDPsocketStruct* UDPsocket; 67 68 struct UDPpacket 69 { 70 int channel; 71 Uint8 *data; 72 int len; 73 int maxlen; 74 int status; 75 IPaddress address; 76 } 77 78 alias void* SDLNet_SocketSet; 79 80 struct _SDLNet_GenericSocket 81 { 82 int ready; 83 } 84 alias _SDLNet_GenericSocket* SDLNet_GenericSocket; 85 86 alias SDL_SetError SDLNet_SetError; 87 alias SDL_GetError SDLNet_GetError; 88 89 void SDL_NET_VERSION(SDL_version* X) 90 { 91 X.major = SDL_NET_MAJOR_VERSION; 92 X.minor = SDL_NET_MINOR_VERSION; 93 X.patch = SDL_NET_PATCHLEVEL; 94 } 95 96 int SDLNet_TCP_AddSocket(SDLNet_SocketSet set, TCPsocket sock) 97 { 98 return SDLNet_AddSocket(set, cast(SDLNet_GenericSocket)sock); 99 } 100 101 int SDLNet_TCP_DelSocket(SDLNet_SocketSet set, TCPsocket sock) 102 { 103 return SDLNet_DelSocket(set, cast(SDLNet_GenericSocket)sock); 104 } 105 106 int SDLNet_UDP_AddSocket(SDLNet_SocketSet set, UDPsocket sock) 107 { 108 return SDLNet_AddSocket(set, cast(SDLNet_GenericSocket)sock); 109 } 110 111 int SDLNet_UDP_DelSocket(SDLNet_SocketSet set, UDPsocket sock) 112 { 113 return SDLNet_DelSocket(set, cast(SDLNet_GenericSocket)sock); 114 } 115 116 bool SDLNet_SocketReady(TCPsocket sock) 117 { 118 return cast(bool)((sock !is null) && (cast(SDLNet_GenericSocket)sock).ready); 119 } 120 121 bool SDLNet_SocketReady(UDPsocket sock) 122 { 123 return cast(bool)((sock !is null) && (cast(SDLNet_GenericSocket)sock).ready); 124 } 125 126 void SDLNet_Write16(Uint16 value, void* areap) 127 { 128 Uint16* areap16 = cast(Uint16*)areap; 129 *areap16 = SDL_SwapBE16(value); 130 } 131 132 Uint16 SDLNet_Read16(void *areap) 133 { 134 Uint16* areap16 = cast(Uint16*)areap; 135 return SDL_SwapBE16(*areap16); 136 } 137 138 void SDLNet_Write32(Uint32 value, void* areap) 139 { 140 Uint32* areap32 = cast(Uint32*)areap; 141 *areap32 = SDL_SwapBE32(value); 142 } 143 144 Uint32 SDLNet_Read32(void* areap) 145 { 146 Uint32* areap32 = cast(Uint32*)areap; 147 return SDL_SwapBE32(*areap32); 148 } 149 150 extern(C) 151 { 152 alias CSDLVERPTR function() da_SDLNet_Linked_Version; 153 alias int function() da_SDLNet_Init; 154 alias void function() da_SDLNet_Quit; 155 alias int function(IPaddress*, in char*, Uint16) da_SDLNet_ResolveHost; 156 alias CCPTR function(IPaddress*) da_SDLNet_ResolveIP; 157 alias TCPsocket function(IPaddress*) da_SDLNet_TCP_Open; 158 alias TCPsocket function(TCPsocket) da_SDLNet_TCP_Accept; 159 alias IPaddress* function(TCPsocket) da_SDLNet_TCP_GetPeerAddress; 160 alias int function(TCPsocket,in void*,int) da_SDLNet_TCP_Send; 161 alias int function(TCPsocket,void*,int) da_SDLNet_TCP_Recv; 162 alias void function(TCPsocket) da_SDLNet_TCP_Close; 163 alias UDPpacket* function(int) da_SDLNet_AllocPacket; 164 alias int function(UDPpacket*) da_SDLNet_ResizePacket; 165 alias void function(UDPpacket*) da_SDLNet_FreePacket; 166 alias UDPpacket** function(int,int) da_SDLNet_AllocPacketV; 167 alias void function(UDPpacket**) da_SDLNet_FreePacketV; 168 alias UDPsocket function(Uint16) da_SDLNet_UDP_Open; 169 alias int function(UDPsocket,int,IPaddress*) da_SDLNet_UDP_Bind; 170 alias void function(UDPsocket,int) da_SDLNet_UDP_Unbind; 171 alias IPaddress* function(UDPsocket,int) da_SDLNet_UDP_GetPeerAddress; 172 alias int function(UDPsocket,UDPpacket**,int) da_SDLNet_UDP_SendV; 173 alias int function(UDPsocket,int,UDPpacket*) da_SDLNet_UDP_Send; 174 alias int function(UDPsocket,UDPpacket**) da_SDLNet_UDP_RecvV; 175 alias int function(UDPsocket,UDPpacket*) da_SDLNet_UDP_Recv; 176 alias void function(UDPsocket) da_SDLNet_UDP_Close; 177 alias SDLNet_SocketSet function(int) da_SDLNet_AllocSocketSet; 178 alias int function(SDLNet_SocketSet,SDLNet_GenericSocket) da_SDLNet_AddSocket; 179 alias int function(SDLNet_SocketSet,SDLNet_GenericSocket) da_SDLNet_DelSocket; 180 alias int function(SDLNet_SocketSet,Uint32) da_SDLNet_CheckSockets; 181 alias void function(SDLNet_SocketSet) da_SDLNet_FreeSocketSet; 182 } 183 184 mixin(gsharedString!() ~ 185 " 186 da_SDLNet_Linked_Version SDLNet_Linked_Version; 187 da_SDLNet_Init SDLNet_Init; 188 da_SDLNet_Quit SDLNet_Quit; 189 da_SDLNet_ResolveHost SDLNet_ResolveHost; 190 da_SDLNet_ResolveIP SDLNet_ResolveIP; 191 da_SDLNet_TCP_Open SDLNet_TCP_Open; 192 da_SDLNet_TCP_Accept SDLNet_TCP_Accept; 193 da_SDLNet_TCP_GetPeerAddress SDLNet_TCP_GetPeerAddress; 194 da_SDLNet_TCP_Send SDLNet_TCP_Send; 195 da_SDLNet_TCP_Recv SDLNet_TCP_Recv; 196 da_SDLNet_TCP_Close SDLNet_TCP_Close; 197 da_SDLNet_AllocPacket SDLNet_AllocPacket; 198 da_SDLNet_ResizePacket SDLNet_ResizePacket; 199 da_SDLNet_FreePacket SDLNet_FreePacket; 200 da_SDLNet_AllocPacketV SDLNet_AllocPacketV; 201 da_SDLNet_FreePacketV SDLNet_FreePacketV; 202 da_SDLNet_UDP_Open SDLNet_UDP_Open; 203 da_SDLNet_UDP_Bind SDLNet_UDP_Bind; 204 da_SDLNet_UDP_Unbind SDLNet_UDP_Unbind; 205 da_SDLNet_UDP_GetPeerAddress SDLNet_UDP_GetPeerAddress; 206 da_SDLNet_UDP_SendV SDLNet_UDP_SendV; 207 da_SDLNet_UDP_Send SDLNet_UDP_Send; 208 da_SDLNet_UDP_RecvV SDLNet_UDP_RecvV; 209 da_SDLNet_UDP_Recv SDLNet_UDP_Recv; 210 da_SDLNet_UDP_Close SDLNet_UDP_Close; 211 da_SDLNet_AllocSocketSet SDLNet_AllocSocketSet; 212 da_SDLNet_AddSocket SDLNet_AddSocket; 213 da_SDLNet_DelSocket SDLNet_DelSocket; 214 da_SDLNet_CheckSockets SDLNet_CheckSockets; 215 da_SDLNet_FreeSocketSet SDLNet_FreeSocketSet; 216 "); 217 218 class DerelictSDLNetLoader : SharedLibLoader 219 { 220 public: 221 this() 222 { 223 super( 224 "SDL_net.dll", 225 "libSDL_net.so, libSDL_net-1.2.so, libSDL_net-1.2.so.0", 226 "../Frameworks/SDL_net.framework/SDL_net, /Library/Frameworks/SDL_net.framework/SDL_net, /System/Library/Frameworks/SDL_net.framework/SDL_net" 227 ); 228 } 229 230 protected: 231 override void loadSymbols() 232 { 233 if(!DerelictSDL.isLoaded) 234 { 235 throw new SharedLibLoadException("DerelictSDL must be loaded before attempting to load DerelictSDLNet!"); 236 } 237 238 bindFunc(cast(void**)&SDLNet_Linked_Version, "SDLNet_Linked_Version"); 239 bindFunc(cast(void**)&SDLNet_Init, "SDLNet_Init"); 240 bindFunc(cast(void**)&SDLNet_Quit, "SDLNet_Quit"); 241 bindFunc(cast(void**)&SDLNet_ResolveHost, "SDLNet_ResolveHost"); 242 bindFunc(cast(void**)&SDLNet_ResolveIP, "SDLNet_ResolveIP"); 243 bindFunc(cast(void**)&SDLNet_TCP_Open, "SDLNet_TCP_Open"); 244 bindFunc(cast(void**)&SDLNet_TCP_Accept, "SDLNet_TCP_Accept"); 245 bindFunc(cast(void**)&SDLNet_TCP_GetPeerAddress, "SDLNet_TCP_GetPeerAddress"); 246 bindFunc(cast(void**)&SDLNet_TCP_Send, "SDLNet_TCP_Send"); 247 bindFunc(cast(void**)&SDLNet_TCP_Recv, "SDLNet_TCP_Recv"); 248 bindFunc(cast(void**)&SDLNet_TCP_Close, "SDLNet_TCP_Close"); 249 bindFunc(cast(void**)&SDLNet_AllocPacket, "SDLNet_AllocPacket"); 250 bindFunc(cast(void**)&SDLNet_ResizePacket, "SDLNet_ResizePacket"); 251 bindFunc(cast(void**)&SDLNet_FreePacket, "SDLNet_FreePacket"); 252 bindFunc(cast(void**)&SDLNet_AllocPacketV, "SDLNet_AllocPacketV"); 253 bindFunc(cast(void**)&SDLNet_FreePacketV, "SDLNet_FreePacketV"); 254 bindFunc(cast(void**)&SDLNet_UDP_Open, "SDLNet_UDP_Open"); 255 bindFunc(cast(void**)&SDLNet_UDP_Bind, "SDLNet_UDP_Bind"); 256 bindFunc(cast(void**)&SDLNet_UDP_Unbind, "SDLNet_UDP_Unbind"); 257 bindFunc(cast(void**)&SDLNet_UDP_GetPeerAddress, "SDLNet_UDP_GetPeerAddress"); 258 bindFunc(cast(void**)&SDLNet_UDP_SendV, "SDLNet_UDP_SendV"); 259 bindFunc(cast(void**)&SDLNet_UDP_Send, "SDLNet_UDP_Send"); 260 bindFunc(cast(void**)&SDLNet_UDP_RecvV, "SDLNet_UDP_RecvV"); 261 bindFunc(cast(void**)&SDLNet_UDP_Recv, "SDLNet_UDP_Recv"); 262 bindFunc(cast(void**)&SDLNet_UDP_Close, "SDLNet_UDP_Close"); 263 bindFunc(cast(void**)&SDLNet_AllocSocketSet, "SDLNet_AllocSocketSet"); 264 bindFunc(cast(void**)&SDLNet_AddSocket, "SDLNet_AddSocket"); 265 bindFunc(cast(void**)&SDLNet_DelSocket, "SDLNet_DelSocket"); 266 bindFunc(cast(void**)&SDLNet_CheckSockets, "SDLNet_CheckSockets"); 267 bindFunc(cast(void**)&SDLNet_FreeSocketSet, "SDLNet_FreeSocketSet"); 268 } 269 } 270 271 DerelictSDLNetLoader DerelictSDLNet; 272 273 static this() 274 { 275 DerelictSDLNet = new DerelictSDLNetLoader(); 276 } 277 278 static ~this() 279 { 280 if(SharedLibLoader.isAutoUnloadEnabled()) 281 DerelictSDLNet.unload(); 282 }