bool KArchive::writeFile_impl(const QString &name, const QString &user, const QString &group, uint size, mode_t perm, time_t atime, time_t mtime, time_t ctime, const char *data) { if(!prepareWriting(name, user, group, size, perm, atime, mtime, ctime)) { kdWarning() << "KArchive::writeFile prepareWriting failed" << endl; return false; } // Write data // Note: if data is 0L, don't call writeBlock, it would terminate the KFilterDev if(data && size && !writeData(data, size)) { kdWarning() << "KArchive::writeFile writeData failed" << endl; return false; } if(!doneWriting(size)) { kdWarning() << "KArchive::writeFile doneWriting failed" << endl; return false; } return true; }
bool KArchive::writeFile( const QString& name, const QString& user, const QString& group, const char* data, qint64 size, mode_t perm, time_t atime, time_t mtime, time_t ctime ) { if ( !prepareWriting( name, user, group, size, perm, atime, mtime, ctime ) ) { qWarning() << "prepareWriting failed"; return false; } // Write data // Note: if data is 0L, don't call write, it would terminate the KFilterDev if ( data && size && !writeData( data, size ) ) { qWarning() << "writeData failed"; return false; } if ( !finishWriting( size ) ) { qWarning() << "finishWriting failed"; return false; } return true; }
bool KArchive::prepareWriting_impl(const QString &name, const QString &user, const QString &group, uint size, mode_t /*perm*/, time_t /*atime*/, time_t /*mtime*/, time_t /*ctime*/) { kdWarning(7040) << "New prepareWriting API not implemented in this class." << endl << "Falling back to old API (metadata information will be lost)" << endl; return prepareWriting(name, user, group, size); }
//! For more information: the description of the KRFUNC macro can be seen KrDebugLogger::~KrDebugLogger() { indentation -= indentationIncrease; QFile file; QTextStream stream; prepareWriting(file, stream); stream << QString("┗"); // Indicates that a function is going to finish stream << function << endl; }
//! This constructor is used inside the KRFUNC macro. For more details: the description of the KRFUNC macro can be seen KrDebugLogger::KrDebugLogger(const QString &argFunction, int line) : function(argFunction) { QFile file; QTextStream stream; prepareWriting(file, stream); stream << QString("┏"); // Indicates that a function has been started stream << function << "(" << line << ")" << endl; indentation += indentationIncrease; }
bool KArchive::writeFile(const QString &name, const QByteArray &data, mode_t perm, const QString &user, const QString &group, const QDateTime &atime, const QDateTime &mtime, const QDateTime &ctime) { const qint64 size = data.size(); if (!prepareWriting(name, user, group, size, perm, atime, mtime, ctime)) { //qWarning() << "prepareWriting failed"; return false; } // Write data // Note: if data is null, don't call write, it would terminate the KCompressionDevice if (data.constData() && size && !writeData(data.constData(), size)) { //qWarning() << "writeData failed"; return false; } if (!finishWriting(size)) { //qWarning() << "finishWriting failed"; return false; } return true; }
bool KArchive::addLocalFile(const QString &fileName, const QString &destName) { QFileInfo fileInfo(fileName); if(!fileInfo.isFile() && !fileInfo.isSymLink()) { kdWarning() << "KArchive::addLocalFile " << fileName << " doesn't exist or is not a regular file." << endl; return false; } KDE_struct_stat fi; if(KDE_lstat(QFile::encodeName(fileName), &fi) == -1) { kdWarning() << "KArchive::addLocalFile stating " << fileName << " failed: " << strerror(errno) << endl; return false; } if(fileInfo.isSymLink()) { return writeSymLink(destName, fileInfo.readLink(), fileInfo.owner(), fileInfo.group(), fi.st_mode, fi.st_atime, fi.st_mtime, fi.st_ctime); } /*end if*/ uint size = fileInfo.size(); // the file must be opened before prepareWriting is called, otherwise // if the opening fails, no content will follow the already written // header and the tar file is effectively f*cked up QFile file(fileName); if(!file.open(IO_ReadOnly)) { kdWarning() << "KArchive::addLocalFile couldn't open file " << fileName << endl; return false; } if(!prepareWriting(destName, fileInfo.owner(), fileInfo.group(), size, fi.st_mode, fi.st_atime, fi.st_mtime, fi.st_ctime)) { kdWarning() << "KArchive::addLocalFile prepareWriting " << destName << " failed" << endl; return false; } // Read and write data in chunks to minimize memory usage QByteArray array(8 * 1024); int n; uint total = 0; while((n = file.readBlock(array.data(), array.size())) > 0) { if(!writeData(array.data(), n)) { kdWarning() << "KArchive::addLocalFile writeData failed" << endl; return false; } total += n; } Q_ASSERT(total == size); if(!doneWriting(size)) { kdWarning() << "KArchive::addLocalFile doneWriting failed" << endl; return false; } return true; }
bool KArchive::addLocalFile( const QString& fileName, const QString& destName ) { QFileInfo fileInfo( fileName ); if ( !fileInfo.isFile() && !fileInfo.isSymLink() ) { kWarning() << fileName << "doesn't exist or is not a regular file."; return false; } KDE_struct_stat fi; if (KDE::lstat(fileName,&fi) == -1) { kWarning() << "stat'ing" << fileName << "failed:" << strerror(errno); return false; } if (fileInfo.isSymLink()) { QString symLinkTarget; // Do NOT use fileInfo.readLink() for unix symlinks! // It returns the -full- path to the target, while we want the target string "as is". #if defined(Q_OS_UNIX) && !defined(Q_OS_OS2EMX) const QByteArray encodedFileName = QFile::encodeName(fileName); QByteArray s; #if defined(PATH_MAX) s.resize(PATH_MAX+1); #else int path_max = pathconf(encodedFileName.data(), _PC_PATH_MAX); if (path_max <= 0) { path_max = 4096; } s.resize(path_max); #endif int len = readlink(encodedFileName.data(), s.data(), s.size() - 1); if ( len >= 0 ) { s[len] = '\0'; symLinkTarget = QFile::decodeName(s); } #endif if (symLinkTarget.isEmpty()) // Mac or Windows symLinkTarget = fileInfo.symLinkTarget(); return writeSymLink(destName, symLinkTarget, fileInfo.owner(), fileInfo.group(), fi.st_mode, fi.st_atime, fi.st_mtime, fi.st_ctime); }/*end if*/ qint64 size = fileInfo.size(); // the file must be opened before prepareWriting is called, otherwise // if the opening fails, no content will follow the already written // header and the tar file is effectively f*cked up QFile file( fileName ); if ( !file.open( QIODevice::ReadOnly ) ) { kWarning() << "couldn't open file " << fileName; return false; } if ( !prepareWriting( destName, fileInfo.owner(), fileInfo.group(), size, fi.st_mode, fi.st_atime, fi.st_mtime, fi.st_ctime ) ) { kWarning() << " prepareWriting" << destName << "failed"; return false; } // Read and write data in chunks to minimize memory usage QByteArray array; array.resize( int( qMin( qint64( 1024 * 1024 ), size ) ) ); qint64 n; qint64 total = 0; while ( ( n = file.read( array.data(), array.size() ) ) > 0 ) { if ( !writeData( array.data(), n ) ) { kWarning() << "writeData failed"; return false; } total += n; } Q_ASSERT( total == size ); if ( !finishWriting( size ) ) { kWarning() << "finishWriting failed"; return false; } return true; }
bool KArchive::addLocalFile(const QString &fileName, const QString &destName) { QFileInfo fileInfo(fileName); if (!fileInfo.isFile() && !fileInfo.isSymLink()) { setErrorString( tr("%1 doesn't exist or is not a regular file.") .arg(fileName)); return false; } #if defined(Q_OS_UNIX) #define STAT_METHOD QT_LSTAT #else #define STAT_METHOD QT_STAT #endif QT_STATBUF fi; if (STAT_METHOD(QFile::encodeName(fileName).constData(), &fi) == -1) { setErrorString( tr("Failed accessing the file %1 for adding to the archive. The error was: %2") .arg(fileName) .arg(QLatin1Literal{strerror(errno)})); return false; } if (fileInfo.isSymLink()) { QString symLinkTarget; // Do NOT use fileInfo.readLink() for unix symlinks! // It returns the -full- path to the target, while we want the target string "as is". #if defined(Q_OS_UNIX) && !defined(Q_OS_OS2EMX) const QByteArray encodedFileName = QFile::encodeName(fileName); QByteArray s; #if defined(PATH_MAX) s.resize(PATH_MAX + 1); #else int path_max = pathconf(encodedFileName.data(), _PC_PATH_MAX); if (path_max <= 0) { path_max = 4096; } s.resize(path_max); #endif int len = readlink(encodedFileName.data(), s.data(), s.size() - 1); if (len >= 0) { s[len] = '\0'; symLinkTarget = QFile::decodeName(s.constData()); } #endif if (symLinkTarget.isEmpty()) { // Mac or Windows symLinkTarget = fileInfo.symLinkTarget(); } return writeSymLink(destName, symLinkTarget, fileInfo.owner(), fileInfo.group(), fi.st_mode, fileInfo.lastRead(), fileInfo.lastModified(), fileInfo.created()); }/*end if*/ qint64 size = fileInfo.size(); // the file must be opened before prepareWriting is called, otherwise // if the opening fails, no content will follow the already written // header and the tar file is effectively f*cked up QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { setErrorString( tr("Couldn't open file %1: %2") .arg(fileName) .arg(file.errorString())); return false; } if (!prepareWriting(destName, fileInfo.owner(), fileInfo.group(), size, fi.st_mode, fileInfo.lastRead(), fileInfo.lastModified(), fileInfo.created())) { //qCWarning(KArchiveLog) << " prepareWriting" << destName << "failed"; return false; } // Read and write data in chunks to minimize memory usage QByteArray array; array.resize(int(qMin(qint64(1024 * 1024), size))); qint64 n; qint64 total = 0; while ((n = file.read(array.data(), array.size())) > 0) { if (!writeData(array.data(), n)) { //qCWarning(KArchiveLog) << "writeData failed"; return false; } total += n; } Q_ASSERT(total == size); if (!finishWriting(size)) { //qCWarning(KArchiveLog) << "finishWriting failed"; return false; } return true; }