]> git.lyx.org Git - lyx.git/blobdiff - src/EmbeddedFiles.h
Embedding: saving inzip name to .lyx file so that embedded files can always be found...
[lyx.git] / src / EmbeddedFiles.h
index 3cb95be7cadf1dc6e855287972b1cb5a6963e06a..b0d719ba858ce0bddb3cfe6424571819797abead 100644 (file)
@@ -102,23 +102,41 @@ public:
                std::string const & buffer_path = std::string());
        
        /// set filename and inzipName.
+       /**
+        * NOTE: inzip_name_ is not unique across operation systems and is not 
+        * guaranteed to be the same across different versions of lyx.
+        * inzip_name_ will be saved to the lyx file, and is used to indicate 
+        * whether or not a file is embedded, and where the embedded file is in
+        * the bundled file. However, the embedded file will be renamed to the 
+        * name set here when an EmbeddedFile is enabled. It is therefore
+        * safe to change the naming scheme here.
+        *
+        * NOTE that this treatment does not welcome an UUID solution because
+        * all embedded files will have to be renamed when an embedded file is
+        * opened. It is of course possible to use saved inzipname, but that is
+        * not easy. For example, when a new EmbeddedFile is created with the same
+        * file as an old one, it needs to be synced to the old inzipname...
+       **/
        void set(std::string const & filename, std::string const & buffer_path);
-       
+       /** Set the inzip name of an EmbeddedFile, which should be the name
+        *  of an actual embedded file on disk. When an EmbeddedFile is enabled,
+        *  this file will be renamed to the default inzipName if needed. 
+        */
+       void setInzipName(std::string const & name);
+
        /// filename in the zip file, which is the relative path
        std::string inzipName() const { return inzip_name_; }
 
        /// embedded file, equals to temppath()/inzipName()
-       std::string embeddedFile(Buffer const * buf) const;
+       std::string embeddedFile() const;
        /// embeddedFile() or absFilename() depending on embedding status
-       std::string availableFile(Buffer const * buf) const;
+       /// and whether or not embedding is enabled.
+       FileName availableFile() const;
+       /// 
+       std::string latexFilename(std::string const & buffer_path) const;
 
        /// add an inset that refers to this file
        void addInset(Inset const * inset);
-       Inset const * inset(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
@@ -126,13 +144,16 @@ public:
        /// set embedding status. updateFromExternal() should be called before this
        /// to copy or sync the embedded file with external one.
        void setEmbed(bool embed);
-       /// Only files in or under current document path is embeddable
-       bool embeddable() const { return inzip_name_ != ""; } 
+
+       /// whether or not embedding is enabled in the current buffer
+       bool enabled() const { return temp_path_ != ""; }
+       /// enable embedding of this file
+       void enable(bool flag, Buffer const * buf);
 
        /// extract file, does not change embedding status
-       bool extract(Buffer const * buf) const;
+       bool extract() const;
        /// update embedded file from external file, does not change embedding status
-       bool updateFromExternalFile(Buffer const * buf) const;
+       bool updateFromExternalFile() const;
        ///
        /// After the embedding status is changed, update all insets related
        /// to this file item. For example, a graphic inset may need to monitor
@@ -141,6 +162,18 @@ public:
        /// document between EmbeddedFiles::update() and this function.
        void updateInsets(Buffer const * buf) const;
 
+       /// Check readability of availableFile
+       bool isReadableFile() const;
+       /// Calculate checksum of availableFile
+       unsigned long checksum() const;
+
+private:
+       // calculate inzip_name_ from filename
+       std::string calcInzipName(std::string const & buffer_path);
+       // move an embedded disk file with an existing inzip_name_ to 
+       // an calculated inzip_name_
+       void syncInzipFile(std::string const & buffer_path);
+       
 private:
        /// filename in zip file
        std::string inzip_name_;
@@ -149,6 +182,11 @@ private:
        /// 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_;
+       /// Embedded file needs to know whether enbedding is enabled,
+       /// and where is the lyx temporary directory. Such information can
+       /// be retrived from a buffer, but a buffer is not always available when
+       /// an EmbeddedFile is used.
+       std::string temp_path_;
 };
 
 
@@ -156,57 +194,23 @@ bool operator==(EmbeddedFile const & lhs, EmbeddedFile const & rhs);
 bool operator!=(EmbeddedFile const & lhs, EmbeddedFile const & rhs);
 
 
-class EmbeddedFiles {
+class EmbeddedFileList : public std::vector<EmbeddedFile> {
 public:
-       typedef std::vector<EmbeddedFile> EmbeddedFileList;
-public:
-       ///
-       EmbeddedFiles(Buffer * buffer = 0) : file_list_(), buffer_(buffer) {}
-       ///
-       ~EmbeddedFiles() {}
-
-       /// return buffer params embedded flag
-       bool enabled() const;
        /// set buffer params embedded flag. Files will be updated or extracted
        /// if such an operation fails, enable will fail.
-       void enable(bool flag);
+       void enable(bool flag, Buffer & buffer);
 
-       /// add a file item. 
+       /// add a file item.
        /* \param file Embedded file to add
         * \param inset Inset pointer
         */
-       EmbeddedFile & registerFile(EmbeddedFile const & file, Inset const * inset = 0);
+       void registerFile(EmbeddedFile const & file, Inset const * inset, Buffer const & buffer);
 
        /// scan the buffer and get a list of EmbeddedFile
-       void update();
+       void update(Buffer const & buffer);
 
        /// write a zip file
-       bool writeFile(support::DocFileName const & filename);
-
-       void clear() { file_list_.clear(); }
-
-       ///
-       EmbeddedFile & operator[](size_t idx) { return *(file_list_.begin() + idx); }
-       EmbeddedFile const & operator[](size_t idx) const { return *(file_list_.begin() + idx); }
-       ///
-       EmbeddedFileList::iterator begin() { return file_list_.begin(); }
-       EmbeddedFileList::iterator end() { return file_list_.end(); }
-       EmbeddedFileList::const_iterator begin() const { return file_list_.begin(); }
-       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 extractAll() const;
-       /// update all files from external, used when enable embedding
-       bool updateFromExternalFile() const;
-       ///
-       /// update all insets to use embedded files when embedding status is changed
-       void updateInsets() const;
-private:
-       /// list of embedded files
-       EmbeddedFileList file_list_;
-       ///
-       Buffer * buffer_;
+       bool writeFile(support::DocFileName const & filename, Buffer const & buffer);
 };
 
 } // namespace lyx