summaryrefslogtreecommitdiff
path: root/src/network/core/core.cpp
diff options
context:
space:
mode:
authorKUDr <kudr@openttd.org>2007-01-10 18:12:09 +0000
committerKUDr <kudr@openttd.org>2007-01-10 18:12:09 +0000
commite373ea7096c741a8189f7a480863fd21dd6f6be1 (patch)
treed9abc3d9810159441bed9f82a52bd1ee52d770dd /src/network/core/core.cpp
parent001d858b528d78743deaf7dcea46ea8f0736bad9 (diff)
downloadopenttd-e373ea7096c741a8189f7a480863fd21dd6f6be1.tar.xz
(svn r8033) [cpp] - Prepare for merge from branches/cpp (all .c files renamed to .cpp)
Diffstat (limited to 'src/network/core/core.cpp')
-rw-r--r--src/network/core/core.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/network/core/core.cpp b/src/network/core/core.cpp
new file mode 100644
index 000000000..ca953e5f0
--- /dev/null
+++ b/src/network/core/core.cpp
@@ -0,0 +1,86 @@
+/* $Id$ */
+
+#ifdef ENABLE_NETWORK
+
+#include "../../stdafx.h"
+#include "../../debug.h"
+#include "os_abstraction.h"
+
+#ifdef __MORPHOS__
+/* the library base is required here */
+struct Library *SocketBase = NULL;
+#endif
+
+/**
+ * Initializes the network core (as that is needed for some platforms
+ */
+bool NetworkCoreInitialize(void)
+{
+#if defined(__MORPHOS__) || defined(__AMIGA__)
+ /*
+ * IMPORTANT NOTE: SocketBase needs to be initialized before we use _any_
+ * network related function, else: crash.
+ */
+ DEBUG(net, 3, "[core] loading bsd socket library");
+ SocketBase = OpenLibrary("bsdsocket.library", 4);
+ if (SocketBase == NULL) {
+ DEBUG(net, 0, "[core] can't open bsdsocket.library version 4, network unavailable");
+ return false;
+ }
+
+#if defined(__AMIGA__)
+ /* for usleep() implementation (only required for legacy AmigaOS builds) */
+ TimerPort = CreateMsgPort();
+ if (TimerPort != NULL) {
+ TimerRequest = (struct timerequest*)CreateIORequest(TimerPort, sizeof(struct timerequest);
+ if (TimerRequest != NULL) {
+ if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest*)TimerRequest, 0) == 0) {
+ TimerBase = TimerRequest->tr_node.io_Device;
+ if (TimerBase == NULL) {
+ /* free ressources... */
+ DEBUG(net, 0, "[core] can't initialize timer, network unavailable");
+ return false;
+ }
+ }
+ }
+ }
+#endif // __AMIGA__
+#endif // __MORPHOS__ / __AMIGA__
+
+/* Let's load the network in windows */
+#ifdef WIN32
+ {
+ WSADATA wsa;
+ DEBUG(net, 3, "[core] loading windows socket library");
+ if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) {
+ DEBUG(net, 0, "[core] WSAStartup failed, network unavailable");
+ return false;
+ }
+ }
+#endif /* WIN32 */
+
+ return true;
+}
+
+/**
+ * Shuts down the network core (as that is needed for some platforms
+ */
+void NetworkCoreShutdown(void)
+{
+#if defined(__MORPHOS__) || defined(__AMIGA__)
+ /* free allocated resources */
+#if defined(__AMIGA__)
+ if (TimerBase != NULL) CloseDevice((struct IORequest*)TimerRequest); // XXX This smells wrong
+ if (TimerRequest != NULL) DeleteIORequest(TimerRequest);
+ if (TimerPort != NULL) DeleteMsgPort(TimerPort);
+#endif
+
+ if (SocketBase != NULL) CloseLibrary(SocketBase);
+#endif
+
+#if defined(WIN32)
+ WSACleanup();
+#endif
+}
+
+#endif /* ENABLE_NETWORK */