@@ -2,40 +2,40 @@ import { DirectoryRecord, ISODirectoryRecord, JolietDirectoryRecord } from './Di
2
2
import { FileFlags } from './constants.js' ;
3
3
import { CLEntry , REEntry } from './entries.js' ;
4
4
5
- export abstract class Directory < T extends DirectoryRecord > {
6
- protected _record : T ;
7
- private _fileList : string [ ] = [ ] ;
8
- private _fileMap : { [ name : string ] : T } = { } ;
5
+ export abstract class Directory < T extends DirectoryRecord > extends Map < string , T > {
6
+ //public readonly files: string[] = [];
7
+ //private fileMap = new Map<string, T>();
9
8
10
- public constructor ( record : T , isoData : Uint8Array ) {
11
- this . _record = record ;
9
+ public constructor (
10
+ protected record : T ,
11
+ isoData : Uint8Array
12
+ ) {
13
+ super ( ) ;
12
14
let i = record . lba ;
13
15
let limit = i + record . dataLength ;
14
16
if ( ! ( record . fileFlags & FileFlags . Directory ) ) {
15
17
// Must have a CL entry.
16
- const cl = record . getSUEntries ( isoData ) . filter ( e => e instanceof CLEntry ) [ 0 ] as CLEntry ;
18
+ const cl = record . getSUEntries ( isoData ) . find ( e => e instanceof CLEntry ) ;
19
+ if ( ! cl ) {
20
+ throw new ReferenceError ( 'No CL entry' ) ;
21
+ }
17
22
i = cl . childDirectoryLba * 2048 ;
18
23
limit = Infinity ;
19
24
}
20
25
21
26
while ( i < limit ) {
22
- const len = isoData [ i ] ;
27
+ const length = isoData [ i ] ;
23
28
// Zero-padding between sectors.
24
- // TODO: Could optimize this to seek to nearest-sector upon
25
- // seeing a 0.
26
- if ( len === 0 ) {
29
+ // Could optimize this to seek to nearest-sector upon seeing a 0.
30
+ if ( ! length ) {
27
31
i ++ ;
28
32
continue ;
29
33
}
30
34
const r = this . _constructDirectoryRecord ( isoData . slice ( i ) ) ;
31
35
const fname = r . fileName ( isoData ) ;
32
36
// Skip '.' and '..' entries.
33
- if ( fname !== '\u0000' && fname !== '\u0001' ) {
34
- // Skip relocated entries.
35
- if ( ! r . hasRockRidge || r . getSUEntries ( isoData ) . filter ( e => e instanceof REEntry ) . length === 0 ) {
36
- this . _fileMap [ fname ] = r ;
37
- this . _fileList . push ( fname ) ;
38
- }
37
+ if ( fname !== '\u0000' && fname !== '\u0001' && ( ! r . hasRockRidge || ! r . getSUEntries ( isoData ) . filter ( e => e instanceof REEntry ) . length ) ) {
38
+ this . set ( fname , r ) ;
39
39
} else if ( limit === Infinity ) {
40
40
// First entry contains needed data.
41
41
limit = i + r . dataLength ;
@@ -44,40 +44,21 @@ export abstract class Directory<T extends DirectoryRecord> {
44
44
}
45
45
}
46
46
47
- /**
48
- * Get the record with the given name.
49
- * Returns undefined if not present.
50
- */
51
- public getRecord ( name : string ) : DirectoryRecord {
52
- return this . _fileMap [ name ] ;
53
- }
54
-
55
- public get fileList ( ) : string [ ] {
56
- return this . _fileList ;
57
- }
58
-
59
47
public getDotEntry ( isoData : Uint8Array ) : T {
60
- return this . _constructDirectoryRecord ( isoData . slice ( this . _record . lba ) ) ;
48
+ return this . _constructDirectoryRecord ( isoData . slice ( this . record . lba ) ) ;
61
49
}
62
50
63
51
protected abstract _constructDirectoryRecord ( data : Uint8Array ) : T ;
64
52
}
65
- export class ISODirectory extends Directory < ISODirectoryRecord > {
66
- public constructor ( record : ISODirectoryRecord , isoData : Uint8Array ) {
67
- super ( record , isoData ) ;
68
- }
69
53
54
+ export class ISODirectory extends Directory < ISODirectoryRecord > {
70
55
protected _constructDirectoryRecord ( data : Uint8Array ) : ISODirectoryRecord {
71
- return new ISODirectoryRecord ( data , this . _record . rockRidgeOffset ) ;
56
+ return new ISODirectoryRecord ( data , this . record . rockRidgeOffset ) ;
72
57
}
73
58
}
74
59
75
60
export class JolietDirectory extends Directory < JolietDirectoryRecord > {
76
- public constructor ( record : JolietDirectoryRecord , isoData : Uint8Array ) {
77
- super ( record , isoData ) ;
78
- }
79
-
80
61
protected _constructDirectoryRecord ( data : Uint8Array ) : JolietDirectoryRecord {
81
- return new JolietDirectoryRecord ( data , this . _record . rockRidgeOffset ) ;
62
+ return new JolietDirectoryRecord ( data , this . record . rockRidgeOffset ) ;
82
63
}
83
64
}
0 commit comments