JD2022-TU1/main/extern/Camcam/LIBS/Net/NET_PacHis.cpp

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;
};