rubidium@5523: /* $Id$ */ rubidium@5523: celestar@6121: /** celestar@6121: * @file core.cpp Functions used to initialize/shut down the core network celestar@6121: */ celestar@6121: rubidium@5523: #ifdef ENABLE_NETWORK rubidium@5523: rubidium@5523: #include "../../stdafx.h" rubidium@5526: #include "../../debug.h" rubidium@5523: #include "os_abstraction.h" rubidium@5870: #include "core.h" rubidium@5870: #include "packet.h" rubidium@5523: rubidium@5523: #ifdef __MORPHOS__ rubidium@5523: /* the library base is required here */ rubidium@5523: struct Library *SocketBase = NULL; rubidium@5523: #endif rubidium@5523: rubidium@5523: /** rubidium@5523: * Initializes the network core (as that is needed for some platforms rubidium@5864: * @return true if the core has been initialized, false otherwise rubidium@5523: */ rubidium@6247: bool NetworkCoreInitialize() rubidium@5523: { rubidium@5523: #if defined(__MORPHOS__) || defined(__AMIGA__) rubidium@5523: /* rubidium@5523: * IMPORTANT NOTE: SocketBase needs to be initialized before we use _any_ rubidium@5523: * network related function, else: crash. rubidium@5523: */ rubidium@5523: DEBUG(net, 3, "[core] loading bsd socket library"); rubidium@5523: SocketBase = OpenLibrary("bsdsocket.library", 4); rubidium@5523: if (SocketBase == NULL) { rubidium@5523: DEBUG(net, 0, "[core] can't open bsdsocket.library version 4, network unavailable"); rubidium@5524: return false; rubidium@5523: } rubidium@5523: rubidium@5523: #if defined(__AMIGA__) rubidium@5523: /* for usleep() implementation (only required for legacy AmigaOS builds) */ rubidium@5523: TimerPort = CreateMsgPort(); rubidium@5523: if (TimerPort != NULL) { rubidium@5523: TimerRequest = (struct timerequest*)CreateIORequest(TimerPort, sizeof(struct timerequest); rubidium@5523: if (TimerRequest != NULL) { rubidium@5523: if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest*)TimerRequest, 0) == 0) { rubidium@5523: TimerBase = TimerRequest->tr_node.io_Device; rubidium@5523: if (TimerBase == NULL) { rubidium@5524: /* free ressources... */ rubidium@5523: DEBUG(net, 0, "[core] can't initialize timer, network unavailable"); rubidium@5524: return false; rubidium@5523: } rubidium@5523: } rubidium@5523: } rubidium@5523: } rubidium@5523: #endif // __AMIGA__ rubidium@5523: #endif // __MORPHOS__ / __AMIGA__ rubidium@5523: rubidium@5523: /* Let's load the network in windows */ rubidium@5523: #ifdef WIN32 rubidium@5523: { rubidium@5523: WSADATA wsa; rubidium@5523: DEBUG(net, 3, "[core] loading windows socket library"); rubidium@5523: if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) { rubidium@5523: DEBUG(net, 0, "[core] WSAStartup failed, network unavailable"); rubidium@5524: return false; rubidium@5523: } rubidium@5523: } rubidium@5523: #endif /* WIN32 */ rubidium@5524: rubidium@5524: return true; rubidium@5523: } rubidium@5523: rubidium@5523: /** rubidium@5523: * Shuts down the network core (as that is needed for some platforms rubidium@5523: */ rubidium@6247: void NetworkCoreShutdown() rubidium@5523: { rubidium@5523: #if defined(__MORPHOS__) || defined(__AMIGA__) rubidium@5528: /* free allocated resources */ rubidium@5523: #if defined(__AMIGA__) rubidium@5523: if (TimerBase != NULL) CloseDevice((struct IORequest*)TimerRequest); // XXX This smells wrong rubidium@5523: if (TimerRequest != NULL) DeleteIORequest(TimerRequest); rubidium@5523: if (TimerPort != NULL) DeleteMsgPort(TimerPort); rubidium@5523: #endif rubidium@5523: rubidium@5523: if (SocketBase != NULL) CloseLibrary(SocketBase); rubidium@5523: #endif rubidium@5523: rubidium@5523: #if defined(WIN32) rubidium@5523: WSACleanup(); rubidium@5523: #endif rubidium@5523: } rubidium@5523: rubidium@5870: rubidium@5870: /** rubidium@5870: * Serializes the GRFIdentifier (GRF ID and MD5 checksum) to the packet rubidium@5870: * @param p the packet to write the data to rubidium@5870: * @param grf the GRFIdentifier to serialize rubidium@5870: */ rubidium@5870: void NetworkSocketHandler::Send_GRFIdentifier(Packet *p, const GRFIdentifier *grf) rubidium@5870: { rubidium@5870: uint j; rubidium@5900: p->Send_uint32(grf->grfid); rubidium@5870: for (j = 0; j < sizeof(grf->md5sum); j++) { rubidium@5900: p->Send_uint8 (grf->md5sum[j]); rubidium@5870: } rubidium@5870: } rubidium@5870: rubidium@5870: /** rubidium@5870: * Deserializes the GRFIdentifier (GRF ID and MD5 checksum) from the packet rubidium@5870: * @param p the packet to read the data from rubidium@5870: * @param grf the GRFIdentifier to deserialize rubidium@5870: */ rubidium@5870: void NetworkSocketHandler::Recv_GRFIdentifier(Packet *p, GRFIdentifier *grf) rubidium@5870: { rubidium@5870: uint j; rubidium@5900: grf->grfid = p->Recv_uint32(); rubidium@5870: for (j = 0; j < sizeof(grf->md5sum); j++) { rubidium@5900: grf->md5sum[j] = p->Recv_uint8(); rubidium@5870: } rubidium@5870: } rubidium@5870: rubidium@5523: #endif /* ENABLE_NETWORK */