bool CProto::WriteDataByLocalIdentifier() { TRACE_FUN( Routine, "CProto::WriteDataByLocalIdentifier" ); bool ret( false ); ResetError(); _writeResultCode = wrcNotExecuted; l2max::CByteArray param; l2max::CBuffer paramStream( ¶m ); paramStream.open( l2max::CAbstractIODevice::omWriteOnly ); _abstractMode4->Serialize( paramStream ); l2max::CByteArray resp; if( ret = MakeTransaction( mECUFunc, param, resp ) ) { HAbstractMode4 abstractMode4Clone( _abstractMode4->clone() ); l2max::CBuffer respStream( &resp ); respStream.open( l2max::CAbstractIODevice::omReadOnly ); if( ret = abstractMode4Clone->Deserialize( respStream ) ) { if( *_abstractMode4 == *abstractMode4Clone ) { _writeResultCode = wrcAccept; } else { _writeResultCode = wrcReject; } } else { CAbstractProto::_errorCode = ecBinaryError; _errorCode = ecMode4Deserialization; } } return ret; }
bool CProto::ReadDataByLocalIdentifier() { TRACE_FUN( Routine, "CProto::ReadDataByLocalIdentifier" ); bool ret( false ); ResetError(); l2max::CByteArray param; l2max::CBuffer paramStream( ¶m ); paramStream << ( unsigned char )( 0x00 ); l2max::CByteArray resp; if( ret = MakeTransaction( mTransmitData, param, resp ) ) { l2max::CBuffer respStream( &resp ); respStream.open( l2max::CAbstractIODevice::omReadOnly ); if( ret = _abstractMode1Data0->Deserialize( respStream ) ) { if( !_abstractMode4.IsNull() ) { _abstractMode4->Synchronize(); } } else { CAbstractProto::_errorCode = ecBinaryError; _errorCode = ecMode1Data0Deserialization; } } return ret; }
void TcpConnection::handleRead(const boost::system::error_code& error) { std::cout << error.message() << std::endl; // if (error != 0) { // return; // } // std::cout << buf.size() << std::endl; // std::cout << std::string(buf.begin(), buf.end()) << std::endl; std::istream respStream(&response_); std::string msg(std::istreambuf_iterator<char>(respStream), {}); msg.erase(msg.end() - 1); std::cout << msg << std::endl; writer = std::unique_ptr<JsonWriter>(new JsonWriter()); try { auto reader = std::unique_ptr<JsonReader>(new JsonReader(msg)); Request request = reader->getRequest(); reader.reset(); auto response = dispatcher_.Invoke( request.getMethodName(), request.getParameters(), request.getId()); response.write(*writer.get()); } catch (const Fault& ex) { Response(ex.GetCode(), ex.GetString(), Value()).write(*writer.get()); } std::cout << writer->getData() << std::endl; boost::asio::async_write( socket, boost::asio::buffer(std::string(writer->getData())), boost::bind(&TcpConnection::handleWrite, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }
bool CDataStreamLayer::MakeTransaction( unsigned char aMode, const l2max::CByteArray& aParam, l2max::CByteArray& aResp ) { bool ret( false ); l2max::CByteArray req; l2max::CBuffer reqStream( &req ); reqStream << reqHeader( sizeof( aMode ) + aParam.size() ); reqStream << aMode; reqStream << aParam; reqStream << CDataStreamLayer::checkSum( req ); if( ret = _adapter.Write( req ) ) { l2max::CByteArray resp; resp.Resize( _maxResponseLength ); if( ret = _adapter.Read( resp ) ) { if( resp.size() ) { unsigned char checkSum( resp.back() ); resp.Pop_back(); if( checkSum != CDataStreamLayer::checkSum( resp ) ) { _errorCode = ecBinaryError; } if( _errorCode == ecNoError ) { l2max::CBuffer respStream( &resp ); unsigned char respEcuId( 0 ); unsigned char respMsgLength( 0 ); respStream >> respEcuId; respStream >> respMsgLength; if( respEcuId == ecuId() ) { l2max::CByteArray resp; respStream >> resp; if( resp.size() != decLength( respMsgLength ) ) { _errorCode = ecBinaryError; } if( _errorCode == ecNoError ) { l2max::CBuffer respStream( &resp ); unsigned char respMode( 0 ); respStream >> respMode; if( respMode == aMode ) { respStream >> aResp; } else {