///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) Statoil ASA // Copyright (C) Ceetron Solutions AS // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RiaSocketDataTransfer.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RiaSocketDataTransfer::writeBlockDataToSocket( QTcpSocket* socket, const char* data, quint64 bytesToWrite, QStringList& errorMessages ) { quint64 bytesWritten = 0; quint64 maxBlockSize = maximumValueCountInBlock() * sizeof( double ); while ( bytesWritten < bytesToWrite ) { quint64 byteCountToWrite = qMin( bytesToWrite - bytesWritten, maxBlockSize ); qint64 actuallyBytesWritten = socket->write( data + bytesWritten, byteCountToWrite ); if ( actuallyBytesWritten < 0 ) { errorMessages.push_back( "Error detected when writing data, error string from socket" ); errorMessages.push_back( socket->errorString() ); return false; } bytesWritten += actuallyBytesWritten; } return true; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RiaSocketDataTransfer::readBlockDataFromSocket( QTcpSocket* socket, char* data, quint64 bytesToRead, QStringList& errorMessages ) { quint64 bytesRead = 0; quint64 maxBlockSize = maximumValueCountInBlock() * sizeof( double ); while ( bytesRead < bytesToRead ) { if ( socket->bytesAvailable() ) { quint64 byteCountToRead = bytesToRead - bytesRead; byteCountToRead = qMin( byteCountToRead, maxBlockSize ); qint64 actuallyBytesRead = socket->read( data + bytesRead, byteCountToRead ); if ( actuallyBytesRead < 0 ) { errorMessages.push_back( "Error detected when reading data, error string from socket" ); errorMessages.push_back( socket->errorString() ); return false; } bytesRead += actuallyBytesRead; #ifdef octave_oct_h // octave_stdout << "Byte read " << bytesRead << " of a total of "<< bytesToRead << "\n"; #endif } else { if ( !socket->waitForReadyRead() ) { errorMessages.push_back( "Waited for data for %1 milli seconds." ); errorMessages.push_back( socket->errorString() ); return false; } } // Allow Octave process to end a long running Octave function #ifdef octave_oct_h OCTAVE_QUIT; #endif } return true; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- size_t RiaSocketDataTransfer::maximumValueCountInBlock() { return 20000; }