Subversion Repositories spk

Rev

Rev 197 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#ifndef __MUTLISPKFILE_H__
#define __MUTLISPKFILE_H__

#include "SpkFile.h"

typedef struct SPKEXPORT SMultiSpkFile
{
        SMultiSpkFile() : bOn(false), iPos(0), pFile(nullptr) { iType = 0; bRemove = false; sData = 0; lSize = 0; }
        Utils::WString  sName;
        char   *sData;
        long    lSize;
        bool    bOn;
        Utils::WString  sScriptName;
        Utils::WString  sScriptVersion;
        Utils::WString  sScriptAuthor;
        CBaseFile *pFile;
        int             iType;
        int             iPos;
        bool    bRemove;
} SMultiSpkFile;

typedef struct SPKEXPORT SMultiHeader
{
        SMultiHeader() : fVersion(0.0f), iCompression(0), lUncomprLen(0), lComprLen(0), bSelection(false) { }
        float   fVersion;
        int             iCompression;
        long    lUncomprLen;
        long    lComprLen;
        bool    bSelection;
} SMultiHeader;

class SPKEXPORT CMultiSpkFile
{
public:
        CMultiSpkFile ()
        {
                m_bChanged = false;
        }
        ~CMultiSpkFile ();

        SMultiSpkFile *addFileEntry(const Utils::WString &filename);
        bool addFile(SMultiSpkFile *file);
        bool addFile(const Utils::WString &file, bool on = true);
        bool addFileNow(const Utils::WString &file, bool = true );
        bool removeFile ( int id );
        bool removeFile(const SMultiSpkFile *ms);
        bool removeFile(const Utils::WString &file);
        bool markRemoveFile ( int id );
        bool markRemoveFile ( SMultiSpkFile *ms );
        bool markRemoveFile(const Utils::WString &file);
        void markRemoveAll();

        void ClearFiles ();
        void CreatePackage(SMultiSpkFile *p);

        bool readFile(const Utils::WString &filename, bool = true );
        bool ReadAllFilesToMemory (CProgressInfo *progress = NULL);
        bool ReadFileToMemory ( SMultiSpkFile *ms );
        bool readAllPackages(const Utils::WString &filename, int type = SPKREAD_NODATA, CLinkList<CBaseFile> *addToList = NULL ) { _sFilename = filename; return readAllPackages(type, addToList); }
        bool readAllPackages(int type = SPKREAD_NODATA, CLinkList<CBaseFile> *addToList = NULL );
        bool ReadSpk ( SMultiSpkFile *ms, int type = SPKREAD_NODATA );

        const SMultiSpkFile *findFile (const Utils::WString &name) const;

        bool extractAll(const Utils::WString &dir);
        bool extractData(SMultiSpkFile *ms);
        bool extractFile(const SMultiSpkFile *ms, const Utils::WString &dir);
        bool extractFile(const Utils::WString &filename, const Utils::WString &dir);
        bool splitMulti(const Utils::WString &filename, const Utils::WString &destdir);
        
        bool writeFile(const Utils::WString &filename, CProgressInfo *progress = NULL);

        void setName(const Utils::WString &n) { _sName = n; m_bChanged = true; }
        void setSelection ( bool on ) { m_SHeader.bSelection = on; m_bChanged = true; }
        void setCompression ( int c ) { m_SHeader.iCompression = c; m_bChanged = true; }
        void setFilename(const Utils::WString &s) { _sFilename = s; }
        void setChanged(bool b) { m_bChanged = b; }

        const Utils::WString name() const { return _sName; }
        const Utils::WString& filename() const { return _sFilename; }
        bool isSelection() const { return m_SHeader.bSelection; }
        bool isChanged() const { return m_bChanged; }

        size_t numFiles() const { return m_lFiles.size(); }
        unsigned long GetFileSize();
        unsigned int GetAvailableFiles();
        CLinkList<SMultiSpkFile> *GetFileList () { return &m_lFiles; }

        void UpdatedPackage(CBaseFile *p);
        SMultiSpkFile *findPackage(CBaseFile *p);
        SMultiSpkFile *findPackage(const Utils::WString &name, const Utils::WString &author);
        void RemovePackages();

protected:
        Utils::WString _createData() const;
        bool _parseHeader(const Utils::WString &header);
        bool _parseValueLine(const Utils::WString &line);
        void _readValues(const Utils::WString &values);

private:
        CLinkList<SMultiSpkFile> m_lFiles;
        Utils::WString _sName, _sFilename;

        SMultiHeader m_SHeader;
        bool            m_bChanged;
};

#endif //__MUTLISPKFILE_H__