X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FFileName.cpp;h=32a5862fdb6568bc91cd22670ce6e4b1c0780445;hb=b198a36a363bb6a084407d476942d68ef5fb5e86;hp=4e075f2ed81fc064ddf034ae38b92513c11b1761;hpb=1b508fff0332e514847ba87efbc2e1e0d981daa1;p=lyx.git diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp index 4e075f2ed8..32a5862fdb 100644 --- a/src/support/FileName.cpp +++ b/src/support/FileName.cpp @@ -22,7 +22,6 @@ #include "support/Package.h" #include "support/qstring_helpers.h" -#include #include #include #include @@ -35,7 +34,7 @@ #include #endif -#include +#include "support/checksum.h" #include #include @@ -519,7 +518,12 @@ time_t FileName::lastModified() const // been touched between the object creation and now, we refresh the file // information. d->refresh(); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) + return d->fi.lastModified().toSecsSinceEpoch(); +#else return d->fi.lastModified().toTime_t(); +#endif + } @@ -537,20 +541,14 @@ bool FileName::link(FileName const & name) const unsigned long checksum_ifstream_fallback(char const * file) { - unsigned long result = 0; //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(); - return result; + return 0; + return support::checksum(ifs); } + unsigned long FileName::checksum() const { if (!exists()) { @@ -583,11 +581,9 @@ unsigned long FileName::checksum() const qint64 size = fi.size(); uchar * ubeg = qf.map(0, size); uchar * uend = ubeg + size; - boost::crc_32_type ucrc; - ucrc.process_block(ubeg, uend); + result = support::checksum(ubeg, uend); qf.unmap(ubeg); qf.close(); - result = ucrc.checksum(); #else // QT_VERSION @@ -616,12 +612,10 @@ unsigned long FileName::checksum() const return 0; } - char * beg = static_cast(mm); - char * end = beg + info.st_size; + unsigned char * beg = static_cast(mm); + unsigned char * end = beg + info.st_size; - boost::crc_32_type crc; - crc.process_block(beg, end); - result = crc.checksum(); + result = support::checksum(beg, end); munmap(mm, info.st_size); close(fd); @@ -784,11 +778,7 @@ docstring FileName::fileContents(string const & encoding) const if (encoding.empty() || encoding == "UTF-8") s = QString::fromUtf8(contents.data()); else if (encoding == "ascii") -#if (QT_VERSION < 0x050000) - s = QString::fromAscii(contents.data()); -#else s = QString::fromLatin1(contents.data()); -#endif else if (encoding == "local8bit") s = QString::fromLocal8Bit(contents.data()); else if (encoding == "latin1") @@ -818,6 +808,19 @@ void FileName::changeExtension(string const & extension) } +void FileName::ensureExtension(string const & extension) +{ + string ext; + // Make sure the extension starts with a dot + if (!extension.empty() && extension[0] != '.') + ext= '.' + extension; + else + ext = extension; + if (!suffixIs(ascii_lowercase(absFileName()), ext)) + set(absFileName() + ext); +} + + docstring const FileName::relPath(string const & path) const { // FIXME UNICODE @@ -979,31 +982,11 @@ string DocFileName::mangledFileName(string const & dir, bool use_counter, bool e // Now the real work. Remove the extension. string mname = support::changeExtension(name, string()); - if (encrypt_path) { - QString qname = toqstr(mname); -#if QT_VERSION >= 0x050000 - QByteArray hash = QCryptographicHash::hash(qname.toLocal8Bit(),QCryptographicHash::Sha256); -#else - QByteArray hash = QCryptographicHash::hash(qname.toLocal8Bit(),QCryptographicHash::Sha1); -#endif - hash = hash.toHex(); - mname = fromqstr(QString(hash)); - mname = mname + "_" + onlyFileName(); - } + if (encrypt_path) + mname = "export_" + onlyFileName() + "_" + toHexHash(mname); // The mangled name must be a valid LaTeX name. - // The list of characters to keep is probably over-restrictive, - // but it is not really a problem. - // Apart from non-ASCII characters, at least the following characters - // are forbidden: '/', '.', ' ', and ':'. - // On windows it is not possible to create files with '<', '>' or '?' - // in the name. - static string const keep = "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "+-0123456789;="; - string::size_type pos = 0; - while ((pos = mname.find_first_not_of(keep, pos)) != string::npos) - mname[pos++] = '_'; + mname = sanitizeFileName(mname); // Add the extension back on mname = support::changeExtension(mname, getExtension(name));