| 1 |  | unit Access_OniArchive; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 2 |  | interface | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 3 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 4 | < | uses DataAccess, Classes; | 
 
 
 
 
 
 
 
 
 | 4 | > | uses DataAccess, Classes, TypeDefs; | 
 
 
 
 
 
 
 
 
 
 
 | 5 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 6 |  | type | 
 
 
 
 
 
 
 
 
 | 7 | – | { | 
 
 
 
 
 
 
 
 
 | 8 | – | THeader = packed record | 
 
 
 
 
 
 
 
 
 | 9 | – | Ident:      array[0..$13] of Byte; | 
 
 
 
 
 
 
 
 
 | 10 | – | Files:      LongWord; | 
 
 
 
 
 
 
 
 
 | 11 | – | NamedFiles: LongWord; | 
 
 
 
 
 
 
 
 
 | 12 | – | Extensions: LongWord; | 
 
 
 
 
 
 
 
 
 | 13 | – | DataAddr:   LongWord; | 
 
 
 
 
 
 
 
 
 | 14 | – | DataSize:   LongWord; | 
 
 
 
 
 
 
 
 
 | 15 | – | NamesAddr:  LongWord; | 
 
 
 
 
 
 
 
 
 | 16 | – | NamesSize:  LongWord; | 
 
 
 
 
 
 
 
 
 | 17 | – | Ident2:     array[0..$F] of Byte; | 
 
 
 
 
 
 
 
 
 | 18 | – | end; | 
 
 
 
 
 
 
 
 
 | 19 | – | TFilesMap = array of packed record | 
 
 
 
 
 
 
 
 
 | 20 | – | Extension: array[0..$3] of Char; | 
 
 
 
 
 
 
 
 
 | 21 | – | DataAddr:  LongWord; | 
 
 
 
 
 
 
 
 
 | 22 | – | NameAddr:  LongWord; | 
 
 
 
 
 
 
 
 
 | 23 | – | FileSize:  LongWord; | 
 
 
 
 
 
 
 
 
 | 24 | – | FileType:  LongWord; | 
 
 
 
 
 
 
 
 
 | 25 | – | end; | 
 
 
 
 
 
 
 
 
 | 26 | – |  | 
 
 
 
 
 
 
 
 
 | 27 | – | TFileInfo = packed record | 
 
 
 
 
 
 
 
 
 | 28 | – | ID:      Integer; | 
 
 
 
 
 
 
 
 
 | 29 | – | FileName: String; | 
 
 
 
 
 
 
 
 
 | 30 | – | FileNameHex: String; | 
 
 
 
 
 
 
 
 
 | 31 | – | Extension: String[4]; | 
 
 
 
 
 
 
 
 
 | 32 | – | Name:    String; | 
 
 
 
 
 
 
 
 
 | 33 | – | Size:    LongWord; | 
 
 
 
 
 
 
 
 
 | 34 | – | FileType: LongWord; | 
 
 
 
 
 
 
 
 
 | 35 | – | DatAddr: LongWord; | 
 
 
 
 
 
 
 
 
 | 36 | – | opened:  Boolean; | 
 
 
 
 
 
 
 
 
 | 37 | – | end; | 
 
 
 
 
 
 
 
 
 | 38 | – | TFiles = array of TFileInfo; | 
 
 
 
 
 
 
 
 
 | 39 | – |  | 
 
 
 
 
 
 
 
 
 | 40 | – | TNamedFilesMap = array of packed record | 
 
 
 
 
 
 
 
 
 | 41 | – | FileNumber: LongWord; | 
 
 
 
 
 
 
 
 
 | 42 | – | blubb:      LongWord; | 
 
 
 
 
 
 
 
 
 | 43 | – | end; | 
 
 
 
 
 
 
 
 
 | 44 | – | TExtensionsMap = array of packed record | 
 
 
 
 
 
 
 
 
 | 45 | – | Ident:     array[0..$7] of Byte; | 
 
 
 
 
 
 
 
 
 | 46 | – | Extension: array[0..$3] of Char; | 
 
 
 
 
 
 
 
 
 | 47 | – | ExtCount:  LongWord; | 
 
 
 
 
 
 
 
 
 | 48 | – | end; | 
 
 
 
 
 
 
 
 
 | 49 | – | } | 
 
 
 
 
 
 
 
 
 | 50 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 7 |  | TAccess_OniArchive = class(TDataAccess) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 8 |  | private | 
 
 
 
 
 
 
 
 
 
 
 | 9 | < | {    Fdat_file:     TFileStream; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 10 | < | Fraw_file:     TFileStream; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 11 | < | Fsep_file:     TFileStream; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 12 | < | Fdat_header:   THeader; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 13 | < | Fdat_filesmap: TFilesMap; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 14 | < | Fdat_files:    TFiles; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 15 | < | Fdat_namedfilesmap: TNamedFilesMap; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 16 | < | Fdat_extensionsmap: TExtensionsMap; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 17 | < | FUnloadWhenUnused: Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 62 | < | FDatOpened:    Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 63 | < | FRawOpened:    Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 64 | < | FSepOpened:    Boolean; | 
 
 
 
 
 
 
 
 
 | 9 | > | Fdat_file:           TFileStream; | 
 
 
 
 
 | 10 | > | Fraw_file:           TFileStream; | 
 
 
 
 
 | 11 | > | Fsep_file:           TFileStream; | 
 
 
 
 
 | 12 | > | Fdat_files:          TFiles; | 
 
 
 
 
 | 13 | > | Fdat_extensionsmap:  TExtensionsMap; | 
 
 
 
 
 | 14 | > | FUnloadWhenUnused:   Boolean; | 
 
 
 
 
 | 15 | > | FDatOpened:          Boolean; | 
 
 
 
 
 | 16 | > | FRawOpened:          Boolean; | 
 
 
 
 
 | 17 | > | FSepOpened:          Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 18 |  | protected | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 19 |  | public | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 20 |  | property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write FUnloadWhenUnused; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 21 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 22 | < | constructor Create(DatFilename: String; var Result: Boolean); override; | 
 
 
 
 
 
 
 
 
 | 22 | > | constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override; | 
 
 
 
 
 
 
 
 
 
 
 | 23 |  | procedure Close; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 24 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 25 | < | function GetFileInfo(fileid: Integer): TFileInfo; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 26 | < | function GetFilesList(ext: String; pattern: String; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 27 | < | NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 28 | < | function GetFilesCount: LongWord; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 29 | < | function GetExtensionsList: TStringArray; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 30 | < | function GetExtendedExtensionsList: TExtensionsMap; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 31 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 32 | < | function LoadDatFile(fileid: LongWord): Tdata; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 33 | < | procedure UpdateDatFile(fileid: LongWord; Data: Tdata); override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 34 | < | procedure LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 35 | < | procedure UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 36 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 37 | < | procedure LoadRawOffset(loc_sep: Boolean; raw_addr, size: LongWord; target: Pointer); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 38 | < | function GetRawList(fileid: LongWord): TRawList; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 39 | < | procedure LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 40 | < | procedure UpdateRawFile(fileid, dat_offset: LongWord; size: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 41 | < | target: Pointer); override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 42 | < | procedure LoadRawFilePart(fileid, dat_offset: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 43 | < | offset, size: LongWord; target: Pointer); override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 44 | < | procedure UpdateRawFilePart(fileid, dat_offset: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 45 | < | offset, size: LongWord; target: Pointer); override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 93 | < | function AppendRawFile(loc_sep: Boolean; size: LongWord; target: Pointer): LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 94 | < | override;//Returns new Address | 
 
 
 
 
 
 
 
 
 | 25 | > | function GetFileInfo(FileID: Integer): TFileInfo; override; | 
 
 
 
 
 | 26 | > | function GetFilesList(Ext: String; Pattern: String; | 
 
 
 
 
 | 27 | > | NoEmptyFiles: Boolean; SortType: TSortType): TStrings; override; | 
 
 
 
 
 | 28 | > | function GetFileCount: Integer; override; | 
 
 
 
 
 | 29 | > | function GetExtensionsList(ExtListFormat: TExtensionFormat): TStrings; override; | 
 
 
 
 
 | 30 | > |  | 
 
 
 
 
 | 31 | > | procedure LoadDatFile(FileID: Integer; var Target: TStream); overload; override; | 
 
 
 
 
 | 32 | > | procedure UpdateDatFile(FileID: Integer; Src: TStream); overload; override; | 
 
 
 
 
 | 33 | > | procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); overload; override; | 
 
 
 
 
 | 34 | > | procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; override; | 
 
 
 
 
 | 35 | > |  | 
 
 
 
 
 | 36 | > | function GetRawList(FileID: Integer): TRawDataList; override; | 
 
 
 
 
 | 37 | > | function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override; | 
 
 
 
 
 | 38 | > |  | 
 
 
 
 
 | 39 | > | procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); | 
 
 
 
 
 | 40 | > | procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override; | 
 
 
 
 
 | 41 | > | procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override; | 
 
 
 
 
 | 42 | > | procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); overload; override; | 
 
 
 
 
 | 43 | > | procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); overload; override; | 
 
 
 
 
 | 44 | > |  | 
 
 
 
 
 | 45 | > | function AppendRawFile(LocSep: Boolean; Size: Integer; Src: TStream): Integer; overload; override; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 46 |  | published | 
 
 
 
 
 
 
 
 
 
 
 | 47 | < | }  end; | 
 
 
 
 
 
 
 
 
 | 47 | > | end; | 
 
 
 
 
 
 
 
 
 
 
 | 48 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 49 |  | implementation | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 50 |  |  | 
 
 
 
 
 
 
 
 | 51 | + | uses | 
 
 
 
 
 
 
 
 | 52 | + | SysUtils, StrUtils, Data, Functions, RawList; | 
 
 
 
 
 
 
 
 | 53 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 54 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 55 |  | (* | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 56 |  | ================================================================================ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 57 |  | Implementation of  TOniDataDat | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 58 |  | *) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 59 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 60 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 61 | < | constructor TOniDataDat.Create(DatFilename: String; var Result: Boolean); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 60 | > |  | 
 
 
 
 
 | 61 | > | constructor TAccess_OniArchive.Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); | 
 
 
 
 
 | 62 | > | type | 
 
 
 
 
 | 63 | > | THeader = packed record | 
 
 
 
 
 | 64 | > | Ident:      array[0..$13] of Byte; | 
 
 
 
 
 | 65 | > | Files:      Integer; | 
 
 
 
 
 | 66 | > | NamedFiles: Integer; | 
 
 
 
 
 | 67 | > | Extensions: Integer; | 
 
 
 
 
 | 68 | > | DataAddr:   Integer; | 
 
 
 
 
 | 69 | > | DataSize:   Integer; | 
 
 
 
 
 | 70 | > | NamesAddr:  Integer; | 
 
 
 
 
 | 71 | > | NamesSize:  Integer; | 
 
 
 
 
 | 72 | > | Ident2:     array[0..$F] of Byte; | 
 
 
 
 
 | 73 | > | end; | 
 
 
 
 
 | 74 | > | TFilesMap = array of packed record | 
 
 
 
 
 | 75 | > | Extension: array[0..$3] of Char; | 
 
 
 
 
 | 76 | > | DataAddr:  Integer; | 
 
 
 
 
 | 77 | > | NameAddr:  Integer; | 
 
 
 
 
 | 78 | > | FileSize:  Integer; | 
 
 
 
 
 | 79 | > | FileType:  LongWord; | 
 
 
 
 
 | 80 | > | end; | 
 
 
 
 
 | 81 | > | TNamedFilesMap = array of packed record | 
 
 
 
 
 | 82 | > | FileNumber: Integer; | 
 
 
 
 
 | 83 | > | blubb:      Integer; | 
 
 
 
 
 | 84 | > | end; | 
 
 
 
 
 
 
 
 
 
 
 | 85 |  | const | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 86 |  | header_ident1_pc: array[0..$13] of Byte = | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 87 |  | ($1F, $27, $DC, $33, $DF, $BC, $03, $00, $31, $33, $52, $56, $40, $00, | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 95 |  | header_ident2: array[0..$F] of Byte = | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 96 |  | ($99, $CF, $40, $00, $90, $4F, $63, $00, $F4, $55, $5F, $00, $90, $4F, $63, $00); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 97 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 98 | < | i: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 99 | < | header_pc, header_mac: Boolean; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 98 | > | i: Integer; | 
 
 
 
 
 | 99 | > | header_pc, header_mac, header_macbeta: Boolean; | 
 
 
 
 
 | 100 | > | Fdat_header:   THeader; | 
 
 
 
 
 | 101 | > | Fdat_filesmap: TFilesMap; | 
 
 
 
 
 | 102 | > | Fdat_namedfilesmap: TNamedFilesMap; | 
 
 
 
 
 
 
 
 
 
 
 | 103 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 104 |  | FUnloadWhenUnused := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 105 |  | FDatOpened := False; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 106 |  | FRawOpened := False; | 
 
 
 
 
 
 
 
 | 107 | + | Msg := SM_UnknownError; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 108 |  | if not FileExists(DatFilename) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 109 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 110 | < | ShowMessage('File doesn''t exist!!!'); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 130 | < | Result := False; | 
 
 
 
 
 
 
 
 
 | 110 | > | Msg := SM_FileNotFound; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 111 |  | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 112 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 113 |  | FFileName := DatFilename; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 115 |  | Fdat_file.Read(Fdat_header, SizeOf(Fdat_header)); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 116 |  | header_pc  := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 117 |  | header_mac := True; | 
 
 
 
 
 
 
 
 | 118 | + | header_macbeta := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 119 |  | for i := 0 to High(Fdat_header.Ident) do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 120 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 121 | < | FLevelInfo.Ident[i] := Fdat_header.Ident[i]; | 
 
 
 
 
 
 
 
 
 | 121 | > | //    FLevelInfo.Ident[i] := Fdat_header.Ident[i]; | 
 
 
 
 
 
 
 
 
 
 
 | 122 |  | if Fdat_header.Ident[i] <> header_ident1_pc[i] then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 123 |  | header_pc := False; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 124 |  | if Fdat_header.Ident[i] <> header_ident1_mac[i] then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 125 |  | header_mac := False; | 
 
 
 
 
 
 
 
 | 126 | + | if Fdat_header.Ident[i] <> header_ident1_macbeta[i] then | 
 
 
 
 
 
 
 
 | 127 | + | header_macbeta := False; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 128 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 129 | < | if not (header_pc xor header_mac) then | 
 
 
 
 
 
 
 
 
 | 129 | > | if not (header_pc xor header_mac xor header_macbeta) then | 
 
 
 
 
 
 
 
 
 
 
 | 130 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 131 | < | Result := False; | 
 
 
 
 
 
 
 
 
 | 131 | > | Msg := SM_IncompatibleFile; | 
 
 
 
 
 
 
 
 
 
 
 | 132 |  | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 133 |  | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 134 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 135 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 136 | < | if (header_pc and not header_mac) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 137 | < | Fos_mac := False | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 138 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 139 | < | Fos_mac := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 136 | > | if (header_pc and not header_mac and not header_macbeta) then | 
 
 
 
 
 | 137 | > | FDataOS := DOS_WIN | 
 
 
 
 
 | 138 | > | else if (not header_pc and header_mac and not header_macbeta) then | 
 
 
 
 
 | 139 | > | FDataOS := DOS_MAC | 
 
 
 
 
 | 140 | > | else if (not header_pc and not header_mac and header_macbeta) then | 
 
 
 
 
 | 141 | > | FDataOS := DOS_MACBETA; | 
 
 
 
 
 
 
 
 
 
 
 | 142 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 143 |  | SetLength(Fdat_filesmap, Fdat_header.Files); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 144 |  | SetLength(Fdat_files, Fdat_header.Files); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 164 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 165 |  | Fdat_files[i].Name := ''; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 166 |  | end; | 
 
 
 
 
 
 
 
 
 | 182 | – | Fdat_files[i].FileName    := | 
 
 
 
 
 
 
 
 
 | 183 | – | FormatNumber(i, 5, '0') + '-' + Fdat_files[i].Name + '.' + Fdat_files[i].Extension; | 
 
 
 
 
 
 
 
 
 | 184 | – | Fdat_files[i].FileNameHex := | 
 
 
 
 
 
 
 
 
 | 185 | – | IntToHex(i, 4) + '-' + Fdat_files[i].Name + '.' + Fdat_files[i].Extension; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 167 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 168 |  | Fdat_file.Seek($40 + Fdat_header.Files * $14, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 169 |  | SetLength(Fdat_namedfilesmap, Fdat_header.NamedFiles); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 176 |  | Fdat_file.Read(Fdat_extensionsmap[i], SizeOf(Fdat_extensionsmap[i])); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 177 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 178 |  | Fdat_file.Seek(Fdat_files[0].DatAddr + 7, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 179 | < | Fdat_file.Read(FLevelInfo.LevelNumber, 1); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 180 | < | FLevelInfo.LevelNumber := FLevelInfo.LevelNumber div 2; | 
 
 
 
 
 
 
 
 
 | 179 | > | Fdat_file.Read(FLevelNumber, 1); | 
 
 
 
 
 | 180 | > | FLevelNumber := FLevelNumber div 2; | 
 
 
 
 
 
 
 
 
 
 
 | 181 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 182 |  | Fdat_file.Free; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 183 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 184 | < | Result   := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 185 | < | FBackend := ODB_Dat; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 184 | > | Msg := SM_OK; | 
 
 
 
 
 | 185 | > | FBackend := DB_ONI; | 
 
 
 
 
 | 186 | > | FChangeRights := [CR_EditDat, CR_EditRaw, CR_AppendRaw]; | 
 
 
 
 
 
 
 
 
 
 
 | 187 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 188 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 189 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 190 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 191 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 192 | < | procedure TOniDataDat.Close; | 
 
 
 
 
 
 
 
 
 | 192 | > | procedure TAccess_OniArchive.Close; | 
 
 
 
 
 
 
 
 
 
 
 | 193 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 194 | < | if not FUnloadWhenUnused and FDatOpened then | 
 
 
 
 
 
 
 
 
 | 194 | > | if FDatOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 195 |  | Fdat_file.Free; | 
 
 
 
 
 
 
 
 
 
 
 | 196 | < | if not FUnloadWhenUnused and FRawOpened then | 
 
 
 
 
 
 
 
 
 | 196 | > | if FRawOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 197 |  | Fraw_file.Free; | 
 
 
 
 
 
 
 
 
 
 
 | 198 | < | if not FUnloadWhenUnused and FSepOpened then | 
 
 
 
 
 
 
 
 
 | 198 | > | if FSepOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 199 |  | Fsep_file.Free; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 200 |  | Self.Free; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 201 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 203 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 204 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 205 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 206 | < | function TOniDataDat.GetFileInfo(fileid: Integer): TFileInfo; | 
 
 
 
 
 
 
 
 
 | 206 | > | function TAccess_OniArchive.GetFileInfo(fileid: Integer): TFileInfo; | 
 
 
 
 
 
 
 
 
 
 
 | 207 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 208 |  | if fileid = -1 then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 210 |  | Result := inherited GetFileInfo(fileid); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 211 |  | Exit; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 212 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 213 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 | 213 | > | if fileid < Self.GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 214 |  | Result    := Fdat_files[fileid] | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 215 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 216 |  | Result.ID := -1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 219 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 220 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 221 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 222 | < | function TOniDataDat.GetFilesList(ext: String; pattern: String; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 223 | < | NoEmptyFiles: Boolean; sort: TSortType): TStringArray; | 
 
 
 
 
 
 
 
 
 | 222 | > | function TAccess_OniArchive.GetFilesList(ext: String; pattern: String; | 
 
 
 
 
 | 223 | > | NoEmptyFiles: Boolean; SortType: TSortType): TStrings; | 
 
 
 
 
 
 
 
 
 
 
 | 224 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 225 | < | i: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 226 | < | list: TStringList; | 
 
 
 
 
 
 
 
 
 | 225 | > | i:      Integer; | 
 
 
 
 
 | 226 | > | list:   TStringList; | 
 
 
 
 
 
 
 
 
 
 
 | 227 |  | id, name, extension: String; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 228 |  | fields: TStrings; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 229 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 230 |  | procedure getfields; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 231 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 232 | < | fields.CommaText := StringReplace(AnsiQuotedStr(list.Strings[i], '"'), ';', '","', [rfReplaceAll]); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 233 | < | if sort in [stIDAsc, stIDDesc] then | 
 
 
 
 
 
 
 
 
 | 232 | > | fields.CommaText := StringReplace(AnsiQuotedStr(list.Strings[i], '"'), ';', '","', [rfReplaceAll]); | 
 
 
 
 
 | 233 | > | if SortType in [ST_IDAsc, ST_IDDesc] then | 
 
 
 
 
 
 
 
 
 
 
 | 234 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 235 |  | id := fields.Strings[0]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 236 |  | name := fields.Strings[1]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 237 |  | extension := fields.Strings[2]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 238 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 239 | < | if sort in [stNameAsc, stNameDesc] then | 
 
 
 
 
 
 
 
 
 | 239 | > | if SortType in [ST_NameAsc, ST_NameDesc] then | 
 
 
 
 
 
 
 
 
 
 
 | 240 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 241 |  | id := fields.Strings[1]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 242 |  | name := fields.Strings[0]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 243 |  | extension := fields.Strings[2]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 244 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 245 | < | if sort in [stExtAsc, stExtDesc] then | 
 
 
 
 
 
 
 
 
 | 245 | > | if SortType in [ST_ExtAsc, ST_ExtDesc] then | 
 
 
 
 
 
 
 
 
 
 
 | 246 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 247 |  | id := fields.Strings[1]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 248 |  | name := fields.Strings[2]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 253 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 254 |  | list := TStringList.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 255 |  | list.Sorted := True; | 
 
 
 
 
 
 
 
 
 
 
 | 256 | < | for i := 0 to Fdat_header.Files - 1 do | 
 
 
 
 
 
 
 
 
 | 256 | > | for i := 0 to GetFileCount - 1 do | 
 
 
 
 
 
 
 
 
 
 
 | 257 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 258 |  | if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 259 |  | ((Length(pattern) = 0) or | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 268 |  | name := Fdat_files[i].Name; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 269 |  | extension := Fdat_files[i].Extension; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 270 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 271 | < | case sort of | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 272 | < | stIDAsc, stIDDesc:     list.Add(id + ';' + name + ';' + extension); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 273 | < | stNameAsc, stNameDesc: list.Add(name + ';' + id + ';' + extension); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 274 | < | stExtAsc, stExtDesc:   list.Add(extension + ';' + id + ';' + name); | 
 
 
 
 
 
 
 
 
 | 271 | > | case SortType of | 
 
 
 
 
 | 272 | > | ST_IDAsc, ST_IDDesc:     list.Add(id + ';' + name + ';' + extension); | 
 
 
 
 
 | 273 | > | ST_NameAsc, ST_NameDesc: list.Add(name + ';' + id + ';' + extension); | 
 
 
 
 
 | 274 | > | ST_ExtAsc, ST_ExtDesc:   list.Add(extension + ';' + id + ';' + name); | 
 
 
 
 
 
 
 
 
 
 
 | 275 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 276 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 277 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 278 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 | 279 | < | SetLength(Result, list.Count); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 280 | < | if Length(Result) > 0 then | 
 
 
 
 
 
 
 
 
 | 279 | > | Result := TStringList.Create; | 
 
 
 
 
 | 280 | > | if list.Count > 0 then | 
 
 
 
 
 
 
 
 
 
 
 | 281 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 282 |  | fields := TStringList.Create; | 
 
 
 
 
 
 
 
 
 
 
 | 283 | < | if sort in [stIDAsc, stNameAsc, stExtAsc] then | 
 
 
 
 
 
 
 
 
 | 283 | > | if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc] then | 
 
 
 
 
 
 
 
 
 
 
 | 284 |  | for i := 0 to list.Count - 1 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 285 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 286 |  | getfields; | 
 
 
 
 
 
 
 
 
 
 
 | 287 | < | Result[i] := id + '-' + name + '.' + extension; | 
 
 
 
 
 
 
 
 
 | 287 | > | Result.Add(id + '-' + name + '.' + extension); | 
 
 
 
 
 
 
 
 
 
 
 | 288 |  | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 289 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 290 |  | for i := list.Count - 1 downto 0 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 291 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 292 |  | getfields; | 
 
 
 
 
 
 
 
 
 
 
 | 293 | < | Result[list.Count - i - 1] := id + '-' + name + '.' + extension; | 
 
 
 
 
 
 
 
 
 | 293 | > | Result.Add(id + '-' + name + '.' + extension); | 
 
 
 
 
 
 
 
 
 
 
 | 294 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 295 |  | fields.Free; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 296 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 300 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 301 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 302 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 303 | < | function TOniDataDat.GetFilesCount: LongWord; | 
 
 
 
 
 
 
 
 
 | 303 | > | function TAccess_OniArchive.GetFileCount: Integer; | 
 
 
 
 
 
 
 
 
 
 
 | 304 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 305 | < | Result := Fdat_header.Files; | 
 
 
 
 
 
 
 
 
 | 305 | > | Result := Length(Fdat_files); | 
 
 
 
 
 
 
 
 
 
 
 | 306 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 307 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 308 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 309 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 310 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 311 | < | function TOniDataDat.GetExtensionsList: TStringArray; | 
 
 
 
 
 
 
 
 
 | 311 | > | function TAccess_OniArchive.GetExtensionsList(ExtListFormat: TExtensionFormat): TStrings; | 
 
 
 
 
 
 
 
 
 
 
 | 312 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 313 | < | i: LongWord; | 
 
 
 
 
 
 
 
 
 | 313 | > | i: Integer; | 
 
 
 
 
 
 
 
 
 
 
 | 314 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 315 | < | SetLength(Result, Fdat_header.Extensions); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 316 | < | for i := 0 to Fdat_header.Extensions - 1 do | 
 
 
 
 
 
 
 
 
 | 315 | > | Result := TStringList.Create; | 
 
 
 
 
 | 316 | > | for i := 0 to Length(Fdat_extensionsmap) - 1 do | 
 
 
 
 
 
 
 
 
 
 
 | 317 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 318 |  | with Fdat_extensionsmap[i] do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 319 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 320 | < | Result[i] := Extension[3] + Extension[2] + Extension[1] + Extension[0] + | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 321 | < | ' (' + IntToStr(ExtCount) + ')'; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 320 | > | case ExtListFormat of | 
 
 
 
 
 | 321 | > | EF_ExtOnly: | 
 
 
 
 
 | 322 | > | Result.Add(Extension[3] + Extension[2] + Extension[1] + Extension[0]); | 
 
 
 
 
 | 323 | > | EF_ExtCount: | 
 
 
 
 
 | 324 | > | Result.Add(Extension[3] + Extension[2] + Extension[1] + Extension[0] + | 
 
 
 
 
 | 325 | > | ' (' + IntToStr(ExtCount) + ')'); | 
 
 
 
 
 | 326 | > | end; | 
 
 
 
 
 
 
 
 
 
 
 | 327 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 328 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 329 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 330 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 331 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 332 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 333 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 347 | < | function TOniDataDat.GetExtendedExtensionsList: TExtensionsMap; | 
 
 
 
 
 
 
 
 
 | 333 | > | procedure TAccess_OniArchive.LoadDatFile(FileID: Integer; var Target: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 334 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 335 | < | i: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 350 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 351 | < | SetLength(Result, Fdat_header.Extensions); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 352 | < | for i := 0 to Fdat_header.Extensions - 1 do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 353 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 354 | < | Result[i] := Fdat_extensionsmap[i]; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 355 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 356 | < | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 357 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 358 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 359 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 360 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 361 | < | function TOniDataDat.LoadDatFile(fileid: LongWord): Tdata; | 
 
 
 
 
 
 
 
 
 | 335 | > | streampos: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 336 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 337 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 | 337 | > | if fileid < GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 338 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 339 | < | if FUnloadWhenUnused or not FDatOpened then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 339 | > | if not Assigned(Target) then | 
 
 
 
 
 | 340 | > | Target := TMemoryStream.Create; | 
 
 
 
 
 | 341 | > | if not FDatOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 342 |  | Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 343 |  | Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 344 | < | SetLength(Result, Fdat_files[fileid].Size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 345 | < | Fdat_file.Read(Result[0], Fdat_files[fileid].Size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 344 | > | streampos := Target.Position; | 
 
 
 
 
 | 345 | > | Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size); | 
 
 
 
 
 | 346 | > | Target.Seek(streampos, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 347 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 348 | < | Fdat_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 348 | > | begin | 
 
 
 
 
 | 349 | > | Fdat_file.Free; | 
 
 
 
 
 | 350 | > | FDatOpened := False; | 
 
 
 
 
 | 351 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 352 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 353 |  | FDatOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 354 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 355 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 356 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 357 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 378 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 379 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 380 | < | procedure TOniDataDat.UpdateDatFile(fileid: LongWord; Data: Tdata); | 
 
 
 
 
 
 
 
 
 | 357 | > | procedure TAccess_OniArchive.UpdateDatFile(FileID: Integer; Src: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 358 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 359 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 | 359 | > | if fileid < GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 360 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 361 | < | if FUnloadWhenUnused or not FDatOpened then | 
 
 
 
 
 
 
 
 
 | 361 | > | if not FDatOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 362 |  | Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 363 |  | Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 364 | < | Fdat_file.Write(Data[0], Length(Data)); | 
 
 
 
 
 
 
 
 
 | 364 | > | Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size); | 
 
 
 
 
 
 
 
 
 
 
 | 365 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 366 | < | Fdat_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 366 | > | begin | 
 
 
 
 
 | 367 | > | Fdat_file.Free; | 
 
 
 
 
 | 368 | > | FDatOpened := False; | 
 
 
 
 
 | 369 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 370 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 371 |  | FDatOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 372 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 373 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 374 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 375 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 376 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 377 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 398 | < | procedure TOniDataDat.LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); | 
 
 
 
 
 
 
 
 
 | 375 | > | procedure TAccess_OniArchive.LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); | 
 
 
 
 
 | 376 | > | var | 
 
 
 
 
 | 377 | > | streampos: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 378 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 379 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 | 379 | > | if fileid < GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 380 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 381 | < | if FUnloadWhenUnused or not FDatOpened then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 381 | > | if not Assigned(Target) then | 
 
 
 
 
 | 382 | > | Target := TMemoryStream.Create; | 
 
 
 
 
 | 383 | > | if not FDatOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 384 |  | Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 385 |  | Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 386 | < | Fdat_file.Read(target^, size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 386 | > | streampos := Target.Position; | 
 
 
 
 
 | 387 | > | Target.CopyFrom(Fdat_file, size); | 
 
 
 
 
 | 388 | > | Target.Seek(streampos, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 389 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 390 | < | Fdat_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 390 | > | begin | 
 
 
 
 
 | 391 | > | FDatOpened := False; | 
 
 
 
 
 | 392 | > | Fdat_file.Free; | 
 
 
 
 
 | 393 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 394 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 395 |  | FDatOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 396 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 397 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 398 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 399 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 414 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 415 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 416 | < | procedure TOniDataDat.UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); | 
 
 
 
 
 
 
 
 
 | 399 | > | procedure TAccess_OniArchive.UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 400 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 401 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 | 401 | > | if fileid < GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 402 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 403 | < | if FUnloadWhenUnused or not FDatOpened then | 
 
 
 
 
 
 
 
 
 | 403 | > | if not FDatOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 404 |  | Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 405 |  | Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 406 | < | Fdat_file.Write(target^, size); | 
 
 
 
 
 
 
 
 
 | 406 | > | Fdat_file.CopyFrom(Src, Size); | 
 
 
 
 
 
 
 
 
 
 
 | 407 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 408 | < | Fdat_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 408 | > | begin | 
 
 
 
 
 | 409 | > | Fdat_file.Free; | 
 
 
 
 
 | 410 | > | FDatOpened := False; | 
 
 
 
 
 | 411 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 412 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 413 |  | FDatOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 414 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 416 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 417 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 418 |  |  | 
 
 
 
 
 
 
 
 | 419 | + | function TAccess_OniArchive.GetRawList(FileID: Integer): TRawDataList; | 
 
 
 
 
 
 
 
 | 420 | + | begin | 
 
 
 
 
 
 
 
 | 421 | + | Result := RawLists.GetRawList(FConnectionID, FileID); | 
 
 
 
 
 
 
 
 | 422 | + | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 423 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 424 | < | function TOniDataDat.GetRawList(fileid: LongWord): TRawList; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 425 | < | var | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 436 | < | i: LongWord; | 
 
 
 
 
 
 
 
 
 | 424 | > |  | 
 
 
 
 
 | 425 | > | function TAccess_OniArchive.GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 426 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 427 | < | SetLength(Result, 0); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 439 | < | for i := 0 to High(RawListHandlers) do | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 440 | < | if UpperCase(RawListHandlers[i].Ext) = UpperCase(Fdat_files[fileid].extension) then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 441 | < | if RawListHandlers[i].needed then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 442 | < | begin | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 443 | < | Result := RawListHandlers[i].Handler(Self, fileid); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 444 | < | Break; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 445 | < | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 446 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 447 | < | Break; | 
 
 
 
 
 
 
 
 
 | 427 | > | Result := RawLists.GetRawInfo(FConnectionID, FileID, DatOffset); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 428 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 429 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 430 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 431 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 432 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 433 | < | procedure TOniDataDat.LoadRawOffset(loc_sep: Boolean; raw_addr, size: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 454 | < | target: Pointer); | 
 
 
 
 
 
 
 
 
 | 433 | > | procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 434 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 435 | < | if not loc_sep then | 
 
 
 
 
 
 
 
 
 | 435 | > | if not LocSep then | 
 
 
 
 
 
 
 
 
 
 
 | 436 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 437 | < | if FUnloadWhenUnused or not FRawOpened then | 
 
 
 
 
 
 
 
 
 | 437 | > | if not FRawOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 438 |  | Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 439 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 440 | < | if raw_addr <= Fraw_file.Size then | 
 
 
 
 
 
 
 
 
 | 440 | > | if RawAddr <= Fraw_file.Size then | 
 
 
 
 
 
 
 
 
 
 
 | 441 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 442 | < | Fraw_file.Seek(raw_addr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 | 442 | > | Fraw_file.Seek(RawAddr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 443 |  | Fraw_file.Read(target^, size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 444 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 445 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 446 | < | Fraw_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 446 | > | begin | 
 
 
 
 
 | 447 | > | FRawOpened := False; | 
 
 
 
 
 | 448 | > | Fraw_file.Free; | 
 
 
 
 
 | 449 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 450 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 451 |  | FRawOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 452 |  | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 453 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 454 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 455 | < | if FUnloadWhenUnused or not FSepOpened then | 
 
 
 
 
 
 
 
 
 | 455 | > | if not FSepOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 456 |  | Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 457 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 458 | < | if raw_addr <= Fsep_file.Size then | 
 
 
 
 
 
 
 
 
 | 458 | > | if RawAddr <= Fsep_file.Size then | 
 
 
 
 
 
 
 
 
 
 
 | 459 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 460 | < | Fsep_file.Seek(raw_addr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 | 460 | > | Fsep_file.Seek(RawAddr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 461 |  | Fsep_file.Read(target^, size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 462 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 463 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 464 | < | Fsep_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 464 | > | begin | 
 
 
 
 
 | 465 | > | FSepOpened := False; | 
 
 
 
 
 | 466 | > | Fsep_file.Free; | 
 
 
 
 
 | 467 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 468 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 469 |  | FSepOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 470 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 471 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 472 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 473 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 489 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 490 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 491 | < | procedure TOniDataDat.LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); | 
 
 
 
 
 
 
 
 
 | 473 | > | procedure TAccess_OniArchive.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 474 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 475 | < | raw_info: TRawInfo; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 475 | > | raw_info: TRawDataInfo; | 
 
 
 
 
 | 476 | > | streampos: Integer; | 
 
 
 
 
 
 
 
 
 
 
 | 477 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 478 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 478 | > | if not Assigned(Target) then | 
 
 
 
 
 | 479 | > | Target := TMemoryStream.Create; | 
 
 
 
 
 | 480 | > | if fileid < GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 481 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 482 | < | raw_info := Self.GetRawInfo(fileid, dat_offset); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 483 | < | if not raw_info.loc_sep then | 
 
 
 
 
 
 
 
 
 | 482 | > | raw_info := Self.GetRawInfo(FileID, DatOffset); | 
 
 
 
 
 | 483 | > | if not raw_info.LocSep then | 
 
 
 
 
 
 
 
 
 
 
 | 484 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 485 | < | if FUnloadWhenUnused or not FRawOpened then | 
 
 
 
 
 
 
 
 
 | 485 | > | if not FRawOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 486 |  | Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 487 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 488 | < | Fraw_file.Seek(raw_info.raw_addr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 489 | < | Fraw_file.Read(target^, raw_info.raw_size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 488 | > | Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); | 
 
 
 
 
 | 489 | > | streampos := Target.Position; | 
 
 
 
 
 | 490 | > | Target.CopyFrom(Fraw_file, raw_info.RawSize); | 
 
 
 
 
 | 491 | > | Target.Seek(streampos, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 492 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 493 | < | Fraw_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 493 | > | begin | 
 
 
 
 
 | 494 | > | FRawOpened := False; | 
 
 
 
 
 | 495 | > | Fraw_file.Free; | 
 
 
 
 
 | 496 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 497 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 498 |  | FRawOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 499 |  | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 502 |  | if FUnloadWhenUnused or not FSepOpened then | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 503 |  | Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 504 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 505 | < | Fsep_file.Seek(raw_info.raw_addr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 506 | < | Fsep_file.Read(target^, raw_info.raw_size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 505 | > | Fsep_file.Seek(raw_info.RawAddr, soFromBeginning); | 
 
 
 
 
 | 506 | > | streampos := Target.Position; | 
 
 
 
 
 | 507 | > | Target.CopyFrom(Fsep_file, raw_info.RawSize); | 
 
 
 
 
 | 508 | > | Target.Seek(streampos, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 | 509 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 510 | < | Fsep_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 510 | > | begin | 
 
 
 
 
 | 511 | > | FSepOpened := False; | 
 
 
 
 
 | 512 | > | Fsep_file.Free; | 
 
 
 
 
 | 513 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 514 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 515 |  | FSepOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 516 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 517 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 518 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 519 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 520 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 526 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 527 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 528 | < | procedure TOniDataDat.UpdateRawFile(fileid, dat_offset: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 529 | < | size: LongWord; target: Pointer); | 
 
 
 
 
 
 
 
 
 | 520 | > | procedure TAccess_OniArchive.UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 521 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 522 | < | raw_info: TRawInfo; | 
 
 
 
 
 
 
 
 
 | 522 | > | raw_info: TRawDataInfo; | 
 
 
 
 
 
 
 
 
 
 
 | 523 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 524 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 | 524 | > | if fileid < GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 525 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 526 | < | raw_info := Self.GetRawInfo(fileid, dat_offset); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 527 | < | if not raw_info.loc_sep then | 
 
 
 
 
 
 
 
 
 | 526 | > | raw_info := GetRawInfo(FileID, DatOffset); | 
 
 
 
 
 | 527 | > | if not raw_info.LocSep then | 
 
 
 
 
 
 
 
 
 
 
 | 528 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 529 | < | if FUnloadWhenUnused or not FRawOpened then | 
 
 
 
 
 
 
 
 
 | 529 | > | if not FRawOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 530 |  | Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 531 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 532 | < | Fraw_file.Seek(raw_info.raw_addr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 533 | < | Fraw_file.Write(target^, raw_info.raw_size); | 
 
 
 
 
 
 
 
 
 | 532 | > | Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); | 
 
 
 
 
 | 533 | > | Fraw_file.CopyFrom(Src, raw_info.RawSize); | 
 
 
 
 
 
 
 
 
 
 
 | 534 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 535 | < | Fraw_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 535 | > | begin | 
 
 
 
 
 | 536 | > | FRawOpened := False; | 
 
 
 
 
 | 537 | > | Fraw_file.Free; | 
 
 
 
 
 | 538 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 539 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 540 |  | FRawOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 541 |  | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 542 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 543 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 544 | < | if FUnloadWhenUnused or not FSepOpened then | 
 
 
 
 
 
 
 
 
 | 544 | > | if not FSepOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 545 |  | Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 546 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 547 | < | Fsep_file.Seek(raw_info.raw_addr, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 548 | < | Fsep_file.Write(target^, raw_info.raw_size); | 
 
 
 
 
 
 
 
 
 | 547 | > | Fsep_file.Seek(raw_info.RawAddr, soFromBeginning); | 
 
 
 
 
 | 548 | > | Fsep_file.CopyFrom(Src, raw_info.RawSize); | 
 
 
 
 
 
 
 
 
 
 
 | 549 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 550 | < | Fsep_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 550 | > | begin | 
 
 
 
 
 | 551 | > | FSepOpened := False; | 
 
 
 
 
 | 552 | > | Fsep_file.Free; | 
 
 
 
 
 | 553 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 554 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 555 |  | FSepOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 556 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 557 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 558 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 559 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 560 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 564 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 565 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 566 | < | procedure TOniDataDat.LoadRawFilePart(fileid, dat_offset: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 567 | < | offset, size: LongWord; target: Pointer); | 
 
 
 
 
 
 
 
 
 | 560 | > | procedure TAccess_OniArchive.LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 561 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 562 | < | raw_info: TRawInfo; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 563 | < | Data:     Tdata; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 571 | < | mem:      TMemoryStream; | 
 
 
 
 
 
 
 
 
 | 562 | > | Data: TStream; | 
 
 
 
 
 | 563 | > | streampos: Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 564 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 565 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 565 | > | if not Assigned(Target) then | 
 
 
 
 
 | 566 | > | Target := TMemoryStream.Create; | 
 
 
 
 
 | 567 | > | if fileid < Self.GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 568 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 569 | < | raw_info := Self.GetRawInfo(fileid, dat_offset); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 570 | < | SetLength(Data, raw_info.raw_size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 571 | < | Self.LoadRawFile(fileid, dat_offset, @Data[0]); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 572 | < | mem := TMemoryStream.Create; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 573 | < | mem.Write(Data[offset], size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 574 | < | mem.Read(target^, size); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 581 | < | mem.Free; | 
 
 
 
 
 
 
 
 
 | 569 | > | data := nil; | 
 
 
 
 
 | 570 | > | LoadRawFile(FileID, DatOffset, Data); | 
 
 
 
 
 | 571 | > | Data.Seek(Offset, soFromBeginning); | 
 
 
 
 
 | 572 | > | streampos := Target.Position; | 
 
 
 
 
 | 573 | > | Target.CopyFrom(Data, Size); | 
 
 
 
 
 | 574 | > | Target.Seek(streampos, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 575 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 576 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 577 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 578 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 586 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 587 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 588 | < | procedure TOniDataDat.UpdateRawFilePart(fileid, dat_offset: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 589 | < | offset, size: LongWord; target: Pointer); | 
 
 
 
 
 
 
 
 
 | 578 | > | procedure TAccess_OniArchive.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 579 |  | var | 
 
 
 
 
 
 
 
 
 
 
 | 580 | < | raw_info: TRawInfo; | 
 
 
 
 
 
 
 
 
 | 580 | > | raw_info: TRawDataInfo; | 
 
 
 
 
 
 
 
 
 
 
 | 581 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 582 | < | if fileid < Self.GetFilesCount then | 
 
 
 
 
 
 
 
 
 | 582 | > | if fileid < GetFileCount then | 
 
 
 
 
 
 
 
 
 
 
 | 583 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 584 | < | raw_info := Self.GetRawInfo(fileid, dat_offset); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 585 | < | if not raw_info.loc_sep then | 
 
 
 
 
 
 
 
 
 | 584 | > | raw_info := GetRawInfo(FileID, DatOffset); | 
 
 
 
 
 | 585 | > | if not raw_info.LocSep then | 
 
 
 
 
 
 
 
 
 
 
 | 586 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 587 | < | if FUnloadWhenUnused or not FRawOpened then | 
 
 
 
 
 
 
 
 
 | 587 | > | if not FRawOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 588 |  | Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 589 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 590 | < | Fraw_file.Seek(raw_info.raw_addr + offset, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 591 | < | Fraw_file.Write(target^, raw_info.raw_size); | 
 
 
 
 
 
 
 
 
 | 590 | > | Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); | 
 
 
 
 
 | 591 | > | Fraw_file.CopyFrom(Src, Size); | 
 
 
 
 
 
 
 
 
 
 
 | 592 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 593 | < | Fraw_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 593 | > | begin | 
 
 
 
 
 | 594 | > | FRawOpened := False; | 
 
 
 
 
 | 595 | > | Fraw_file.Free; | 
 
 
 
 
 | 596 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 597 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 598 |  | FRawOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 599 |  | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 600 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 601 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 602 | < | if FUnloadWhenUnused or not FSepOpened then | 
 
 
 
 
 
 
 
 
 | 602 | > | if not FSepOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 603 |  | Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 604 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 | 605 | < | Fsep_file.Seek(raw_info.raw_addr + offset, soFromBeginning); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 606 | < | Fsep_file.Write(target^, raw_info.raw_size); | 
 
 
 
 
 
 
 
 
 | 605 | > | Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); | 
 
 
 
 
 | 606 | > | Fsep_file.CopyFrom(Src, Size); | 
 
 
 
 
 
 
 
 
 
 
 | 607 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 608 | < | Fsep_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 608 | > | begin | 
 
 
 
 
 | 609 | > | FSepOpened := False; | 
 
 
 
 
 | 610 | > | Fsep_file.Free; | 
 
 
 
 
 | 611 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 612 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 613 |  | FSepOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 614 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 615 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 616 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 617 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 618 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 624 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 625 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 626 | < | function TOniDataDat.AppendRawFile(loc_sep: Boolean; size: LongWord; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 627 | < | target: Pointer): LongWord; //Returns new Address | 
 
 
 
 
 
 
 
 
 | 618 | > | function TAccess_OniArchive.AppendRawFile(LocSep: Boolean; Size: Integer; Src: TStream): Integer; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 619 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 620 | < | if not loc_sep then | 
 
 
 
 
 
 
 
 
 | 620 | > | if not LocSep then | 
 
 
 
 
 
 
 
 
 
 
 | 621 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 622 | < | if FUnloadWhenUnused or not FRawOpened then | 
 
 
 
 
 
 
 
 
 | 622 | > | if not FRawOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 623 |  | Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 624 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 625 |  | Result := Fraw_file.Size; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 626 |  | Fraw_file.Seek(0, soFromEnd); | 
 
 
 
 
 
 
 
 
 
 
 | 627 | < | Fraw_file.Write(target^, size); | 
 
 
 
 
 
 
 
 
 | 627 | > | Fraw_file.CopyFrom(Src, Size); | 
 
 
 
 
 
 
 
 
 
 
 | 628 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 629 | < | Fraw_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 629 | > | begin | 
 
 
 
 
 | 630 | > | FRawOpened := False; | 
 
 
 
 
 | 631 | > | Fraw_file.Free; | 
 
 
 
 
 | 632 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 633 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 634 |  | FRawOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 635 |  | end | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 636 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 637 |  | begin | 
 
 
 
 
 
 
 
 
 
 
 | 638 | < | if FUnloadWhenUnused or not FSepOpened then | 
 
 
 
 
 
 
 
 
 | 638 | > | if not FSepOpened then | 
 
 
 
 
 
 
 
 
 
 
 | 639 |  | Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 640 |  | fmOpenReadWrite); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 641 |  | Result := Fsep_file.Size; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 642 |  | Fsep_file.Seek(0, soFromEnd); | 
 
 
 
 
 
 
 
 
 
 
 | 643 | < | Fsep_file.Write(target^, size); | 
 
 
 
 
 
 
 
 
 | 643 | > | Fsep_file.CopyFrom(Src, Size); | 
 
 
 
 
 
 
 
 
 
 
 | 644 |  | if UnloadWhenUnused then | 
 
 
 
 
 
 
 
 
 
 
 | 645 | < | Fsep_file.Free | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 645 | > | begin | 
 
 
 
 
 | 646 | > | FSepOpened := False; | 
 
 
 
 
 | 647 | > | Fsep_file.Free; | 
 
 
 
 
 | 648 | > | end | 
 
 
 
 
 
 
 
 
 
 
 | 649 |  | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 650 |  | FSepOpened := True; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 651 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 652 |  | end; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 653 |  |  | 
 
 
 
 
 
 
 
 
 | 657 | – |  | 
 
 
 
 
 
 
 
 
 | 658 | – | } | 
 
 
 
 
 
 
 
 
 | 659 | – |  | 
 
 
 
 
 
 
 
 
 | 660 | – |  | 
 
 
 
 
 
 
 
 
 | 661 | – |  | 
 
 
 
 
 
 
 
 
 | 662 | – |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 654 |  | end. |