////////////////////////////////////////////////////////////////////////////////////////// // Write data to the file. XsensResultValue Cmt1f::writeData (const uint32_t length, const void* data) { if (!m_isOpen) return m_lastResult = XRV_NOFILEOPEN; if (m_readOnly) return m_lastResult = XRV_READONLY; gotoWrite(); size_t writeRes = fwrite(data, 1, length, m_handle); if (writeRes == (size_t)EOF || writeRes < length) { int32_t err = (int32_t)errno; switch (err) { case 0: break; case ENOSPC: return m_lastResult = XRV_INSUFFICIENTSPACE; case ENOMEM: return m_lastResult = XRV_OUTOFMEMORY; default: return m_lastResult = XRV_ERROR; } } m_writePos += writeRes; if (m_writePos > m_fileSize) m_fileSize = m_writePos; return m_lastResult = XRV_OK; }
////////////////////////////////////////////////////////////////////////////////////////// // Write data to the file. XsensResultValue Cmt1f::writeData(const uint32_t length, const void* data) { if (!m_isOpen) return m_lastResult = XRV_NOFILEOPEN; if (m_readOnly) return m_lastResult = XRV_READONLY; gotoWrite(); m_writePos += fwrite(data, 1, length, m_handle); if (m_writePos > m_fileSize) m_fileSize = m_writePos; return m_lastResult = XRV_OK; }
/*! \brief Insert the given data into the file. \details The function writes the given data to the file at the current write position. This operation may take a while to complete. The write position is placed at the end of the inserted data. \param start The offset in the file to write the first byte \param data The data to insert in the file \returns XRV_OK if the data was inserted successfully */ XsResultValue IoInterfaceFile::insertData( XsFilePos start, const XsByteArray& data) { if (!m_handle) return m_lastResult = XRV_NOFILEOPEN; if (m_readOnly) return m_lastResult = XRV_READONLY; gotoWrite(); XsSize length = data.size(); XsFilePos rPos = start; XsFilePos wPos = rPos + length; size_t read1, read2; XsFilePos remaining = m_fileSize - start; size_t bsize = (length > 512) ? length : 512; char* bufferRoot = (char*)malloc(bsize * 2); if (!bufferRoot) return XRV_OUTOFMEMORY; char* buffer1 = bufferRoot; char* buffer2 = bufferRoot + bsize; char* btemp; // copy data FSEEK(rPos); if (data.size() == 0) return m_lastResult = XRV_OK; if (remaining >= (XsFilePos)bsize) read1 = fread(buffer1, 1, bsize, m_handle); else read1 = fread(buffer1, 1, (size_t)remaining, m_handle); remaining -= read1; rPos += read1; while (remaining > 0) { // move data to correct buffer read2 = read1; btemp = buffer1; buffer1 = buffer2; buffer2 = btemp; // read next block if (remaining >= (XsFilePos)bsize) read1 = fread(buffer1, 1, bsize, m_handle); else read1 = fread(buffer1, 1, (size_t)remaining, m_handle); remaining -= read1; rPos += read1; // write block to the correct position FSEEK(wPos); wPos += fwrite(buffer2, 1, read2, m_handle); FSEEK(rPos); } FSEEK(wPos); wPos += fwrite(buffer1, 1, read1, m_handle); FSEEK(start); m_writePos = start + fwrite(data.data(), 1, length, m_handle); m_fileSize += length; free(bufferRoot); return m_lastResult = XRV_OK; }
/*! \brief Delete the given data from the file. \details The function erases the given data from the file at the given write position. This operation may take a while to complete, but is faster than insertData. The write position is not changed and the read position is checked for validity upon function exit. \param start The offset of the first byte to delete \param length The total number of bytes to delete \returns XRV_OK if the data was deleted successfully */ XsResultValue IoInterfaceFile::deleteData(XsFilePos start, XsSize length) { if (!m_handle) return m_lastResult = XRV_NOFILEOPEN; if (m_readOnly) return m_lastResult = XRV_READONLY; gotoWrite(); XsFilePos wPos = start; XsFilePos rPos = wPos + length; size_t read1; XsFilePos endPos = (start + (XsFilePos)length); if (endPos < m_fileSize) { XsFilePos remaining = m_fileSize - endPos; char buffer[512]; // copy data FSEEK(rPos); while (remaining > 0) { if (remaining >= 512) read1 = fread(buffer, 1, 512, m_handle); else read1 = fread(buffer, 1, (size_t)remaining, m_handle); remaining -= read1; rPos += read1; // write block to the correct position FSEEK(wPos); wPos += fwrite(buffer, 1, read1, m_handle); FSEEK(rPos); } m_fileSize -= length; } else { m_fileSize = start; } #ifdef _WIN32 int32_t rv = _chsize(_fileno(m_handle), (int32_t)m_fileSize); #else int32_t rv = ftruncate(fileno(m_handle), (int32_t)m_fileSize); #endif int32_t eno = 0; if (rv != 0) eno = errno; m_writePos = start; FSEEK(wPos); if (rv != 0) { switch (eno) { case EACCES: return m_lastResult = XRV_BUSY; case EBADF: return m_lastResult = XRV_INVALIDINSTANCE; case ENOSPC: return m_lastResult = XRV_OUTOFMEMORY; case EINVAL: return m_lastResult = XRV_INVALIDPARAM; default: return m_lastResult = XRV_ERROR; } } return m_lastResult = XRV_OK; }
////////////////////////////////////////////////////////////////////////////////////////// // Insert the given data into the file. XsensResultValue Cmt1f::insertData (const CmtFilePos start, const uint32_t length, const void* data) { if (!m_isOpen) return m_lastResult = XRV_NOFILEOPEN; if (m_readOnly) return m_lastResult = XRV_READONLY; gotoWrite(); CmtFilePos rPos = start; CmtFilePos wPos = rPos + length; size_t read1, read2; CmtFilePos remaining = m_fileSize - start; size_t bsize = (length > 512)?length:512; char* buffer1 = (char*) malloc(bsize); char* buffer2 = (char*) malloc(bsize); char* btemp; // copy data FSEEK(rPos); if (remaining >= (CmtFilePos) bsize) read1 = fread(buffer1,1,bsize,m_handle); else read1 = fread(buffer1,1,(size_t) remaining,m_handle); remaining -= read1; rPos += read1; while(remaining > 0) { // move data to correct buffer read2 = read1; btemp = buffer1; buffer1 = buffer2; buffer2 = btemp; // read next block if (remaining >= (CmtFilePos) bsize) read1 = fread(buffer1,1,bsize,m_handle); else read1 = fread(buffer1,1,(size_t) remaining,m_handle); remaining -= read1; rPos += read1; // write block to the correct position FSEEK(wPos); wPos += fwrite(buffer2, 1, read2, m_handle); FSEEK(rPos); } FSEEK(wPos); wPos += fwrite(buffer1, 1, read1, m_handle); FSEEK(start); m_writePos = start + fwrite(data, 1, length, m_handle); m_fileSize += length; free(buffer1); free(buffer2); return m_lastResult = XRV_OK; }