Repository navigation
Expand file tree
/
Copy pathwolioclinerecv.cpp
More file actions
137 lines (112 loc) · 2.63 KB
/
Copy pathwolioclinerecv.cpp
File metadata and controls
137 lines (112 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#define WIN32_LEAN_AND_MEAN
#include <wio.h>
#ifdef _MSC_VER
#pragma comment(lib, "kernel32")
#endif
//-- wio.h definitions
//--------------- SafeSend(), LineRecv(), BufRecv() and BufSend() functions are
//--------------- used for I/O on overlapped streams such as sockets, comm
//--------------- devices or named pipes.
/* Read a line from a file or device. It first tries non-overlapped read in
* the device is a file and the read operation should start from the current
* position. If non-overlapped read is not supported, such as communication
* port or socket it tries overlapped read.
* Returns the number of characters written in buffer. The newline character is
* not included in the buffer or in the return value, but is received from the
* stream.
* If zero is returned, GetLastError() will return an error code if an error
* occured or ERROR_SUCCESS if just a blank line was received.
*/
EXTERN_C DWORD
LineRecv(HANDLE h, LPSTR pBuf, DWORD dwBufSize, DWORD dwTimeout)
{
WOverlappedIOC ol;
if (!ol)
return 0;
return ol.LineRecv(h, pBuf, dwBufSize, dwTimeout);
}
DWORD
WOverlappedIOC::LineRecv(HANDLE h, LPSTR pBuf, DWORD dwBufSize,
DWORD dwTimeout)
{
if (dwBufSize < (sizeof(CHAR)*2))
return 0;
bool bGood = true;
DWORD dwLen = 0;
for (LPSTR ptr = pBuf; dwLen < dwBufSize - (sizeof(CHAR)*2); )
{
DWORD dwReadLen;
if (!ReadFile(h, ptr, sizeof CHAR, &dwReadLen, NULL))
{
bGood = false;
break;
}
if (dwReadLen != sizeof CHAR)
{
bGood = false;
SetLastError(ERROR_HANDLE_EOF);
break;
}
if (ptr[0] == '\r')
continue;
if (ptr[0] == '\n')
break;
dwLen ++;
ptr ++;
}
if (bGood && (dwLen == 0))
SetLastError(ERROR_SUCCESS);
if (bGood)
{
pBuf[dwLen] = '\x00';
return dwLen;
}
switch (GetLastError())
{
case ERROR_HANDLE_EOF:
pBuf[dwLen] = '\x00';
return dwLen;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_FUNCTION:
break;
default:
return 0;
}
dwLen = 0;
bGood = true;
for (char *ptr = pBuf; dwLen < dwBufSize - (sizeof(CHAR)*2); )
{
if (!Read(h, ptr, sizeof(CHAR)))
{
bGood = false;
break;
}
if (!Wait(dwTimeout))
{
bGood = false;
break;
}
DWORD dwReadLen;
if (!GetResult(&dwReadLen))
{
bGood = false;
break;
}
if (dwReadLen != sizeof(CHAR))
{
bGood = false;
SetLastError(ERROR_HANDLE_EOF);
break;
}
if (ptr[0] == '\r')
continue;
if (ptr[0] == '\n')
break;
dwLen ++;
ptr ++;
}
if (bGood & (dwLen == 0))
SetLastError(ERROR_SUCCESS);
pBuf[dwLen] = '\x00';
return dwLen;
}