# core.cpp

Go to the documentation of this file.

    00001 /* $Id: core.cpp 15053 2009-01-13 11:53:33Z rubidium $ */
    00002
    00007 #ifdef ENABLE_NETWORK
    00008
    00009 #include "../../stdafx.h"
    00010 #include "../../debug.h"
    00011 #include "os_abstraction.h"
    00012 #include "core.h"
    00013 #include "packet.h"
    00014
    00015
    00016 #ifdef __MORPHOS__
    00017 /* the library base is required here */
    00018 struct Library *SocketBase = NULL;
    00019 #endif
    00020
    00025 bool NetworkCoreInitialize()
    00026 {
    00027 #if defined(__MORPHOS__) || defined(__AMIGA__)
    00028   /*
    00029    *  IMPORTANT NOTE: SocketBase needs to be initialized before we use _any_
    00030    *  network related function, else: crash.
    00031    */
    00032   DEBUG(net, 3, "[core] loading bsd socket library");
    00033   SocketBase = OpenLibrary("bsdsocket.library", 4);
    00034   if (SocketBase == NULL) {
    00035     DEBUG(net, 0, "[core] can't open bsdsocket.library version 4, network unavailable");
    00036     return false;
    00037   }
    00038
    00039 #if defined(__AMIGA__)
    00040   /* for usleep() implementation (only required for legacy AmigaOS builds) */
    00041   TimerPort = CreateMsgPort();
    00042   if (TimerPort != NULL) {
    00043     TimerRequest = (struct timerequest*)CreateIORequest(TimerPort, sizeof(struct timerequest);
    00044     if (TimerRequest != NULL) {
    00045       if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest*)TimerRequest, 0) == 0) {
    00046         TimerBase = TimerRequest->tr_node.io_Device;
    00047         if (TimerBase == NULL) {
    00048           /* free ressources... */
    00049           DEBUG(net, 0, "[core] can't initialize timer, network unavailable");
    00050           return false;
    00051         }
    00052       }
    00053     }
    00054   }
    00055 #endif // __AMIGA__
    00056 #endif // __MORPHOS__ / __AMIGA__
    00057
    00058 /* Let's load the network in windows */
    00059 #ifdef WIN32
    00060   {
    00061     WSADATA wsa;
    00062     DEBUG(net, 3, "[core] loading windows socket library");
    00063     if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) {
    00064       DEBUG(net, 0, "[core] WSAStartup failed, network unavailable");
    00065       return false;
    00066     }
    00067   }
    00068 #endif /* WIN32 */
    00069
    00070   return true;
    00071 }
    00072
    00076 void NetworkCoreShutdown()
    00077 {
    00078 #if defined(__MORPHOS__) || defined(__AMIGA__)
    00079   /* free allocated resources */
    00080 #if defined(__AMIGA__)
    00081   if (TimerBase    != NULL) CloseDevice((struct IORequest*)TimerRequest); // XXX This smells wrong
    00082   if (TimerRequest != NULL) DeleteIORequest(TimerRequest);
    00083   if (TimerPort    != NULL) DeleteMsgPort(TimerPort);
    00084 #endif
    00085
    00086   if (SocketBase != NULL) CloseLibrary(SocketBase);
    00087 #endif
    00088
    00089 #if defined(WIN32)
    00090   WSACleanup();
    00091 #endif
    00092 }
    00093
    00094
    00100 void NetworkSocketHandler::Send_GRFIdentifier(Packet *p, const GRFIdentifier *grf)
    00101 {
    00102   uint j;
    00103   p->Send_uint32(grf->grfid);
    00104   for (j = 0; j < sizeof(grf->md5sum); j++) {
    00105     p->Send_uint8 (grf->md5sum[j]);
    00106   }
    00107 }
    00108
    00114 void NetworkSocketHandler::Recv_GRFIdentifier(Packet *p, GRFIdentifier *grf)
    00115 {
    00116   uint j;
    00117   grf->grfid = p->Recv_uint32();
    00118   for (j = 0; j < sizeof(grf->md5sum); j++) {
    00119     grf->md5sum[j] = p->Recv_uint8();
    00120   }
    00121 }
    00122
    00123 #endif /* ENABLE_NETWORK */