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