// 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(); }
// 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; }
Offset length( Descriptor file ) { if( file == InvalidDescriptor ) return InvalidOffset; Offset curPosition = tell( file ); Offset length = seekToEnd( file ); seek( file, curPosition, seekFromStart ); return length; }
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; }
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; }