Clean up EmbeddedFiles.h/cpp because the valid_ field is no longer needed

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21304 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Bo Peng 2007-10-30 22:21:48 +00:00
parent 829f1ceb96
commit 773e3d475f
2 changed files with 30 additions and 80 deletions

View File

@ -74,7 +74,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);
@ -125,24 +125,12 @@ 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);
@ -270,10 +258,9 @@ EmbeddedFile & EmbeddedFiles::registerFile(string const & filename,
// find this filename, keep the original embedding status
if (it != file_list_.end()) {
it->addInset(inset);
it->validate();
return *it;
}
// try to be more careful
//
file_list_.push_back(EmbeddedFile(abs_filename,
getInzipName(abs_filename, inzipName), embed, inset));
return file_list_.back();
@ -282,16 +269,7 @@ EmbeddedFile & EmbeddedFiles::registerFile(string const & filename,
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);
@ -311,7 +289,7 @@ bool EmbeddedFiles::writeFile(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;
@ -356,7 +334,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;
@ -368,7 +346,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;
@ -415,7 +393,7 @@ 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() && it->refCount() > 0)
if (it->refCount() > 0)
it->updateInsets(buffer_);
}

View File

@ -30,15 +30,23 @@ an 'Embedded Files' feature of lyx.
Expected features:
=========================
1. With embedding enabled (disabled by default), .lyx file can embed graphics,
listings, bib file etc.
1. Bundled .lyx file can embed graphics, listings, bib file etc. The bundle
format is used when Document->Save in bundled format is selected.
2. Embedded file.lyx file is a zip file, with file.lyx, manifest.txt
and embedded files.
2. Embedded file.lyx file is a zip file, with content.lyx and embedded files.
3. An embedding dialog is provided to change embedding status (buffer
level or individual embedded files), manually embed, extract, view
or edit files.
3. The embedding status of embedded files can be set at the inset level,
or from Document->Settings->Embedded Files.
4. Extra files such as .cls and .layout can be embedded from Document->
Settings->Embedded Files->Extra Files.
5. When Document->Save in bundled format is selected, all embedded files
become bundled. Changes to the external version of this file does not
affect the output of the .lyx file.
6. When Document->Save in bundled format is unchecked, all embedded files
are copied to their original locations.
Overall, this feature allows two ways of editing a .lyx file
@ -51,57 +59,33 @@ be embedded. These embedded files can be viewed or edited through
the embedding dialog. This file can be shared with others more
easily.
Format a anb b can be converted easily, by enable/disable embedding. Diabling
embedding is also called unpacking because all embedded files will be copied
to their original locations.
Format a anb b can be converted easily, by packing/unpacking a .lyx file.
Implementation:
======================
1. An EmbeddedFiles class is implemented to keep the embedded files (
class EmbeddedFile). (c.f. src/EmbeddedFiles.[h|cpp])
This class keeps a manifest that has
a. external relative filename
b. inzip filename. It is the relative path name if the embedded file is
in or under the document directory, or file name otherwise. Name aliasing
is used if two external files share the same name.
c. embedding status.
It also provides functions to
a. manipulate manifest
b. scan a buffer for embeddable files
c. determine which file to use according to embedding status
2. When a file is saved, it is scanned for embedded files. (c.f.
EmbeddedFiles::update(), Inset::registerEmbeddedFiles()).
3. When a lyx file file.lyx is saved, it is save to tmppath() first.
Embedded files are compressed along with file.lyx and a manifest.txt.
3. When a lyx file file.lyx is saved, it is save to tmppath()/content.lyx
first. Embedded files are compressed along with content.lyx.
If embedding is disabled, file.lyx is saved in the usual pure-text form.
(c.f. Buffer::writeFile(), EmbeddedFiles::writeFile())
4. When a lyx file.lyx file is opened, if it is a zip file, it is
decompressed to tmppath(). If manifest.txt and file.lyx exists in
tmppath(), the manifest is read to buffer, and tmppath()/file.lyx is
read as usual. If file.lyx is not a zip file, it is read as usual.
decompressed to tmppath() and tmppath()/content.lyx is read as usual.
(c.f. bool Buffer::readFile())
5. A menu item Document -> Embedded Files is provided to open
a embedding dialog. It handles a EmbddedFiles point directly.
From this dialog, a user can disable embedding, change embedding status,
or embed other files, extract, view, edit files.
5. A menu item Document -> Save in bundled format is provided to pack/unpack
a .lyx file.
6. If embedding of a .lyx file with embedded files is disabled, all its
embedded files are copied to their respective external filenames. This
is why external filename will exist even if a file is at "EMBEDDED" status.
7. Individual embeddable insets should find ways to handle embedded files.
InsetGraphics replace params().filename with its temppath()/inzipname version
when the inset is created. The filename appears as /tmp/..../inzipname
when lyx runs. When params().filename is saved, lyx checks if this is an
embedded file (check path == temppath()), if so, save filename() instead.
(c.f. InsetGraphic::read(), InsetGraphics::edit(), InsetGraphicsParams::write())
*/
namespace lyx {
@ -144,16 +128,6 @@ public:
/// to copy or sync the embedded file with external one.
void setEmbed(bool embed) { embedded_ = embed; }
// A flag indicating whether or not this filename is valid.
// When lyx runs, InsetGraphics etc may be added or removed so filename
// maybe obsolete. In Buffer::updateEmbeddedFiles, the EmbeddedFiles is first
// invalidated (c.f. invalidate()), and all insets are asked to register
// embedded files. In this way, EmbeddedFileList will be refreshed, with
// status setting untouched.
bool valid() const { return valid_; }
void validate() { valid_ = true; }
void invalidate();
/// extract file, does not change embedding status
bool extract(Buffer const * buf) const;
/// update embedded file from external file, does not change embedding status
@ -170,9 +144,7 @@ private:
std::string inzip_name_;
/// the status of this docfile
bool embedded_;
///
bool valid_;
/// Current position of the item, used to locate the files. Because one
/// Insets that contains this file item. Because a
/// file item can be referred by several Insets, a vector is used.
std::vector<Inset const *> inset_list_;
};