Changeset 521 for GraphicTest/Packages/bgrabitmap/bgramultifiletype.pas
- Timestamp:
- Apr 17, 2019, 12:58:41 AM (5 years ago)
- Location:
- GraphicTest
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
GraphicTest
- Property svn:ignore
-
old new 8 8 GraphicTest.lps 9 9 GraphicTest.dbg 10 heaptrclog.trc
-
- Property svn:ignore
-
GraphicTest/Packages/bgrabitmap/bgramultifiletype.pas
r494 r521 2 2 3 3 {$mode objfpc}{$H+} 4 {$MODESWITCH ADVANCEDRECORDS} 4 5 5 6 interface … … 7 8 uses 8 9 Classes, SysUtils, fgl; 10 11 type 12 13 { TEntryFilename } 14 15 TEntryFilename = record 16 private 17 FExtension: utf8string; 18 FName: utf8string; 19 function GetFilename: utf8string; 20 function GetIsEmpty: boolean; 21 procedure SetExtension(AValue: utf8string); 22 procedure SetFilename(AValue: utf8string); 23 procedure SetName(AValue: utf8string); 24 public 25 class operator =(const AValue1,AValue2: TEntryFilename): boolean; 26 property Filename: utf8string read GetFilename write SetFilename; 27 property Name: utf8string read FName write SetName; 28 property Extension: utf8string read FExtension write SetExtension; 29 property IsEmpty: boolean read GetIsEmpty; 30 end; 31 32 function EntryFilename(AName,AExtension: string): TEntryFilename; overload; 33 function EntryFilename(AFilename: string): TEntryFilename; overload; 9 34 10 35 type … … 22 47 public 23 48 constructor Create(AContainer: TMultiFileContainer); 24 function CopyTo({%H-}ADestination: TStream): int eger; virtual;49 function CopyTo({%H-}ADestination: TStream): int64; virtual; 25 50 property Name: utf8string read GetName write SetName; 26 51 property Extension: utf8string read GetExtension; … … 38 63 protected 39 64 procedure Init; virtual; 40 function AddEntry(AEntry: TMultiFileEntry ): integer;65 function AddEntry(AEntry: TMultiFileEntry; AIndex: integer = -1): integer; 41 66 function GetCount: integer; 42 67 function GetEntry(AIndex: integer): TMultiFileEntry; 43 68 function CreateEntry(AName: utf8string; AExtension: utf8string; AContent: TStream): TMultiFileEntry; virtual; abstract; 69 function GetRawString(AIndex: integer): RawByteString; 70 function GetRawStringByFilename(AFilename: string): RawByteString; 71 procedure SetRawString(AIndex: integer; AValue: RawByteString); 72 procedure SetRawStringByFilename(AFilename: string; AValue: RawByteString); 44 73 public 45 constructor Create; 46 constructor Create(AFilename: utf8string); 47 constructor Create(AStream: TStream); 48 constructor Create(AStream: TStream; AStartPos: Int64); 49 function Add(AName: utf8string; AExtension: utf8string; AContent: TStream; AOverwrite: boolean = false; AOwnStream: boolean = true): integer; 50 function Add(AName: utf8string; AExtension: utf8string; AContent: utf8String; AOverwrite: boolean = false): integer; 74 constructor Create; overload; 75 constructor Create(AFilename: utf8string); overload; 76 constructor Create(AStream: TStream); overload; 77 constructor Create(AStream: TStream; AStartPos: Int64); overload; 78 function Add(AName: utf8string; AExtension: utf8string; AContent: TStream; AOverwrite: boolean = false; AOwnStream: boolean = true): integer; overload; 79 function Add(AName: utf8string; AExtension: utf8string; AContent: RawByteString; AOverwrite: boolean = false): integer; overload; 80 function Add(AFilename: TEntryFilename; AContent: TStream; AOverwrite: boolean = false; AOwnStream: boolean = true): integer; overload; 81 function Add(AFilename: TEntryFilename; AContent: RawByteString; AOverwrite: boolean = false): integer; overload; 51 82 procedure Clear; virtual; 52 83 destructor Destroy; override; 53 84 procedure LoadFromFile(AFilename: utf8string); 54 85 procedure LoadFromStream(AStream: TStream); virtual; abstract; 86 procedure LoadFromResource(AFilename: string); virtual; 55 87 procedure SaveToFile(AFilename: utf8string); 56 88 procedure SaveToStream(ADestination: TStream); virtual; abstract; 57 89 procedure Remove(AEntry: TMultiFileEntry); virtual; 58 procedure Delete(AIndex: integer); virtual; overload; 59 function Delete(AName: utf8string; AExtension: utf8string;ACaseSensitive: boolean = True): boolean; overload; 60 function IndexOf(AEntry: TMultiFileEntry): integer; 61 function IndexOf(AName: utf8string; AExtenstion: utf8string; ACaseSensitive: boolean = True): integer; virtual; 90 procedure Delete(AIndex: integer); overload; virtual; 91 function Delete(AName: utf8string; AExtension: utf8string; ACaseSensitive: boolean = True): boolean; overload; 92 function Delete(AFilename: TEntryFilename; ACaseSensitive: boolean = True): boolean; overload; 93 function IndexOf(AEntry: TMultiFileEntry): integer; overload; 94 function IndexOf(AName: utf8string; AExtenstion: utf8string; ACaseSensitive: boolean = True): integer; overload; virtual; 95 function IndexOf(AFilename: TEntryFilename; ACaseSensitive: boolean = True): integer; overload; 62 96 property Count: integer read GetCount; 63 97 property Entry[AIndex: integer]: TMultiFileEntry read GetEntry; 98 property RawString[AIndex: integer]: RawByteString read GetRawString write SetRawString; 99 property RawStringByFilename[AFilename: string]: RawByteString read GetRawStringByFilename write SetRawStringByFilename; 64 100 end; 65 101 66 102 implementation 67 103 68 uses BGRAUTF8; 104 uses BGRAUTF8, strutils, BGRABitmapTypes; 105 106 { TEntryFilename } 107 108 function TEntryFilename.GetFilename: utf8string; 109 begin 110 if Extension = '' then 111 result := Name 112 else 113 result := Name+'.'+Extension; 114 end; 115 116 function TEntryFilename.GetIsEmpty: boolean; 117 begin 118 result := (FName='') and (FExtension = ''); 119 end; 120 121 procedure TEntryFilename.SetExtension(AValue: utf8string); 122 var 123 i: Integer; 124 begin 125 if FExtension=AValue then Exit; 126 for i := 1 to length(AValue) do 127 if AValue[i] in ['.','/'] then 128 raise Exception.Create('Invalid extension'); 129 FExtension:=AValue; 130 end; 131 132 procedure TEntryFilename.SetFilename(AValue: utf8string); 133 var 134 idxDot: SizeInt; 135 begin 136 idxDot := RPos('.',AValue); 137 if idxDot = 0 then 138 begin 139 Name := AValue; 140 Extension := ''; 141 end 142 else 143 begin 144 Name := copy(AValue,1,idxDot-1); 145 Extension := copy(AValue,idxDot+1,length(AValue)-idxDot); 146 end; 147 end; 148 149 procedure TEntryFilename.SetName(AValue: utf8string); 150 var 151 i: Integer; 152 begin 153 if FName=AValue then Exit; 154 for i := 1 to length(AValue) do 155 if AValue[i] = '/' then 156 raise Exception.Create('Invalid name'); 157 FName:=AValue; 158 end; 159 160 function EntryFilename(AName, AExtension: string): TEntryFilename; 161 begin 162 result.Name := AName; 163 result.Extension:= AExtension; 164 end; 165 166 function EntryFilename(AFilename: string): TEntryFilename; 167 begin 168 result.Filename:= AFilename; 169 end; 170 171 class operator TEntryFilename.=(const AValue1, AValue2: TEntryFilename): boolean; 172 begin 173 result := (AValue1.Name = AValue2.Name) and (AValue1.Extension = AValue2.Extension); 174 end; 69 175 70 176 { TMultiFileEntry } … … 85 191 end; 86 192 87 function TMultiFileEntry.CopyTo(ADestination: TStream): int eger;193 function TMultiFileEntry.CopyTo(ADestination: TStream): int64; 88 194 begin 89 195 result := 0; … … 94 200 function TMultiFileContainer.GetCount: integer; 95 201 begin 96 result := FEntries.Count; 202 if Assigned(FEntries) then 203 result := FEntries.Count 204 else 205 result := 0; 97 206 end; 98 207 … … 102 211 end; 103 212 213 function TMultiFileContainer.GetRawString(AIndex: integer): RawByteString; 214 var s: TStringStream; 215 begin 216 s := TStringStream.Create(''); 217 try 218 Entry[AIndex].CopyTo(s); 219 result := s.DataString; 220 finally 221 s.Free; 222 end; 223 end; 224 225 function TMultiFileContainer.GetRawStringByFilename(AFilename: string 226 ): RawByteString; 227 var 228 idx: Integer; 229 begin 230 idx := IndexOf(EntryFilename(AFilename)); 231 if idx = -1 then 232 result := '' 233 else 234 result := GetRawString(idx); 235 end; 236 237 procedure TMultiFileContainer.SetRawString(AIndex: integer; 238 AValue: RawByteString); 239 begin 240 with Entry[AIndex] do 241 Add(Name, Extension, AValue, true); 242 end; 243 244 procedure TMultiFileContainer.SetRawStringByFilename(AFilename: string; 245 AValue: RawByteString); 246 var 247 f: TEntryFilename; 248 begin 249 f := EntryFilename(AFilename); 250 Add(f.Name,f.Extension,AValue,true); 251 end; 252 104 253 procedure TMultiFileContainer.Init; 105 254 begin … … 107 256 end; 108 257 109 function TMultiFileContainer.AddEntry(AEntry: TMultiFileEntry): integer; 110 begin 111 result := FEntries.Add(AEntry); 258 function TMultiFileContainer.AddEntry(AEntry: TMultiFileEntry; AIndex: integer): integer; 259 begin 260 if not Assigned(FEntries) then 261 raise exception.Create('Entry list not created'); 262 if (AIndex >= 0) and (AIndex < FEntries.Count) then 263 begin 264 FEntries.Insert(AIndex, AEntry); 265 result := AIndex; 266 end 267 else 268 result := FEntries.Add(AEntry); 112 269 end; 113 270 … … 160 317 newEntry := CreateEntry(AName, AExtension, AContent); 161 318 if Assigned(newEntry) then 162 result := AddEntry(newEntry )319 result := AddEntry(newEntry, index) 163 320 else 164 321 raise exception.Create('Unable to create entry'); … … 166 323 167 324 function TMultiFileContainer.Add(AName: utf8string; AExtension: utf8string; 168 AContent: utf8String; AOverwrite: boolean): integer;325 AContent: RawByteString; AOverwrite: boolean): integer; 169 326 var stream: TMemoryStream; 170 327 begin 171 328 stream := TMemoryStream.Create; 172 stream.Write(AContent[1],length(AContent));329 if length(AContent) > 0 then stream.Write(AContent[1],length(AContent)); 173 330 result := Add(AName,AExtension,stream,AOverwrite); 331 end; 332 333 function TMultiFileContainer.Add(AFilename: TEntryFilename; AContent: TStream; 334 AOverwrite: boolean; AOwnStream: boolean): integer; 335 begin 336 result := Add(AFilename.Name,AFilename.Extension, AContent, AOverwrite, AOwnStream); 337 end; 338 339 function TMultiFileContainer.Add(AFilename: TEntryFilename; 340 AContent: RawByteString; AOverwrite: boolean): integer; 341 begin 342 result := Add(AFilename.Name,AFilename.Extension, AContent, AOverwrite); 174 343 end; 175 344 … … 187 356 LoadFromStream(stream); 188 357 stream.Free; 358 end; 359 360 procedure TMultiFileContainer.LoadFromResource(AFilename: string); 361 var 362 stream: TStream; 363 begin 364 stream := BGRAResource.GetResourceStream(AFilename); 365 try 366 LoadFromStream(stream); 367 finally 368 stream.Free; 369 end; 189 370 end; 190 371 … … 230 411 result := true; 231 412 end; 413 end; 414 415 function TMultiFileContainer.Delete(AFilename: TEntryFilename; 416 ACaseSensitive: boolean): boolean; 417 begin 418 result := Delete(AFilename.Name,AFilename.Extension,ACaseSensitive); 232 419 end; 233 420 … … 259 446 end; 260 447 448 function TMultiFileContainer.IndexOf(AFilename: TEntryFilename; 449 ACaseSensitive: boolean): integer; 450 begin 451 result := IndexOf(AFilename.Name,AFilename.Extension,ACaseSensitive); 452 end; 453 261 454 procedure TMultiFileContainer.Clear; 262 455 var
Note:
See TracChangeset
for help on using the changeset viewer.