X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEmbeddedFiles.cpp;h=4109dcd74662eba9fb255722449602ede3d5ae5b;hb=6c977615633e5e132494b9a7fa778588210f9c95;hp=b9f3c2a111004c1c2193eed24d3431a97c389ce8;hpb=a3c4711b08c129b98a24293b3f57e55f6a093353;p=lyx.git diff --git a/src/EmbeddedFiles.cpp b/src/EmbeddedFiles.cpp index b9f3c2a111..4109dcd746 100644 --- a/src/EmbeddedFiles.cpp +++ b/src/EmbeddedFiles.cpp @@ -34,6 +34,8 @@ #include "support/ExceptionMessage.h" #include "support/FileZipListDir.h" +#include + #include #include #include @@ -46,8 +48,7 @@ namespace lyx { namespace Alert = frontend::Alert; EmbeddedFile::EmbeddedFile(string const & file, std::string const & buffer_path) - : DocFileName("", false), inzip_name_(""), embedded_(false), inset_list_(), - temp_path_("") + : DocFileName("", false), embedded_(false), inset_list_() { set(file, buffer_path); } @@ -131,7 +132,9 @@ void EmbeddedFile::enable(bool flag, Buffer const * buf, bool updateFile) if (embedded() && updateFile) updateFromExternalFile(); } else { - if (embedded() && updateFile) + // when a new embeddeed file is created, it is not enabled, and + // there is no need to extract. + if (enabled() && embedded() && updateFile) extract(); temp_path_ = ""; } @@ -165,7 +168,7 @@ bool EmbeddedFile::extract() const // otherwise, ask if overwrite int ret = Alert::prompt( _("Overwrite external file?"), - bformat(_("External file %1$s already exists, do you want to overwrite it"), + bformat(_("External file %1$s already exists, do you want to overwrite it?"), from_utf8(ext_file)), 1, 1, _("&Overwrite"), _("&Cancel")); if (ret != 0) // if the user does not want to overwrite, we still consider it @@ -251,6 +254,64 @@ bool EmbeddedFile::updateFromExternalFile() const } +EmbeddedFile EmbeddedFile::copyTo(Buffer const * buf) +{ + EmbeddedFile file = EmbeddedFile(absFilename(), buf->filePath()); + file.setEmbed(embedded()); + file.enable(buf->embedded(), buf, false); + + // use external file. + if (!embedded()) + return file; + + LYXERR(Debug::FILES, "Copy " << availableFile() + << " to " << file.availableFile()); + + FileName from_file = availableFile(); + FileName to_file = file.availableFile(); + + if (!from_file.exists()) { + // no from file + throw ExceptionMessage(ErrorException, + _("Failed to copy embedded file"), + bformat(_("Failed to embed file %1$s.\n" + "Please check whether the source file is available"), + from_utf8(absFilename()))); + file.setEmbed(false); + return file; + } + + // if destination file already exists ... + if (to_file.exists()) { + // no need to copy if the files are the same + if (checksum() == to_file.checksum()) + return file; + // other wise, ask if overwrite + int const ret = Alert::prompt( + _("Update embedded file?"), + bformat(_("Embedded file %1$s already exists, do you want to overwrite it"), + from_utf8(to_file.absFilename())), 1, 1, _("&Overwrite"), _("&Cancel")); + if (ret != 0) + // if the user does not want to overwrite, we still consider it + // a successful operation. + return file; + } + // copy file + // need to make directory? + FileName path = to_file.onlyPath(); + if (!path.isDirectory()) + path.createPath(); + if (from_file.copyTo(to_file)) + return file; + throw ExceptionMessage(ErrorException, + _("Copy file failure"), + bformat(_("Cannot copy file %1$s to %2$s.\n" + "Please check whether the directory exists and is writeable."), + from_utf8(from_file.absFilename()), from_utf8(to_file.absFilename()))); + return file; +} + + void EmbeddedFile::updateInsets() const { vector::const_iterator it = inset_list_.begin(); @@ -411,7 +472,7 @@ void EmbeddedFileList::enable(bool flag, Buffer & buffer, bool updateFile) for (it = begin(); it != it_end; ++it) it->updateInsets(); - if (!updateFile) + if (!updateFile || (count_external == 0 && count_embedded == 0)) return; // show result