core.cpp

Go to the documentation of this file.
00001 /* $Id: core.cpp 17693 2009-10-04 17:16:41Z rubidium $ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD 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, version 2.
00006  * OpenTTD 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.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00014 #ifdef ENABLE_NETWORK
00015 
00016 #include "../../stdafx.h"
00017 #include "../../debug.h"
00018 #include "packet.h"
00019 
00020 
00021 #ifdef __MORPHOS__
00022 /* the library base is required here */
00023 struct Library *SocketBase = NULL;
00024 #endif
00025 
00030 bool NetworkCoreInitialize()
00031 {
00032 #if defined(__MORPHOS__) || defined(__AMIGA__)
00033   /*
00034    *  IMPORTANT NOTE: SocketBase needs to be initialized before we use _any_
00035    *  network related function, else: crash.
00036    */
00037   DEBUG(net, 3, "[core] loading bsd socket library");
00038   SocketBase = OpenLibrary("bsdsocket.library", 4);
00039   if (SocketBase == NULL) {
00040     DEBUG(net, 0, "[core] can't open bsdsocket.library version 4, network unavailable");
00041     return false;
00042   }
00043 
00044 #if defined(__AMIGA__)
00045   /* for usleep() implementation (only required for legacy AmigaOS builds) */
00046   TimerPort = CreateMsgPort();
00047   if (TimerPort != NULL) {
00048     TimerRequest = (struct timerequest*)CreateIORequest(TimerPort, sizeof(struct timerequest);
00049     if (TimerRequest != NULL) {
00050       if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest*)TimerRequest, 0) == 0) {
00051         TimerBase = TimerRequest->tr_node.io_Device;
00052         if (TimerBase == NULL) {
00053           /* free ressources... */
00054           DEBUG(net, 0, "[core] can't initialize timer, network unavailable");
00055           return false;
00056         }
00057       }
00058     }
00059   }
00060 #endif /* __AMIGA__ */
00061 #endif /* __MORPHOS__ / __AMIGA__ */
00062 
00063 /* Let's load the network in windows */
00064 #ifdef WIN32
00065   {
00066     WSADATA wsa;
00067     DEBUG(net, 3, "[core] loading windows socket library");
00068     if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) {
00069       DEBUG(net, 0, "[core] WSAStartup failed, network unavailable");
00070       return false;
00071     }
00072   }
00073 #endif /* WIN32 */
00074 
00075   return true;
00076 }
00077 
00081 void NetworkCoreShutdown()
00082 {
00083 #if defined(__MORPHOS__) || defined(__AMIGA__)
00084   /* free allocated resources */
00085 #if defined(__AMIGA__)
00086   if (TimerBase    != NULL) CloseDevice((struct IORequest*)TimerRequest); // XXX This smells wrong
00087   if (TimerRequest != NULL) DeleteIORequest(TimerRequest);
00088   if (TimerPort    != NULL) DeleteMsgPort(TimerPort);
00089 #endif
00090 
00091   if (SocketBase != NULL) CloseLibrary(SocketBase);
00092 #endif
00093 
00094 #if defined(WIN32)
00095   WSACleanup();
00096 #endif
00097 }
00098 
00099 
00105 void NetworkSocketHandler::Send_GRFIdentifier(Packet *p, const GRFIdentifier *grf)
00106 {
00107   uint j;
00108   p->Send_uint32(grf->grfid);
00109   for (j = 0; j < sizeof(grf->md5sum); j++) {
00110     p->Send_uint8 (grf->md5sum[j]);
00111   }
00112 }
00113 
00119 void NetworkSocketHandler::Recv_GRFIdentifier(Packet *p, GRFIdentifier *grf)
00120 {
00121   uint j;
00122   grf->grfid = p->Recv_uint32();
00123   for (j = 0; j < sizeof(grf->md5sum); j++) {
00124     grf->md5sum[j] = p->Recv_uint8();
00125   }
00126 }
00127 
00128 #endif /* ENABLE_NETWORK */

Generated on Tue Jan 5 21:02:55 2010 for OpenTTD by  doxygen 1.5.6