예제 #1
0
파일: cmt1.cpp 프로젝트: dominoc/xmfc
//////////////////////////////////////////////////////////////////////////////////////////
// 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;
}
예제 #2
0
파일: cmt1.cpp 프로젝트: jiapei100/mrpt
//////////////////////////////////////////////////////////////////////////////////////////
// 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;
}
예제 #3
0
/*! \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;
}
예제 #4
0
/*! \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;
}
예제 #5
0
파일: cmt1.cpp 프로젝트: GYengera/mrpt
//////////////////////////////////////////////////////////////////////////////////////////
// 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;
}