#include <memory>
#include <string>
-
+#include <exception>
#include "bios.h"
+#include "io/opensslBIO.h"
#define RECORD_HEADER_SIZE 17
}
template <class T>
- static void read( std::string::iterator& it, T& val ) {
- char* data = ( char* ) &val;
+ static void read( std::string::const_iterator& it, T& val ) {
+ union typeConversion {
+ char buf[sizeof( T )];
+ T value;
+
+ typeConversion( const T& v ) : value( v ) {}
+ };
+
+ typeConversion data( 0 );
for( size_t i = 0; i < sizeof( T ); i++ ) {
- data[i] = *it;
- it++;
+ data.buf[i] = *it++;
}
+
+ val = data.value;
}
std::string packToString() {
return res;
}
- void unpackFromString( std::string str ) {
+ void unpackFromString( const std::string& str ) {
if( str.size() != RECORD_HEADER_SIZE ) {
- throw "Invalid string length";
+ throw std::runtime_error( "Invalid string length" );
}
- auto it = str.begin();
+ auto it = str.cbegin();
read( it, command );
read( it, flags );
read( it, sessid );
read( it, offset );
read( it, payloadLength );
}
-
+ bool isFollowupOf( const RecordHeader& head ) {
+ return head.command == command && head.flags == flags && head.sessid == sessid && head.command_count == command_count && head.totalLength == totalLength && head.offset + 1 == offset;
+ }
};
-std::string parseCommand( RecordHeader& head, const std::string& input, std::shared_ptr<std::ostream> log );
+std::string parseCommand( RecordHeader& head, const std::string& input );
+std::string parseCommandChunked( RecordHeader& head, std::shared_ptr<OpensslBIOWrapper> conn );
-void sendCommand( RecordHeader& head, const std::string& data, std::shared_ptr<OpensslBIO> bio, std::shared_ptr<std::ostream> log );
+void sendCommand( RecordHeader& head, const std::string& data, std::shared_ptr<OpensslBIO> bio );