| 293 | } |
| 294 | |
| 295 | void CCppNetImpl::_ReadFunction(base::CMemSharePtr<CEventHandler>& event, uint32_t err) { |
| 296 | if (!event) { |
| 297 | base::LOG_WARN("event is null while read."); |
| 298 | return; |
| 299 | } |
| 300 | auto socket_ptr = event->_client_socket.Lock(); |
| 301 | uint64_t handle = socket_ptr->GetSocket(); |
| 302 | if (err & EVENT_CONNECT) { |
| 303 | // remote refuse connect |
| 304 | if (err & ERR_CONNECT_FAILED || err & ERR_CONNECT_CLOSE) { |
| 305 | err = CEC_CONNECT_REFUSE; |
| 306 | |
| 307 | } else { |
| 308 | err = CEC_SUCCESS; |
| 309 | |
| 310 | } |
| 311 | if (_connection_call_back) { |
| 312 | _connection_call_back(socket_ptr->_upper_sock, err); |
| 313 | } |
| 314 | |
| 315 | // start read |
| 316 | if (err == CEC_SUCCESS) { |
| 317 | socket_ptr->SyncRead(); |
| 318 | |
| 319 | } else { |
| 320 | std::unique_lock<std::mutex> lock(_mutex); |
| 321 | _socket_map.erase(socket_ptr->GetSocket()); |
| 322 | } |
| 323 | |
| 324 | } else if (err & EVENT_DISCONNECT) { |
| 325 | if (err & ERR_CONNECT_CLOSE) { |
| 326 | err = CEC_SUCCESS; |
| 327 | if (_disconnection_call_back) { |
| 328 | _disconnection_call_back(socket_ptr->_upper_sock, err); |
| 329 | } |
| 330 | std::unique_lock<std::mutex> lock(_mutex); |
| 331 | _socket_map.erase(socket_ptr->GetSocket()); |
| 332 | } |
| 333 | |
| 334 | } else if (err & EVENT_READ) { |
| 335 | if (err & ERR_CONNECT_CLOSE) { |
| 336 | err = CEC_CLOSED; |
| 337 | |
| 338 | } else if (err & ERR_CONNECT_BREAK) { |
| 339 | err = CEC_CONNECT_BREAK; |
| 340 | |
| 341 | } else if (err & ERR_TIME_OUT) { |
| 342 | err = CEC_TIMEOUT; |
| 343 | |
| 344 | } else { |
| 345 | err = CEC_SUCCESS; |
| 346 | } |
| 347 | |
| 348 | // call read back function |
| 349 | if (_read_call_back) { |
| 350 | _read_call_back(socket_ptr->_upper_sock, socket_ptr->_read_event->_buffer.Get(), socket_ptr->_read_event->_off_set, err); |
| 351 | } |
| 352 | |