using support::tempName;
using support::trim;
using support::sum;
+using support::suffixIs;
namespace Alert = frontend::Alert;
namespace os = support::os;
namespace {
-int const LYX_FORMAT = 282;
+int const LYX_FORMAT = 285;
} // namespace anon
BOOST_ASSERT(paragraphs().empty());
readHeader(lex);
- if (!params().getTextClass().load(filePath())) {
- string theclass = params().getTextClass().name();
+ TextClass const & baseClass = textclasslist[params().getBaseClass()];
+ if (!baseClass.load(filePath())) {
+ string theclass = baseClass.name();
Alert::error(_("Can't load document class"), bformat(
_("Using the default document class, because the "
"class %1$s could not be loaded."), from_utf8(theclass)));
"\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
}
}
+ // read manifest after header
+ embeddedFiles().readManifest(lex, errorList);
+ // read main text
bool const res = text().read(*this, lex, errorList);
for_each(text().paragraphs().begin(),
text().paragraphs().end(),
LYXERR(Debug::FILES) << filename << " is in zip format. Unzip to " << temppath() << endl;
::unzipToDir(filename.toFilesystemEncoding(), temppath());
//
- FileName manifest(addName(temppath(), "manifest.txt"));
- FileName lyxfile(addName(temppath(),
- onlyFilename(filename.toFilesystemEncoding())));
+ FileName lyxfile(addName(temppath(), "content.lyx"));
// if both manifest.txt and file.lyx exist, this is am embedded file
- if (fs::exists(manifest.toFilesystemEncoding()) &&
- fs::exists(lyxfile.toFilesystemEncoding())) {
+ if (fs::exists(lyxfile.toFilesystemEncoding())) {
params().embedded = true;
fname = lyxfile;
- // read manifest file
- ifstream is(manifest.toFilesystemEncoding().c_str());
- is >> pimpl_->embedded_files;
- is.close();
- LYXERR(Debug::FILES) << filename << " is a embedded file. Its manifest is:\n"
- << pimpl_->embedded_files;
}
}
// The embedded lyx file can also be compressed, for backward compatibility
// to not overwrite them with those of the file created in the tempdir
// when it has to be converted to the current format.
if (!pimpl_->checksum_) {
- pimpl_->timestamp_ = fs::last_write_time(filename.toFilesystemEncoding());
- pimpl_->checksum_ = sum(filename);
+ // Save the timestamp and checksum of disk file. If filename is an
+ // emergency file, save the timestamp and sum of the original lyx file
+ // because isExternallyModified will check for this file. (BUG4193)
+ string diskfile = filename.toFilesystemEncoding();
+ if (suffixIs(diskfile, ".emergency"))
+ diskfile = diskfile.substr(0, diskfile.size() - 10);
+ saveCheckSum(diskfile);
}
if (file_format != LYX_FORMAT) {
if (writeFile(pimpl_->filename)) {
markClean();
removeAutosaveFile(fileName());
- pimpl_->timestamp_ = fs::last_write_time(pimpl_->filename.toFilesystemEncoding());
- pimpl_->checksum_ = sum(pimpl_->filename);
+ saveCheckSum(pimpl_->filename.toFilesystemEncoding());
return true;
} else {
// Saving failed, so backup is not backup
FileName content;
if (params().embedded)
// first write the .lyx file to the temporary directory
- content = FileName(addName(temppath(),
- onlyFilename(fname.toFilesystemEncoding())));
+ content = FileName(addName(temppath(), "content.lyx"));
else
content = fname;
if (retval && params().embedded) {
// write file.lyx and all the embedded files to the zip file fname
- // if embedding is enabled, and there is any embedded file
- pimpl_->embedded_files.update();
- return pimpl_->embedded_files.write(fname);
+ // if embedding is enabled
+ return pimpl_->embedded_files.writeFile(fname);
}
return retval;
}
params().writeFile(ofs);
ofs << "\\end_header\n";
+ // write the manifest after header
+ ofs << "\n\\begin_manifest\n";
+ pimpl_->embedded_files.update();
+ embeddedFiles().writeManifest(ofs);
+ ofs << "\\end_manifest\n";
+
// write the text
ofs << "\n\\begin_body\n";
text().write(*this, ofs);
}
+void Buffer::saveCheckSum(string const & file) const
+{
+ if (fs::exists(file)) {
+ pimpl_->timestamp_ = fs::last_write_time(file);
+ pimpl_->checksum_ = sum(FileName(file));
+ } else {
+ // in the case of save to a new file.
+ pimpl_->timestamp_ = 0;
+ pimpl_->checksum_ = 0;
+ }
+}
+
+
void Buffer::markClean() const
{
if (!pimpl_->lyx_clean) {
if (!params().parentname.empty()
&& theBufferList().exists(params().parentname)) {
Buffer * buf = theBufferList().getBuffer(params().parentname);
- if (buf)
+ //We need to check if the parent is us...
+ //FIXME RECURSIVE INCLUDE
+ //This is not sufficient, since recursive includes could be downstream.
+ if (buf && buf != this)
return buf->getMasterBuffer();
}