| 136 | } |
| 137 | |
| 138 | bool CServerSocket::ProcessPacket(const uint8_t* packet, uint32 size, int8 opcode) |
| 139 | { |
| 140 | try { |
| 141 | AddDebugLogLineN( logServer, "Processing Server Packet: " ); |
| 142 | |
| 143 | switch(opcode) { |
| 144 | case OP_SERVERMESSAGE: { |
| 145 | /* Kry import of lugdunum 16.40 new features */ |
| 146 | AddDebugLogLineN( logServer, "Server: OP_SERVERMESSAGE" ); |
| 147 | |
| 148 | if (size < 3) { |
| 149 | throw wxString("Corrupt or invalid server message received (size too small)"); |
| 150 | } |
| 151 | |
| 152 | theStats::AddDownOverheadServer(size); |
| 153 | char* buffer = new char[size-1]; |
| 154 | memcpy(buffer,&packet[2],size-2); |
| 155 | buffer[size-2] = 0; |
| 156 | |
| 157 | wxString strMessages(char2unicode(buffer)); |
| 158 | |
| 159 | delete[] buffer; |
| 160 | |
| 161 | // 16.40 servers do not send separate OP_SERVERMESSAGE packets for each line; |
| 162 | // instead of this they are sending all text lines with one OP_SERVERMESSAGE packet. |
| 163 | |
| 164 | wxStringTokenizer token(strMessages,"\r\n",wxTOKEN_DEFAULT ); |
| 165 | |
| 166 | while (token.HasMoreTokens()) { |
| 167 | wxString message = token.GetNextToken(); |
| 168 | |
| 169 | bool bOutputMessage = true; |
| 170 | if (message.StartsWith("server version")) { |
| 171 | wxString strVer = message.Mid(15,64); // truncate string to avoid misuse by servers in showing ads |
| 172 | strVer.Trim(); |
| 173 | CServer* eserver = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); |
| 174 | if (eserver) { |
| 175 | eserver->SetVersion(strVer); |
| 176 | Notify_ServerRefresh(eserver); |
| 177 | } |
| 178 | } else if (message.StartsWith("ERROR")) { |
| 179 | CServer* pServer = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); |
| 180 | wxString servername; |
| 181 | if (pServer) { |
| 182 | servername = pServer->GetListName(); |
| 183 | } else { |
| 184 | servername = _("Server"); |
| 185 | } |
| 186 | AddLogLineN(CFormat( _("ERROR: %s (%s) - %s") ) |
| 187 | % servername |
| 188 | % Uint32_16toStringIP_Port(cur_server->GetIP(), cur_server->GetPort()) |
| 189 | % message.Mid(5,message.Len()).Trim(" :")); |
| 190 | bOutputMessage = false; |
| 191 | |
| 192 | } else if (message.StartsWith("WARNING")) { |
| 193 | |
| 194 | CServer* pServer = theApp->serverlist->GetServerByAddress(cur_server->GetAddress(),cur_server->GetPort()); |
| 195 | wxString servername; |
nothing calls this directly
no test coverage detected