@@ -67,7 +67,6 @@ public HpiArchive(Stream stream)
6767
6868 archiveReader = new BinaryReader ( archiveStream ) ;
6969
70-
7170 foreach ( var entry in entriesDictionary . Keys )
7271 {
7372 if ( entriesDictionary [ entry ] . FlagCompression != CompressionMethod . None )
@@ -84,8 +83,6 @@ public HpiArchive(Stream stream)
8483
8584 entriesDictionary [ entry ] . compressedChunkSizes = size ;
8685 }
87- else
88- entriesDictionary [ entry ] . compressedChunkSizes = new int [ ] { entriesDictionary [ entry ] . UncompressedSize } ; //To optimize
8986 }
9087 }
9188
@@ -96,52 +93,51 @@ private void GetEntries(int NumberOfEntries, int EntryListOffset, BinaryReader r
9693 reader . BaseStream . Position = EntryListOffset + ( i * 9 ) ;
9794
9895 int nameOffset = reader . ReadInt32 ( ) ;
99- int dataOffset = reader . ReadInt32 ( ) ; //Unused?
96+ int dataOffset = reader . ReadInt32 ( ) ;
10097 bool IsDirectory = reader . ReadBoolean ( ) ;
10198 reader . BaseStream . Position = nameOffset ;
10299 var fullPath = Path . Combine ( parentPath , ReadStringCP437NullTerminated ( reader ) ) ;
100+ reader . BaseStream . Position = dataOffset ;
103101
104102 if ( IsDirectory )
105103 GetEntries ( reader . ReadInt32 ( ) , reader . ReadInt32 ( ) , reader , fullPath ) ;
106104 else
107- {
108- FileEntry fd = new FileEntry ( reader , this ) ;
109- entriesDictionary . Add ( fullPath , fd ) ;
110- }
105+ entriesDictionary . Add ( fullPath , new FileEntry ( reader , this ) ) ;
111106 }
112107 }
113108
114- internal static void SetEntries ( DirectoryTree tree , BinaryWriter bw , IEnumerator < FileEntry > sequence )
109+ internal static void SetEntries ( DirectoryNode node , BinaryWriter bw , IEnumerator < FileEntry > sequence )
115110 {
116- bw . Write ( tree . Count ) ; //Root Entries number in directory
117-
111+ bw . Write ( node . Children . Count ) ; //Root Entries number in directory
118112 bw . Write ( ( int ) bw . BaseStream . Position + 4 ) ; //Entries Offset point to next
119113
120- for ( int i = 0 ; i < tree . Count ; ++ i )
114+ bool first = true ;
115+ foreach ( var item in node . Children )
121116 {
122- int posString ;
123- if ( i == 0 )
124- posString = ( int ) bw . BaseStream . Position + ( tree . Count - i ) * 9 ;
125- else
126- posString = ( int ) bw . BaseStream . Length ;
117+ int posString = ( int ) bw . BaseStream . Length ;
118+ if ( first )
119+ {
120+ first = false ;
121+ posString = ( int ) bw . BaseStream . Position + node . Children . Count * 9 ;
122+ }
127123 bw . Write ( posString ) ; //NameOffset; /* points to the file name */
128- int posNext = posString + tree [ i ] . Key . Length + 1 ;
129- bw . Write ( posNext ) ; //DirDataOffset ; /* points to directory data */
130- bool isDir = tree [ i ] . Children . Count != 0 ;
131- bw . Write ( isDir ) ;
124+ int posNext = posString + item . Key . Length + 1 ;
125+ bw . Write ( posNext ) ; //DataOffset ; /* points to directory data */
126+ bool isDir = item . Value . Children . Count != 0 ;
127+ bw . Write ( isDir ) ;
132128
133129 int previousPos = ( int ) bw . BaseStream . Position ;
134130 bw . BaseStream . Position = posString ;
135- WriteStringCP437NullTerminated ( bw , tree [ i ] . Key ) ;
131+ WriteStringCP437NullTerminated ( bw , item . Key ) ;
136132 if ( isDir )
137- SetEntries ( tree [ i ] . Children , bw , sequence ) ;
133+ SetEntries ( item . Value , bw , sequence ) ;
138134 else
139135 {
140136 sequence . MoveNext ( ) ;
141137 bw . Write ( sequence . Current . OffsetOfCompressedData ) ; //OffsetOfData
142138 bw . Write ( sequence . Current . UncompressedSize ) ; //UncompressedSize
143139 bw . Write ( ( byte ) sequence . Current . FlagCompression ) ; //FlagCompression
144-
140+
145141 }
146142 bw . BaseStream . Position = previousPos ;
147143 }
0 commit comments