Example #1
0
// Try to apply
void CFStream::applyDelayedItems()
{
	ReceiverItems& res = receiver_items;
	SourceItems& src = source_items;
	for(ReceiverItems::iterator it = receiver_items.begin(); it != receiver_items.end();)
	{
		const CFRecordType::TypeId receiver_id = it->receiver_id;
		SourceItems::iterator its = std::find_if(source_items.begin(), source_items.end(), boost::bind(&SourceItem::receiver_id, _1) == receiver_id || boost::bind(&SourceItem::receiver_id, _1) == rt_ANY_TYPE);
		if(its != source_items.end())
		{
			if(NULL != it->fn)
			{
				it->fn(*this, it->data_place, its->data); // receiver_items and source_items may be expanded here.
			}
			else
			{
				seekFromBegin(it->data_place);
				write(&its->data, it->data_size);
			}
			receiver_items.erase(++it);
			source_items.erase(its);
			continue;
		}
		++it;
	}
	seekToEnd();
}
Example #2
0
// FIXME loss permissions at create file!!
Descriptor open( const frl::String &fileName, frl::UInt openMode, frl::UInt permMode )
{
	if( fileName.empty()  || openMode == openNotOpen || permMode <= 0)
		return InvalidDescriptor;

	frl::UInt flags = 0;

	switch( openMode & ( openReadOnly | openWriteOnly) )
	{
		case openReadOnly:
			flags=O_RDONLY;
			break;
		case openWriteOnly:
			flags=O_WRONLY;
			break;
		default:
			flags = O_RDWR;
	}

	if( openMode & openAppend )
		flags |= O_APPEND;

	if( openMode & openTruncate )
		flags |= O_TRUNC;

	if( openMode & openCreate )
	{
		flags |= O_CREAT;
		if( openMode & openExclusive )
			flags |= O_EXCL;
	}

	if( openMode & openNonBlocking )
		flags |= O_NONBLOCK;

	#ifdef O_BINARY
	if( openMode & openBinary )
		flags |= O_BINARY;
	#endif

	#ifdef O_TEXT
	if( openMode & openText )
		flags |= O_TEXT;
	#endif

	#ifdef O_LARGEFILE
	if( openMode & openLargeFile )
		flags |= O_LARGEFILE;
	#endif

	Descriptor file = ::open( multiByteCompatibility( fileName ).c_str(), flags, permMode );
	if( file < 0 )
		return InvalidDescriptor;
	if(openMode & openAppend)					
		seekToEnd( descriptor );
	return file;
}
Example #3
0
Offset length( Descriptor file )
{
	if( file == InvalidDescriptor )
		return InvalidOffset;
	Offset curPosition = tell( file );
	Offset length = seekToEnd( file );
	seek( file, curPosition, seekFromStart );
	return length;
}
Example #4
0
uint FileStream::getLength() 
{
	if (isOpen())
	{
		uint curPos = getPosition();
		seekToEnd();
		uint len = getPosition();
		seek(curPos, SEEK_SET);
		return len;
        
		//return _filelength(_fileno(m_stream));
	}

	if (m_path.empty())
		return 0;

	struct _stat statbuf;
	_stat(m_path.c_str(), &statbuf);
	return statbuf.st_size;
}
Example #5
0
frl::Bool concatenate( const String &fileName1, const String &fileName2, const String &fileNameDst, Bool overwrite )
{
	if( ! isExist( fileName1 ) || ! isExist( fileName2 ) )
		return False;

	struct DescriptorManager
	{
		Descriptor file1;
		Descriptor file2;
		Descriptor fileDst;

		DescriptorManager( void )
			:	file1( InvalidDescriptor ),
				file2( InvalidDescriptor ),
				fileDst( InvalidDescriptor )
		{
		}
		~DescriptorManager()
		{
			close( file1 );
			close( file2 );
			close( fileDst );
		}

	};
	DescriptorManager dm;

	dm.file1 = open( fileName1, openReadOnly );
	if( dm.file1 == InvalidDescriptor )
		return False;

	dm.file2 = open( fileName2, openReadOnly );
	if( dm.file2 == InvalidDescriptor )
		return False;

	if( isExist( fileNameDst ) )
	{
		if( overwrite )
		{
			removal( fileNameDst );
			create( fileNameDst );
			dm.fileDst = open( fileNameDst, openWriteOnly );
			if( dm.fileDst == InvalidDescriptor )
				return False;
		}
		else
		{
			dm.fileDst = open( fileNameDst, openWriteOnly );
			if( dm.fileDst == InvalidDescriptor )
				return False;
			seekToEnd( dm.fileDst );
		}
	}
	else
	{
		create( fileNameDst );
		dm.fileDst = open( fileNameDst, openWriteOnly );
		if( dm.fileDst == InvalidDescriptor )
			return False;
	}

	UChar buffer[4096];
	RWCount countWrite, countRead;
	while( True )
	{
		countRead = read( dm.file1, buffer, sizeof(buffer) );
		if( countRead < 0 )
			return False;

		if( countRead == 0 )
			break;

		countWrite = write( dm.fileDst, buffer, countRead );
		if( countWrite < 0 )
			return False;
	}
	while( True )
	{
		countRead = read( dm.file2, buffer, sizeof(buffer) );
		if( countRead < 0 )
			return False;

		if( countRead == 0)
			break;

		countWrite = write( dm.fileDst, buffer, countRead );
		if( countWrite < 0)
			return False;
	}
	return True;
}