author | llornkcor <llornkcor> | 2003-07-17 02:25:08 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2003-07-17 02:25:08 (UTC) |
commit | 6ca1d7605597f4b8a7559167e5cf3d6e093805cd (patch) (side-by-side diff) | |
tree | 93096c3d0df0c0f02c75d2acc2f481120914945c /library/filemanager.cpp | |
parent | 115e09bdeb2ee3c7c0b9344f95179e1d10e86e48 (diff) | |
download | opie-6ca1d7605597f4b8a7559167e5cf3d6e093805cd.zip opie-6ca1d7605597f4b8a7559167e5cf3d6e093805cd.tar.gz opie-6ca1d7605597f4b8a7559167e5cf3d6e093805cd.tar.bz2 |
fix filesaving when filename contains extended characters
-rw-r--r-- | library/filemanager.cpp | 85 |
1 files changed, 76 insertions, 9 deletions
diff --git a/library/filemanager.cpp b/library/filemanager.cpp index 2b97846..cc657fa 100644 --- a/library/filemanager.cpp +++ b/library/filemanager.cpp @@ -29,4 +29,9 @@ #include <errno.h> #include <stdlib.h> +#include <unistd.h> +#include <sys/stat.h> +#include <dirent.h> +#include <sys/sendfile.h> +#include <fcntl.h> /*! @@ -60,6 +65,8 @@ bool FileManager::saveFile( const DocLnk &f, const QByteArray &data ) ensurePathExists( fn ); QFile fl( fn ); - if ( !fl.open( IO_WriteOnly|IO_Raw ) ) + if ( !fl.open( IO_WriteOnly|IO_Raw ) ) { + qWarning("open failed"); return FALSE; + } int total_written = fl.writeBlock( data ); fl.close(); @@ -68,10 +75,10 @@ bool FileManager::saveFile( const DocLnk &f, const QByteArray &data ) return FALSE; } + qDebug("total written %d out of %d", total_written, data.size()); // else rename the file... - if ( ::rename( fn.latin1(), f.file().latin1() ) < 0 ) { + if ( !renameFile( fn.latin1(), f.file().latin1() ) ) { qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), f.file().latin1(), errno ); // remove the file... - QFile::remove( fn ); } return TRUE; @@ -91,5 +98,5 @@ bool FileManager::saveFile( const DocLnk &f, const QString &text ) QFile fl( fn ); if ( !fl.open( IO_WriteOnly|IO_Raw ) ) { - qDebug( "open failed: %s", fn.latin1() ); + qWarning("open failed"); return FALSE; } @@ -103,10 +110,9 @@ bool FileManager::saveFile( const DocLnk &f, const QString &text ) return FALSE; } - // okay now rename the file... - if ( ::rename( fn.latin1(), f.file().latin1() ) < 0 ) { + // okay now rename the file.. + if ( !renameFile( fn.latin1(), f.file().latin1() ) ) { qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), f.file().latin1(), errno ); - // remove the tmp file, otherwise, it will just lay around... - QFile::remove( fn.latin1() ); + } return TRUE; @@ -198,5 +204,5 @@ bool FileManager::copyFile( const AppLnk &src, const AppLnk &dest ) if ( ok ) { // okay now rename the file... - if ( ::rename( fn.latin1(), dest.file().latin1() ) < 0 ) { + if ( !renameFile( fn.latin1(), dest.file().latin1() ) ) { qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), dest.file().latin1(), errno ); @@ -211,4 +217,65 @@ bool FileManager::copyFile( const AppLnk &src, const AppLnk &dest ) } +bool FileManager::copyFile( const QString & src, const QString & dest ) { + bool success = true; + struct stat status; + int read_fd=0; + int write_fd=0; + struct stat stat_buf; + off_t offset = 0; + QFile srcFile(src); + QFile destFile(dest); + + if(!srcFile.open( IO_ReadOnly|IO_Raw)) { + return success = false; + } + read_fd = srcFile.handle(); + if(read_fd != -1) { + fstat (read_fd, &stat_buf); + if( !destFile.open( IO_WriteOnly|IO_Raw ) ) + return success = false; + write_fd = destFile.handle(); + if(write_fd != -1) { + int err=0; + QString msg; + err = sendfile(write_fd, read_fd, &offset, stat_buf.st_size); + if( err == -1) { + switch(err) { + case EBADF : msg = "The input file was not opened for reading or the output file was not opened for writing. "; + case EINVAL: msg = "Descriptor is not valid or locked. "; + case ENOMEM: msg = "Insufficient memory to read from in_fd."; + case EIO: msg = "Unspecified error while reading from in_fd."; + }; + success = false; + } + } else { + qWarning("open write failed %s, %s",src.latin1(), dest.latin1()); + success = false; + } + } else { + qWarning("open read failed %s, %s",src.latin1(), dest.latin1()); + success = false; + } + srcFile.close(); + destFile.close(); + // Set file permissions + if( stat( (const char *) src, &status ) == 0 ) { + chmod( (const char *) dest, status.st_mode ); + } + + return success; +} + + +bool FileManager::renameFile( const QString & src, const QString & dest ) { + if(copyFile( src, dest )) { + if(QFile::remove(src) ) { + return true; + } + } + return false; +} + + /*! Opens the document specified by \a f as a readable QIODevice. |