From 56a60dce0a6aaea9c49a81b2d0a8c2c1c43822b0 Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Mon, 29 Sep 2008 09:35:13 +0000 Subject: [PATCH] Merge FileFileName::Private::checksum() into FileFileName::checksum(). git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@26615 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/support/FileName.cpp | 169 +++++++++++++++++++-------------------- 1 file changed, 83 insertions(+), 86 deletions(-) diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp index 2126039297..a625e01e4e 100644 --- a/src/support/FileName.cpp +++ b/src/support/FileName.cpp @@ -121,85 +121,10 @@ struct FileName::Private #endif } - unsigned long checksum(); - /// QFileInfo fi; }; -unsigned long FileName::Private::checksum() -{ -#if QT_VERSION >= 0x999999 - // First version of checksum uses Qt4.4 mmap support. - // FIXME: This code is not ready with Qt4.4.2, - // see http://bugzilla.lyx.org/show_bug.cgi?id=5293 - // FIXME: should we check if the MapExtension extension is supported? - // see QAbstractFileEngine::supportsExtension() and - // QAbstractFileEngine::MapExtension) - QFile qf(fi.filePath()); - if (!qf.open(QIODevice::ReadOnly)) - return 0; - qint64 size = fi.size(); - uchar * ubeg = qf.map(0, size); - uchar * uend = ubeg + size; - boost::crc_32_type ucrc; - ucrc.process_block(ubeg, uend); - qf.unmap(ubeg); - qf.close(); - return ucrc.checksum(); -#endif - - //FIXME: This doesn't work on Windows for non ascii file names. Provided that - // Windows package uses Qt4.4, this isn't a problem. - QByteArray const encoded = QFile::encodeName(fi.absoluteFilePath()); - char const * file = encoded.constData(); - -#ifdef SUM_WITH_MMAP - //LYXERR(Debug::FILES, "using mmap (lightning fast)"); - - int fd = open(file, O_RDONLY); - if (!fd) - return 0; - - struct stat info; - fstat(fd, &info); - - void * mm = mmap(0, info.st_size, PROT_READ, - MAP_PRIVATE, fd, 0); - // Some platforms have the wrong type for MAP_FAILED (compaq cxx). - if (mm == reinterpret_cast(MAP_FAILED)) { - close(fd); - return 0; - } - - char * beg = static_cast(mm); - char * end = beg + info.st_size; - - boost::crc_32_type crc; - crc.process_block(beg, end); - unsigned long result = crc.checksum(); - - munmap(mm, info.st_size); - close(fd); - - return result; - -#else // no SUM_WITH_MMAP - - //LYXERR(Debug::FILES, "lyx::sum() using istreambuf_iterator (fast)"); - ifstream ifs(file, ios_base::in | ios_base::binary); - if (!ifs) - return 0; - - istreambuf_iterator beg(ifs); - istreambuf_iterator end; - boost::crc_32_type crc; - crc = for_each(beg, end, crc); - return crc.checksum(); - -#endif // SUM_WITH_MMAP -} - ///////////////////////////////////////////////////////////////////// // // FileName @@ -330,6 +255,8 @@ bool FileName::changePermission(unsigned long int mode) const string FileName::toFilesystemEncoding() const { + // FIXME: This doesn't work on Windows for non ascii file names with Qt < 4.4. + // Provided that Windows package uses Qt4.4, this isn't a problem. QByteArray const encoded = QFile::encodeName(d->fi.absoluteFilePath()); return string(encoded.begin(), encoded.end()); } @@ -521,24 +448,94 @@ bool FileName::chdir() const unsigned long FileName::checksum() const { + unsigned long result = 0; + if (!exists()) { //LYXERR0("File \"" << absFilename() << "\" does not exist!"); - return 0; + return result; } // a directory may be passed here so we need to test it. (bug 3622) if (isDirectory()) { LYXERR0('"' << absFilename() << "\" is a directory!"); - return 0; + return result; + } + + // This is used in the debug output at the end of the method. + static QTime t; + if (lyxerr.debugging(Debug::FILES)) + t.restart(); + +#if QT_VERSION >= 0x999999 + // First version of checksum uses Qt4.4 mmap support. + // FIXME: This code is not ready with Qt4.4.2, + // see http://bugzilla.lyx.org/show_bug.cgi?id=5293 + // FIXME: should we check if the MapExtension extension is supported? + // see QAbstractFileEngine::supportsExtension() and + // QAbstractFileEngine::MapExtension) + QFile qf(fi.filePath()); + if (!qf.open(QIODevice::ReadOnly)) + return result; + qint64 size = fi.size(); + uchar * ubeg = qf.map(0, size); + uchar * uend = ubeg + size; + boost::crc_32_type ucrc; + ucrc.process_block(ubeg, uend); + qf.unmap(ubeg); + qf.close(); + result = ucrc.checksum(); + +#else // QT_VERSION + + string const encoded = toFilesystemEncoding(); + char const * file = encoded.c_str(); + + #ifdef SUM_WITH_MMAP + //LYXERR(Debug::FILES, "using mmap (lightning fast)"); + + int fd = open(file, O_RDONLY); + if (!fd) + return result; + + struct stat info; + fstat(fd, &info); + + void * mm = mmap(0, info.st_size, PROT_READ, + MAP_PRIVATE, fd, 0); + // Some platforms have the wrong type for MAP_FAILED (compaq cxx). + if (mm == reinterpret_cast(MAP_FAILED)) { + close(fd); + return result; } - if (!lyxerr.debugging(Debug::FILES)) - return d->checksum(); - - QTime t; - t.start(); - unsigned long r = d->checksum(); - lyxerr << "Checksumming \"" << absFilename() << "\" " - << r << " lasted " << t.elapsed() << " ms." << endl; - return r; + + char * beg = static_cast(mm); + char * end = beg + info.st_size; + + boost::crc_32_type crc; + crc.process_block(beg, end); + unsigned long result = crc.checksum(); + + munmap(mm, info.st_size); + close(fd); + + #else // no SUM_WITH_MMAP + + //LYXERR(Debug::FILES, "lyx::sum() using istreambuf_iterator (fast)"); + ifstream ifs(file, ios_base::in | ios_base::binary); + if (!ifs) + return result; + + istreambuf_iterator beg(ifs); + istreambuf_iterator end; + boost::crc_32_type crc; + crc = for_each(beg, end, crc); + result = crc.checksum(); + + #endif // SUM_WITH_MMAP +#endif // QT_VERSION + + LYXERR(Debug::FILES, "Checksumming \"" << absFilename() << "\" " + << result << " lasted " << t.elapsed() << " ms."); + return result; } -- 2.39.5