Example #1
0
   bool CProto::WriteDataByLocalIdentifier()
   {
      TRACE_FUN( Routine, "CProto::WriteDataByLocalIdentifier" );

      bool ret( false );

      ResetError();

      _writeResultCode = wrcNotExecuted;

      l2max::CByteArray param;
      l2max::CBuffer paramStream( &param );

      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;
   }
Example #2
0
   bool CProto::ReadDataByLocalIdentifier()
   {
      TRACE_FUN( Routine, "CProto::ReadDataByLocalIdentifier" );

      bool ret( false );

      ResetError();

      l2max::CByteArray param;
      l2max::CBuffer paramStream( &param );

      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;
   }
Example #3
0
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
                            {