123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- /******************************************************************************
- |* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
- |* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- |* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
- |* PARTICULAR PURPOSE.
- |*
- |* Copyright 1995-2005 Nero AG. All Rights Reserved.
- |*-----------------------------------------------------------------------------
- |* NeroSDK / NeroAPI
- |*
- |* PROGRAM: NeroFileSystemContent.h
- |*
- |* PURPOSE:
- |* This is the third NeroAPI interface for preparing data CDs/DVDs. Unlike NeroIsoTrack.h,
- |* it is not much "callback based",thus most of the process will be driven by the
- |* application, making it easier to write. This interface is closely connected to the
- |* internal engine of NeroAPI, this improves the cooperation of NeroAPI and the application.
- |*
- |* This set of classes describe the content of the file system of a disc.
- |* The application will build a file structure using the IFileSystemContent object.
- |* During the burn process, NeroAPI will request the content of files using the
- |* IFileContent interface.
- |*
- |* Use the NeroCreateFileSystemContainer function of NeroAPI.h to get an instance of an
- |* IFileSystemDescContainer object. Then, use the NERO_WRITE_FILE_SYSTEM_CONTAINER structure
- |* to burn the file structure created.
- ******************************************************************************/
- #ifndef __NEROFILESYSTEMCONTENT_H
- #define __NEROFILESYSTEMCONTENT_H
- #if defined(__BORLANDC__)
- // NEROAPI expects structs to be 8byte aligned
- #pragma pack(push, 8)
- // tell Borland C++ Builder to treat enums as int
- #pragma option push -b
- #endif
- // To make sure we do not interfere with other classes
- namespace FileSystemContent
- {
- class InterfaceBase
- {
- public:
- // Get another interface for the same object. This will be used to extend the DLL interface without
- // loosing binary compatibility. Returns NULL if no interface with this ID was found
- // This is inspired from the COM QueryInterface function
- virtual void *GetOtherInterface(int interfaceId) const // Using an ID number
- {
- return 0; // Not other interface available by default
- }
- virtual void *GetOtherInterface(const char *interfaceName) const // Using a string
- {
- return 0; // Not other interface available by default
- }
- protected:
- virtual ~InterfaceBase() {}
- };
- ////////////////////////////////////////////////////////////////////////////////////////
- // This first set of interfaces will be used by the burn engine to read the content of
- // the file system
- ////////////////////////////////////////////////////////////////////////////////////////
- class IFileContent : public InterfaceBase
- {
- public:
- virtual unsigned Read(void *pBuffer,unsigned length) =0;
- virtual bool EndOfFile() =0;
- virtual bool Error() =0;
- // Called by the application when the object is not needed anymore
- virtual void Release() = 0;
- };
- class IDirectory;
- class IDirectoryEntry : public InterfaceBase
- {
- public:
- enum ENTRY_ERROR
- {
- ENTRY_NO_ERROR,
- SEQUENCING_ERROR, // The content for this file may not be requested at this moment
- ERROR_NOT_A_FILE, // This entry is not a file
- NOT_AVAILABLE, // The content of this file cannot be requested at all
- INTERFACE_ERROR, // The overriden function has tried to get an other interface for one object and has failed
- FEATURE_NOT_AVAILABLE // This feature is not available for this file system type
- };
- enum {
- MODE2_FORM2 =1<<0,
- FIXED_INSIDE_VOLUME_SPACE =1<<1,
- FIXED_OUTSIDE_VOLUME_SPACE =1<<2,
- NO_OWN_CONTENT =1<<3
- };
-
- virtual const char *GetName() const =0; // File or directory name
- virtual const IDirectory *GetSubDirectory() const =0;
- virtual ENTRY_ERROR GetContent(IFileContent **) const =0;
- virtual const char *GetSourceFilePath() const =0; // Return the source file path, NULL if the file is generated
- virtual __int64 GetSize() const =0;
- virtual int GetFilePriority() const =0;
- virtual int GetDirOrder() const =0;
- virtual int GetId() const =0; // Id number that can be used to find the file again later
- virtual unsigned GetDataStartSec() const =0;
- };
- class IDirectory : public InterfaceBase
- {
- public:
- virtual int GetNumEntries() const =0;
- virtual const IDirectoryEntry *GetDirectoryEntry(int i) const =0;
- };
- class IFileSystemContent : public InterfaceBase
- {
- public:
- virtual const char *GetName() const =0; // Volume name
- virtual const IDirectory *GetRoot() const =0;
- };
- ////////////////////////////////////////////////////////////////////////////////////////
- // This second set of interfaces will be used by the application to produce the content of
- // the file system
- ////////////////////////////////////////////////////////////////////////////////////////
- // Allows the file producer to return the data
- class IDataInputStream : public InterfaceBase
- {
- public:
- virtual void Write(const void *buffer,int size) = 0;
- };
- // Produce the content of a file. This interface must be derived and its implementation must
- // create the content of the file in the ProduceFile function
- class IFileProducer : public InterfaceBase
- {
- public:
- // Calling this method will automatically update the file size to the amount of data
- // delivered by the producer
- virtual IDirectoryEntry::ENTRY_ERROR ProduceFile(IDataInputStream *str) const = 0;
- // Called by NeroAPI when the object is not needed anymore
- virtual void Release() const = 0;
- };
- class IDirectoryContainer;
- // Description of a file
- class IDirectoryEntryContainer : public IDirectoryEntry
- {
- public:
- // This object can be accessed in several ways
- enum
- {
- IID_IDirectoryEntryContainer,
- IID_IFileProducer, // If the file entry was created using an IFileProducer
- // object, this one can be retrieved using GetOtherInterface
- IID_IDirectoryEntryContainer2, // Reserved
- IID_IDirectoryEntry2 // Reserved
- };
- // Using this function, the file size can be changed after having added the entry to the directory
- virtual void SetSize(__int64 size) =0;
- // The two functions below can be used to readjust the directory priority
- // Priority numbers will be used in upward order: the file with smaller values first
- virtual void SetPriority(int priority) =0;
- virtual void SetDirOrder(int directoryPriority) =0;
- // Set the sector number that will be saved into the directory structure
- virtual void SetDataStartSec(unsigned) =0;
- // Set the physical position of the file in the filesystem
- virtual void SetFixedDataStartSec(unsigned) =0;
- virtual void SetFileNumber(int) =0;
- virtual void SetId(int) =0;
- virtual void SetFlags(bool enable,unsigned f) =0; // Enable/disable the given flag
- };
- // Extension of the IDirectoryEntryContainer interface
- class IDirectoryEntryContainer2 : public IDirectoryEntryContainer
- {
- public:
- // If the file entry was created using an IFileProducer, returns a pointer on it
- virtual const IFileProducer *GetFileProducer() const =0;
- // Update the size attribute of this file by producing its content without writing
- // it anywhere
- virtual ENTRY_ERROR MeasureSize() =0;
- // Set the size that is stored in the media directory record but do not change the
- // size of allocated and requested data
- // This is currently only available for ISO filesystems
- virtual ENTRY_ERROR SetDirRecordSize(__int64 size) =0;
- };
- // Represents the content of a directory
- class IDirectoryContainer : public IDirectory
- {
- public:
- // Add a directory a returns a pointer on it
- // directoryPriority specifies the position in the directory. See this->AddFile
- // for details
- virtual IDirectoryContainer *AddDirectory(const char *name, int directoryPriority) =0;
- // Add a file the directory. The fp object will be automatically deleted when the directory
- // container will be deleted
- //
- // the filesize passed here does *not* need to be correct, it will be used by the
- // filesystem generator to preallocate space so it must be the *maximum* space the final
- // version of the file may need (worst-case).
- //
- // Priority specifies some user-defined ordinal defining the order in which the files are
- // being written to the disc physically (like .ifo comes before .vob).
- // Priorities are valid across directories
- // The fileentry order in a directory is defined by the directoryPriority parameter which is the primary
- // sort criterium when arranging the files in a directory (Note that this is only true for
- // filesystems that do not require files to be sorted in the directory, e.g. UDF)
- // If any of the priority specifiers is -1, the producer doesn't care about the priority
- // and Nero will put the file where it thinks it fit
- // AddFile will return NULL if a file with the same name already exists
- virtual IDirectoryEntryContainer *AddFile(const char *name,
- const IFileProducer *fp,__int64 size,
- int priority, int directoryPriority) = 0;
- // Add a file which exists in the real file system
- virtual IDirectoryEntryContainer *AddFile(const char *name,
- const char *sourcePath,
- int priority, int directoryPriority) = 0;
-
- // Remove an entry from the directory
- virtual bool RemoveEntry(const char *name) =0;
- virtual IDirectoryEntryContainer *Entry(const char *name) =0;
- virtual IDirectoryEntryContainer *Entry(int i) =0;
- virtual IDirectoryContainer *SubDirectory(const char *name) =0;
- };
- // Supplemental method to the IDirectoryContainer interface
- class IDirectoryContainerSearch {
- public:
- enum {
- SEARCH_DEPTH_INCL, // Searches whole tree including given start object
- SEARCH_CHILDREN_EXCL // Searches children of start object only
- };
- // Like 'SubDirectory' of 'IDirectoryContainer' but with different search modes.
- // 'reserved' is intended for future use and MUST be initialized with NULL for now.
- virtual IDirectoryContainer *SubDirectoryEx(const char *name, unsigned mode, void *reserved) = 0;
- };
- // Represents the content of a file system
- struct IFileSystemDescContainer : public IFileSystemContent
- {
- virtual void SetName(const char *) =0; // Set the volume name of the file system
- virtual IDirectoryContainer *Root() =0; // Access the root directory for changing it
- // Called by the application when the object is not needed anymore
- virtual void Release() const = 0;
- };
- } // namespace FileSystemContent
- #if defined(__BORLANDC__)
- #pragma pack(pop)
- #pragma option pop
- #endif
- #endif//__NEROFILESYSTEMCONTENT_H
|