Changeset 101 for oup/rewrite/DataAccess
- Timestamp:
- Feb 20, 2007, 9:43:29 PM (18 years ago)
- Location:
- oup/rewrite/DataAccess
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
oup/rewrite/DataAccess/Access_OUP_ADB.pas
r93 r101 2 2 interface 3 3 4 uses DataAccess ;4 uses DataAccess, ABSMain, TypeDefs, Classes; 5 5 6 6 type 7 7 TAccess_OUP_ADB = class(TDataAccess) 8 8 private 9 { FDatabase:TABSDatabase;10 FQuery: TABSQuery;11 Fdat_files: TFiles;9 FDatabase: TABSDatabase; 10 FQuery: TABSQuery; 11 Fdat_files: TFiles; 12 12 Fdat_extensionsmap: TExtensionsMap; 13 13 protected 14 14 public 15 constructor Create( OLDBFilename: String; var Result: Boolean); override;15 constructor Create(DBFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override; 16 16 procedure Close; override; 17 17 18 18 procedure UpdateListCache; 19 // function GetDatLinks(srcid:LongWord):TDatLinks; 20 function GetFileInfo(fileid: Integer): TFileInfo; override; 21 function GetFilesList(ext: String; pattern: String; 22 NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override; 23 function GetFilesCount: LongWord; override; 24 function GetExtensionsList: TStringArray; override; 25 function GetExtendedExtensionsList: TExtensionsMap; override; 26 function GetNamedFilesMap: TNamedFilesMap; 27 28 function LoadDatFile(fileid: LongWord): Tdata; override; 29 procedure UpdateDatFile(fileid: LongWord; Data: Tdata); override; 30 procedure LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); override; 31 procedure UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); override; 32 33 function GetRawList(fileid: LongWord): TRawList; override; 34 procedure LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); override; 35 procedure UpdateRawFile(fileid, dat_offset: LongWord; size: LongWord; 36 target: Pointer); override; 37 procedure LoadRawFilePart(fileid, dat_offset: LongWord; 38 offset, size: LongWord; target: Pointer); override; 39 procedure UpdateRawFilePart(fileid, dat_offset: LongWord; 40 offset, size: LongWord; target: Pointer); override; 19 20 function GetFileInfo(FileID: Integer): TFileInfo; override; 21 function GetFilesList(Ext: String; Pattern: String; 22 NoEmptyFiles: Boolean; SortType: TSortType): TStrings; override; 23 function GetFileCount: Integer; override; 24 function GetExtensionsList(ExtListFormat: TExtensionFormat): TStrings; override; 25 26 procedure LoadDatFile(FileID: Integer; var Target: TStream); overload; override; 27 procedure UpdateDatFile(FileID: Integer; Src: TStream); overload; override; 28 procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); overload; override; 29 procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; override; 30 31 function GetRawList(FileID: Integer): TRawDataList; override; 32 function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override; 33 34 procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override; 35 procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override; 36 procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); overload; override; 37 procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); overload; override; 41 38 published 42 }end;39 end; 43 40 44 41 45 42 implementation 43 44 uses 45 SysUtils, Data, Functions, ABSDecUtil, DB; 46 46 47 47 … … 51 51 *) 52 52 53 { 54 constructor TOniDataADB.Create(OLDBFilename: String; var Result: Boolean); 55 var 56 i, j: Byte; 57 temps: String; 58 begin 59 if not FileExists(OLDBFilename) then 60 begin 61 ShowMessage('File doesn''t exist!!!'); 62 Result := False; 53 54 constructor TAccess_OUP_ADB.Create(DBFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); 55 var 56 i: Integer; 57 begin 58 Msg := SM_UnknownError; 59 if not FileExists(DBFilename) then 60 begin 61 Msg := SM_FileNotFound; 63 62 Exit; 64 63 end; 65 FFileName := OLDBFilename; 64 FFileName := DBFilename; 65 66 66 FDatabase := TABSDatabase.Create(nil); 67 FDatabase.DatabaseName := 'OLDBcon' ;68 FDatabase.DatabaseFileName := OLDBFilename;67 FDatabase.DatabaseName := 'OLDBcon' + IntToStr(ConnectionID); 68 FDatabase.DatabaseFileName := DBFilename; 69 69 FDatabase.Open; 70 70 FQuery := TABSQuery.Create(FDatabase); 71 FQuery.DatabaseName := 'OLDBcon' ;71 FQuery.DatabaseName := 'OLDBcon' + IntToStr(ConnectionID); 72 72 FQuery.SQL.Text := 'SELECT [name],[value] FROM globals ORDER BY [name] ASC'; 73 73 FQuery.Open; … … 78 78 if FQuery.FieldByName('value').AsString <> DBversion then 79 79 begin 80 ShowMessage('Database-file ' + #13 + #10 + 81 '"' + OLDBFilename + '"' + #13 + #10 + 82 'has wrong version. (Required: ' + DBversion + '; found: ' + 83 FQuery.FieldByName('value').AsString + ')'); 80 Msg := SM_IncompatibleDBVersion; 84 81 FQuery.Close; 85 Result := False;86 82 Exit; 87 83 end; 88 84 end; 89 85 if FQuery.FieldByName('name').AsString = 'lvl' then 90 begin 91 FLevelInfo.LevelNumber := StrToInt(FQuery.FieldByName('value').AsString); 92 end; 93 if FQuery.FieldByName('name').AsString = 'ident' then 94 begin 95 temps := FQuery.FieldByName('value').AsString; 96 for i := 0 to High(FLevelInfo.Ident) do 97 begin 98 j := i * 2 + 1; 99 case temps[j] of 100 '0'..'9': 101 FLevelInfo.Ident[i] := Ord(temps[j]) - 48; 102 'A'..'F': 103 FLevelInfo.Ident[i] := Ord(temps[j]) - 55; 104 end; 105 FLevelInfo.Ident[i] := FLevelInfo.Ident[i] * 16; 106 case temps[j + 1] of 107 '0'..'9': 108 FLevelInfo.Ident[i] := FLevelInfo.Ident[i] + Ord(temps[j + 1]) - 48; 109 'A'..'F': 110 FLevelInfo.Ident[i] := FLevelInfo.Ident[i] + Ord(temps[j + 1]) - 55; 111 end; 112 end; 113 end; 114 if FQuery.FieldByName('name').AsString = 'ident' then 115 begin 116 temps := FQuery.FieldByName('value').AsString; 117 Fos_mac := temps = 'MAC'; 86 FLevelNumber := StrToInt(FQuery.FieldByName('value').AsString); 87 if FQuery.FieldByName('name').AsString = 'DataOS' then 88 begin 89 if FQuery.FieldByName('value').AsString = 'WIN' then 90 FDataOS := DOS_WIN 91 else if FQuery.FieldByName('value').AsString = 'WINDEMO' then 92 FDataOS := DOS_WINDEMO 93 else if FQuery.FieldByName('value').AsString = 'MAC' then 94 FDataOS := DOS_MAC 95 else if FQuery.FieldByName('value').AsString = 'MACBETA' then 96 FDataOS := DOS_MACBETA; 118 97 end; 119 98 FQuery.Next; … … 121 100 FQuery.Close; 122 101 102 Msg := SM_OK; 103 FBackend := DB_ADB; 104 105 FChangeRights := [CR_EditDat, CR_EditRaw, CR_ResizeDat, CR_ResizeRaw]; 106 123 107 UpdateListCache; 124 125 Result := True; 126 FBackend := ODB_ADB; 127 end; 128 129 130 131 132 procedure TOniDataADB.Close; 133 begin 108 end; 109 110 111 112 113 procedure TAccess_OUP_ADB.Close; 114 begin 115 FQuery.Free; 134 116 FDatabase.Close; 135 117 FDatabase.Free; … … 139 121 140 122 141 procedure T OniDataADB.UpdateListCache;142 var 143 i: LongWord;123 procedure TAccess_OUP_ADB.UpdateListCache; 124 var 125 i: Integer; 144 126 temps: String; 145 127 begin 146 128 FQuery.SQL.Text := 'SELECT id,name,extension,[size],contenttype FROM datfiles ORDER BY id ASC;'; 147 129 FQuery.Open; 130 SetLength(Fdat_files, FQuery.RecordCount); 148 131 if FQuery.RecordCount > 0 then 149 132 begin 150 133 FQuery.First; 151 SetLength(Fdat_files, FQuery.RecordCount);152 134 i := 0; 153 135 repeat … … 155 137 Fdat_files[i].Name := FQuery.FieldByName('name').AsString; 156 138 Fdat_files[i].Extension := FQuery.FieldByName('extension').AsString; 157 Fdat_files[i].FileName := FormatNumber(Fdat_files[i].ID, 5, '0') + '-' +158 Fdat_files[i].Name + '.' + Fdat_files[0].Extension;159 Fdat_files[i].FileNameHex := IntToHex(Fdat_files[i].ID, 4) + '-' +160 Fdat_files[i].Name + '.' + Fdat_files[0].Extension;161 139 Fdat_files[i].Size := FQuery.FieldByName('size').AsInteger; 162 140 Fdat_files[i].FileType := HexToLong(FQuery.FieldByName('contenttype').AsString); 163 141 Fdat_files[i].DatAddr := 0; 164 Fdat_files[i].opened := False;165 142 Inc(i); 166 143 FQuery.Next; … … 169 146 FQuery.Close; 170 147 171 SetLength(Fdat_extensionsmap, 0);172 148 FQuery.SQL.Text := 173 149 'SELECT extension,count(extension) AS x FROM datfiles GROUP BY extension ORDER BY extension ASC;'; 174 150 FQuery.Open; 151 SetLength(Fdat_extensionsmap, FQuery.RecordCount); 175 152 if FQuery.RecordCount > 0 then 176 153 begin 177 SetLength(Fdat_extensionsmap, FQuery.RecordCount);178 154 i := 0; 179 155 repeat 180 temps := FQuery.FieldByName('extension').AsString [1];156 temps := FQuery.FieldByName('extension').AsString; 181 157 Fdat_extensionsmap[i].Extension[3] := temps[1]; 182 158 Fdat_extensionsmap[i].Extension[2] := temps[2]; … … 192 168 193 169 194 function TOniDataADB.GetFileInfo(fileid: Integer): TFileInfo; 195 var 196 i: Integer; 170 function TAccess_OUP_ADB.GetFileInfo(fileid: Integer): TFileInfo; 197 171 begin 198 172 if fileid = -1 then … … 201 175 Exit; 202 176 end; 203 if fileid < Self.GetFilesCount then 204 begin 205 for i := 0 to High(Fdat_files) do 206 if Fdat_files[i].ID = fileid then 207 Break; 208 if i < Length(Fdat_files) then 209 Result := Fdat_files[i] 210 else 211 Result.ID := -1; 212 end 177 if fileid < Self.GetFileCount then 178 Result := Fdat_files[fileid] 213 179 else 214 begin215 180 Result.ID := -1; 216 end; 217 end; 218 219 220 221 222 function TOniDataADB.GetFilesList(ext: String; pattern: String; 223 NoEmptyFiles: Boolean; sort: TSortType): TStringArray; 224 var 225 i: LongWord; 226 list: TStringList; 181 end; 182 183 184 185 186 function TAccess_OUP_ADB.GetFilesList(ext: String; pattern: String; 187 NoEmptyFiles: Boolean; SortType: TSortType): TStrings; 188 var 189 i: Integer; 190 list: TStringList; 227 191 id, name, extension: String; 228 192 fields: TStrings; … … 230 194 procedure getfields; 231 195 begin 232 233 if sort in [stIDAsc, stIDDesc] then196 fields.CommaText := StringReplace(AnsiQuotedStr(list.Strings[i], '"'), ';', '","', [rfReplaceAll]); 197 if SortType in [ST_IDAsc, ST_IDDesc] then 234 198 begin 235 199 id := fields.Strings[0]; … … 237 201 extension := fields.Strings[2]; 238 202 end; 239 if sort in [stNameAsc, stNameDesc] then203 if SortType in [ST_NameAsc, ST_NameDesc] then 240 204 begin 241 205 id := fields.Strings[1]; … … 243 207 extension := fields.Strings[2]; 244 208 end; 245 if sort in [stExtAsc, stExtDesc] then209 if SortType in [ST_ExtAsc, ST_ExtDesc] then 246 210 begin 247 211 id := fields.Strings[1]; … … 254 218 list := TStringList.Create; 255 219 list.Sorted := True; 256 for i := 0 to High(Fdat_files)do220 for i := 0 to GetFileCount - 1 do 257 221 begin 258 222 if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and … … 269 233 extension := Fdat_files[i].Extension; 270 234 271 case sortof272 stIDAsc, stIDDesc: list.Add(id + ';' + name + ';' + extension);273 stNameAsc, stNameDesc: list.Add(name + ';' + id + ';' + extension);274 stExtAsc, stExtDesc: list.Add(extension + ';' + id + ';' + name);235 case SortType of 236 ST_IDAsc, ST_IDDesc: list.Add(id + ';' + name + ';' + extension); 237 ST_NameAsc, ST_NameDesc: list.Add(name + ';' + id + ';' + extension); 238 ST_ExtAsc, ST_ExtDesc: list.Add(extension + ';' + id + ';' + name); 275 239 end; 276 240 end; 277 241 end; 278 242 end; 279 SetLength(Result, list.Count); 280 fields := TStringList.Create; 281 if sort in [stIDAsc, stNameAsc, stExtAsc] then 282 for i := 0 to list.Count - 1 do 283 begin 284 getfields; 285 Result[i] := id + '-' + name + '.' + extension; 286 end 287 else 288 for i := list.Count - 1 downto 0 do 289 begin 290 getfields; 291 Result[list.Count - i - 1] := id + '-' + name + '.' + extension; 292 end; 243 Result := TStringList.Create; 244 if list.Count > 0 then 245 begin 246 fields := TStringList.Create; 247 if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc] then 248 for i := 0 to list.Count - 1 do 249 begin 250 getfields; 251 Result.Add(id + '-' + name + '.' + extension); 252 end 253 else 254 for i := list.Count - 1 downto 0 do 255 begin 256 getfields; 257 Result.Add(id + '-' + name + '.' + extension); 258 end; 259 fields.Free; 260 end; 293 261 list.Free; 294 fields.Free; 295 end; 296 297 298 299 300 function TOniDataADB.GetFilesCount: LongWord; 262 end; 263 264 265 266 267 function TAccess_OUP_ADB.GetFileCount: Integer; 301 268 begin 302 269 Result := Length(Fdat_files); … … 304 271 305 272 306 307 308 function TOniDataADB.GetExtensionsList: TStringArray; 309 var 310 i: LongWord; 311 begin 312 SetLength(Result, Length(Fdat_extensionsmap)); 313 for i := 0 to High(Result) do 273 function TAccess_OUP_ADB.GetExtensionsList(ExtListFormat: TExtensionFormat): TStrings; 274 var 275 i: Integer; 276 begin 277 Result := TStringList.Create; 278 for i := 0 to Length(Fdat_extensionsmap) - 1 do 314 279 begin 315 280 with Fdat_extensionsmap[i] do 316 281 begin 317 Result[i] := Extension[3] + Extension[2] + Extension[1] + Extension[0] + 318 ' (' + IntToStr(ExtCount) + ')'; 319 end; 320 end; 321 end; 322 323 324 325 326 function TOniDataADB.GetExtendedExtensionsList: TExtensionsMap; 327 var 328 i, j: LongWord; 329 temps: String; 330 Data: Tdata; 331 begin 332 SetLength(Result, 0); 333 FQuery.SQL.Text := 'SELECT ext,ident FROM extlist ORDER BY ext ASC;'; 334 FQuery.Open; 335 if FQuery.RecordCount > 0 then 336 begin 337 SetLength(Result, FQuery.RecordCount); 338 i := 0; 339 repeat 340 temps := FQuery.FieldByName('ext').AsString; 341 for j := 0 to 3 do 342 Result[i].Extension[j] := temps[4 - j]; 343 Data := DecodeHexString(FQuery.FieldByName('ident').AsString); 344 for j := 0 to 7 do 345 Result[i].Ident[j] := Data[j]; 346 Inc(i); 347 FQuery.Next; 348 until FQuery.EOF; 349 end; 350 FQuery.Close; 351 end; 352 353 354 355 356 function TOniDataADB.GetNamedFilesMap: TNamedFilesMap; 357 var 358 i: LongWord; 359 temp: Integer; 360 temps: String; 361 temparray: array of record 362 id: Integer; 363 fullname: String[50]; 364 end; 365 begin 366 SetLength(temparray, 0); 367 FQuery.SQL.Text := 368 'SELECT id,(extension+name) AS xname FROM datfiles WHERE Length(name)>0 ORDER BY extension,name ASC;'; 369 FQuery.Open; 370 if FQuery.RecordCount > 0 then 371 begin 372 repeat 373 temp := FQuery.FieldByName('id').AsInteger; 374 temps := FQuery.FieldByName('xname').AsString; 375 376 SetLength(temparray, Length(temparray) + 1); 377 if Length(temparray) > 1 then 378 begin 379 for i := High(temparray) - 1 downto 0 do 380 begin 381 if StringSmaller(temps, temparray[i].fullname) then 382 begin 383 temparray[i + 1] := temparray[i]; 384 if i = 0 then 385 begin 386 temparray[i].id := temp; 387 temparray[i].fullname := temps; 388 end; 389 end 390 else 391 begin 392 temparray[i + 1].id := temp; 393 temparray[i + 1].fullname := temps; 394 Break; 395 end; 396 end; 397 end 398 else 399 begin 400 temparray[0].id := temp; 401 temparray[0].fullname := temps; 282 case ExtListFormat of 283 EF_ExtOnly: 284 Result.Add(Extension[3] + Extension[2] + Extension[1] + Extension[0]); 285 EF_ExtCount: 286 Result.Add(Extension[3] + Extension[2] + Extension[1] + Extension[0] + 287 ' (' + IntToStr(ExtCount) + ')'); 402 288 end; 403 FQuery.Next; 404 until FQuery.EOF; 405 end; 406 FQuery.Close; 407 SetLength(Result, Length(temparray)); 408 for i := 0 to High(temparray) do 409 begin 410 Result[i].FileNumber := temparray[i].id; 411 Result[i].blubb := 0; 412 end; 413 end; 414 415 416 417 418 function TOniDataADB.LoadDatFile(fileid: LongWord): Tdata; 289 end; 290 end; 291 end; 292 293 294 procedure TAccess_OUP_ADB.LoadDatFile(FileID: Integer; var Target: TStream); 419 295 var 420 296 mem: TStream; 421 begin 422 if fileid < Self.GetFilesCount then 423 begin 297 streampos: Integer; 298 begin 299 if fileid < GetFileCount then 300 begin 301 if not Assigned(Target) then 302 Target := TMemoryStream.Create; 303 304 streampos := Target.Position; 305 424 306 FQuery.SQL.Text := 'SELECT data FROM datfiles WHERE id=' + IntToStr(fileid) + ';'; 425 307 FQuery.Open; … … 427 309 begin 428 310 mem := FQuery.CreateBlobStream(FQuery.FieldByName('data'), bmRead); 429 SetLength(Result, mem.Size);430 311 mem.Seek(0, soFromBeginning); 431 mem.Read(Result[0], mem.Size);312 Target.CopyFrom(mem, mem.Size); 432 313 mem.Free; 433 314 end; 434 315 FQuery.Close; 435 end; 436 end; 437 438 439 440 441 procedure TOniDataADB.UpdateDatFile(fileid: LongWord; Data: Tdata); 316 317 Target.Seek(streampos, soFromBeginning); 318 end; 319 end; 320 321 procedure TAccess_OUP_ADB.UpdateDatFile(FileID: Integer; Src: TStream); 442 322 var 443 323 MimeCoder: TStringFormat_MIME64; 444 324 mem: TMemoryStream; 445 325 begin 446 if fileid < Self.GetFilesCount then326 if fileid < GetFileCount then 447 327 begin 448 328 mimecoder := TStringFormat_MIME64.Create; 449 329 mem := TMemoryStream.Create; 450 mem.Write(Data[0], Length(Data)); 451 mem.Seek(0, soFromBeginning); 330 mem.CopyFrom(Src, Src.Size); 452 331 FQuery.SQL.Text := 'UPDATE datfiles SET data=MimeToBin("' + 453 332 MimeCoder.StrTo(mem.Memory, mem.Size) + '"), size=' + IntToStr(mem.Size) + … … 457 336 mimecoder.Free; 458 337 end; 459 UpdateListCache; 460 end; 461 462 463 464 465 procedure TOniDataADB.LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); 466 var 338 end; 339 340 341 342 procedure TAccess_OUP_ADB.LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); 343 var 344 streampos: Integer; 467 345 mem: TStream; 468 346 begin 469 if fileid < Self.GetFilesCount then 470 begin 347 if fileid < GetFileCount then 348 begin 349 if not Assigned(Target) then 350 Target := TMemoryStream.Create; 351 streampos := Target.Position; 352 471 353 FQuery.SQL.Text := 'SELECT data FROM datfiles WHERE id=' + IntToStr(fileid) + ';'; 472 354 FQuery.Open; … … 475 357 mem := FQuery.CreateBlobStream(FQuery.FieldByName('data'), bmRead); 476 358 mem.Seek(offset, soFromBeginning); 477 mem.Read(target^, size);359 Target.CopyFrom(mem, size); 478 360 mem.Free; 479 361 end; 480 362 FQuery.Close; 481 end;482 end;483 484 485 486 487 procedure T OniDataADB.UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer);363 Target.Seek(streampos, soFromBeginning); 364 end; 365 end; 366 367 368 369 procedure TAccess_OUP_ADB.UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); 488 370 var 489 371 MimeCoder: TStringFormat_MIME64; 490 372 mem: TMemoryStream; 491 Data: Tdata; 492 begin 493 if fileid < Self.GetFilesCount then 494 begin 495 Data := Self.LoadDatFile(fileid); 373 begin 374 if fileid < GetFileCount then 375 begin 376 mem := nil; 377 LoadDatFile(fileid, TStream(mem)); 378 mem.Seek(Offset, soFromBeginning); 379 mem.CopyFrom(Src, Size); 380 mem.Seek(0, soFromBeginning); 496 381 mimecoder := TStringFormat_MIME64.Create; 497 mem := TMemoryStream.Create;498 mem.Write(Data[0], Length(Data));499 mem.Seek(offset, soFromBeginning);500 mem.Write(target^, size);501 mem.Seek(0, soFromBeginning);502 382 FQuery.SQL.Text := 'UPDATE datfiles SET data=MimeToBin("' + 503 383 MimeCoder.StrTo(mem.Memory, mem.Size) + '") WHERE id=' + IntToStr(fileid) + ';'; … … 509 389 510 390 511 512 513 function TOniDataADB.GetRawList(fileid: LongWord): TRawList; 514 var 515 i: LongWord; 391 function TAccess_OUP_ADB.GetRawList(FileID: Integer): TRawDataList; 392 var 393 i: Integer; 516 394 begin 517 395 SetLength(Result, 0); … … 525 403 i := 0; 526 404 repeat 527 Result[i]. src_id:= fileid;528 Result[i]. src_offset := FQuery.FieldByName('src_link_offset').AsInteger;529 Result[i]. raw_addr := 0;530 Result[i]. raw_size := FQuery.FieldByName('size').AsInteger;531 Result[i]. loc_sep := FQuery.FieldByName('sep').AsBoolean;405 Result[i].SrcID := fileid; 406 Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger; 407 Result[i].RawAddr := 0; 408 Result[i].RawSize := FQuery.FieldByName('size').AsInteger; 409 Result[i].LocSep := FQuery.FieldByName('sep').AsBoolean; 532 410 Inc(i); 533 411 FQuery.Next; … … 538 416 539 417 540 541 542 procedure TOniDataADB.LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); 418 function TAccess_OUP_ADB.GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; 419 var 420 i: Integer; 421 rawlist: TRawDataList; 422 begin 423 rawlist := GetRawList(FileID); 424 if Length(rawlist) > 0 then 425 begin 426 for i := 0 to High(rawlist) do 427 if rawlist[i].SrcOffset = DatOffset then 428 Break; 429 if i < Length(rawlist) then 430 Result := rawlist[i] 431 else begin 432 Result.SrcID := -1; 433 Result.SrcOffset := -1; 434 Result.RawAddr := -1; 435 Result.RawSize := -1; 436 end; 437 end; 438 end; 439 440 441 442 procedure TAccess_OUP_ADB.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); 543 443 var 544 444 mem: TStream; 545 begin 546 if fileid < Self.GetFilesCount then 547 begin 445 streampos: Integer; 446 begin 447 if fileid < GetFileCount then 448 begin 449 if not Assigned(Target) then 450 Target := TMemoryStream.Create; 451 streampos := Target.Position; 548 452 FQuery.SQL.Text := 'SELECT data FROM rawmap WHERE (src_id=' + 549 IntToStr( fileid) + ') AND (src_link_offset=' + IntToStr(dat_offset) + ');';453 IntToStr(FileID) + ') AND (src_link_offset=' + IntToStr(DatOffset) + ');'; 550 454 FQuery.Open; 551 455 if FQuery.RecordCount > 0 then … … 553 457 mem := FQuery.CreateBlobStream(FQuery.FieldByName('data'), bmRead); 554 458 mem.Seek(0, soFromBeginning); 555 mem.Read(target^, mem.size);459 Target.CopyFrom(mem, mem.Size); 556 460 mem.Free; 557 461 end; 558 462 FQuery.Close; 559 end; 560 end; 561 562 563 564 565 procedure TOniDataADB.UpdateRawFile(fileid, dat_offset: LongWord; 566 size: LongWord; target: Pointer); 463 Target.Seek(streampos, soFromBeginning); 464 end; 465 end; 466 467 468 procedure TAccess_OUP_ADB.UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); 567 469 var 568 470 MimeCoder: TStringFormat_MIME64; 569 471 mem: TMemoryStream; 570 472 begin 571 if fileid < Self.GetFilesCount then473 if fileid < GetFileCount then 572 474 begin 573 475 mimecoder := TStringFormat_MIME64.Create; 574 476 mem := TMemoryStream.Create; 575 mem. Write(target^, size);477 mem.CopyFrom(Src, Src.Size); 576 478 mem.Seek(0, soFromBeginning); 577 479 FQuery.SQL.Text := 'UPDATE rawmap SET data=MimeToBin("' + MimeCoder.StrTo( 578 mem.Memory, mem.Size) + '") WHERE (src_id=' + IntToStr( fileid) +579 ') AND (src_link_offset=' + IntToStr( dat_offset) + ');';480 mem.Memory, mem.Size) + '") WHERE (src_id=' + IntToStr(FileID) + 481 ') AND (src_link_offset=' + IntToStr(DatOffset) + ');'; 580 482 FQuery.ExecSQL; 581 483 mem.Free; … … 587 489 588 490 589 procedure TOniDataADB.LoadRawFilePart(fileid, dat_offset: LongWord; 590 offset, size: LongWord; target: Pointer); 591 var 592 Data: Tdata; 491 procedure TAccess_OUP_ADB.LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); 492 var 593 493 mem: TMemoryStream; 594 begin 595 if fileid < Self.GetFilesCount then 596 begin 597 SetLength(Data, Self.GetRawInfo(fileid, dat_offset).raw_size); 598 Self.LoadRawFile(fileid, dat_offset, @Data[0]); 599 mem := TMemoryStream.Create; 600 mem.Write(Data[offset], size); 601 mem.Read(target^, size); 494 streampos: Integer; 495 begin 496 if fileid < GetFileCount then 497 begin 498 if not Assigned(Target) then 499 Target := TMemoryStream.Create; 500 streampos := Target.Position; 501 mem := nil; 502 LoadRawFile(FileID, DatOffset, TStream(mem)); 503 mem.Seek(Offset, soFromBeginning); 504 Target.CopyFrom(mem, Size); 602 505 mem.Free; 603 end;604 end;605 606 607 608 609 procedure TOniDataADB.UpdateRawFilePart(fileid, dat_offset: LongWord; 610 offset, size: LongWord; target: Pointer);506 Target.Seek(streampos, soFromBeginning); 507 end; 508 end; 509 510 511 512 513 procedure TAccess_OUP_ADB.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); 611 514 var 612 515 MimeCoder: TStringFormat_MIME64; 613 516 mem: TMemoryStream; 614 Data: Tdata; 615 begin 616 if fileid < Self.GetFilesCount then 617 begin 618 SetLength(Data, Self.GetRawInfo(fileid, offset).raw_size); 619 Self.LoadRawFile(fileid, offset, @Data[0]); 517 begin 518 if fileid < GetFileCount then 519 begin 520 mem := nil; 521 LoadRawFile(fileid, offset, TStream(mem)); 522 mem.Seek(offset, soFromBeginning); 523 mem.CopyFrom(Src, Size); 524 mem.Seek(0, soFromBeginning); 620 525 mimecoder := TStringFormat_MIME64.Create; 621 mem := TMemoryStream.Create;622 mem.Write(Data[0], Length(Data));623 mem.Seek(offset, soFromBeginning);624 mem.Write(target^, size);625 mem.Seek(0, soFromBeginning);626 526 FQuery.SQL.Text := 'UPDATE rawmap SET data=MimeToBin("' + MimeCoder.StrTo( 627 527 mem.Memory, mem.Size) + '") WHERE (src_id=' + IntToStr(fileid) + 628 ') AND (src_link_offset=' + IntToStr( dat_offset) + ');';528 ') AND (src_link_offset=' + IntToStr(DatOffset) + ');'; 629 529 FQuery.ExecSQL; 630 530 mem.Free; … … 633 533 end; 634 534 635 } 535 636 536 637 537 -
oup/rewrite/DataAccess/Access_OniArchive.pas
r93 r101 2 2 interface 3 3 4 uses DataAccess, Classes ;4 uses DataAccess, Classes, TypeDefs; 5 5 6 6 type 7 {8 THeader = packed record9 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 record20 Extension: array[0..$3] of Char;21 DataAddr: LongWord;22 NameAddr: LongWord;23 FileSize: LongWord;24 FileType: LongWord;25 end;26 27 TFileInfo = packed record28 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 record41 FileNumber: LongWord;42 blubb: LongWord;43 end;44 TExtensionsMap = array of packed record45 Ident: array[0..$7] of Byte;46 Extension: array[0..$3] of Char;47 ExtCount: LongWord;48 end;49 }50 51 7 TAccess_OniArchive = class(TDataAccess) 52 8 private 53 { Fdat_file: TFileStream; 54 Fraw_file: TFileStream; 55 Fsep_file: TFileStream; 56 Fdat_header: THeader; 57 Fdat_filesmap: TFilesMap; 58 Fdat_files: TFiles; 59 Fdat_namedfilesmap: TNamedFilesMap; 60 Fdat_extensionsmap: TExtensionsMap; 61 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; 65 18 protected 66 19 public 67 20 property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write FUnloadWhenUnused; 68 21 69 constructor Create(DatFilename: String; var Result: Boolean); override;22 constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override; 70 23 procedure Close; override; 71 24 72 function GetFileInfo(fileid: Integer): TFileInfo; override; 73 function GetFilesList(ext: String; pattern: String; 74 NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override; 75 function GetFilesCount: LongWord; override; 76 function GetExtensionsList: TStringArray; override; 77 function GetExtendedExtensionsList: TExtensionsMap; override; 78 79 function LoadDatFile(fileid: LongWord): Tdata; override; 80 procedure UpdateDatFile(fileid: LongWord; Data: Tdata); override; 81 procedure LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); override; 82 procedure UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); override; 83 84 procedure LoadRawOffset(loc_sep: Boolean; raw_addr, size: LongWord; target: Pointer); 85 function GetRawList(fileid: LongWord): TRawList; override; 86 procedure LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); override; 87 procedure UpdateRawFile(fileid, dat_offset: LongWord; size: LongWord; 88 target: Pointer); override; 89 procedure LoadRawFilePart(fileid, dat_offset: LongWord; 90 offset, size: LongWord; target: Pointer); override; 91 procedure UpdateRawFilePart(fileid, dat_offset: LongWord; 92 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; 95 46 published 96 }end;47 end; 97 48 98 49 implementation 50 51 uses 52 SysUtils, StrUtils, Data, Functions, RawList; 99 53 100 54 … … 104 58 *) 105 59 106 { 107 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; 108 85 const 109 86 header_ident1_pc: array[0..$13] of Byte = … … 119 96 ($99, $CF, $40, $00, $90, $4F, $63, $00, $F4, $55, $5F, $00, $90, $4F, $63, $00); 120 97 var 121 i: LongWord; 122 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; 123 103 begin 124 104 FUnloadWhenUnused := True; 125 105 FDatOpened := False; 126 106 FRawOpened := False; 107 Msg := SM_UnknownError; 127 108 if not FileExists(DatFilename) then 128 109 begin 129 ShowMessage('File doesn''t exist!!!'); 130 Result := False; 110 Msg := SM_FileNotFound; 131 111 Exit; 132 112 end; … … 136 116 header_pc := True; 137 117 header_mac := True; 118 header_macbeta := True; 138 119 for i := 0 to High(Fdat_header.Ident) do 139 120 begin 140 FLevelInfo.Ident[i] := Fdat_header.Ident[i];121 // FLevelInfo.Ident[i] := Fdat_header.Ident[i]; 141 122 if Fdat_header.Ident[i] <> header_ident1_pc[i] then 142 123 header_pc := False; 143 124 if Fdat_header.Ident[i] <> header_ident1_mac[i] then 144 125 header_mac := False; 145 end; 146 if not (header_pc xor header_mac) then 147 begin 148 Result := 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 xor header_macbeta) then 130 begin 131 Msg := SM_IncompatibleFile; 149 132 Exit; 150 133 end 151 134 else 152 135 begin 153 if (header_pc and not header_mac) then 154 Fos_mac := False 155 else 156 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; 157 142 end; 158 143 SetLength(Fdat_filesmap, Fdat_header.Files); … … 180 165 Fdat_files[i].Name := ''; 181 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;186 167 end; 187 168 Fdat_file.Seek($40 + Fdat_header.Files * $14, soFromBeginning); … … 196 177 197 178 Fdat_file.Seek(Fdat_files[0].DatAddr + 7, soFromBeginning); 198 Fdat_file.Read(FLevel Info.LevelNumber, 1);199 FLevel Info.LevelNumber := FLevelInfo.LevelNumber div 2;179 Fdat_file.Read(FLevelNumber, 1); 180 FLevelNumber := FLevelNumber div 2; 200 181 201 182 Fdat_file.Free; 202 183 203 Result := True; 204 FBackend := ODB_Dat; 205 end; 206 207 208 209 210 procedure TOniDataDat.Close; 211 begin 212 if not FUnloadWhenUnused and FDatOpened then 184 Msg := SM_OK; 185 FBackend := DB_ONI; 186 FChangeRights := [CR_EditDat, CR_EditRaw, CR_AppendRaw]; 187 end; 188 189 190 191 192 procedure TAccess_OniArchive.Close; 193 begin 194 if FDatOpened then 213 195 Fdat_file.Free; 214 if not FUnloadWhenUnused andFRawOpened then196 if FRawOpened then 215 197 Fraw_file.Free; 216 if not FUnloadWhenUnused andFSepOpened then198 if FSepOpened then 217 199 Fsep_file.Free; 218 200 Self.Free; … … 222 204 223 205 224 function T OniDataDat.GetFileInfo(fileid: Integer): TFileInfo;206 function TAccess_OniArchive.GetFileInfo(fileid: Integer): TFileInfo; 225 207 begin 226 208 if fileid = -1 then … … 229 211 Exit; 230 212 end; 231 if fileid < Self.GetFile sCount then213 if fileid < Self.GetFileCount then 232 214 Result := Fdat_files[fileid] 233 215 else … … 238 220 239 221 240 function T OniDataDat.GetFilesList(ext: String; pattern: String;241 NoEmptyFiles: Boolean; sort: TSortType): TStringArray;242 var 243 i: LongWord;244 list: TStringList;222 function TAccess_OniArchive.GetFilesList(ext: String; pattern: String; 223 NoEmptyFiles: Boolean; SortType: TSortType): TStrings; 224 var 225 i: Integer; 226 list: TStringList; 245 227 id, name, extension: String; 246 228 fields: TStrings; … … 248 230 procedure getfields; 249 231 begin 250 251 if sort in [stIDAsc, stIDDesc] then232 fields.CommaText := StringReplace(AnsiQuotedStr(list.Strings[i], '"'), ';', '","', [rfReplaceAll]); 233 if SortType in [ST_IDAsc, ST_IDDesc] then 252 234 begin 253 235 id := fields.Strings[0]; … … 255 237 extension := fields.Strings[2]; 256 238 end; 257 if sort in [stNameAsc, stNameDesc] then239 if SortType in [ST_NameAsc, ST_NameDesc] then 258 240 begin 259 241 id := fields.Strings[1]; … … 261 243 extension := fields.Strings[2]; 262 244 end; 263 if sort in [stExtAsc, stExtDesc] then245 if SortType in [ST_ExtAsc, ST_ExtDesc] then 264 246 begin 265 247 id := fields.Strings[1]; … … 272 254 list := TStringList.Create; 273 255 list.Sorted := True; 274 for i := 0 to Fdat_header.Files- 1 do256 for i := 0 to GetFileCount - 1 do 275 257 begin 276 258 if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and … … 287 269 extension := Fdat_files[i].Extension; 288 270 289 case sortof290 stIDAsc, stIDDesc: list.Add(id + ';' + name + ';' + extension);291 stNameAsc, stNameDesc: list.Add(name + ';' + id + ';' + extension);292 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); 293 275 end; 294 276 end; 295 277 end; 296 278 end; 297 SetLength(Result, list.Count);298 if Length(Result)> 0 then279 Result := TStringList.Create; 280 if list.Count > 0 then 299 281 begin 300 282 fields := TStringList.Create; 301 if sort in [stIDAsc, stNameAsc, stExtAsc] then283 if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc] then 302 284 for i := 0 to list.Count - 1 do 303 285 begin 304 286 getfields; 305 Result [i] := id + '-' + name + '.' + extension;287 Result.Add(id + '-' + name + '.' + extension); 306 288 end 307 289 else … … 309 291 begin 310 292 getfields; 311 Result [list.Count - i - 1] := id + '-' + name + '.' + extension;293 Result.Add(id + '-' + name + '.' + extension); 312 294 end; 313 295 fields.Free; … … 319 301 320 302 321 function T OniDataDat.GetFilesCount: LongWord;322 begin 323 Result := Fdat_header.Files;324 end; 325 326 327 328 329 function T OniDataDat.GetExtensionsList: TStringArray;330 var 331 i: LongWord;332 begin 333 SetLength(Result, Fdat_header.Extensions);334 for i := 0 to Fdat_header.Extensions- 1 do303 function TAccess_OniArchive.GetFileCount: Integer; 304 begin 305 Result := Length(Fdat_files); 306 end; 307 308 309 310 311 function TAccess_OniArchive.GetExtensionsList(ExtListFormat: TExtensionFormat): TStrings; 312 var 313 i: Integer; 314 begin 315 Result := TStringList.Create; 316 for i := 0 to Length(Fdat_extensionsmap) - 1 do 335 317 begin 336 318 with Fdat_extensionsmap[i] do 337 319 begin 338 Result[i] := Extension[3] + Extension[2] + Extension[1] + Extension[0] + 339 ' (' + IntToStr(ExtCount) + ')'; 340 end; 341 end; 342 end; 343 344 345 346 347 function TOniDataDat.GetExtendedExtensionsList: TExtensionsMap; 348 var 349 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; 362 begin 363 if fileid < Self.GetFilesCount then 364 begin 365 if FUnloadWhenUnused or not FDatOpened then 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 procedure TAccess_OniArchive.LoadDatFile(FileID: Integer; var Target: TStream); 334 var 335 streampos: Integer; 336 begin 337 if fileid < GetFileCount then 338 begin 339 if not Assigned(Target) then 340 Target := TMemoryStream.Create; 341 if not FDatOpened then 366 342 Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); 367 343 Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); 368 SetLength(Result, Fdat_files[fileid].Size); 369 Fdat_file.Read(Result[0], Fdat_files[fileid].Size); 370 if UnloadWhenUnused then 371 Fdat_file.Free 344 streampos := Target.Position; 345 Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size); 346 Target.Seek(streampos, soFromBeginning); 347 if UnloadWhenUnused then 348 begin 349 Fdat_file.Free; 350 FDatOpened := False; 351 end 372 352 else 373 353 FDatOpened := True; … … 375 355 end; 376 356 377 378 379 380 procedure TOniDataDat.UpdateDatFile(fileid: LongWord; Data: Tdata); 381 begin 382 if fileid < Self.GetFilesCount then 383 begin 384 if FUnloadWhenUnused or not FDatOpened then 357 procedure TAccess_OniArchive.UpdateDatFile(FileID: Integer; Src: TStream); 358 begin 359 if fileid < GetFileCount then 360 begin 361 if not FDatOpened then 385 362 Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); 386 363 Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); 387 Fdat_file.Write(Data[0], Length(Data)); 388 if UnloadWhenUnused then 389 Fdat_file.Free 364 Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size); 365 if UnloadWhenUnused then 366 begin 367 Fdat_file.Free; 368 FDatOpened := False; 369 end 390 370 else 391 371 FDatOpened := True; … … 393 373 end; 394 374 395 396 397 398 procedure TOniDataDat.LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); 399 begin 400 if fileid < Self.GetFilesCount then 401 begin 402 if FUnloadWhenUnused or not FDatOpened then 375 procedure TAccess_OniArchive.LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); 376 var 377 streampos: Integer; 378 begin 379 if fileid < GetFileCount then 380 begin 381 if not Assigned(Target) then 382 Target := TMemoryStream.Create; 383 if not FDatOpened then 403 384 Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); 404 385 Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); 405 Fdat_file.Read(target^, size); 406 if UnloadWhenUnused then 407 Fdat_file.Free 386 streampos := Target.Position; 387 Target.CopyFrom(Fdat_file, size); 388 Target.Seek(streampos, soFromBeginning); 389 if UnloadWhenUnused then 390 begin 391 FDatOpened := False; 392 Fdat_file.Free; 393 end 408 394 else 409 395 FDatOpened := True; … … 411 397 end; 412 398 413 414 415 416 procedure TOniDataDat.UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); 417 begin 418 if fileid < Self.GetFilesCount then 419 begin 420 if FUnloadWhenUnused or not FDatOpened then 399 procedure TAccess_OniArchive.UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); 400 begin 401 if fileid < GetFileCount then 402 begin 403 if not FDatOpened then 421 404 Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); 422 405 Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); 423 Fdat_file.Write(target^, size); 424 if UnloadWhenUnused then 425 Fdat_file.Free 406 Fdat_file.CopyFrom(Src, Size); 407 if UnloadWhenUnused then 408 begin 409 Fdat_file.Free; 410 FDatOpened := False; 411 end 426 412 else 427 413 FDatOpened := True; … … 431 417 432 418 433 434 function TOniDataDat.GetRawList(fileid: LongWord): TRawList; 435 var 436 i: LongWord; 437 begin 438 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; 448 end; 449 450 451 452 453 procedure TOniDataDat.LoadRawOffset(loc_sep: Boolean; raw_addr, size: LongWord; 454 target: Pointer); 455 begin 456 if not loc_sep then 457 begin 458 if FUnloadWhenUnused or not FRawOpened then 419 function TAccess_OniArchive.GetRawList(FileID: Integer): TRawDataList; 420 begin 421 Result := RawLists.GetRawList(FConnectionID, FileID); 422 end; 423 424 425 function TAccess_OniArchive.GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; 426 begin 427 Result := RawLists.GetRawInfo(FConnectionID, FileID, DatOffset); 428 end; 429 430 431 432 433 procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); 434 begin 435 if not LocSep then 436 begin 437 if not FRawOpened then 459 438 Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), 460 439 fmOpenReadWrite); 461 if raw_addr <= Fraw_file.Size then462 begin 463 Fraw_file.Seek( raw_addr, soFromBeginning);440 if RawAddr <= Fraw_file.Size then 441 begin 442 Fraw_file.Seek(RawAddr, soFromBeginning); 464 443 Fraw_file.Read(target^, size); 465 444 end; 466 445 if UnloadWhenUnused then 467 Fraw_file.Free 446 begin 447 FRawOpened := False; 448 Fraw_file.Free; 449 end 468 450 else 469 451 FRawOpened := True; … … 471 453 else 472 454 begin 473 if FUnloadWhenUnused ornot FSepOpened then455 if not FSepOpened then 474 456 Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), 475 457 fmOpenReadWrite); 476 if raw_addr <= Fsep_file.Size then477 begin 478 Fsep_file.Seek( raw_addr, soFromBeginning);458 if RawAddr <= Fsep_file.Size then 459 begin 460 Fsep_file.Seek(RawAddr, soFromBeginning); 479 461 Fsep_file.Read(target^, size); 480 462 end; 481 463 if UnloadWhenUnused then 482 Fsep_file.Free 464 begin 465 FSepOpened := False; 466 Fsep_file.Free; 467 end 483 468 else 484 469 FSepOpened := True; … … 486 471 end; 487 472 488 489 490 491 procedure TOniDataDat.LoadRawFile(fileid, dat_offset: LongWord; target: Pointer);492 var 493 raw_info: TRawInfo;494 begin 495 if fileid < Self.GetFilesCount then496 begin 497 raw_info := Self.GetRawInfo( fileid, dat_offset);498 if not raw_info. loc_sep then499 begin 500 if FUnloadWhenUnused ornot FRawOpened then473 procedure TAccess_OniArchive.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); 474 var 475 raw_info: TRawDataInfo; 476 streampos: Integer; 477 begin 478 if not Assigned(Target) then 479 Target := TMemoryStream.Create; 480 if fileid < GetFileCount then 481 begin 482 raw_info := Self.GetRawInfo(FileID, DatOffset); 483 if not raw_info.LocSep then 484 begin 485 if not FRawOpened then 501 486 Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), 502 487 fmOpenReadWrite); 503 Fraw_file.Seek(raw_info.raw_addr, soFromBeginning); 504 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); 505 492 if UnloadWhenUnused then 506 Fraw_file.Free 493 begin 494 FRawOpened := False; 495 Fraw_file.Free; 496 end 507 497 else 508 498 FRawOpened := True; … … 513 503 Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), 514 504 fmOpenReadWrite); 515 Fsep_file.Seek(raw_info.raw_addr, soFromBeginning); 516 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); 517 509 if UnloadWhenUnused then 518 Fsep_file.Free 510 begin 511 FSepOpened := False; 512 Fsep_file.Free; 513 end 519 514 else 520 515 FSepOpened := True; … … 523 518 end; 524 519 525 526 527 528 procedure TOniDataDat.UpdateRawFile(fileid, dat_offset: LongWord; 529 size: LongWord; target: Pointer); 530 var 531 raw_info: TRawInfo; 532 begin 533 if fileid < Self.GetFilesCount then 534 begin 535 raw_info := Self.GetRawInfo(fileid, dat_offset); 536 if not raw_info.loc_sep then 537 begin 538 if FUnloadWhenUnused or not FRawOpened then 520 procedure TAccess_OniArchive.UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); 521 var 522 raw_info: TRawDataInfo; 523 begin 524 if fileid < GetFileCount then 525 begin 526 raw_info := GetRawInfo(FileID, DatOffset); 527 if not raw_info.LocSep then 528 begin 529 if not FRawOpened then 539 530 Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), 540 531 fmOpenReadWrite); 541 Fraw_file.Seek(raw_info. raw_addr, soFromBeginning);542 Fraw_file. Write(target^, raw_info.raw_size);532 Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); 533 Fraw_file.CopyFrom(Src, raw_info.RawSize); 543 534 if UnloadWhenUnused then 544 Fraw_file.Free 535 begin 536 FRawOpened := False; 537 Fraw_file.Free; 538 end 545 539 else 546 540 FRawOpened := True; … … 548 542 else 549 543 begin 550 if FUnloadWhenUnused ornot FSepOpened then544 if not FSepOpened then 551 545 Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), 552 546 fmOpenReadWrite); 553 Fsep_file.Seek(raw_info. raw_addr, soFromBeginning);554 Fsep_file. Write(target^, raw_info.raw_size);547 Fsep_file.Seek(raw_info.RawAddr, soFromBeginning); 548 Fsep_file.CopyFrom(Src, raw_info.RawSize); 555 549 if UnloadWhenUnused then 556 Fsep_file.Free 550 begin 551 FSepOpened := False; 552 Fsep_file.Free; 553 end 557 554 else 558 555 FSepOpened := True; … … 561 558 end; 562 559 563 564 565 566 procedure TOniDataDat.LoadRawFilePart(fileid, dat_offset: LongWord; 567 offset, size: LongWord; target: Pointer); 568 var 569 raw_info: TRawInfo; 570 Data: Tdata; 571 mem: TMemoryStream; 572 begin 573 if fileid < Self.GetFilesCount then 574 begin 575 raw_info := Self.GetRawInfo(fileid, dat_offset); 576 SetLength(Data, raw_info.raw_size); 577 Self.LoadRawFile(fileid, dat_offset, @Data[0]); 578 mem := TMemoryStream.Create; 579 mem.Write(Data[offset], size); 580 mem.Read(target^, size); 581 mem.Free; 582 end; 583 end; 584 585 586 587 588 procedure TOniDataDat.UpdateRawFilePart(fileid, dat_offset: LongWord; 589 offset, size: LongWord; target: Pointer); 590 var 591 raw_info: TRawInfo; 592 begin 593 if fileid < Self.GetFilesCount then 594 begin 595 raw_info := Self.GetRawInfo(fileid, dat_offset); 596 if not raw_info.loc_sep then 597 begin 598 if FUnloadWhenUnused or not FRawOpened then 560 procedure TAccess_OniArchive.LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); 561 var 562 Data: TStream; 563 streampos: Integer; 564 begin 565 if not Assigned(Target) then 566 Target := TMemoryStream.Create; 567 if fileid < Self.GetFileCount then 568 begin 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 procedure TAccess_OniArchive.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); 579 var 580 raw_info: TRawDataInfo; 581 begin 582 if fileid < GetFileCount then 583 begin 584 raw_info := GetRawInfo(FileID, DatOffset); 585 if not raw_info.LocSep then 586 begin 587 if not FRawOpened then 599 588 Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), 600 589 fmOpenReadWrite); 601 Fraw_file.Seek(raw_info. raw_addr + offset, soFromBeginning);602 Fraw_file. Write(target^, raw_info.raw_size);590 Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); 591 Fraw_file.CopyFrom(Src, Size); 603 592 if UnloadWhenUnused then 604 Fraw_file.Free 593 begin 594 FRawOpened := False; 595 Fraw_file.Free; 596 end 605 597 else 606 598 FRawOpened := True; … … 608 600 else 609 601 begin 610 if FUnloadWhenUnused ornot FSepOpened then602 if not FSepOpened then 611 603 Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), 612 604 fmOpenReadWrite); 613 Fsep_file.Seek(raw_info. raw_addr + offset, soFromBeginning);614 Fsep_file. Write(target^, raw_info.raw_size);605 Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); 606 Fsep_file.CopyFrom(Src, Size); 615 607 if UnloadWhenUnused then 616 Fsep_file.Free 608 begin 609 FSepOpened := False; 610 Fsep_file.Free; 611 end 617 612 else 618 613 FSepOpened := True; … … 621 616 end; 622 617 623 624 625 626 function TOniDataDat.AppendRawFile(loc_sep: Boolean; size: LongWord; 627 target: Pointer): LongWord; //Returns new Address 628 begin 629 if not loc_sep then 630 begin 631 if FUnloadWhenUnused or not FRawOpened then 618 function TAccess_OniArchive.AppendRawFile(LocSep: Boolean; Size: Integer; Src: TStream): Integer; 619 begin 620 if not LocSep then 621 begin 622 if not FRawOpened then 632 623 Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), 633 624 fmOpenReadWrite); 634 625 Result := Fraw_file.Size; 635 626 Fraw_file.Seek(0, soFromEnd); 636 Fraw_file.Write(target^, size); 637 if UnloadWhenUnused then 638 Fraw_file.Free 627 Fraw_file.CopyFrom(Src, Size); 628 if UnloadWhenUnused then 629 begin 630 FRawOpened := False; 631 Fraw_file.Free; 632 end 639 633 else 640 634 FRawOpened := True; … … 642 636 else 643 637 begin 644 if FUnloadWhenUnused ornot FSepOpened then638 if not FSepOpened then 645 639 Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), 646 640 fmOpenReadWrite); 647 641 Result := Fsep_file.Size; 648 642 Fsep_file.Seek(0, soFromEnd); 649 Fsep_file.Write(target^, size); 650 if UnloadWhenUnused then 651 Fsep_file.Free 643 Fsep_file.CopyFrom(Src, Size); 644 if UnloadWhenUnused then 645 begin 646 FSepOpened := False; 647 Fsep_file.Free; 648 end 652 649 else 653 650 FSepOpened := True; … … 655 652 end; 656 653 657 658 }659 660 661 662 663 654 end. -
oup/rewrite/DataAccess/ConnectionManager.pas
r97 r101 150 150 ext := UpperCase(ExtractFileExt(FileName)); 151 151 152 if ext = ' ODB' then152 if ext = '.OLDB' then 153 153 backend := DB_ADB 154 else if ext = ' DAT' then154 else if ext = '.DAT' then 155 155 backend := DB_ONI 156 156 else … … 173 173 FLastID := FConnections[i].ConnectionID; 174 174 Result := FLastID; 175 Msg := SM_OK; 175 176 end 176 177 else … … 180 181 FConnections[i] := nil; 181 182 SetLength(FConnections, Length(FConnections) - 1); 182 Msg := SM_UnknownError;183 Msg := CreateMsg; 183 184 end; 184 185 end; -
oup/rewrite/DataAccess/DataAccess.pas
r97 r101 3 3 4 4 uses TypeDefs, Classes, StrUtils, SysUtils; 5 //uses Data, Classes, SysUtils, StrUtils,6 // Dialogs, ABSDecUtil, ABSMain, DB, Windows;7 8 5 9 6 type 10 7 TDataAccess = class 11 8 private 9 protected 12 10 FConnectionID: Integer; 13 11 FFileName: String; … … 17 15 FChangeRights: TChangeRights; 18 16 procedure SetDataOS(DataOS: TDataOS); 19 protected20 17 public 21 18 property ConnectionID: Integer read FConnectionID; … … 24 21 property DataOS: TDataOS read FDataOS write SetDataOS; 25 22 property LevelNumber: Integer read FLevelNumber; 23 property ChangeRights: TChangeRights read FChangeRights; 26 24 27 25 constructor Create(FileName: String; ConnectionID: Integer; var Msg: TStatusMessages); virtual; abstract; … … 37 35 38 36 procedure LoadDatFile(FileID: Integer; var Target: TStream); overload; virtual; abstract; 39 procedure LoadDatFile(FileID: Integer; var Target: TByteData); overload; virtual; abstract;37 procedure LoadDatFile(FileID: Integer; var Target: TByteData); overload; 40 38 procedure UpdateDatFile(FileID: Integer; Src: TStream); overload; virtual; abstract; 41 procedure UpdateDatFile(FileID: Integer; Src: TByteData); overload; virtual; abstract;39 procedure UpdateDatFile(FileID: Integer; Src: TByteData); overload; 42 40 procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); overload; virtual; abstract; 43 procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TByteData); overload; virtual; abstract;44 procedure LoadDatFilePart(FileID, Offset, Size: Integer; Target: Pointer); overload; virtual; abstract;41 procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TByteData); overload; 42 procedure LoadDatFilePart(FileID, Offset, Size: Integer; Target: Pointer); overload; 45 43 procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; virtual; abstract; 46 procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TByteData); overload; virtual; abstract;47 procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: Pointer); overload; virtual; abstract;44 procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TByteData); overload; 45 procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: Pointer); overload; 48 46 49 47 function GetRawList(FileID: Integer): TRawDataList; virtual; abstract; 50 function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; 48 function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; virtual; abstract; 51 49 52 50 procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; virtual; abstract; 53 procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TByteData); overload; virtual; abstract;54 procedure UpdateRawFile(FileID, DatOffset , Size: Integer; Src: TStream); overload; virtual; abstract;55 procedure UpdateRawFile(FileID, DatOffset , Size: Integer; Src: TByteData); overload; virtual; abstract;51 procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TByteData); overload; 52 procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; virtual; abstract; 53 procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TByteData); overload; 56 54 procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); overload; virtual; abstract; 57 procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TByteData); overload; virtual; abstract;58 procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; Target: Pointer); overload; virtual; abstract;55 procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TByteData); overload; 56 procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; Target: Pointer); overload; 59 57 procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); overload; virtual; abstract; 60 procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TByteData); overload; virtual; abstract;61 procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: Pointer); overload; virtual; abstract;62 63 function AppendRawFile(LocSep: Boolean; Size: Integer; Src: TStream): Integer; overload; virtual; abstract;64 function AppendRawFile(LocSep: Boolean; Size: Integer; Src: TByteData): Integer; overload; virtual; abstract;65 function AppendRawFile(LocSep: Boolean; Size: Integer; Src: Pointer): Integer; overload; virtual; abstract;58 procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TByteData); overload; 59 procedure UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: Pointer); overload; 60 61 function AppendRawFile(LocSep: Boolean; Size: Integer; Src: TStream): Integer; overload; virtual; 62 function AppendRawFile(LocSep: Boolean; Size: Integer; Src: TByteData): Integer; overload; 63 function AppendRawFile(LocSep: Boolean; Size: Integer; Src: Pointer): Integer; overload; 66 64 published 67 65 end; … … 120 118 121 119 122 function TDataAccess.GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; 123 var 124 i: LongWord; 125 RawList: TRawDataList; 126 begin 127 RawList := GetRawList(FileID); 128 Result.SrcID := -1; 129 Result.SrcOffset := -1; 130 Result.RawAddr := -1; 131 Result.RawSize := -1; 132 if Length(RawList) > 0 then 133 begin 134 for i := 0 to High(RawList) do 135 begin 136 if RawList[i].SrcOffset = DatOffset then 137 begin 138 Result.SrcID := FileID; 139 Result.SrcOffset := RawList[i].SrcOffset; 140 Result.RawAddr := RawList[i].RawAddr; 141 Result.RawSize := RawList[i].RawSize; 142 Result.LocSep := RawList[i].LocSep; 143 Break; 144 end; 145 end; 146 end; 147 end; 120 procedure TDataAccess.LoadDatFile(FileID: Integer; var Target: TByteData); 121 var 122 data: TStream; 123 begin 124 if fileid < GetFileCount then 125 begin 126 data := nil; 127 LoadDatFile(FileID, data); 128 SetLength(Target, data.Size); 129 data.Read(Target[0], data.Size); 130 data.Free; 131 end; 132 end; 133 134 procedure TDataAccess.UpdateDatFile(FileID: Integer; Src: TByteData); 135 var 136 data: TStream; 137 begin 138 if fileid < GetFileCount then 139 begin 140 data := TMemoryStream.Create; 141 data.Write(Src[0], Length(Src)); 142 data.Seek(0, soFromBeginning); 143 UpdateDatFile(FileID, data); 144 data.Free; 145 end; 146 end; 147 148 procedure TDataAccess.LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TByteData); 149 var 150 data: TStream; 151 begin 152 if fileid < GetFileCount then 153 begin 154 data := nil; 155 LoadDatFilePart(FileID, offset, size, data); 156 SetLength(Target, data.Size); 157 data.Read(Target[0], data.Size); 158 data.Free; 159 end; 160 end; 161 162 procedure TDataAccess.LoadDatFilePart(FileID, Offset, Size: Integer; Target: Pointer); 163 var 164 data: TStream; 165 begin 166 if fileid < GetFileCount then 167 begin 168 data := nil; 169 LoadDatFilePart(FileID, offset, size, data); 170 data.Read(Target^, data.Size); 171 data.Free; 172 end; 173 end; 174 175 procedure TDataAccess.UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TByteData); 176 var 177 data: TStream; 178 begin 179 if fileid < GetFileCount then 180 begin 181 data := TMemoryStream.Create; 182 data.Write(Src[0], Size); 183 data.Seek(0, soFromBeginning); 184 UpdateDatFilePart(FileID, offset, size, data); 185 data.Free; 186 end; 187 end; 188 189 procedure TDataAccess.UpdateDatFilePart(FileID, Offset, Size: Integer; Src: Pointer); 190 var 191 data: TStream; 192 begin 193 if fileid < GetFileCount then 194 begin 195 data := TMemoryStream.Create; 196 data.Write(Src^, Size); 197 data.Seek(0, soFromBeginning); 198 UpdateDatFilePart(FileID, offset, size, data); 199 data.Free; 200 end; 201 end; 202 203 204 205 procedure TDataAccess.LoadRawFile(FileID, DatOffset: Integer; var Target: TByteData); 206 var 207 data: TStream; 208 begin 209 if fileid < GetFileCount then 210 begin 211 data := nil; 212 LoadRawFile(FileID, DatOffset, data); 213 SetLength(Target, data.Size); 214 data.Read(Target[0], data.Size); 215 data.Free; 216 end; 217 end; 218 219 procedure TDataAccess.UpdateRawFile(FileID, DatOffset: Integer; Src: TByteData); 220 var 221 data: TStream; 222 begin 223 if fileid < GetFileCount then 224 begin 225 data := TMemoryStream.Create; 226 data.Write(Src[0], Length(Src)); 227 data.Seek(0, soFromBeginning); 228 UpdateRawFile(FileID, DatOffset, data); 229 data.Free; 230 end; 231 end; 232 233 procedure TDataAccess.LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TByteData); 234 var 235 data: TStream; 236 begin 237 if fileid < GetFileCount then 238 begin 239 data := nil; 240 SetLength(Target, Size); 241 LoadRawFile(FileID, DatOffset, Data); 242 Data.Seek(Offset, soFromBeginning); 243 Data.Read(Target[0], Size); 244 Data.Free; 245 end; 246 end; 247 248 procedure TDataAccess.LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; Target: Pointer); 249 var 250 data: TStream; 251 begin 252 if fileid < GetFileCount then 253 begin 254 data := nil; 255 LoadRawFile(FileID, DatOffset, Data); 256 Data.Seek(Offset, soFromBeginning); 257 Data.Read(Target^, Size); 258 Data.Free; 259 end; 260 end; 261 262 procedure TDataAccess.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TByteData); 263 var 264 data: TStream; 265 begin 266 if fileid < GetFileCount then 267 begin 268 data := TMemoryStream.Create; 269 data.Write(Src[0], Size); 270 data.Seek(0, soFromBeginning); 271 UpdateRawFilePart(FileID, DatOffset, Offset, Size, data); 272 data.Free; 273 end; 274 end; 275 276 procedure TDataAccess.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: Pointer); 277 var 278 data: TStream; 279 begin 280 if fileid < GetFileCount then 281 begin 282 data := TMemoryStream.Create; 283 data.Write(Src^, Size); 284 data.Seek(0, soFromBeginning); 285 UpdateRawFilePart(FileID, DatOffset, Offset, Size, data); 286 data.Free; 287 end; 288 end; 289 290 291 function TDataAccess.AppendRawFile(LocSep: Boolean; Size: Integer; Src: TStream): Integer; 292 begin 293 raise ENotImplemented.Create('ERROR: AppendRawFile not implemented here!!!'); 294 end; 295 296 297 function TDataAccess.AppendRawFile(LocSep: Boolean; Size: Integer; Src: TByteData): Integer; 298 var 299 data: TStream; 300 begin 301 data := TMemoryStream.Create; 302 data.Write(Src[0], Size); 303 AppendRawFile(LocSep, Size, data); 304 data.Free; 305 end; 306 307 function TDataAccess.AppendRawFile(LocSep: Boolean; Size: Integer; Src: Pointer): Integer; 308 var 309 data: TStream; 310 begin 311 data := TMemoryStream.Create; 312 data.Write(Src^, Size); 313 AppendRawFile(LocSep, Size, data); 314 data.Free; 315 end; 316 148 317 149 318
Note:
See TracChangeset
for help on using the changeset viewer.