aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/Platform.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/Platform.cpp')
-rw-r--r--src/libui_sdl/Platform.cpp261
1 files changed, 261 insertions, 0 deletions
diff --git a/src/libui_sdl/Platform.cpp b/src/libui_sdl/Platform.cpp
new file mode 100644
index 0000000..fbf0623
--- /dev/null
+++ b/src/libui_sdl/Platform.cpp
@@ -0,0 +1,261 @@
+/*
+ Copyright 2016-2017 StapleButter
+
+ This file is part of melonDS.
+
+ melonDS is free software: you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option)
+ any later version.
+
+ melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with melonDS. If not, see http://www.gnu.org/licenses/.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../Platform.h"
+#include "../Config.h"
+
+/*#ifdef __WXMSW__
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
+ #define socket_t SOCKET
+ #define sockaddr_t SOCKADDR
+ #define pcap_dev_name description
+#else
+ #include <unistd.h>
+ #include <arpa/inet.h>
+ #include <sys/socket.h>
+ #define socket_t int
+ #define sockaddr_t struct sockaddr
+ #define closesocket close
+ #define pcap_dev_name name
+#endif*/
+
+#ifndef INVALID_SOCKET
+#define INVALID_SOCKET (socket_t)-1
+#endif
+
+
+namespace Platform
+{
+
+
+/*class Thread : public wxThread
+{
+public:
+ Thread(void (*func)())
+ : wxThread(wxTHREAD_JOINABLE)
+ {
+ this->Func = func;
+ }
+
+ ~Thread() {}
+
+protected:
+ virtual ExitCode Entry()
+ {
+ Func();
+ return (ExitCode)0;
+ }
+
+private:
+ void (*Func)();
+};*/
+
+
+/*socket_t MPSocket;
+sockaddr_t MPSendAddr;
+u8 PacketBuffer[2048];
+
+#define NIFI_VER 1*/
+
+
+void* Thread_Create(void (*func)())
+{
+ /*Thread* ret = new Thread(func);
+ ret->Run();
+ return (void*)ret;*/
+ return NULL;
+}
+
+void Thread_Free(void* thread)
+{
+ //delete (Thread*)thread;
+}
+
+void Thread_Wait(void* thread)
+{
+ //((Thread*)thread)->Wait();
+}
+
+
+void* Semaphore_Create()
+{
+ //return (void*)new wxSemaphore();
+ return NULL;
+}
+
+void Semaphore_Free(void* sema)
+{
+ //delete (wxSemaphore*)sema;
+}
+
+void Semaphore_Reset(void* sema)
+{
+ //while (((wxSemaphore*)sema)->TryWait() == wxSEMA_NO_ERROR);
+}
+
+void Semaphore_Wait(void* sema)
+{
+ //((wxSemaphore*)sema)->Wait();
+}
+
+void Semaphore_Post(void* sema)
+{
+ //((wxSemaphore*)sema)->Post();
+}
+
+
+bool MP_Init()
+{
+ /*int opt_true = 1;
+ int res;
+
+#ifdef __WXMSW__
+ WSADATA wsadata;
+ if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
+ {
+ return false;
+ }
+#endif // __WXMSW__
+
+ MPSocket = socket(AF_INET, SOCK_DGRAM, 0);
+ if (MPSocket < 0)
+ {
+ return false;
+ }
+
+ res = setsockopt(MPSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt_true, sizeof(int));
+ if (res < 0)
+ {
+ closesocket(MPSocket);
+ MPSocket = INVALID_SOCKET;
+ return false;
+ }
+
+ sockaddr_t saddr;
+ saddr.sa_family = AF_INET;
+ *(u32*)&saddr.sa_data[2] = htonl(Config::SocketBindAnyAddr ? INADDR_ANY : INADDR_LOOPBACK);
+ *(u16*)&saddr.sa_data[0] = htons(7064);
+ res = bind(MPSocket, &saddr, sizeof(sockaddr_t));
+ if (res < 0)
+ {
+ closesocket(MPSocket);
+ MPSocket = INVALID_SOCKET;
+ return false;
+ }
+
+ res = setsockopt(MPSocket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt_true, sizeof(int));
+ if (res < 0)
+ {
+ closesocket(MPSocket);
+ MPSocket = INVALID_SOCKET;
+ return false;
+ }
+
+ MPSendAddr.sa_family = AF_INET;
+ *(u32*)&MPSendAddr.sa_data[2] = htonl(INADDR_BROADCAST);
+ *(u16*)&MPSendAddr.sa_data[0] = htons(7064);*/
+
+ return true;
+}
+
+void MP_DeInit()
+{
+ /*if (MPSocket >= 0)
+ closesocket(MPSocket);
+
+#ifdef __WXMSW__
+ WSACleanup();
+#endif // __WXMSW__*/
+}
+
+int MP_SendPacket(u8* data, int len)
+{
+ /*if (MPSocket < 0)
+ return 0;
+
+ if (len > 2048-8)
+ {
+ printf("MP_SendPacket: error: packet too long (%d)\n", len);
+ return 0;
+ }
+
+ *(u32*)&PacketBuffer[0] = htonl(0x4946494E); // NIFI
+ PacketBuffer[4] = NIFI_VER;
+ PacketBuffer[5] = 0;
+ *(u16*)&PacketBuffer[6] = htons(len);
+ memcpy(&PacketBuffer[8], data, len);
+
+ int slen = sendto(MPSocket, (const char*)PacketBuffer, len+8, 0, &MPSendAddr, sizeof(sockaddr_t));
+ if (slen < 8) return 0;
+ return slen - 8;*/
+ return 0;
+}
+
+int MP_RecvPacket(u8* data, bool block)
+{
+ /*if (MPSocket < 0)
+ return 0;
+
+ fd_set fd;
+ struct timeval tv;
+
+ FD_ZERO(&fd);
+ FD_SET(MPSocket, &fd);
+ tv.tv_sec = 0;
+ tv.tv_usec = block ? 5000 : 0;
+
+ if (!select(MPSocket+1, &fd, 0, 0, &tv))
+ {
+ return 0;
+ }
+
+ sockaddr_t fromAddr;
+ socklen_t fromLen = sizeof(sockaddr_t);
+ int rlen = recvfrom(MPSocket, (char*)PacketBuffer, 2048, 0, &fromAddr, &fromLen);
+ if (rlen < 8+24)
+ {
+ return 0;
+ }
+ rlen -= 8;
+
+ if (ntohl(*(u32*)&PacketBuffer[0]) != 0x4946494E)
+ {
+ return 0;
+ }
+
+ if (PacketBuffer[4] != NIFI_VER)
+ {
+ return 0;
+ }
+
+ if (ntohs(*(u16*)&PacketBuffer[6]) != rlen)
+ {
+ return 0;
+ }
+
+ memcpy(data, &PacketBuffer[8], rlen);
+ return rlen;*/
+ return 0;
+}
+
+
+}