bool QIODevice::atEnd() const { if ( isSequentialAccess() || isTranslated() ) { QIODevice* that = (QIODevice*)this; int c = that->getch(); bool result = c < 0; that->ungetch(c); return result; } else { return at() == (int)size(); } }
bool QIODevice::atEnd() const { if ( isSequentialAccess() || isTranslated() ) { QIODevice* that = (QIODevice*)this; const int oldStatus = ioSt; int c = that->getch(); bool result = c < 0; that->ungetch(c); if (ioSt != oldStatus) that->ioSt = oldStatus; return result; } else { return at() == size(); } }
bool QFile::open( int m ) { if ( isOpen() ) { // file already open #if defined(CHECK_STATE) warning( "QFile::open: File already open" ); #endif return FALSE; } if ( fn.isNull() ) { // no file name defined #if defined(CHECK_NULL) warning( "QFile::open: No file name specified" ); #endif return FALSE; } init(); // reset params setMode( m ); if ( !(isReadable() || isWritable()) ) { #if defined(CHECK_RANGE) warning( "QFile::open: File access not specified" ); #endif return FALSE; } bool ok = TRUE; if ( isRaw() ) { // raw file I/O int oflags = OPEN_RDONLY; if ( isReadable() && isWritable() ) oflags = OPEN_RDWR; else if ( isWritable() ) oflags = OPEN_WRONLY; if ( flags() & IO_Append ) { // append to end of file? if ( flags() & IO_Truncate ) oflags |= (OPEN_CREAT | OPEN_TRUNC); else oflags |= (OPEN_APPEND | OPEN_CREAT); setFlags( flags() | IO_WriteOnly ); // append implies write } else if ( isWritable() ) { // create/trunc if writable if ( flags() & IO_Truncate ) oflags |= (OPEN_CREAT | OPEN_TRUNC); else oflags |= OPEN_CREAT; } #if defined(HAS_TEXT_FILEMODE) && !defined(_OS_MAC_) if ( isTranslated() ) oflags |= OPEN_TEXT; else oflags |= OPEN_BINARY; #endif #if defined(HAS_ASYNC_FILEMODE) if ( isAsynchronous() ) oflags |= OPEN_ASYNC; #endif fd = OPEN( (const char *)fn, oflags, 0666 ); if ( fd != -1 ) { // open successful STATBUF st; FSTAT( fd, &st ); length = (int)st.st_size; index = (flags() & IO_Append) == 0 ? 0 : length; } else { ok = FALSE; } } else { // buffered file I/O const char *perm = 0; char perm2[4]; bool try_create = FALSE; if ( flags() & IO_Append ) { // append to end of file? setFlags( flags() | IO_WriteOnly ); // append implies write perm = isReadable() ? "a+" : "a"; } else { if ( isReadWrite() ) { if ( flags() & IO_Truncate ) { perm = "w+"; } else { perm = "r+"; try_create = TRUE; // try to create if not exists } } else if ( isReadable() ) { perm = "r"; } else if ( isWritable() ) { perm = "w"; } } strcpy( perm2, perm ); #if defined(HAS_TEXT_FILEMODE) if ( isTranslated() ) strcat( perm2, "t" ); else strcat( perm2, "b" ); #endif fh = fopen( (const char *)fn, perm2 ); if ( !fh && try_create ) { perm2[0] = 'w'; // try "w+" instead of "r+" fh = fopen( (const char *)fn, perm2 ); } if ( fh ) { STATBUF st; FSTAT( FILENO(fh), &st ); length = (int)st.st_size; index = (flags() & IO_Append) == 0 ? 0 : length; } else { ok = FALSE; } } if ( ok ) { setState( IO_Open ); } else { init(); if ( errno == EMFILE ) // no more file handles/descrs setStatus( IO_ResourceError ); else setStatus( IO_OpenError ); } return ok; }
bool QFile::open( int m ) { if ( isOpen() ) { // file already open #if defined(QT_CHECK_STATE) qWarning( "QFile::open: File already open" ); #endif return FALSE; } if ( fn.isEmpty() ) { // no file name defined #if defined(QT_CHECK_NULL) qWarning( "QFile::open: No file name specified" ); #endif return FALSE; } init(); // reset params setMode( m ); if ( !(isReadable() || isWritable()) ) { #if defined(QT_CHECK_RANGE) qWarning( "QFile::open: File access not specified" ); #endif return FALSE; } bool ok = TRUE; struct stat st; if ( isRaw() ) { int oflags = O_RDONLY; if ( isReadable() && isWritable() ) oflags = O_RDWR; else if ( isWritable() ) oflags = O_WRONLY; if ( flags() & IO_Append ) { // append to end of file? if ( flags() & IO_Truncate ) oflags |= (O_CREAT | O_TRUNC); else oflags |= (O_APPEND | O_CREAT); setFlags( flags() | IO_WriteOnly ); // append implies write } else if ( isWritable() ) { // create/trunc if writable if ( flags() & IO_Truncate ) oflags |= (O_CREAT | O_TRUNC); else oflags |= O_CREAT; } #if defined(HAS_TEXT_FILEMODE) if ( isTranslated() ) oflags |= OPEN_TEXT; else oflags |= OPEN_BINARY; #endif #if defined(HAS_ASYNC_FILEMODE) if ( isAsynchronous() ) oflags |= OPEN_ASYNC; #endif fd = qt_open( QFile::encodeName(fn), oflags, 0666 ); if ( fd != -1 ) { // open successful ::fstat( fd, &st ); // get the stat for later usage } else { ok = FALSE; } } else { // buffered file I/O QCString perm; char perm2[4]; bool try_create = FALSE; if ( flags() & IO_Append ) { // append to end of file? setFlags( flags() | IO_WriteOnly ); // append implies write perm = isReadable() ? "a+" : "a"; } else { if ( isReadWrite() ) { if ( flags() & IO_Truncate ) { perm = "w+"; } else { perm = "r+"; try_create = TRUE; // try to create if not exists } } else if ( isReadable() ) { perm = "r"; } else if ( isWritable() ) { perm = "w"; } } qstrcpy( perm2, perm ); #if defined(HAS_TEXT_FILEMODE) if ( isTranslated() ) strcat( perm2, "t" ); else strcat( perm2, "b" ); #endif for (;;) { // At most twice fh = fopen( QFile::encodeName(fn), perm2 ); if ( !fh && try_create ) { perm2[0] = 'w'; // try "w+" instead of "r+" try_create = FALSE; } else { break; } } if ( fh ) { ::fstat( fileno(fh), &st ); // get the stat for later usage } else { ok = FALSE; } } if ( ok ) { setState( IO_Open ); // on successful open the file stat was got; now test what type // of file we have if ( (st.st_mode & S_IFMT) != S_IFREG ) { // non-seekable setType( IO_Sequential ); length = INT_MAX; ioIndex = 0; } else { #if defined(QT_LARGEFILE_SUPPORT) && !defined(QT_ABI_QT4) length = st.st_size > UINT_MAX ? UINT_MAX : (Offset)st.st_size; #else length = (Offset)st.st_size; #endif ioIndex = (flags() & IO_Append) == 0 ? 0 : length; if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) { // try if you can read from it (if you can, it's a sequential // device; e.g. a file in the /proc filesystem) int c = getch(); if ( c != -1 ) { ungetch(c); setType( IO_Sequential ); length = INT_MAX; ioIndex = 0; } resetStatus(); } } } else { init(); if ( errno == EMFILE ) // no more file handles/descrs setStatus( IO_ResourceError ); else setStatus( IO_OpenError ); setErrorStringErrno( errno ); } return ok; }
bool QFile::open( int m ) { if ( isOpen() ) { // file already open #if defined(CHECK_STATE) qWarning( "QFile::open: File already open" ); #endif return FALSE; } if ( fn.isNull() ) { // no file name defined #if defined(CHECK_NULL) qWarning( "QFile::open: No file name specified" ); #endif return FALSE; } init(); // reset params setMode( m ); if ( !(isReadable() || isWritable()) ) { #if defined(CHECK_RANGE) qWarning( "QFile::open: File access not specified" ); #endif return FALSE; } bool ok = TRUE; STATBUF st; if ( isRaw() ) { // raw file I/O int oflags = OPEN_RDONLY; if ( isReadable() && isWritable() ) oflags = OPEN_RDWR; else if ( isWritable() ) oflags = OPEN_WRONLY; if ( flags() & IO_Append ) { // append to end of file? if ( flags() & IO_Truncate ) oflags |= (OPEN_CREAT | OPEN_TRUNC); else oflags |= (OPEN_APPEND | OPEN_CREAT); setFlags( flags() | IO_WriteOnly ); // append implies write } else if ( isWritable() ) { // create/trunc if writable if ( flags() & IO_Truncate ) oflags |= (OPEN_CREAT | OPEN_TRUNC); else oflags |= OPEN_CREAT; } #if defined(HAS_TEXT_FILEMODE) if ( isTranslated() ) #ifdef __CYGWIN__ /* Do nothing, allowing the Cygwin mount mode to take effect. */; #else oflags |= OPEN_TEXT; #endif else oflags |= OPEN_BINARY; #endif #if defined(HAS_ASYNC_FILEMODE) if ( isAsynchronous() ) oflags |= OPEN_ASYNC; #endif fd = OPEN( QFile::encodeName(fn), oflags, 0666 ); if ( fd != -1 ) { // open successful FSTAT( fd, &st ); // get the stat for later usage } else { ok = FALSE; } } else { // buffered file I/O
bool QFile::open( int m ) { if ( isOpen() ) { // file already open #if defined(CHECK_STATE) qWarning( "QFile::open: File already open" ); #endif return FALSE; } if ( fn.isNull() ) { // no file name defined #if defined(CHECK_NULL) qWarning( "QFile::open: No file name specified" ); #endif return FALSE; } init(); // reset params setMode( m ); if ( !(isReadable() || isWritable()) ) { #if defined(CHECK_RANGE) qWarning( "QFile::open: File access not specified" ); #endif return FALSE; } bool ok = TRUE; STATBUF st; if ( isRaw() ) { // raw file I/O int oflags = OPEN_RDONLY; if ( isReadable() && isWritable() ) oflags = OPEN_RDWR; else if ( isWritable() ) oflags = OPEN_WRONLY; if ( flags() & IO_Append ) { // append to end of file? if ( flags() & IO_Truncate ) oflags |= (OPEN_CREAT | OPEN_TRUNC); else oflags |= (OPEN_APPEND | OPEN_CREAT); setFlags( flags() | IO_WriteOnly ); // append implies write } else if ( isWritable() ) { // create/trunc if writable if ( flags() & IO_Truncate ) oflags |= (OPEN_CREAT | OPEN_TRUNC); else oflags |= OPEN_CREAT; } #if defined(HAS_TEXT_FILEMODE) if ( isTranslated() ) oflags |= OPEN_TEXT; else oflags |= OPEN_BINARY; #endif #if defined(HAS_ASYNC_FILEMODE) if ( isAsynchronous() ) oflags |= OPEN_ASYNC; #endif #if defined(__CYGWIN32_) fd = OPEN( QFile::encodeName(fn), oflags, 0666 ); #else QString str = fn; reslashify(str); fd = _wopen( (wchar_t*) str.ucs2(), oflags, 0666 ); #endif if ( fd != -1 ) { // open successful FSTAT( fd, &st ); // get the stat for later usage } else { ok = FALSE; } } else { // buffered file I/O QCString perm; char perm2[4]; bool try_create = FALSE; if ( flags() & IO_Append ) { // append to end of file? setFlags( flags() | IO_WriteOnly ); // append implies write perm = isReadable() ? "a+" : "a"; } else { if ( isReadWrite() ) { if ( flags() & IO_Truncate ) { perm = "w+"; } else { perm = "r+"; try_create = TRUE; // try to create if not exists } } else if ( isReadable() ) { perm = "r"; } else if ( isWritable() ) { perm = "w"; } } qstrcpy( perm2, perm ); if ( isTranslated() ) strcat( perm2, "t" ); else strcat( perm2, "b" ); while (1) { // At most twice #if defined(__CYGWIN32_) fh = fopen( QFile::encodeName(fn), perm2 ); #else QString str = fn; QString prm( perm2 ); reslashify(str); fh = _wfopen( (wchar_t*) str.ucs2(), (wchar_t*) prm.ucs2() ); #endif if ( !fh && try_create ) { perm2[0] = 'w'; // try "w+" instead of "r+" try_create = FALSE; } else { break; } } if ( fh ) { FSTAT( FILENO(fh), &st ); // get the stat for later usage } else { ok = FALSE; } } if ( ok ) { setState( IO_Open ); // on successful open the file stat was got; now test what type // of file we have if ( (st.st_mode & STAT_MASK) != STAT_REG ) { // non-seekable setType( IO_Sequential ); length = INT_MAX; ioIndex = (flags() & IO_Append) == 0 ? 0 : length; } else { length = (int)st.st_size; ioIndex = (flags() & IO_Append) == 0 ? 0 : length; if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) { // try if you can read from it (if you can, it's a sequential // device; e.g. a file in the /proc filesystem) int c = getch(); if ( c != -1 ) { ungetch(c); setType( IO_Sequential ); length = INT_MAX; } } } } else { init(); if ( errno == EMFILE ) // no more file handles/descrs setStatus( IO_ResourceError ); else setStatus( IO_OpenError ); } return ok; }