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.
If embedding is disabled, file.lyx is saved in the usual pure-text form.
-(c.f. Buffer::writeFile(), EmbeddedFiles::write())
+(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
namespace lyx {
class Buffer;
+class Lexer;
+class ErrorList;
class EmbeddedFile : public support::DocFileName
{
public:
+ EmbeddedFile() {};
+
EmbeddedFile(std::string const & file, std::string const & inzip_name,
- bool embedded, ParConstIterator const & pit);
+ bool embedded, Inset const * inset);
/// filename in the zip file, usually the relative path
std::string inzipName() const { return inzip_name_; }
+ void setInzipName(std::string name) { inzip_name_ = name; }
/// embedded file, equals to temppath()/inzipName()
std::string embeddedFile(Buffer const * buf) const;
/// embeddedFile() or absFilename() depending on embedding status
std::string availableFile(Buffer const * buf) const;
- /// paragraph id
- void setParIter(ParConstIterator const & pit);
- int const parID() const;
+ /// add an inset that refers to this file
+ void addInset(Inset const * inset);
+ Inset const * inset(int idx) const;
+ /// save the location of this inset as bookmark so that
+ /// it can be located using LFUN_BOOKMARK_GOTO
+ void saveBookmark(Buffer const * buf, int idx) const;
+ /// Number of Insets this file item is referred
+ /// If refCount() == 0, this file must be manually inserted.
+ /// This fact is used by the update() function to skip updating
+ /// such items.
+ int refCount() const { return inset_list_.size(); }
/// embedding status of this file
bool embedded() const { return embedded_; }
+ /// set embedding status. updateFromExternal() should be called before this
+ /// 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
// status setting untouched.
bool valid() const { return valid_; }
void validate() { valid_ = true; }
- void invalidate() { valid_ = false; }
- ///
+ 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
+ bool updateFromExternalFile(Buffer const * buf) const;
///
- bool embed(Buffer const * buf);
+ /// After the embedding status is changed, update all insets related
+ /// to this file item.
+ /// Because inset pointers may not be up to date, EmbeddedFiles::update()
+ /// would better be called before this function is called.
+ void updateInsets(Buffer const * buf) const;
private:
/// filename in zip file
bool embedded_;
///
bool valid_;
- /// Current position of the item, used to locate the files
- /// A figure may be referred by several items. In this case
- /// only the last location is recorded.
- ParConstIterator par_it_;
+ /// Current position of the item, used to locate the files. Because one
+ /// file item can be referred by several Insets, a vector is used.
+ std::vector<Inset const *> inset_list_;
};
typedef std::vector<EmbeddedFile> EmbeddedFileList;
public:
///
- EmbeddedFiles(Buffer * buffer = NULL): file_list_(), buffer_(buffer) {}
+ EmbeddedFiles(Buffer * buffer = 0) : file_list_(), buffer_(buffer) {}
///
~EmbeddedFiles() {}
/// return buffer params embedded flag
bool enabled() const;
- /// set buffer params embedded flag
+ /// set buffer params embedded flag. Files will be updated or extracted
+ /// if such an operation fails, enable will fail.
void enable(bool flag);
- /// add a file item
- void registerFile(std::string const & filename, bool embed = false,
- ParConstIterator const & pit = ParConstIterator());
+ /// add a file item.
+ /* \param filename filename to add
+ * \param embed embedding status. For a new file item, this is always true.
+ * If the file already exists, this parameter is ignored.
+ * \param inset Inset pointer
+ * \param inzipName suggested inzipname
+ */
+ EmbeddedFile & registerFile(std::string const & filename, bool embed = false,
+ Inset const * inset = 0,
+ std::string const & inzipName = std::string());
/// scan the buffer and get a list of EmbeddedFile
void update();
/// write a zip file
- bool write(support::DocFileName const & filename);
+ bool writeFile(support::DocFileName const & filename);
void clear() { file_list_.clear(); }
EmbeddedFileList::const_iterator end() const { return file_list_.end(); }
// try to locate filename, using either absFilename() or embeddedFile()
EmbeddedFileList::const_iterator find(std::string filename) const;
+ /// extract all file items, used when disable embedding
+ bool extract() const;
+ /// update all files from external, used when enable embedding
+ bool updateFromExternalFile() const;
///
- bool extractAll() const;
- ///
- friend std::istream & operator>> (std::istream & is, EmbeddedFiles &);
-
- friend std::ostream & operator<< (std::ostream & os, EmbeddedFiles const &);
+ bool readManifest(Lexer & lex, ErrorList & errorList);
+ void writeManifest(std::ostream & os) const;
+ /// update all insets to use embedded files when embedding status is changed
+ void updateInsets() const;
private:
- /// get a unique inzip name
- std::string const getInzipName(std::string const & name);
+ /// get a unique inzip name, a suggestion can be given.
+ std::string const getInzipName(std::string const & name, std::string const & inzipName);
/// list of embedded files
EmbeddedFileList file_list_;
///
Buffer * buffer_;
};
+} // namespace lyx
-std::istream & operator>> (std::istream & is, EmbeddedFiles &);
-
-std::ostream & operator<< (std::ostream & os, EmbeddedFiles const &);
-
-}
#endif