#include "support/ExceptionMessage.h"
#include "support/FileZipListDir.h"
+#include <boost/assert.hpp>
+
#include <sstream>
#include <fstream>
#include <utility>
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);
}
temp_path_ = buf->temppath();
if (!suffixIs(temp_path_, '/'))
temp_path_ += '/';
- if (embedded()) {
- if (updateFile)
- updateFromExternalFile();
- }
- } else {
if (embedded() && updateFile)
+ updateFromExternalFile();
+ } else {
+ // 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_ = "";
}
if (!emb.exists()) {
if (ext.exists())
return true;
- else
- throw ExceptionMessage(ErrorException, _("Failed to extract file"),
- bformat(_("Cannot extract file '%1$s'.\n"
- "Source file %2$s does not exist"),
- from_utf8(outputFilename()), from_utf8(emb_file)));
+ throw ExceptionMessage(ErrorException, _("Failed to extract file"),
+ bformat(_("Cannot extract file '%1$s'.\n"
+ "Source file %2$s does not exist"),
+ from_utf8(outputFilename()), from_utf8(emb_file)));
}
// if external file already exists ...
// 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
}
+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<Inset const *>::const_iterator it = inset_list_.begin();
++count_external;
}
// if operation is successful (no exception is thrown)
- buffer.markDirty();
buffer.params().embedded = flag;
// if the operation is successful, update insets
for (it = begin(); it != it_end; ++it)
it->updateInsets();
- if (!updateFile)
+ if (!updateFile || (count_external == 0 && count_embedded == 0))
return;
// show result
// copy file back
if (!zipfile.copyTo(filename)) {
Alert::error(_("Save failure"),
- bformat(_("Cannot create file %1$s.\n"
+ bformat(_("Cannot create file %1$s.\n"
"Please check whether the directory exists and is writeable."),
from_utf8(filename.absFilename())));
- //LYXERR(Debug::DEBUG, "Fs error: " << fe.what());
}
return true;
}