From cbad214cdda5f85a177148e38c138b9560ba0c17 Mon Sep 17 00:00:00 2001 From: Yuriy Skalko Date: Sat, 21 Nov 2020 15:40:31 +0200 Subject: [PATCH] Refactor checksum calculation --- src/ConverterCache.cpp | 13 ++------ src/frontends/qt/GuiApplication.cpp | 11 ++----- src/frontends/qt/GuiClipboard.cpp | 15 ++++------ src/support/FileName.cpp | 22 ++++---------- src/support/Makefile.am | 2 ++ src/support/checksum.cpp | 46 +++++++++++++++++++++++++++++ src/support/checksum.h | 30 +++++++++++++++++++ 7 files changed, 95 insertions(+), 44 deletions(-) create mode 100644 src/support/checksum.cpp create mode 100644 src/support/checksum.h diff --git a/src/ConverterCache.cpp b/src/ConverterCache.cpp index bee0253652..0f4d03efb9 100644 --- a/src/ConverterCache.cpp +++ b/src/ConverterCache.cpp @@ -25,8 +25,8 @@ #include "support/lyxtime.h" #include "support/Package.h" +#include "support/checksum.h" #include "support/lassert.h" -#include #include #include @@ -41,14 +41,6 @@ namespace lyx { namespace { -unsigned long do_crc(string const & s) -{ - boost::crc_32_type crc; - crc = for_each(s.begin(), s.end(), crc); - return crc.checksum(); -} - - // FIXME THREAD // This should be OK because it is only assigned during init() static FileName cache_dir; @@ -62,7 +54,8 @@ public: : timestamp(t), checksum(c) { ostringstream os; - os << setw(10) << setfill('0') << do_crc(orig_from.absFileName()) + os << setw(10) << setfill('0') + << support::checksum(orig_from.absFileName()) << '-' << to_format; cache_name = FileName(addName(cache_dir.absFileName(), os.str())); LYXERR(Debug::FILES, "Add file cache item " << orig_from diff --git a/src/frontends/qt/GuiApplication.cpp b/src/frontends/qt/GuiApplication.cpp index b3cfd5e5bf..8ab89b89ef 100644 --- a/src/frontends/qt/GuiApplication.cpp +++ b/src/frontends/qt/GuiApplication.cpp @@ -59,6 +59,7 @@ #include "insets/InsetText.h" +#include "support/checksum.h" #include "support/convert.h" #include "support/debug.h" #include "support/ExceptionMessage.h" @@ -146,8 +147,6 @@ #include #endif // Q_OS_MAC -#include - #include #include #include @@ -1708,9 +1707,7 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr) && !is_open)) { // We want the ui session to be saved per document and not per // window number. The filename crc is a good enough identifier. - boost::crc_32_type crc; - crc = for_each(fname.begin(), fname.end(), crc); - createView(crc.checksum()); + createView(support::checksum(fname)); current_view_->openDocument(fname); if (!current_view_->documentBufferView()) current_view_->close(); @@ -2670,10 +2667,8 @@ void GuiApplication::restoreGuiSession() FileName const & file_name = last.file_name; if (!current_view_ || (!lyxrc.open_buffers_in_tabs && current_view_->documentBufferView() != 0)) { - boost::crc_32_type crc; string const & fname = file_name.absFileName(); - crc = for_each(fname.begin(), fname.end(), crc); - createView(crc.checksum()); + createView(support::checksum(fname)); } current_view_->loadDocument(file_name, false); diff --git a/src/frontends/qt/GuiClipboard.cpp b/src/frontends/qt/GuiClipboard.cpp index 59e59005b7..f78ab1cda4 100644 --- a/src/frontends/qt/GuiClipboard.cpp +++ b/src/frontends/qt/GuiClipboard.cpp @@ -35,6 +35,8 @@ #include "frontends/alert.h" +#include "support/checksum.h" + #include #include #include @@ -47,8 +49,6 @@ #include #include -#include - #include #include #include @@ -431,11 +431,8 @@ void GuiClipboard::put(string const & lyx, docstring const & html, docstring con data->setData(lyxMimeType(), qlyx); // If the OS has not the concept of clipboard ownership, // we recognize internal data through its checksum. - if (!hasInternal()) { - boost::crc_32_type crc32; - crc32.process_bytes(lyx.c_str(), lyx.size()); - checksum = crc32.checksum(); - } + if (!hasInternal()) + checksum = support::checksum(lyx); } // Don't test for text.empty() since we want to be able to clear the // clipboard. @@ -528,9 +525,7 @@ bool GuiClipboard::isInternal() const // ourself by comparing its checksum with the stored one. QByteArray const ar = cache_.data(lyxMimeType()); string const data(ar.data(), ar.count()); - boost::crc_32_type crc32; - crc32.process_bytes(data.c_str(), data.size()); - return checksum == crc32.checksum(); + return checksum == static_cast(support::checksum(data)); } diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp index 4e075f2ed8..3d31c7d37c 100644 --- a/src/support/FileName.cpp +++ b/src/support/FileName.cpp @@ -35,7 +35,7 @@ #include #endif -#include +#include "support/checksum.h" #include #include @@ -537,20 +537,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 +577,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 @@ -619,9 +611,7 @@ unsigned long FileName::checksum() const char * beg = static_cast(mm); 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); diff --git a/src/support/Makefile.am b/src/support/Makefile.am index addeab86b8..45d30b823f 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -38,6 +38,8 @@ liblyxsupport_a_SOURCES = \ bind.h \ Cache.h \ Changer.h \ + checksum.cpp \ + checksum.h \ ConsoleApplication.cpp \ ConsoleApplication.h \ ConsoleApplicationPrivate.h \ diff --git a/src/support/checksum.cpp b/src/support/checksum.cpp new file mode 100644 index 0000000000..151b5330d6 --- /dev/null +++ b/src/support/checksum.cpp @@ -0,0 +1,46 @@ +// -*- C++ -*- +/** + * \file checksum.cpp + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Yuriy Skalko + * + * Full author contact details are available in file CREDITS. + */ + +#include "support/checksum.h" +#include "boost/crc.hpp" +#include + +namespace lyx { + +namespace support { + +unsigned long checksum(std::string const & s) +{ + boost::crc_32_type crc; + crc.process_bytes(s.c_str(), s.size()); + return crc.checksum(); +} + +unsigned long checksum(std::ifstream & ifs) +{ + std::istreambuf_iterator beg(ifs); + std::istreambuf_iterator end; + + boost::crc_32_type crc; + crc = for_each(beg, end, crc); + return crc.checksum(); +} + +unsigned long checksum(char const * beg, char const * end) +{ + boost::crc_32_type crc; + crc.process_block(beg, end); + return crc.checksum(); +} + +} // namespace support + +} // namespace lyx diff --git a/src/support/checksum.h b/src/support/checksum.h new file mode 100644 index 0000000000..ab14339765 --- /dev/null +++ b/src/support/checksum.h @@ -0,0 +1,30 @@ +// -*- C++ -*- +/** + * \file checksum.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Yuriy Skalko + * + * Full author contact details are available in file CREDITS. + */ + +#ifndef LYX_CHECKSUM_H +#define LYX_CHECKSUM_H + +#include +#include + +namespace lyx { + +namespace support { + +unsigned long checksum(std::string const & s); +unsigned long checksum(std::ifstream & ifs); +unsigned long checksum(char const * beg, char const * end); + +} // namespace support + +} // namespace lyx + +#endif // LYX_CHECKSUM_H -- 2.39.5