]> git.lyx.org Git - lyx.git/blobdiff - src/EmbeddedFiles.cpp
* support/FileName:
[lyx.git] / src / EmbeddedFiles.cpp
index 155ed86ac787c1b57f58d669b59c9bc71f0bf482..2d2aef8c37b842a1c93d4f2340528fc9191529d2 100644 (file)
 
 #include "frontends/alert.h"
 
-#include <boost/filesystem/operations.hpp>
-
 #include "support/filetools.h"
-#include "support/fs_extras.h"
 #include "support/convert.h"
 #include "support/lyxlib.h"
 #include "support/lstrings.h"
@@ -53,14 +50,12 @@ using std::istringstream;
 
 namespace lyx {
 
-namespace fs = boost::filesystem;
 namespace Alert = frontend::Alert;
 
 using support::FileName;
 using support::DocFileName;
 using support::makeAbsPath;
 using support::addName;
-using support::onlyPath;
 using support::absolutePath;
 using support::onlyFilename;
 using support::makeRelPath;
@@ -74,7 +69,7 @@ using support::makedir;
 EmbeddedFile::EmbeddedFile(string const & file, string const & inzip_name,
        bool embed, Inset const * inset)
        : DocFileName(file, true), inzip_name_(inzip_name), embedded_(embed),
-               valid_(true), inset_list_()
+               inset_list_()
 {
        if (inset != NULL)
                inset_list_.push_back(inset);
@@ -109,7 +104,7 @@ void EmbeddedFile::saveBookmark(Buffer const * buf, int idx) const
                if (&(*it) == ptr) {
                        // this is basically BufferView::saveBookmark(0)
                        LyX::ref().session().bookmarks().save(
-                               FileName(buf->fileName()),
+                               FileName(buf->absFileName()),
                                it.bottom().pit(),
                                it.bottom().pos(),
                                it.paragraph().id(),
@@ -125,32 +120,23 @@ void EmbeddedFile::saveBookmark(Buffer const * buf, int idx) const
 
 string EmbeddedFile::availableFile(Buffer const * buf) const
 {
-       if (embedded())
-               return embeddedFile(buf);
-       else
-               return absFilename();
-}
-
-
-void EmbeddedFile::invalidate()
-{
-       // Clear inset_list_ because they will be registered again.
-       inset_list_.clear();
-       valid_ = false;
+       return embedded() ? embeddedFile(buf) : absFilename();
 }
 
 
 bool EmbeddedFile::extract(Buffer const * buf) const
 {
-
        string ext_file = absFilename();
        string emb_file = embeddedFile(buf);
 
-       if (!fs::exists(emb_file))
+       FileName emb(emb_file);
+       FileName ext(ext_file);
+
+       if (!emb.exists())
                return false;
 
        // if external file already exists ...
-       if (fs::exists(ext_file)) {
+       if (ext.exists()) {
                // no need to copy if the files are the same
                if (sum(*this) == sum(FileName(emb_file)))
                        return true;
@@ -165,20 +151,18 @@ bool EmbeddedFile::extract(Buffer const * buf) const
                        return true;
        }
        // copy file
-       try {
-               // need to make directory?
-               string path = onlyPath(ext_file);
-               if (!fs::is_directory(path))
-                       makedir(const_cast<char*>(path.c_str()), 0755);
-               fs::copy_file(emb_file, ext_file, false);
+
+       // need to make directory?
+       FileName path = ext.onlyPath();
+       if (!path.isDirectory())
+               makedir(const_cast<char*>(path.absFilename().c_str()), 0755);
+       if (emb.copyTo(ext))
                return true;
-       } catch (fs::filesystem_error const & fe) {
-               Alert::error(_("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)));
-               LYXERR(Debug::DEBUG) << "Fs error: " << fe.what() << endl;
-       }
+       Alert::error(_("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)));
+       //LYXERR(Debug::DEBUG, "Fs error: " << fe.what());
        return false;
 }
 
@@ -188,18 +172,21 @@ bool EmbeddedFile::updateFromExternalFile(Buffer const * buf) const
        string ext_file = absFilename();
        string emb_file = embeddedFile(buf);
 
-       if (!fs::exists(ext_file))
+       FileName emb(emb_file);
+       FileName ext(ext_file);
+
+       if (!ext.exists())
                return false;
        
        // if embedded file already exists ...
-       if (fs::exists(emb_file)) {
+       if (emb.exists()) {
                // no need to copy if the files are the same
                if (sum(*this) == sum(FileName(emb_file)))
                        return true;
                // other wise, ask if overwrite
                int const ret = Alert::prompt(
                        _("Update embedded file?"),
-                       bformat(_("Embeddedl file %1$s already exists, do you want to overwrite it"),
+                       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
@@ -207,45 +194,53 @@ bool EmbeddedFile::updateFromExternalFile(Buffer const * buf) const
                        return true;
        }
        // copy file
-       try {
-               // need to make directory?
-               string path = onlyPath(emb_file);
-               if (!fs::is_directory(path))
-                       makedir(const_cast<char*>(path.c_str()), 0755);
-               fs::copy_file(ext_file, emb_file, false);
+       // need to make directory?
+       FileName path = emb.onlyPath();
+       if (!path.isDirectory())
+               makedir(const_cast<char*>(path.absFilename().c_str()), 0755);
+       if (ext.copyTo(emb))
                return true;
-       } catch (fs::filesystem_error const & fe) {
-               Alert::error(_("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() << endl;
-       }
+       Alert::error(_("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;
 }
 
 
+void EmbeddedFile::updateInsets(Buffer const * buf) const
+{
+       vector<Inset const *>::const_iterator it = inset_list_.begin();
+       vector<Inset const *>::const_iterator it_end = inset_list_.end();
+       for (; it != it_end; ++it)
+               const_cast<Inset *>(*it)->updateEmbeddedFile(*buf, *this);
+}
+
+
 bool EmbeddedFiles::enabled() const
 {
        return buffer_->params().embedded;
 }
 
 
-bool EmbeddedFiles::enable(bool flag)
+void EmbeddedFiles::enable(bool flag)
 {
        if (enabled() != flag) {
                // if enable, copy all files to temppath()
                // if disable, extract all files
                if ((flag && !updateFromExternalFile()) || (!flag && !extract()))
-                       return false;
+                       return;
                // if operation is successful
                buffer_->markDirty();
                buffer_->params().embedded = flag;
+               if (flag)
+                       updateInsets();
        }
 }
 
 
-void EmbeddedFiles::registerFile(string const & filename,
+EmbeddedFile & EmbeddedFiles::registerFile(string const & filename,
        bool embed, Inset const * inset, string const & inzipName)
 {
        // filename can be relative or absolute, translate to absolute filename
@@ -259,34 +254,25 @@ void EmbeddedFiles::registerFile(string const & filename,
        // find this filename, keep the original embedding status
        if (it != file_list_.end()) {
                it->addInset(inset);
-               it->validate();
-               return;
+               return *it;
        }
-       // try to be more careful
+       //
        file_list_.push_back(EmbeddedFile(abs_filename, 
                getInzipName(abs_filename, inzipName), embed, inset));
+       return file_list_.back();
 }
 
 
 void EmbeddedFiles::update()
 {
-       // invalidate all files, obsolete files will then not be validated by the
-       // following document scan. These files will still be kept though, because
-       // they may be added later and their embedding status will be meaningful
-       // again (thinking of cut/paste of an InsetInclude).
-       EmbeddedFileList::iterator it = file_list_.begin();
-       EmbeddedFileList::iterator it_end = file_list_.end();
-       for (; it != it_end; ++it)
-               // we do not update items that are manually inserted
-               if (it->refCount() > 0)
-                       it->invalidate();
+       file_list_.clear();
 
        for (InsetIterator it = inset_iterator_begin(buffer_->inset()); it; ++it)
                it->registerEmbeddedFiles(*buffer_, *this);
 }
 
 
-bool EmbeddedFiles::write(DocFileName const & filename)
+bool EmbeddedFiles::writeFile(DocFileName const & filename)
 {
        // file in the temporary path has the content
        string const content = FileName(addName(buffer_->temppath(),
@@ -299,7 +285,7 @@ bool EmbeddedFiles::write(DocFileName const & filename)
        EmbeddedFileList::iterator it = file_list_.begin();
        EmbeddedFileList::iterator it_end = file_list_.end();
        for (; it != it_end; ++it) {
-               if (it->valid() && it->embedded()) {
+               if (it->embedded()) {
                        string file = it->availableFile(buffer_);
                        if (file.empty())
                                lyxerr << "File " << it->absFilename() << " does not exist. Skip embedding it. " << endl;
@@ -315,20 +301,19 @@ bool EmbeddedFiles::write(DocFileName const & filename)
 
        ::zipFiles(zipfile.toFilesystemEncoding(), filenames);
        // copy file back
-       try {
-               fs::copy_file(zipfile.toFilesystemEncoding(), filename.toFilesystemEncoding(), false);
-       } catch (fs::filesystem_error const & fe) {
+       if (!zipfile.copyTo(filename)) {
                Alert::error(_("Save failure"),
                                 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() << endl;
+               //LYXERR(Debug::DEBUG, "Fs error: " << fe.what());
        }
        return true;
 }
 
 
-EmbeddedFiles::EmbeddedFileList::const_iterator EmbeddedFiles::find(std::string filename) const
+EmbeddedFiles::EmbeddedFileList::const_iterator
+EmbeddedFiles::find(std::string filename) const
 {
        EmbeddedFileList::const_iterator it = file_list_.begin();
        EmbeddedFileList::const_iterator it_end = file_list_.end();
@@ -344,7 +329,7 @@ bool EmbeddedFiles::extract() const
        EmbeddedFileList::const_iterator it = file_list_.begin();
        EmbeddedFileList::const_iterator it_end = file_list_.end();
        for (; it != it_end; ++it)
-               if (it->valid() && it->embedded())
+               if (it->embedded())
                        if(!it->extract(buffer_))
                                return false;
        return true;
@@ -356,7 +341,7 @@ bool EmbeddedFiles::updateFromExternalFile() const
        EmbeddedFileList::const_iterator it = file_list_.begin();
        EmbeddedFileList::const_iterator it_end = file_list_.end();
        for (; it != it_end; ++it)
-               if (it->valid() && it->embedded())
+               if (it->embedded())
                        if (!it->updateFromExternalFile(buffer_))
                                return false;
        return true;
@@ -398,73 +383,13 @@ string const EmbeddedFiles::getInzipName(string const & abs_filename, string con
 }
 
 
-bool EmbeddedFiles::readManifest(Lexer & lex, ErrorList & errorList)
-{
-       int line = -1;
-       int begin_manifest_line = -1;
-
-       file_list_.clear();
-       string filename = "";
-       string inzipName = "";
-       bool status = "";
-
-       while (lex.isOK()) {
-               lex.next();
-               string const token = lex.getString();
-
-               if (token.empty())
-                       continue;
-
-               if (token == "\\end_manifest")
-                       break;
-
-               ++line;
-               if (token == "\\begin_manifest") {
-                       begin_manifest_line = line;
-                       continue;
-               }
-               
-               LYXERR(Debug::PARSER) << "Handling document manifest token: `"
-                                     << token << '\'' << endl;
-
-               if (token == "\\filename")
-                       lex >> filename;
-               else if (token == "\\inzipName")
-                       lex >> inzipName;
-               else if (token == "\\status") {
-                       lex >> status;
-                       registerFile(filename, status, NULL, inzipName);
-                       filename = "";
-                       inzipName = "";
-               } else {
-                       docstring const s = _("\\begin_file is missing");
-                       errorList.push_back(ErrorItem(_("Manifest error"),
-                               s, -1, 0, 0));
-               }
-       }
-       if (begin_manifest_line) {
-               docstring const s = _("\\begin_manifest is missing");
-               errorList.push_back(ErrorItem(_("Manifest error"),
-                       s, -1, 0, 0));
-       }
-       return true;
-}
-
-
-void EmbeddedFiles::writeManifest(ostream & os) const
+void EmbeddedFiles::updateInsets() const
 {
        EmbeddedFiles::EmbeddedFileList::const_iterator it = begin();
        EmbeddedFiles::EmbeddedFileList::const_iterator it_end = end();
-       for (; it != it_end; ++it) {
-               if (!it->valid())
-                       continue;
-               // save the relative path
-               os << "\\filename "
-                       << to_utf8(makeRelPath(from_utf8(it->absFilename()),
-                               from_utf8(buffer_->filePath()))) << '\n'
-                       << "\\inzipName " << it->inzipName() << '\n'
-                       << "\\status " << (it->embedded() ? "true" : "false") << '\n';
-       }
+       for (; it != it_end; ++it)
+               if (it->refCount() > 0)
+                       it->updateInsets(buffer_);
 }