X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Fio%2Frecord.cpp;h=268897d79e2cdf5626e3dca35a1a9bd5af28bb3f;hb=23987db96db7962a6ee58d1aeda2bd87780ca579;hp=4cc5b898bab50e377d71df9b8017cd2932a3dc91;hpb=156855b7e12c3a0254590da514b0d0e8efe469f4;p=cassiopeia.git diff --git a/src/io/record.cpp b/src/io/record.cpp index 4cc5b89..268897d 100644 --- a/src/io/record.cpp +++ b/src/io/record.cpp @@ -27,17 +27,18 @@ std::string toHexAndChecksum( const std::string& src ) { void sendCommand( RecordHeader& head, const std::string& data, std::shared_ptr bio ) { std::stringstream ss; ss << data.size(); - logger::debugf( "Record payload length: %s", ss.str() ); + logger::debugf( "Record payload length: %s", ss.str() ); size_t pos = 0; head.offset = 0; head.totalLength = data.size(); + do { - size_t toTransfer = std::min(static_cast(0xF000), data.size() - pos); + size_t toTransfer = std::min( static_cast( 0xF000 ), data.size() - pos ); head.payloadLength = toTransfer; std::string s; s += head.packToString(); - s += data.substr(pos, toTransfer); + s += data.substr( pos, toTransfer ); std::string res = toHexAndChecksum( s ); @@ -47,7 +48,7 @@ void sendCommand( RecordHeader& head, const std::string& data, std::shared_ptr io){ - logger::note("reading"); +std::string parseCommandChunked( RecordHeader& head, std::shared_ptr io ) { + logger::note( "reading" ); std::string payload = parseCommand( head, io->readLine() ); - std::string all(head.totalLength, ' '); + std::string all( head.totalLength, ' ' ); auto target = all.begin(); size_t pos = 0; RecordHeader head2; - while(true) { + + while( true ) { pos += head.payloadLength; - target = std::copy ( payload.begin(), payload.end(), target); - if(pos >= head.totalLength) { + target = std::copy( payload.begin(), payload.end(), target ); + + if( pos >= head.totalLength ) { break; } - logger::note("chunk digested, reading next one"); + + logger::note( "chunk digested, reading next one" ); + payload = parseCommand( head2, io->readLine() ); - if(!head2.isFollowupOf(head)){ - throw std::runtime_error("Error, header of follow up chunk was malformed"); + + if( !head2.isFollowupOf( head ) ) { + throw std::runtime_error( "Error, header of follow up chunk was malformed" ); } + head = head2; } + return all; }