+ BOOST_ASSERT(enabled());
+
+ string ext_file = absFilename();
+ string emb_file = embeddedFile();
+
+ FileName emb(emb_file);
+ FileName ext(ext_file);
+
+ if (!emb.exists()) {
+ if (ext.exists())
+ return true;
+ 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 ...
+ if (ext.exists()) {
+ // no need to copy if the files are the same
+ if (checksum() == FileName(emb_file).checksum())
+ return true;
+ // otherwise, ask if overwrite
+ int ret = Alert::prompt(
+ _("Overwrite external file?"),
+ 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
+ // a successful operation.
+ return true;
+ }
+ // copy file
+
+ // need to make directory?
+ FileName path = ext.onlyPath();
+ if (!path.createPath()) {
+ throw ExceptionMessage(ErrorException, _("Copy file failure"),
+ bformat(_("Cannot create file path '%1$s'.\n"
+ "Please check whether the path is writeable."),
+ from_utf8(path.absFilename())));
+ return false;
+ }
+
+ if (emb.copyTo(ext)) {
+ LYXERR(Debug::FILES, "Extract file " << emb_file << " to " << ext_file << endl);
+ return true;
+ }
+
+ 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(emb_file), from_utf8(ext_file)));
+ return false;
+}
+
+
+bool EmbeddedFile::updateFromExternalFile() const
+{
+ BOOST_ASSERT(enabled());
+
+ string ext_file = absFilename();
+ string emb_file = embeddedFile();
+
+ FileName emb(emb_file);
+ FileName ext(ext_file);
+
+ if (!ext.exists()) {
+ // no need to update
+ if (emb.exists())
+ return true;
+ // no external and internal file
+ throw ExceptionMessage(ErrorException,
+ _("Failed to embed file"),
+ bformat(_("Failed to embed file %1$s.\n"
+ "Please check whether this file exists and is readable."),
+ from_utf8(ext_file)));
+ }
+
+ // if embedded file already exists ...
+ if (emb.exists()) {
+ // no need to copy if the files are the same
+ if (checksum() == FileName(emb_file).checksum())
+ return true;
+ // 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(ext_file)), 1, 1, _("&Overwrite"), _("&Cancel"));
+ if (ret != 0)
+ // if the user does not want to overwrite, we still consider it
+ // a successful operation.
+ return true;
+ }
+ // copy file
+ // need to make directory?
+ FileName path = emb.onlyPath();
+ if (!path.isDirectory())
+ path.createPath();
+ if (ext.copyTo(emb))
+ return true;
+ 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(ext_file), from_utf8(emb_file)));
+ //LYXERR(Debug::DEBUG, "Fs error: " << fe.what());
+ return false;
+}
+
+
+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;