summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/filemanager.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/library/filemanager.cpp b/library/filemanager.cpp
index 2e5efdd..fbfa1d9 100644
--- a/library/filemanager.cpp
+++ b/library/filemanager.cpp
@@ -161,167 +161,169 @@ bool FileManager::loadFile( const DocLnk &f, QByteArray &ba )
if ( fl.size() > 0 )
fl.readBlock( ba.data(), fl.size() );
fl.close();
return TRUE;
}
/*!
Copies the document specified by \a src to the document specified
by \a dest.
Returns whether the operation succeeded.
*/
bool FileManager::copyFile( const AppLnk &src, const AppLnk &dest )
{
QFile srcFile( src.file() );
if ( !srcFile.open( IO_ReadOnly ) )
return FALSE;
QString fileName = dest.file() + ".new";
ensurePathExists( fileName );
bool ok = TRUE;
ok = copyFile( src.file(), fileName );
if ( ok )
ok = dest.writeLink();
if ( ok )
{
// okay now rename the file...
if ( !renameFile( fileName, dest.file() ) )
// remove the tmp file, otherwise, it will just lay around...
QFile::remove( fileName );
}
else
{
QFile::remove( fileName );
}
return ok;
}
bool FileManager::copyFile( const QString & src, const QString & dest )
{
//open read file
QFile srcFile( src );
if( !srcFile.open( IO_ReadOnly|IO_Raw) )
{
qWarning( "open read failed %s, %s", src.latin1(), dest.latin1() );
return FALSE;
}
//open write file
QFile destFile( dest );
if( !destFile.open( IO_WriteOnly|IO_Raw ) )
{
qWarning( "open write failed %s, %s", src.latin1(), dest.latin1() );
srcFile.close();
return FALSE;
}
//copy content
const int bufsize = 16384;
char buffer[bufsize];
bool ok = TRUE;
int bytesRead = 0;
while ( ok && !srcFile.atEnd() )
{
bytesRead = srcFile.readBlock( buffer, bufsize );
if ( bytesRead < 0 )
ok = FALSE;
while ( ok && bytesRead > 0 )
{
int bytesWritten = destFile.writeBlock( buffer, bytesRead );
if ( bytesWritten < 0 )
ok = FALSE;
else
bytesRead -= bytesWritten;
}
}
srcFile.close();
destFile.close();
// Set file permissions
struct stat status;
if( stat( QFile::encodeName( src ), &status ) == 0 )
{
chmod( QFile::encodeName( dest ), status.st_mode );
}
return ok;
}
bool FileManager::renameFile( const QString & src, const QString & dest )
{
if( rename( QFile::encodeName( src ), QFile::encodeName( dest ) ) == -1);
{
- qWarning( "problem renaming file %s to %s, errno: %d", src.latin1(), dest.latin1(), errno );
- return false;
+ if ( errno != 2 && errno != 11 ) //ignore ENOENT and EAGAIN - bug in system?
+ {
+ qWarning( "problem renaming file %s to %s, errno: %d", src.latin1(), dest.latin1(), errno );
+ return false;
+ }
}
return true;
}
/*!
Opens the document specified by \a f as a readable QIODevice.
The caller must delete the return value.
Returns 0 if the operation fails.
*/
QIODevice* FileManager::openFile( const DocLnk& f )
{
QString fn = f.file();
QFile* fl = new QFile( fn );
if ( !fl->open( IO_ReadOnly ) )
{
delete fl;
fl = 0;
}
return fl;
}
/*!
Opens the document specified by \a f as a writable QIODevice.
The caller must delete the return value.
Returns 0 if the operation fails.
*/
QIODevice* FileManager::saveFile( const DocLnk& f )
{
QString fn = f.file();
ensurePathExists( fn );
QFile* fl = new QFile( fn );
if ( fl->open( IO_WriteOnly ) )
{
f.writeLink();
}
else
{
delete fl;
fl = 0;
}
return fl;
}
/*!
Returns whether the document specified by \a f current exists
as a file on disk.
*/
bool FileManager::exists( const DocLnk &f )
{
return QFile::exists(f.file());
}
/*!
- Ensures that the path \a fn exists, by creating required directories.
+ Ensures that the path \a fileName exists, by creating required directories.
Returns TRUE if successful.
*/
-bool FileManager::ensurePathExists( const QString &fn )
+bool FileManager::ensurePathExists( const QString &fileName )
{
- QFileInfo fi(fn);
- fi.setFile( fi.dirPath(TRUE) );
- if ( !fi.exists() )
+ QDir directory = QFileInfo( fileName ).dir();
+ if ( !directory.exists() )
{
- if ( system( ("mkdir -p " + QFile::encodeName( fi.filePath() ) ) ) )
+ if ( !directory.mkdir( directory.absPath() ) )
return FALSE;
}
return TRUE;
}