void acceptInput() { historyPos = 0; stringstream commandStream(""); commandStream << inputArea.str(); post(inputArea.str().c_str()); history.push_back(inputArea.str()); if (history.size() > deletefromline) { history.pop_front(); } wiLua::GetGlobal()->RunText(inputArea.str()); inputArea.str(""); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaSocketServer::slotReadCommand() { QDataStream socketStream(m_currentClient); socketStream.setVersion(QDataStream::Qt_4_0); // If we have not read the currentCommandSize // read the size of the command if all the data is available if (m_currentCommandSize == 0) { if (m_currentClient->bytesAvailable() < (int)sizeof(qint64)) return; socketStream >> m_currentCommandSize; } // Check if the complete command is available, return and whait for readyRead() if not if (m_currentClient->bytesAvailable() < m_currentCommandSize) return; // Now we can read the command QByteArray command = m_currentClient->read( m_currentCommandSize); QTextStream commandStream(command); QList<QByteArray> args; while (!commandStream.atEnd()) { QByteArray arg; commandStream >> arg; args.push_back(arg); } CVF_ASSERT(args.size() > 0); // qDebug() << args; bool isGetProperty = args[0] == "GetProperty"; // GetProperty [casename/index] PropertyName bool isSetProperty = args[0] == "SetProperty"; // SetProperty [casename/index] PropertyName bool isGetCellInfo = args[0] == "GetActiveCellInfo"; // GetActiveCellInfo [casename/index] bool isGetGridDim = args[0] == "GetMainGridDimensions"; // GetMainGridDimensions [casename/index] if (!(isGetProperty || isSetProperty || isGetCellInfo || isGetGridDim)) { m_errorMessageDialog->showMessage(tr("ResInsight SocketServer: \n") + tr("Unknown command: %1").arg(args[0].data())); return; } QString caseName; QString propertyName; RimReservoir* reservoir = NULL; // Find the correct arguments if (isGetProperty || isSetProperty) { if (args.size() == 2) { propertyName = args[1]; } else if (args.size() > 2) { caseName = args[1]; propertyName = args[2]; } } else if (isGetCellInfo || isGetGridDim) { if (args.size() > 1) { caseName = args[1]; } } reservoir = this->findReservoir(caseName); if (reservoir == NULL) { m_errorMessageDialog->showMessage(tr("ResInsight SocketServer: \n") + tr("Could not find the eclipse case with name or index: \"%1\"").arg(caseName)); return; } if (isGetProperty || isSetProperty) { // Find the requested data, Or create a set if we are setting data and it is not found size_t scalarResultIndex = cvf::UNDEFINED_SIZE_T; std::vector< std::vector<double> >* scalarResultFrames = NULL; if (reservoir && reservoir->reservoirData() && reservoir->reservoirData()->mainGrid() && reservoir->reservoirData()->mainGrid()->results()) { scalarResultIndex = reservoir->reservoirData()->mainGrid()->results()->findOrLoadScalarResult(propertyName); if (scalarResultIndex == cvf::UNDEFINED_SIZE_T && isSetProperty) { scalarResultIndex = reservoir->reservoirData()->mainGrid()->results()->addEmptyScalarResult(RimDefines::GENERATED, propertyName); } if (scalarResultIndex != cvf::UNDEFINED_SIZE_T) { scalarResultFrames = &(reservoir->reservoirData()->mainGrid()->results()->cellScalarResults(scalarResultIndex)); m_currentScalarIndex = scalarResultIndex; m_currentPropertyName = propertyName; } } if (scalarResultFrames == NULL) { m_errorMessageDialog->showMessage(tr("ResInsight SocketServer: \n") + tr("Could not find the property named: \"%1\"").arg(propertyName)); } if (isGetProperty ) { // Write data back : timeStepCount, bytesPrTimestep, dataForTimestep0 ... dataForTimestepN if ( scalarResultFrames == NULL) { // No data available socketStream << (quint64)0 << (quint64)0 ; } else { // First write timestep count quint64 timestepCount = (quint64)scalarResultFrames->size(); socketStream << timestepCount; // then the byte-size of the result values in one timestep size_t timestepResultCount = scalarResultFrames->front().size(); quint64 timestepByteCount = (quint64)(timestepResultCount*sizeof(double)); socketStream << timestepByteCount ; // qDebug() << "Trying to read " << (quint64)(scalarResultFrames->front().size()*sizeof(double)) << "bytes of data"; // Then write the data. for (size_t tIdx = 0; tIdx < scalarResultFrames->size(); ++tIdx) { #if 1 // Write data as raw bytes, fast but does not handle byteswapping m_currentClient->write((const char *)scalarResultFrames->at(tIdx).data(), timestepByteCount); // Raw print of data. Fast but no platform conversion #else // Write data using QDataStream, does byteswapping for us. Must use QDataStream on client as well for (size_t cIdx = 0; cIdx < scalarResultFrames->at(tIdx).size(); ++cIdx) { socketStream << scalarResultFrames->at(tIdx)[cIdx]; } #endif } } } else // Set property { // Disconnect the socket from calling this slot again. m_currentClient->disconnect(SIGNAL(readyRead())); m_currentReservoir = reservoir; if ( scalarResultFrames != NULL) { m_scalarResultsToAdd = scalarResultFrames; if (m_currentClient->bytesAvailable()) { this->slotReadPropertyData(); } connect(m_currentClient, SIGNAL(readyRead()), this, SLOT(slotReadPropertyData())); } } } else if (isGetCellInfo ) { // Write data back to octave: columnCount, bytesPrTimestep, GridNr I J K ParentGridNr PI PJ PK caf::FixedArray<std::vector<qint32>, 8> activeCellInfo; if (!(reservoir && reservoir->reservoirData() && reservoir->reservoirData()->mainGrid()) ) { // No data available socketStream << (quint64)0 << (quint64)0 ; return; } reservoir->reservoirData()->mainGrid()->calculateActiveCellInfo(activeCellInfo[0], activeCellInfo[1], activeCellInfo[2], activeCellInfo[3], activeCellInfo[4], activeCellInfo[5], activeCellInfo[6], activeCellInfo[7]); // First write timestep count quint64 timestepCount = (quint64)8; socketStream << timestepCount; // then the byte-size of the result values in one timestep size_t timestepResultCount = activeCellInfo[0].size(); quint64 timestepByteCount = (quint64)(timestepResultCount*sizeof(qint32)); socketStream << timestepByteCount ; // Then write the data. for (size_t tIdx = 0; tIdx < 8; ++tIdx) { #if 1 // Write data as raw bytes, fast but does not handle byteswapping m_currentClient->write((const char *)activeCellInfo[tIdx].data(), timestepByteCount); #else // Write data using QDataStream, does byteswapping for us. Must use QDataStream on client as well for (size_t cIdx = 0; cIdx < activeCellInfo[tIdx].size(); ++cIdx) { socketStream << activeCellInfo[tIdx][cIdx]; } #endif } } else if (isGetGridDim) { // Write data back to octave: I, J, K dimensions size_t iCount = 0; size_t jCount = 0; size_t kCount = 0; if (reservoir && reservoir->reservoirData() && reservoir->reservoirData()->mainGrid()) { iCount = reservoir->reservoirData()->mainGrid()->cellCountI(); jCount = reservoir->reservoirData()->mainGrid()->cellCountJ(); kCount = reservoir->reservoirData()->mainGrid()->cellCountK(); } socketStream << (quint64)iCount << (quint64)jCount << (quint64)kCount; } }