#include "Converter.h"
#include "Counters.h"
#include "DocIterator.h"
-#include "EmbeddedFiles.h"
#include "Encoding.h"
#include "ErrorList.h"
#include "Exporter.h"
#include "graphics/Previews.h"
-#include "support/assert.h"
+#include "support/lassert.h"
#include "support/convert.h"
#include "support/debug.h"
#include "support/ExceptionMessage.h"
#include "support/Path.h"
#include "support/textutils.h"
#include "support/types.h"
-#include "support/FileZipListDir.h"
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
namespace {
-int const LYX_FORMAT = 327; // Uwe: support for Spanish(Mexico)
+int const LYX_FORMAT = 334;
typedef map<string, bool> DepClean;
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
/// Container for all sort of Buffer dependant errors.
map<string, ErrorList> errorLists;
- /// all embedded files of this buffer
- EmbeddedFileList embedded_files;
-
/// timestamp and checksum used to test if the file has been externally
/// modified. (Used to properly enable 'File->Revert to saved', bug 4114).
time_t timestamp_;
/// A cache for the bibfiles (including bibfiles of loaded child
/// documents), needed for appropriate update of natbib labels.
- mutable EmbeddedFileList bibfilesCache_;
+ mutable support::FileNameList bibfilesCache_;
+
+ /// A cache for bibliography info
+ mutable BiblioInfo bibinfo_;
mutable RefCache ref_cache_;
Buffer::Impl::Impl(Buffer & parent, FileName const & file, bool readonly_)
: parent_buffer(0), lyx_clean(true), bak_clean(true), unnamed(false),
read_only(readonly_), filename(file), file_fully_loaded(false),
- toc_backend(&parent), macro_lock(false),
- embedded_files(), timestamp_(0), checksum_(0), wa_(0),
- undo_(parent)
+ toc_backend(&parent), macro_lock(false), timestamp_(0),
+ checksum_(0), wa_(0), undo_(parent)
{
temppath = createBufferTmpDir();
lyxvc.setBuffer(&parent);
}
-EmbeddedFileList & Buffer::embeddedFiles()
-{
- return d->embedded_files;
-}
-
-
-EmbeddedFileList const & Buffer::embeddedFiles() const
-{
- return d->embedded_files;
-}
-
-
-bool Buffer::embedded() const
-{
- return params().embedded;
-}
-
-
Undo & Buffer::undo()
{
return d->undo_;
params().branchlist().clear();
params().preamble.erase();
params().options.erase();
+ params().master.erase();
params().float_placement.erase();
params().paperwidth.erase();
params().paperheight.erase();
LYXERR(Debug::PARSER, "Handling document header token: `"
<< token << '\'');
- string unknown = params().readToken(lex, token, d->filename.onlyPath(),
- d->temppath);
+ string unknown = params().readToken(lex, token, d->filename.onlyPath());
if (!unknown.empty()) {
if (unknown[0] != '\\' && token == "\\textclass") {
Alert::warning(_("Unknown document class"),
}
}
+ if (!params().master.empty()) {
+ FileName const master_file = makeAbsPath(params().master,
+ onlyPath(absFileName()));
+ if (isLyXFilename(master_file.absFilename())) {
+ Buffer * master = checkAndLoadLyXFile(master_file);
+ d->parent_buffer = master;
+ }
+ }
+
// read main text
bool const res = text().read(*this, lex, errorList, &(d->inset));
- // Enable embeded files, which will set temp path and move
- // inconsistent inzip files if needed.
- try {
- embeddedFiles().validate(*this);
- embeddedFiles().enable(params().embedded, *this, false);
- } catch (ExceptionMessage const & message) {
- Alert::error(message.title_, message.details_);
- Alert::warning(_("Failed to read embedded files"),
- _("Due to most likely a bug, LyX failed to locate all embedded "
- "file. If you unzip the LyX file, you should be able to see and "
- "open content.lyx which is your main text. You may also be able "
- "to recover some embedded files. Please report this bug to the "
- "lyx-devel mailing list."));
- return false;
- }
-
updateMacros();
updateMacroInstances();
return res;
bool Buffer::readFile(FileName const & filename)
{
FileName fname(filename);
- // Check if the file is compressed.
- string format = filename.guessFormatFromContents();
- if (format == "zip") {
- // decompress to a temp directory
- LYXERR(Debug::FILES, filename << " is in zip format. Unzip to " << temppath());
- ::unzipToDir(filename.toFilesystemEncoding(), temppath());
- //
- FileName lyxfile(addName(temppath(), "content.lyx"));
- // if both manifest.txt and file.lyx exist, this is am embedded file
- if (lyxfile.exists()) {
- // if in bundled format, save checksum of the compressed file, not content.lyx
- saveCheckSum(filename);
- params().embedded = true;
- fname = lyxfile;
- }
- }
- // The embedded lyx file can also be compressed, for backward compatibility
- format = fname.guessFormatFromContents();
- if (format == "gzip" || format == "zip" || format == "compress")
- params().compressed = true;
// remove dummy empty par
paragraphs().clear();
bool retval = false;
- FileName content;
- if (params().embedded)
- // first write the .lyx file to the temporary directory
- content = FileName(addName(temppath(), "content.lyx"));
- else
- content = fname;
-
docstring const str = bformat(_("Saving document %1$s..."),
- makeDisplayPath(content.absFilename()));
+ makeDisplayPath(fname.absFilename()));
message(str);
if (params().compressed) {
- gz::ogzstream ofs(content.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
+ gz::ogzstream ofs(fname.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
retval = ofs && write(ofs);
} else {
- ofstream ofs(content.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
+ ofstream ofs(fname.toFilesystemEncoding().c_str(), ios::out|ios::trunc);
retval = ofs && write(ofs);
}
removeAutosaveFile(d->filename.absFilename());
- if (params().embedded) {
- message(str + _(" writing embedded files."));
- // if embedding is enabled, write file.lyx and all the embedded files
- // to the zip file fname.
- if (!d->embedded_files.writeFile(fname, *this)) {
- message(str + _(" could not write embedded files!"));
- return false;
- }
- }
saveCheckSum(d->filename);
message(str + _(" done."));
if (it->lyxCode() == BIBTEX_CODE) {
InsetBibtex const & inset =
static_cast<InsetBibtex const &>(*it);
- EmbeddedFileList const bibfiles = inset.getBibFiles();
+ support::FileNameList const bibfiles = inset.getBibFiles();
d->bibfilesCache_.insert(d->bibfilesCache_.end(),
bibfiles.begin(),
bibfiles.end());
InsetInclude & inset =
static_cast<InsetInclude &>(*it);
inset.updateBibfilesCache();
- EmbeddedFileList const & bibfiles =
+ support::FileNameList const & bibfiles =
inset.getBibfilesCache(*this);
d->bibfilesCache_.insert(d->bibfilesCache_.end(),
bibfiles.begin(),
}
-EmbeddedFileList const & Buffer::getBibfilesCache() const
+support::FileNameList const & Buffer::getBibfilesCache() const
{
// If this is a child document, use the parent's cache instead.
if (d->parent_buffer)
}
+BiblioInfo const & Buffer::masterBibInfo() const
+{
+ // if this is a child document and the parent is already loaded
+ // use the parent's list instead [ale990412]
+ Buffer const * const tmp = masterBuffer();
+ LASSERT(tmp, /**/);
+ if (tmp != this)
+ return tmp->masterBibInfo();
+ return localBibInfo();
+}
+
+
+BiblioInfo const & Buffer::localBibInfo() const
+{
+ // cache the timestamp of the bibliography files.
+ static map<FileName, time_t> bibfileStatus;
+
+ support::FileNameList const & bibfilesCache = getBibfilesCache();
+ // compare the cached timestamps with the actual ones.
+ bool changed = false;
+ support::FileNameList::const_iterator ei = bibfilesCache.begin();
+ support::FileNameList::const_iterator en = bibfilesCache.end();
+ for (; ei != en; ++ ei) {
+ time_t lastw = ei->lastModified();
+ if (lastw != bibfileStatus[*ei]) {
+ changed = true;
+ bibfileStatus[*ei] = lastw;
+ break;
+ }
+ }
+
+ if (changed) {
+ for (InsetIterator it = inset_iterator_begin(inset()); it; ++it)
+ it->fillWithBibKeys(d->bibinfo_, it);
+ }
+ return d->bibinfo_;
+}
+
+
bool Buffer::isDepClean(string const & name) const
{
DepClean::const_iterator const it = d->dep_clean.find(name);
// Check if the label 'from' appears more than once
vector<docstring> labels;
string paramName;
- BiblioInfo keys;
- keys.fillWithBibKeys(this);
+ BiblioInfo const & keys = masterBibInfo();
BiblioInfo::const_iterator bit = keys.begin();
BiblioInfo::const_iterator bend = keys.end();
}
}
+
} // namespace lyx