177 lines
3.9 KiB
C++
177 lines
3.9 KiB
C++
#include <windows.h>
|
|
#include <stdio.h>
|
|
#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;
|
|
};
|