WindowsCompoundBinaryFileReader.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 2134 8e07b9bbd007
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2134
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
Object subclass:#WindowsCompoundBinaryFileReader
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'inStream fileType streamTypes client msb'
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:'UnsupportedFormatErrorSignal'
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'System-Support-FileFormats'
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!WindowsCompoundBinaryFileReader class methodsFor:'documentation'!
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    compoundBinary is actually (kind of) the FAT Disk format in a file.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
    It is very old, but still used by visio (vsd) files.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    CompoundBinary is actually a container format.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    Warning:
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
        ongoing, unfinished work.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
"
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
! !
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!WindowsCompoundBinaryFileReader class methodsFor:'instance creation'!
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
fromFile:aFilename
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
    |s reader|
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
    s := aFilename asFilename readStream.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    reader := self new fromStream:s.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
    s close.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
    ^ reader
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
! !
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
!WindowsCompoundBinaryFileReader methodsFor:'reading from stream'!
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
fromStream:aStream
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
    "read a stream from aStream."
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    client := self.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    self processStream:aStream
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    "
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
     WindowsCompoundBinaryFileReader fromFile:'C:\Users\cg\Downloads\vsdump\examples\Ian\Arrow & Text samples.vsd'      
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    "
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
!
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
processStream:aStream
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    "process a stream."
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    inStream := aStream.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    self readHeaderSector.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    "
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
     WindowsCompoundBinaryFileReader fromFile:'C:\Users\cg\Downloads\vsdump\examples\Ian\Arrow & Text samples.vsd'      
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    "
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
!
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
readHeaderSector
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    "sector 0 is a header sector:
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
        _abSig = DOCF 11E0 A1B1 1AE1 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
        _clid = 0000 0000 0000 0000 0000 0000 0000 0000 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        _uMinorVersion = 003B 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
        _uDllVersion = 3 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
        _uByteOrder = FFFE (Intel byte order) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
        _uSectorShift = 9 (512 bytes) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
        _uMiniSectorShift = 6 (64 bytes) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
        _usReserved = 0000 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        _ulReserved1 = 00000000 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        _ulReserved2 = 00000000 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
        _csectFat = 00000001 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
        _sectDirStart = 00000001 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
        _signature = 00000000 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
        _ulMiniSectorCutoff = 00001000 (4096 bytes) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
        _sectMiniFatStart = 00000002 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
        _csectMiniFat = 00000001 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
        _sectDifStart = FFFFFFFE (no DIF, file is < 7Mb) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
        _csectDIF = 00000000 _sectFat[] = 00000000 FFFFFFFF . . . (continues with FFFFFFFF)    
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    "
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    |sector sectorStream sig clsid uMinorVersion uDllVersion uByteOrder uSectorShift uMiniSectorShift usReserved ulReserved1 ulReserved2 csectFat sectDirStart signature ulMiniSectorCutoff sectMiniFatStart csectMiniFat sectDifStart csectDIF sectFat|
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    sector := inStream nextBytes:512.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    sectorStream := sector readStream.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    sig := sectorStream nextBytes:8.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    sig = #[ 16rD0 16rCF 16r11 16rE0 16rA1 16rB1 16r1A 16rE1 ] ifFalse:[
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
        self error.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    ].
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    clsid := sectorStream nextBytes:16.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    uMinorVersion := sectorStream nextUnsignedShortMSB:false. "/ = 003B 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    uDllVersion := sectorStream nextUnsignedShortMSB:false. "/ 3 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    uByteOrder := sectorStream nextUnsignedShortMSB:false. "/ = FFFE (Intel byte order)
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    uByteOrder == 16rFFFE ifTrue:[
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
        msb := false.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    ] ifFalse:[
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
        uByteOrder == 16rFEFF ifTrue:[
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
            msb := true.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
        ] ifFalse:[
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
            self error  
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
        ]
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    ].
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    uSectorShift := sectorStream nextUnsignedShortMSB:msb.      "/ = 9 (sector size 512 bytes) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    uMiniSectorShift := sectorStream nextUnsignedShortMSB:msb.  "/ = 6 (mini sector size 64 bytes)
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    usReserved := sectorStream nextUnsignedShortMSB:msb.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    ulReserved1 := sectorStream nextUnsignedLongMSB:msb. 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    ulReserved2 := sectorStream nextUnsignedLongMSB:msb.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    csectFat := sectorStream nextUnsignedLongMSB:msb.           "/ number of sectors in FAT chain
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    sectDirStart := sectorStream nextUnsignedLongMSB:msb.       "/ first sector in directory chain
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
    signature := sectorStream nextUnsignedLongMSB:msb.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    ulMiniSectorCutoff := sectorStream nextUnsignedLongMSB:msb. "/ max size of ministreams (4096 bytes) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    sectMiniFatStart := sectorStream nextUnsignedLongMSB:msb.   "/ first sect in mini-FAT = 00000002 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    csectMiniFat := sectorStream nextUnsignedLongMSB:msb.       "/ # of sects in mini-FAT chain = 00000001 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    sectDifStart := sectorStream nextUnsignedLongMSB:msb.       "/ first sect in DIF chain
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    csectDIF := sectorStream nextUnsignedLongMSB:msb.           "/ # of sects in DIF chain = FFFFFFFE (no DIF, file is < 7Mb) 
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    sectFat := OrderedCollection new.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    109 timesRepeat:[                                           "/ followed by first 109 FAT sectors.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
        sectFat add:(sectorStream nextUnsignedLongMSB:msb).     "/ 00000000
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    ].
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    "/ ... FFFFFFFF
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
self halt.
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    "
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
     WindowsCompoundBinaryFileReader fromFile:'C:\Users\cg\Downloads\vsdump\examples\Ian\Arrow & Text samples.vsd'      
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    "
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
! !
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
!WindowsCompoundBinaryFileReader class methodsFor:'documentation'!
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
version
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
    ^ '$Header: /cvs/stx/stx/libbasic2/WindowsCompoundBinaryFileReader.st,v 1.1 2009-04-30 21:20:57 cg Exp $'
8e07b9bbd007 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
! !