2018-07-30 04:40:03 +00:00
|
|
|
#pragma noroot
|
|
|
|
|
|
|
|
#include "readtcp.h"
|
|
|
|
#include "session.h"
|
|
|
|
#include <tcpip.h>
|
2018-08-16 02:05:09 +00:00
|
|
|
#include <misctool.h>
|
2018-07-30 04:40:03 +00:00
|
|
|
#include <orca.h>
|
|
|
|
|
|
|
|
#define buffTypePointer 0x0000 /* For TCPIPReadTCP() */
|
|
|
|
#define buffTypeHandle 0x0001
|
|
|
|
#define buffTypeNewHandle 0x0002
|
|
|
|
|
2018-08-16 02:05:09 +00:00
|
|
|
/* Time out if no new data is received for this long */
|
|
|
|
#define READ_TIMEOUT 15 /* seconds */
|
|
|
|
|
2018-07-30 04:40:03 +00:00
|
|
|
void InitReadTCP(Session *sess, LongWord readCount, void *readPtr) {
|
|
|
|
sess->readCount = readCount;
|
|
|
|
sess->readPtr = readPtr;
|
2018-08-16 02:05:09 +00:00
|
|
|
sess->lastReadTime = GetTick();
|
2018-07-30 04:40:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ReadStatus TryReadTCP(Session *sess) {
|
|
|
|
rrBuff rrBuff;
|
|
|
|
|
|
|
|
TCPIPPoll();
|
|
|
|
sess->tcperr = TCPIPReadTCP(sess->ipid, buffTypePointer, (Ref)sess->readPtr,
|
|
|
|
sess->readCount, &rrBuff);
|
|
|
|
sess->toolerr = toolerror();
|
|
|
|
if (sess->tcperr || sess->toolerr) {
|
|
|
|
return rsError;
|
|
|
|
}
|
|
|
|
|
|
|
|
sess->readCount -= rrBuff.rrBuffCount;
|
|
|
|
sess->readPtr += rrBuff.rrBuffCount;
|
|
|
|
|
|
|
|
if (sess->readCount == 0) {
|
|
|
|
return rsDone;
|
|
|
|
} else {
|
2018-08-16 02:05:09 +00:00
|
|
|
if (rrBuff.rrBuffCount != 0) {
|
|
|
|
sess->lastReadTime = GetTick();
|
|
|
|
} else if (GetTick() - sess->lastReadTime > READ_TIMEOUT * 60) {
|
|
|
|
return rsTimedOut;
|
|
|
|
}
|
|
|
|
|
2018-07-30 04:40:03 +00:00
|
|
|
return rsWaiting;
|
|
|
|
}
|
|
|
|
}
|