Versions in this module Expand all Collapse all v1 v1.0.0 Jun 21, 2023 Changes in this version + const BIG_BLOCK_MINIMUM_DOCUMENT_SIZE + const BLOCK_MASK + const BLOCK_SHIFT + const BYTE_SIZE + const DIFAT_SECTOR_BLOCK + const DIRECTORY_TYPE + const DOCUMENT_TYPE + const DOUBLE_SIZE + const END_OF_CHAIN + const FAT_SECTOR_BLOCK + const INT_SIZE + const LARGER_BIG_BLOCK_SIZE + const LARGEST_REGULAR_SECTOR_NUMBER + const LONG_SIZE + const MAX_BLOCK_COUNT + const PROPERTY_SIZE + const PROPERTY_TYPE_OFFSET + const ROOT_TYPE + const SHORT_SIZE + const SIGNATURE + const SMALLER_BIG_BLOCK_SIZE + const SMALL_BLOCK_SIZE + const UNUSED_BLOCK + var BLOCK_ERROR = errors.New("Unable to read Data Block") + var CLOSED_STREAM_ERROR = errors.New("cannot perform requested operation on a closed stream") + var EMPTY_BLOCK_ERROR = errors.New("Can not return empty data") + var INVALID_FILE_FORMAT = errors.New("Not a valid compound file") + var LARGER_BIG_BLOCK_SIZE_DETAILS = NewBigBlockSize(LARGER_BIG_BLOCK_SIZE, 12) + var OOXML_FILE_FORMAT = errors.New("The supplied data appears to be in the Office 2007+ XML.") + var OOXML_FILE_HEADER = [4]byte + var READ_ERROR = errors.New("Error reading compound file") + var SMALLER_BIG_BLOCK_SIZE_DETAILS = NewBigBlockSize(SMALLER_BIG_BLOCK_SIZE, 9) + func NewSmallDocumentBlock(bigBlockSize POIFSBigBlockSize) *smallDocumentBlock + func RawDataBlock(r io.Reader, blocksize int) *rawDataBlock + func RawDataBlockList(r io.Reader, bigBlockSize POIFSBigBlockSize) (*rawDataBlockList, error) + func SmallDocBlockFromDataBlock(bigBlockSize POIFSBigBlockSize, store []BlockWritable, size int) []*smallDocumentBlock + func SmallDocBlockFromRaw(bigBlockSize POIFSBigBlockSize, blocks []ListManagedBlock) []*smallDocumentBlock + func SmallDocumentBlock(bigBlockSize POIFSBigBlockSize, data []byte, index int) *smallDocumentBlock + func SmallDocumentBlockFill(bigBlockSize POIFSBigBlockSize, blocks *[]BlockWritable) int + func SmallDocumentBlockList(blocks []*smallDocumentBlock) (*smallDocumentBlockList, error) + type BATBlock struct + func CreateBATBlock(bigBlockSize POIFSBigBlockSize, data bytes.Buffer) *BATBlock + func CreateBATBlocks(bigBlockSize POIFSBigBlockSize, entries []int) []*BATBlock + func CreateEmptyBATBlock(bigBlockSize POIFSBigBlockSize, isXBAT bool) *BATBlock + func CreateXBATBlocks(bigBlockSize POIFSBigBlockSize, entries []int, startBlock int) []*BATBlock + func NewBATBlock(bigBlockSize POIFSBigBlockSize) *BATBlock + func NewBATBlockWithEntries(bigBlockSize POIFSBigBlockSize, entries []int, start_index, end_index int) *BATBlock + func (bb *BATBlock) GetOutBlockIndex() int + func (bb *BATBlock) GetValueAt(offset int) (int, error) + func (bb *BATBlock) HasFreeSectors() bool + func (bb *BATBlock) SetOurBlockIndex(index int) + func (bb *BATBlock) SetValueAt(offset, val int) error + func (bb *BATBlock) WriteBlocks(w io.Writer) error + type BATBlockAndIndex struct + func GetBATBlockAndIndex(offset int, header HeaderBlock, bats []*BATBlock) *BATBlockAndIndex + func GetSBATBlockAndIndex(offset int, header HeaderBlock, bats []*BATBlock) *BATBlockAndIndex + func (bi *BATBlockAndIndex) GetBlock() *BATBlock + func (bi *BATBlockAndIndex) GetIndex() int + type BATManaged interface + CountBlocks func() int + SetStartBlock func(index int) + type BlockAllocationTableReader struct + func NewBlockAllocationTableReader(bigBlockSize POIFSBigBlockSize, block_count int, block_array []int, ...) (*BlockAllocationTableReader, error) + func NewBlockAllocationTableReader1(bigBlockSize POIFSBigBlockSize, blocks []ListManagedBlock, ...) (*BlockAllocationTableReader, error) + type BlockAllocationTableWriter struct + func NewBlockAllocationTableWriter(bigBlockSize POIFSBigBlockSize) *BlockAllocationTableWriter + func (b *BlockAllocationTableWriter) CountBlocks() int + func (b *BlockAllocationTableWriter) CreateBlocks() int + func (b *BlockAllocationTableWriter) GetStartBlock() int + func (b *BlockAllocationTableWriter) SetStartBlock(start_block int) + func (b *BlockAllocationTableWriter) WriteBlocks(stream io.Writer) error + type BlockList interface + BlockCount func() int + Fetch func(startBlock, headerPropertiesStartBlock int) ([]ListManagedBlock, error) + Remove func(index int) (ListManagedBlock, error) + SetBAT func(bat *BlockAllocationTableReader) error + Zap func(index int) + func GetSmallDocumentBlocks(bigBlockSize POIFSBigBlockSize, blockList *rawDataBlockList, ...) (BlockList, error) + type BlockWritable interface + WriteBlocks func(w io.Writer) error + func NewPropertyBlockArray(bigBlockSize POIFSBigBlockSize, props []IProperty) []BlockWritable + type ByteField struct + func NewByteField(offset int, value byte, data []byte) (*ByteField, error) + func NewByteFieldFromBytes(offset int, data []byte) (*ByteField, error) + func NewByteFieldWithOffset(offset int) (*ByteField, error) + func NewByteFieldWithVal(offset int, value byte) (*ByteField, error) + func (f *ByteField) ReadFromBytes(data []byte) + func (f *ByteField) Set(val byte, data []byte) + func (f *ByteField) String() string + func (f *ByteField) WriteToBytes(data []byte) + type Child interface + GetNextChild func() Child + GetPreviousChild func() Child + SetNextChild func(child Child) + SetPreviousChild func(child Child) + type ClassID struct + func ClassIDFromBytes(src []byte, offset int) ClassID + func ClassIDFromString(str string) (ClassID, error) + func NewClassID() ClassID + func (cid *ClassID) Read(src []byte, offset int) []byte + func (cid *ClassID) SetBytes(bytes []byte) + func (cid *ClassID) String() string + func (cid *ClassID) Write(dst []byte, offset int) error + type Comparator func(p1, p2 IProperty) int + type DataInputBlock struct + func GetDataInputBlockFromDocumentBlocks(blocks []*DocumentBlock, offset int) *DataInputBlock + func GetDataInputBlockFromSmallBlocks(blocks []*smallDocumentBlock, offset int) *DataInputBlock + func NewDataInputBlock(data []byte, startOffset int) *DataInputBlock + func (d *DataInputBlock) Available() int + func (d *DataInputBlock) ReadFully(buf []byte, offset, length int) + func (d *DataInputBlock) ReadIntLE() int + func (d *DataInputBlock) ReadIntLE2(prevBlock *DataInputBlock, prevBlockAvailable int) int + func (d *DataInputBlock) ReadUByte() int + func (d *DataInputBlock) ReadUShortLE() int + func (d *DataInputBlock) ReadUShortLE2(prevBlock *DataInputBlock) int + type DirectoryEntry interface + CreateDirectory func(name string) DirectoryEntry + CreateDocument func(name string, r io.Reader) DocumentEntry + Entries func() []Entry + Entry func(name string) (Entry, error) + EntryCount func() int + HasEntry func(name string) bool + IsEmpty func() bool + SetStorageClsId func(cid ClassID) + StorageClsId func() ClassID + type DirectoryNode struct + func NewDirectoryNode(prop ParentProperty, fs *POIFSFileSystem, parent *DirectoryNode) (*DirectoryNode, error) + func (dn *DirectoryNode) ChangeName(oldName, newName string) bool + func (dn *DirectoryNode) CreateDirectory(name string) DirectoryEntry + func (dn *DirectoryNode) CreateDocument(name string, stream io.Reader) DocumentEntry + func (dn *DirectoryNode) DeleteEntry(entry Entry) bool + func (dn *DirectoryNode) Entries() []Entry + func (dn *DirectoryNode) Entry(name string) (Entry, error) + func (dn *DirectoryNode) EntryCount() int + func (dn *DirectoryNode) GetFileSystem() *POIFSFileSystem + func (dn *DirectoryNode) GetPath() *POIFSDocumentPath + func (dn *DirectoryNode) HasEntry(name string) bool + func (dn *DirectoryNode) IsDeleteOK() bool + func (dn *DirectoryNode) IsDirectory() bool + func (dn *DirectoryNode) IsEmpty() bool + func (dn *DirectoryNode) SetStorageClsId(cid ClassID) + func (dn *DirectoryNode) StorageClsId() ClassID + type DirectoryProperty struct + func NewDirProperty(name string) *DirectoryProperty + func NewDirPropertyFromData(index int, array []byte, offset int) *DirectoryProperty + func (doc *DirectoryProperty) AddChild(prop IProperty) error + func (doc *DirectoryProperty) ChangeName(prop IProperty, newName string) bool + func (doc *DirectoryProperty) DelChild(prop IProperty) bool + func (doc *DirectoryProperty) GetChildren() []IProperty + func (doc *DirectoryProperty) IsDirectory() bool + func (doc *DirectoryProperty) PreWrite() + type DocumentBlock struct + func DocumentBlockFromRawBlock(block *rawDataBlock) (*DocumentBlock, error) + func DocumentBlockFromStream(r io.Reader, bigBlockSize POIFSBigBlockSize) (db *DocumentBlock, err error) + func (db *DocumentBlock) PartiallyRead() bool + func (db *DocumentBlock) Size() int + func (db *DocumentBlock) WriteBlocks(w io.Writer) error + func (db *DocumentBlock) WriteData(w io.Writer) error + type DocumentEntry interface + GetSize func() int + type DocumentInputStream struct + func NewDocInputStream(doc *POIFSDocument) *DocumentInputStream + func NewDocInputStreamFromDocNode(doc *DocumentNode) *DocumentInputStream + func NewDocInputStreamFromEntry(entry DocumentEntry) *DocumentInputStream + func (d *DocumentInputStream) Available() int + func (d *DocumentInputStream) Close() + func (d *DocumentInputStream) GetDataInputBlock(offset int) *DataInputBlock + func (d *DocumentInputStream) Mark(ignoreReadLimit int) + func (d *DocumentInputStream) Read(p []byte) (n int, err error) + func (d *DocumentInputStream) Reset() + type DocumentNode struct + func NewDocumentNode(prop *DocumentProperty, parent *DirectoryNode) *DocumentNode + func (dn *DocumentNode) GetDocument() *POIFSDocument + func (dn *DocumentNode) GetSize() int + func (dn *DocumentNode) IsDeleteOK() bool + func (dn *DocumentNode) IsDocument() bool + type DocumentProperty struct + func NewDocProperty(name string, size int) *DocumentProperty + func NewDocPropertyFromData(index int, array []byte, offset int) *DocumentProperty + func (doc *DocumentProperty) IsDirectory() bool + func (doc *DocumentProperty) PreWrite() + func (doc *DocumentProperty) SetDocument(d *POIFSDocument) + func (doc *DocumentProperty) ShouldUseSmallBlocks() bool + type Entry interface + Delete func(entry Entry) bool + GetName func() string + GetProperty func() IProperty + IsDeleteOK func() bool + IsDirectory func() bool + IsDocument func() bool + IsRoot func() bool + Parent func() DirectoryEntry + RenameTo func(newName string) bool + type EntryNode struct + func NewEntryNode(prop IProperty, parent *DirectoryNode) *EntryNode + func (en *EntryNode) Delete(entry Entry) bool + func (en *EntryNode) GetName() string + func (en *EntryNode) GetProperty() IProperty + func (en *EntryNode) IsDeleteOK() bool + func (en *EntryNode) IsDirectory() bool + func (en *EntryNode) IsDocument() bool + func (en *EntryNode) IsRoot() bool + func (en *EntryNode) Parent() DirectoryEntry + func (en *EntryNode) RenameTo(newName string) bool + type FixedField interface + ReadFromBytes func(data []byte) + String func() string + WriteToBytes func(data []byte) + type HeaderBlock struct + func NewHeaderBlock(bigBlockSize POIFSBigBlockSize) *HeaderBlock + func NewHeaderBlockFromReader(r io.Reader) (*HeaderBlock, error) + func (hb *HeaderBlock) GetBATArray() []int + func (hb *HeaderBlock) GetBATCount() int + func (hb *HeaderBlock) GetBigBlockSize() POIFSBigBlockSize + func (hb *HeaderBlock) GetPropertyStart() int + func (hb *HeaderBlock) GetSBATCount() int + func (hb *HeaderBlock) GetSBATStart() int + func (hb *HeaderBlock) GetXBATCount() int + func (hb *HeaderBlock) GetXBATIndex() int + func (hb *HeaderBlock) SetBATCount(count int) + func (hb *HeaderBlock) SetPropertyStart(startBlock int) + func (hb *HeaderBlock) SetSBATBlockCount(count int) + func (hb *HeaderBlock) SetSBATStart(startBlock int) + func (hb *HeaderBlock) SetXBATCount(count int) + func (hb *HeaderBlock) SetXBATStart(sb int) + func (hb *HeaderBlock) WriteData(w io.Writer) error + type HeaderBlockWriter struct + func NewHeaderBlockWriter(bigBlockSize POIFSBigBlockSize) *HeaderBlockWriter + func NewHeaderBlockWriterFromHeaderBlock(hb *HeaderBlock) *HeaderBlockWriter + func (w *HeaderBlockWriter) SetBATBlocks(blockCount, startBlock int) []*BATBlock + func (w *HeaderBlockWriter) SetPropertyStart(startBlock int) + func (w *HeaderBlockWriter) SetSBATBlockCount(count int) + func (w *HeaderBlockWriter) SetSBATStart(startBlock int) + func (w *HeaderBlockWriter) WriteBlock(block *bytes.Buffer) + func (w *HeaderBlockWriter) WriteBlocks(stream io.Writer) error + type IProperty interface + ChildIndex func() int + GetIndex func() int + GetName func() string + GetNextChildIndex func() int + GetPrevChildIndex func() int + GetSize func() int + GetStartBlock func() int + GetStorageClsid func() ClassID + IsDirectory func() bool + PreWrite func() + SetChildProperty func(child int) + SetIndex func(index int) + SetName func(name string) + SetNodeColor func(nodeColor byte) + SetPropertyType func(propertyType byte) + SetSize func(size int) + SetStartBlock func(startBlock int) + SetStorageClsid func(cid ClassID) + UseSmallBlocks func() bool + WriteData func(w io.Writer) error + type IntegerField struct + func NewIntegerField(offset, value int, data []byte) (*IntegerField, error) + func NewIntegerFieldFromBytes(offset int, data []byte) (*IntegerField, error) + func NewIntegerFieldWithOffset(offset int) (*IntegerField, error) + func NewIntegerFieldWithVal(offset, value int) (*IntegerField, error) + func (f *IntegerField) ReadFromBytes(data []byte) + func (f *IntegerField) Set(val int, data []byte) + func (f *IntegerField) String() string + func (f *IntegerField) WriteToBytes(data []byte) + type Iterator interface + HasNext func() bool + Next func() interface{} + type ListManagedBlock interface + Data func() ([]byte, error) + type POIFSBigBlockSize struct + BigBlockSize int + HeaderValue int16 + func NewBigBlockSize(blocksize int, headval int16) POIFSBigBlockSize + func (b POIFSBigBlockSize) BATEntriesPerBlock() int + func (b POIFSBigBlockSize) NextXBATChainOffset() int + func (b POIFSBigBlockSize) PropertiesPerBlock() int + func (b POIFSBigBlockSize) XBATEntriesPerBlock() int + type POIFSDocument struct + func NewPOIFSDocFromManagedBlock(name string, bigBlockSize POIFSBigBlockSize, blocks []ListManagedBlock, ...) *POIFSDocument + func NewPOIFSDocFromManagedBlock2(name string, blocks []ListManagedBlock, length int) *POIFSDocument + func NewPOIFSDocFromRaw(name string, blocks []*rawDataBlock, length int) *POIFSDocument + func NewPOIFSDocFromSmallBlocks(name string, blocks []*smallDocumentBlock, length int) *POIFSDocument + func NewPOIFSDocFromStream(name string, r io.Reader) (*POIFSDocument, error) + func NewPOIFSDocFromStream2(name string, bigBlockSize POIFSBigBlockSize, r io.Reader) (*POIFSDocument, error) + func (d *POIFSDocument) CountBlocks() int + func (d *POIFSDocument) GetDataInputBlock(offset int) *DataInputBlock + func (d *POIFSDocument) GetDocumentProperty() *DocumentProperty + func (d *POIFSDocument) GetSmallBlocks() []BlockWritable + func (d *POIFSDocument) SetStartBlock(index int) + func (d *POIFSDocument) WriteBlocks(w io.Writer) error + type POIFSDocumentPath struct + func AddPathToPOIFSDocumentPath(path *POIFSDocumentPath, components []string) (*POIFSDocumentPath, error) + func CreatePOIFSDocumentPath() (*POIFSDocumentPath, error) + func NewPOIFSDocumentPath(components []string) (*POIFSDocumentPath, error) + func (dp *POIFSDocumentPath) GetComponent(n int) string + func (dp *POIFSDocumentPath) GetParent() *POIFSDocumentPath + func (dp *POIFSDocumentPath) Hashcode() int + func (dp *POIFSDocumentPath) Length() int + func (dp *POIFSDocumentPath) String() string + type POIFSFileSystem struct + func FileSystemFromReader(r io.Reader) (*POIFSFileSystem, error) + func NewFileSystem() *POIFSFileSystem + func (fs *POIFSFileSystem) AddDirectory(prop ParentProperty) + func (fs *POIFSFileSystem) AddDocument(doc *POIFSDocument) + func (fs *POIFSFileSystem) CreateDir(name string) (DirectoryEntry, error) + func (fs *POIFSFileSystem) CreateDocument(name string, r io.Reader) (DocumentEntry, error) + func (fs *POIFSFileSystem) GetRoot() (*DirectoryNode, error) + func (fs *POIFSFileSystem) Remove(entry Entry) + func (fs *POIFSFileSystem) WriteFileSystem(output io.Writer) error + type Parent interface + AddChild func(prop IProperty) error + ChangeName func(prop IProperty, newName string) bool + DelChild func(prop IProperty) bool + GetChildren func() []IProperty + type ParentProperty interface + type Property struct + func CreateProperty() *Property + func NewProperty(index int, array []byte, offset int) *Property + func (p *Property) ChildIndex() int + func (p *Property) GetIndex() int + func (p *Property) GetName() string + func (p *Property) GetNextChild() Child + func (p *Property) GetNextChildIndex() int + func (p *Property) GetPrevChildIndex() int + func (p *Property) GetPreviousChild() Child + func (p *Property) GetSize() int + func (p *Property) GetStartBlock() int + func (p *Property) GetStorageClsid() ClassID + func (p *Property) IsDirectory() bool + func (p *Property) SetChildProperty(child int) + func (p *Property) SetIndex(index int) + func (p *Property) SetName(name string) + func (p *Property) SetNextChild(child Child) + func (p *Property) SetNodeColor(nodeColor byte) + func (p *Property) SetPreviousChild(child Child) + func (p *Property) SetPropertyType(propertyType byte) + func (p *Property) SetSize(size int) + func (p *Property) SetStartBlock(startBlock int) + func (p *Property) SetStorageClsid(cid ClassID) + func (p *Property) ShortDescription() string + func (p *Property) UseSmallBlocks() bool + func (p *Property) WriteData(w io.Writer) error + type PropertyBlock struct + func NewPropertyBlock(bigBlockSize POIFSBigBlockSize) *PropertyBlock + func (pb *PropertyBlock) WriteBlocks(w io.Writer) error + type PropertyComparator struct + func PropertySorter(compare Comparator) *PropertyComparator + func (pc *PropertyComparator) Len() int + func (pc *PropertyComparator) Less(i, j int) bool + func (pc *PropertyComparator) Sort(props []IProperty) + func (pc *PropertyComparator) Swap(i, j int) + type PropertyTable struct + func NewPropertyTable(hb *HeaderBlock) *PropertyTable + func NewPropertyTableWithList(hb *HeaderBlock, blocklist *rawDataBlockList) (*PropertyTable, error) + func NewPropertyTableWithProps(hb *HeaderBlock, props []IProperty) *PropertyTable + func (pt *PropertyTable) AddProperty(prop IProperty) + func (pt *PropertyTable) CountBlocks() int + func (pt *PropertyTable) GetRoot() ParentProperty + func (pt *PropertyTable) GetStartBlock() int + func (pt *PropertyTable) PreWrite() + func (pt *PropertyTable) RemoveProperty(prop IProperty) + func (pt *PropertyTable) SetStartBlock(index int) + func (pt *PropertyTable) WriteBlocks(w io.Writer) error + type RootProperty struct + func NewRootProperty() *RootProperty + func NewRootPropertyFromData(index int, array []byte, offset int) *RootProperty + func (p *RootProperty) SetSize(size int) + type ShortField struct + func NewShortField(offset int, value int16, data []byte) (*ShortField, error) + func NewShortFieldFromBytes(offset int, data []byte) (*ShortField, error) + func NewShortFieldWithOffset(offset int) (*ShortField, error) + func NewShortFieldWithVal(offset int, value int16) (*ShortField, error) + func (f *ShortField) ReadFromBytes(data []byte) + func (f *ShortField) Set(val int16, data []byte) + func (f *ShortField) String() string + func (f *ShortField) WriteToBytes(data []byte) + type SmallBlockTableWriter struct + func NewSmalBlockTableWriter(bigBlockSize POIFSBigBlockSize, documents []*POIFSDocument, root *RootProperty) *SmallBlockTableWriter + func (s *SmallBlockTableWriter) CountBlocks() int + func (s *SmallBlockTableWriter) GetSBAT() *BlockAllocationTableWriter + func (s *SmallBlockTableWriter) GetSBATBlockCount() int + func (s *SmallBlockTableWriter) SetStartBlock(start_block int) + func (s *SmallBlockTableWriter) WriteBlocks(w io.Writer) error + type Stack []interface + func (stack *Stack) Pop() (interface{}, error) + func (stack *Stack) Push(x interface{}) + func (stack Stack) Cap() int + func (stack Stack) IsEmpty() bool + func (stack Stack) Len() int + func (stack Stack) Top() (interface{}, error)