| 87 | } |
| 88 | |
| 89 | int CNetworkClient::Recv(char *pLine, int MaxLength) |
| 90 | { |
| 91 | if(State() == NET_CONNSTATE_ONLINE) |
| 92 | { |
| 93 | if(m_BufferOffset) |
| 94 | { |
| 95 | // find message start |
| 96 | int StartOffset = 0; |
| 97 | while(m_aBuffer[StartOffset] == '\r' || m_aBuffer[StartOffset] == '\n') |
| 98 | { |
| 99 | // detect clients line ending format |
| 100 | if(!m_LineEndingDetected) |
| 101 | { |
| 102 | m_aLineEnding[0] = m_aBuffer[StartOffset]; |
| 103 | if(StartOffset+1 < m_BufferOffset && (m_aBuffer[StartOffset+1] == '\r' || m_aBuffer[StartOffset+1] == '\n') && |
| 104 | m_aBuffer[StartOffset] != m_aBuffer[StartOffset+1]) |
| 105 | m_aLineEnding[1] = m_aBuffer[StartOffset+1]; |
| 106 | m_LineEndingDetected = true; |
| 107 | } |
| 108 | |
| 109 | if(++StartOffset >= m_BufferOffset) |
| 110 | { |
| 111 | m_BufferOffset = 0; |
| 112 | return 0; |
| 113 | } |
| 114 | } |
| 115 | |
| 116 | // find message end |
| 117 | int EndOffset = StartOffset; |
| 118 | while(m_aBuffer[EndOffset] != '\r' && m_aBuffer[EndOffset] != '\n') |
| 119 | { |
| 120 | if(++EndOffset >= m_BufferOffset) |
| 121 | { |
| 122 | if(StartOffset > 0) |
| 123 | { |
| 124 | mem_move(m_aBuffer, m_aBuffer+StartOffset, m_BufferOffset-StartOffset); |
| 125 | m_BufferOffset -= StartOffset; |
| 126 | } |
| 127 | return 0; |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | // extract message and update buffer |
| 132 | if(MaxLength-1 < EndOffset-StartOffset) |
| 133 | { |
| 134 | if(StartOffset > 0) |
| 135 | { |
| 136 | mem_move(m_aBuffer, m_aBuffer+StartOffset, m_BufferOffset-StartOffset); |
| 137 | m_BufferOffset -= StartOffset; |
| 138 | } |
| 139 | return 0; |
| 140 | } |
| 141 | mem_copy(pLine, m_aBuffer+StartOffset, EndOffset-StartOffset); |
| 142 | pLine[EndOffset-StartOffset] = 0; |
| 143 | str_sanitize_cc(pLine); |
| 144 | mem_move(m_aBuffer, m_aBuffer+EndOffset, m_BufferOffset-EndOffset); |
| 145 | m_BufferOffset -= EndOffset; |
| 146 | return 1; |
nothing calls this directly
no test coverage detected