#include #include #include "NET.h" #ifdef NO_WORLD typedef struct { char *String; } CommandLine; typedef struct { CommandLine BatchExec[2048]; u32 ulNumberOfCommands; } CommandBatch; class WORLD { public: CommandBatch SceneScript_Ecluse; int SceneScript_ADD(CommandBatch *, char* data); }; #else #include "Scene.h" #endif void NET_Name::Shift(u32 ulShift , NET_IO *pForTrash) { if (ulShift > MAXBUFFERS_PER_NAME) ulShift = MAXBUFFERS_PER_NAME; while (ulShift--) { /* trash unreaded packets */ if (FIFO[Base]) { Number--; pForTrash->InputData.THREAD_STACK.Add(FIFO[Base]); FIFO[Base] = NULL; } Base ++; if (Base >= MAXBUFFERS_PER_NAME) Base = 0; } } void NET_Name::AddPacket(OneBuf *pBuf, NET_IO *pForTrash,WORLD *OwnerW) { /* Mutex must have been taken!!*/ s32 Ret; if (*((u32 *)pBuf->BufDATA) == 'LINK') { if(pBuf->Size == 4) { sprintf(ComputerName,"Unknown"); } if(pBuf->Size == 256 + 4) { memcpy(ComputerName,&pBuf->BufDATA[4],256); ComputerName[255] = 0; } /*pForTrash->InputData.THREAD_STACK.Add(pBuf); return; // Then trash it directos.*/ } if (*((u32 *)pBuf->BufDATA) == 'CODE') { OwnerW->SceneScript_ADD(&OwnerW->SceneScript_Ecluse,(char*)&pBuf->BufDATA[4]); } if (pBuf->PacketNumber < (u32)CurrentPacketNumber) { /* too old -> Trash It direct */ pForTrash->InputData.THREAD_STACK.Add(pBuf); return; } if (pBuf->PacketNumber >= (u32)CurrentPacketNumber + MAXBUFFERS_PER_NAME) { Shift(pBuf->PacketNumber - (CurrentPacketNumber + MAXBUFFERS_PER_NAME) , pForTrash); CurrentPacketNumber = pBuf->PacketNumber - MAXBUFFERS_PER_NAME; } s32 Index; Index = Base + pBuf->PacketNumber - CurrentPacketNumber; if (Index < 0) Index += MAXBUFFERS_PER_NAME; if (Index >= MAXBUFFERS_PER_NAME) Index -= MAXBUFFERS_PER_NAME; if (FIFO[Index]) { /* I receive two time the same packet !! */ /* I release it */ Number--; pForTrash->InputData.THREAD_STACK.Add(FIFO[Index]); } Number++; FIFO[Index] = pBuf; // PHI.SignifyPacketNumber(pBuf->PacketNumber); if (LatestPacketNumber < pBuf->PacketNumber) LatestPacketNumber = pBuf->PacketNumber; }; void NET_Name::Reset(NET_IO *pOwner) { u32 Counter; Counter = MAXBUFFERS_PER_NAME; while (Counter--) { if (FIFO[Counter]) { pOwner->InputData.THREAD_STACK.Add(FIFO[Counter]); Number--; } FIFO[Counter] = NULL; } memset(this,0,sizeof(*this)); pOwner->BuildHTable(); Number = 0; // PHI.reset(); } u32 NET_Name::GetNextPacket(OneBuf *pBuf /* == NULL mean must FLUSH !!*/, NET_IO *pForTrash) { if (!Number) return 0; /* Nothing to get */ u32 OldPN; DWORD MutexState; OldPN = CurrentPacketNumber; if (pBuf) { MutexState = WaitForSingleObject(pForTrash->InputData.AccesMutex, INFINITE); } if ((pBuf) && (FIFO[Base] == NULL)) { if ( /* These two line decide when to say a packet is not lost */ /* 1 -> If less than 8 packet have been received since AND */ (LatestPacketNumber - CurrentPacketNumber < 8) && /* 2 -> if We have waited less than 100 mls */ (timeGetTime() - LatestTimeReception < 100) ) { if (WAIT_OBJECT_0 == MutexState) ReleaseMutex(pForTrash->InputData.AccesMutex); return 0; /* Wait more... maybe the packet is not lost */ } } while (!FIFO[Base]) { Base++; LostPackets ++; if (Base >= MAXBUFFERS_PER_NAME) Base = 0; } GoodPackets ++; if (pBuf) memcpy(pBuf,FIFO[Base],sizeof(OneBuf)); CurrentPacketNumber = FIFO[Base]->PacketNumber; Number--; pForTrash->InputData.THREAD_STACK.Add(FIFO[Base]); /* Give the place to */ FIFO[Base] = NULL; Base++; CurrentPacketNumber++; if (Base >= MAXBUFFERS_PER_NAME) Base = 0; LatestTimeReception = timeGetTime(); if (pBuf) if (WAIT_OBJECT_0 == MutexState) ReleaseMutex(pForTrash->InputData.AccesMutex); if (LostPackets + GoodPackets > 100) { LostPackets >>= 1; GoodPackets >>= 1; } return 1; };