From: Keith F. <ven...@us...> - 2002-01-16 06:52:25
|
Update of /cvsroot/planeshift/planeshift/src/client In directory usw-pr-cvs1:/tmp/cvs-serv4130 Modified Files: psconnection.h psconnection.cpp Log Message: Changed psConnection to run in own thread. Index: psconnection.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/client/psconnection.h,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** psconnection.h 2002/01/10 20:17:35 1.13 --- psconnection.h 2002/01/16 06:52:22 1.14 *************** *** 14,19 **** class psEngine; - // deactivated as this will be removed soon anyway - #if 0 class psConnection : public NetBase { --- 14,17 ---- *************** *** 22,38 **** virtual ~psConnection(); ! bool Connect(const char *server, int port = 1243); ! void DisConnect(); void run(); ! void chat(const char *blabla); ! ! bool SendMsg(MsgHeader *data, uint16_t size, bool important=true); protected: virtual Connection *getConnByIP (LPSOCKADDR_IN addr); virtual Connection *getConnByNum (int clientnum); ! virtual bool handleUnknownClient (LPSOCKADDR_IN addr, const void *data, unsigned int size); MsgQueue *inQueue; --- 20,36 ---- virtual ~psConnection(); ! bool Connect(const char *server, int port = 0); ! void Disconnect(); void run(); ! bool SendMsg(MsgEntry *data); + bool StartThread(); + protected: virtual Connection *getConnByIP (LPSOCKADDR_IN addr); virtual Connection *getConnByNum (int clientnum); ! virtual bool handleUnknownClient (LPSOCKADDR_IN addr, MsgEntry *data); MsgQueue *inQueue; *************** *** 40,45 **** psEngine *engine; }; - #endif #endif --- 38,53 ---- psEngine *engine; + + private: + /** this is the main thread function... special handling is needed because + * you can only pass void f(void*) functions as thread not member + * functions, so the arg of the function passes a pointer to the class + * itself... This all is done by the startThread function while this + * functions runs the main loop of the thread + */ + static void task_proc thread_main(void *); + + task *tptr; }; #endif Index: psconnection.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/client/psconnection.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** psconnection.cpp 2002/01/10 20:17:35 1.25 --- psconnection.cpp 2002/01/16 06:52:22 1.26 *************** *** 16,20 **** #include "psengine.h" ! #if 0 psConnection::psConnection(psEngine *e) : NetBase(500) --- 16,20 ---- #include "psengine.h" ! psConnection::psConnection(psEngine *e) : NetBase(500) *************** *** 23,32 **** } psConnection::~psConnection() { } - // wait up to 3 seconds - #define TIMEOUT 30 bool psConnection::Connect(const char *servaddr, int port) --- 23,31 ---- } + psConnection::~psConnection() { } bool psConnection::Connect(const char *servaddr, int port) *************** *** 36,40 **** // Set Up a Socket if (!Init()) ! return false; server = new Connection; --- 35,39 ---- // Set Up a Socket if (!Init()) ! return false; server = new Connection; *************** *** 43,96 **** err = getIPByName (&server->addr, servaddr); if (err) - return err; - - // try contacting server... - // prepare a client join packet - MsgHeader *h=new MsgHeader; - h->type=0; - h->fnum=1; - h->size=0; - SendMsg(h, sizeof(MsgHeader)); - SendOut(); - - // add out own Message Queue - inQueue=new MsgQueue(50); - if (AddMsgQueue(inQueue)) - { - delete inQueue; - ERRORHALT ("Konnte Queue nicht registrieren!"); - } - - // wait for server response... - for (int i=0;i<TIMEOUT;i++) { ! CheckIn(); ! if (!inQueue->IsEmpty()) ! break; ! ! task::sleep(100); } ! if (inQueue->IsEmpty()) ! { ! #ifdef DEBUG ! ERRORMSG("No server response!"); ! #endif ! return 1; ! } ! ! return 0; } ! bool psConnection::SendMsg(MsgHeader *data, uint16_t , bool ) { ! MsgEntry *me=new MsgEntry; ! ! me->clientnum=0; ! me->data = data; ! ! NetworkQueue->Add (me); ! delete me; ! return true; } --- 42,57 ---- err = getIPByName (&server->addr, servaddr); if (err) { ! delete server; ! server = NULL; ! return false; } ! return true; } ! bool psConnection::SendMsg(MsgEntry *msg) { ! NetworkQueue->Add (msg); return true; } *************** *** 118,183 **** } - bool psConnection::handleUnknownClient (LPSOCKADDR_IN , const void *, unsigned int) - { - ERRORMSG ("not implemented."); - return false; - } - void psConnection::run() { if (!ready) ! return; // NetBase run NetBase::Run(); ! // interpret packets ! while (!inQueue->IsEmpty()) ! { ! const MsgEntry *e=inQueue->Get(); ! #ifdef DEBUG ! if (!e) ! ERRORHALT ("this shouldn't happen !?!"); ! #endif ! const MsgHeader *mh=e->data; - // If it's the Chat Manager... - if (mh->type==113) { - if (mh->fnum==1) { - char *bla=new char[mh->size]; - strncpy (bla, (const char*) (mh+1), mh->size); ! // send text to Chat Window ! #if 0 ! if (strcmp(engine->GetCurrentInterface()->GetName(),"3D window") == 0) ! ((psw3D*)(engine->GetCurrentInterface()))->GetChatWindow()->AddText(bla); #endif ! ! printf ("C: %s\n", bla); ! } else { ! ERRORMSG("Unknow FNum"); ! } ! } else { ! ERRORMSG ("Unknown ObjID"); ! } ! } } ! void psConnection::chat(const char *blabla) { ! void *data = malloc (sizeof(MsgHeader)+strlen(blabla)+1); ! MsgHeader *mh=(MsgHeader *)data; ! char *strdata = (char *) (mh+1); ! mh->type=113; // ID of chat manager ! mh->fnum=1; // Function 1: chat ! mh->size=strlen(blabla)+1; ! strcpy (strdata,blabla); ! SendMsg (mh,mh->size+sizeof(MsgHeader)); } - #endif /*** Error Handling ***/ /** * Network Code need this error reporting functions... --- 79,128 ---- } void psConnection::run() { if (!ready) ! return; // NetBase run NetBase::Run(); + } ! bool psConnection::handleUnknownClient (LPSOCKADDR_IN addr, MsgEntry *data) ! { ! ERRORMSG ("not implemented."); ! return false; ! } ! bool psConnection::StartThread() ! { ! #ifdef DEBUG ! if (tptr) ! ERRORHALT("tried to create 2 client network threads"); #endif ! tptr = task::create (thread_main, (void*) this); ! if (!tptr) ! return false; ! return true; } ! void task_proc psConnection::thread_main(void *arg) { ! psConnection *This=(psConnection *) arg; ! while (1) ! { ! This->Run(); ! task::sleep(200); ! } } + + + + /*** Error Handling ***/ + /** * Network Code need this error reporting functions... |