Ignore:
Timestamp:
Jul 15, 2007, 1:12:26 AM (18 years ago)
Author:
alloc
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • oup/current/FileClasses/_DataTypes.pas

    r237 r240  
    2828
    2929      procedure Update(Offset, Length: Integer); virtual; abstract;
     30      procedure WriteData(stream: TStream); virtual; abstract;
    3031
    3132      property Offset: Integer read FOffset;
     
    5657          Name, Description: String; ExtraArgs: array of const); override;
    5758      procedure Update(Offset, Length: Integer); override;
     59      procedure WriteData(stream: TStream); override;
    5860      property FieldByOffset[Offset: Integer]: TDataField read GetFieldByOffset;
    5961
     
    7375          Name, Description: String; ExtraArgs: array of const); override;
    7476      procedure Update(Offset, Length: Integer); override;
     77      procedure WriteData(stream: TStream); override;
    7578  end;
    7679
     
    8588          Name, Description: String; ExtraArgs: array of const); override;
    8689      procedure Update(Offset, Length: Integer); override;
     90      procedure WriteData(stream: TStream); override;
    8791  end;
    8892
     
    98102          Name, Description: String; ExtraArgs: array of const); override;
    99103      procedure Update(Offset, Length: Integer); override;
     104      procedure WriteData(stream: TStream); override;
    100105  end;
    101106
     
    110115          Name, Description: String; ExtraArgs: array of const); override;
    111116      procedure Update(Offset, Length: Integer); override;
     117      procedure WriteData(stream: TStream); override;
    112118  end;
    113119
     
    122128          Name, Description: String; ExtraArgs: array of const); override;
    123129      procedure Update(Offset, Length: Integer); override;
    124   end;
    125 
    126 
    127   TLinkByID = class(TDataField)
     130      procedure WriteData(stream: TStream); override;
     131  end;
     132
     133
     134  TDatLink = class(TDataField)
     135    private
     136      function GetTarget: TObject; virtual; abstract;
     137    public
     138      property TargetFile: TObject read GetTarget;
     139  end;
     140
     141
     142  TLinkByID = class(TDatLink)
    128143      function GetChildCount: Integer; override;
    129144      function GetChild(ID: Integer): TTreeElement; override;
     
    132147      FPosExts: String;
    133148      function GetValueAsString: String; override;
     149      function GetTarget: TObject; override;
    134150    public
    135151      // ExtraArgs: Pointer auf String: Possible Exts
     
    137153          Name, Description: String; ExtraArgs: array of const); override;
    138154      procedure Update(Offset, Length: Integer); override;
     155      procedure WriteData(stream: TStream); override;
    139156  end;
    140157
     
    149166          Name, Description: String; ExtraArgs: array of const); override;
    150167      procedure Update(Offset, Length: Integer); override;
     168      procedure WriteData(stream: TStream); override;
    151169  end;
    152170
     
    168186          Name, Description: String; ExtraArgs: array of const); override;
    169187      procedure Update(Offset, Length: Integer); override;
     188      procedure WriteData(stream: TStream); override;
    170189
    171190      function AddField(fieldtype: TFieldType; Name, Description: String;
     
    186205          Name, Description: String; ExtraArgs: array of const); override;
    187206      procedure Update(Offset, Length: Integer); override;
     207      procedure WriteData(stream: TStream); override;
    188208  end;
    189209
     
    197217          Name, Description: String; ExtraArgs: array of const); override;
    198218      procedure Update(Offset, Length: Integer); override;
     219      procedure WriteData(stream: TStream); override;
    199220  end;
    200221
     
    283304end;
    284305
     306procedure TString.WriteData(stream: TStream);
     307var
     308  temps: String;
     309  i: Integer;
     310begin
     311  temps := FString;
     312  SetLength(temps, FDataLength);
     313  for i := Length(FString) + 1 to FDataLength do
     314    temps[i] := #0;
     315  stream.Write(temps[1], FDataLength);
     316end;
     317
    285318
    286319
     
    307340  fstream.Seek(FOffset, soFromBeginning);
    308341  fstream.Read(FInt, FDataLength);
     342end;
     343
     344procedure TInt.WriteData(stream: TStream);
     345begin
     346  stream.Write(FInt, FDataLength);
    309347end;
    310348
     
    418456
    419457procedure TArray.Update(Offset, Length: Integer);
     458var
     459  i: Integer;
     460  field: TDataField;
     461begin
     462  if System.Length(FDataFields) > 0 then
     463  begin
     464    if Length > 0 then
     465    begin
     466      for i := 0 to High(FDataFields) do
     467      begin
     468        field := FDataFields[i];
     469        if ((field.Offset < Offset) and (field.Offset + field.DataLength > Offset + Length)) or
     470          ((field.Offset > Offset) and (field.Offset < Offset + Length)) or
     471          ((field.Offset + field.DataLength > Offset) and (field.Offset+field.DataLength < Offset + Length)) then
     472          field.Update(Offset, Length);
     473      end;
     474    end else begin
     475      for i := 0 to High(FDataFields) do
     476        FDataFields[i].Update(Offset, Length);
     477    end;
     478  end;
     479end;
     480
     481procedure TArray.UpdateSize;
     482var
     483  i: Integer;
     484begin
     485  FDataLength := FCounterSize;
     486  if Length(FDataFields) > 0 then
     487    for i := 0 to High(FDataFields) do
     488      FDataLength := FDataLength + FDataFields[i].DataLength;
     489  FParentBlock.UpdateSize;
     490end;
     491
     492procedure TArray.WriteData(stream: TStream);
     493var
     494  i: Integer;
     495begin
     496  if FCounterSize > 0 then
     497    stream.Write(FBlockCount, FCounterSize);
     498  if Length(FDataFields) > 0 then
     499    for i := 0 to High(FDataFields) do
     500      FDataFields[i].WriteData(stream);
     501end;
     502
     503
     504
     505{ TBlock }
     506
     507function TBlock.AddField(fieldtype: TFieldType; Name,
     508    Description: String; ExtraArgs: array of const): TDataField;
     509begin
     510  SetLength(FDataFields, Length(FDataFields) + 1);
     511  FDataFields[High(FDataFields)] := TFieldType(fieldtype).Create(
     512      FParentFile, Self, Name, Description, ExtraArgs);
     513  Result := FDataFields[High(FDataFields)];
     514  FDataLength := FDataLength + Result.DataLength;
     515  if Assigned(FParentBlock) then
     516    FParentBlock.UpdateSize;
     517end;
     518
     519constructor TBlock.Create(ParentFile: TObject; ParentBlock: TContainer;
     520    Name, Description: String; ExtraArgs: array of const);
     521begin
     522  inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
     523end;
     524
     525function TBlock.GetChild(ID: Integer): TTreeElement;
     526begin
     527  Result := FDataFields[ID];
     528end;
     529
     530function TBlock.GetChildCount: Integer;
     531begin
     532  Result := Length(FDataFields);
     533end;
     534
     535function TBlock.GetFieldByOffset(Offset: Integer): TDataField;
     536begin
     537  Exit;
     538end;
     539
     540procedure TBlock.Update(Offset, Length: Integer);
    420541var
    421542  i: Integer;
     
    443564end;
    444565
    445 procedure TArray.UpdateSize;
    446 var
    447   i: Integer;
    448 begin
    449   FDataLength := FCounterSize;
    450   if Length(FDataFields) > 0 then
    451     for i := 0 to High(FDataFields) do
    452       FDataLength := FDataLength + FDataFields[i].DataLength;
    453   FParentBlock.UpdateSize;
    454 end;
    455 
    456 
    457 
    458 { TBlock }
    459 
    460 function TBlock.AddField(fieldtype: TFieldType; Name,
    461     Description: String; ExtraArgs: array of const): TDataField;
    462 begin
    463   SetLength(FDataFields, Length(FDataFields) + 1);
    464   FDataFields[High(FDataFields)] := TFieldType(fieldtype).Create(
    465       FParentFile, Self, Name, Description, ExtraArgs);
    466   Result := FDataFields[High(FDataFields)];
    467   FDataLength := FDataLength + Result.DataLength;
    468   if Assigned(FParentBlock) then
    469     FParentBlock.UpdateSize;
    470 end;
    471 
    472 constructor TBlock.Create(ParentFile: TObject; ParentBlock: TContainer;
    473     Name, Description: String; ExtraArgs: array of const);
    474 begin
    475   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
    476 end;
    477 
    478 function TBlock.GetChild(ID: Integer): TTreeElement;
    479 begin
    480   Result := FDataFields[ID];
    481 end;
    482 
    483 function TBlock.GetChildCount: Integer;
    484 begin
    485   Result := Length(FDataFields);
    486 end;
    487 
    488 function TBlock.GetFieldByOffset(Offset: Integer): TDataField;
    489 begin
    490   Exit;
    491 end;
    492 
    493 procedure TBlock.Update(Offset, Length: Integer);
    494 var
    495   i: Integer;
    496   field: TDataField;
    497 begin
    498   if System.Length(FDataFields) > 0 then
    499   begin
    500     if Length > 0 then
    501     begin
    502       for i := 0 to High(FDataFields) do
    503       begin
    504         field := FDataFields[i];
    505         if ((field.Offset < Offset) and (field.Offset + field.DataLength > Offset + Length)) or
    506           ((field.Offset > Offset) and (field.Offset < Offset + Length)) or
    507           ((field.Offset + field.DataLength > Offset) and (field.Offset+field.DataLength < Offset + Length)) then
    508           field.Update(Offset, Length);
    509       end;
    510     end else begin
    511       for i := 0 to High(FDataFields) do
    512       begin
    513         FDataFields[i].Update(Offset, Length);
    514       end;
    515     end;
    516   end;
    517 end;
    518 
    519566procedure TBlock.UpdateSize;
    520567var
     
    529576end;
    530577
     578procedure TBlock.WriteData(stream: TStream);
     579var
     580  i: Integer;
     581begin
     582  if Length(FDataFields) > 0 then
     583    for i := 0 to High(FDataFields) do
     584      FDataFields[i].WriteData(stream);
     585end;
    531586
    532587
     
    554609  fstream.Read(FLevelID, 4);
    555610  FLevelID := FLevelID div 256 div 256 div 256 div 2;
     611end;
     612
     613procedure TLevelID.WriteData(stream: TStream);
     614var
     615  tempi: Integer;
     616begin
     617  tempi := FLevelID * 256 * 256 * 256 * 2 + 1;
     618  stream.Write(tempi, 4);
    556619end;
    557620
     
    586649end;
    587650
     651procedure TFileID.WriteData(stream: TStream);
     652var
     653  tempi: Integer;
     654begin
     655  if FFileID >= 0 then
     656    tempi := FFileID * 256 + 1
     657  else
     658    tempi := 0;
     659  stream.Write(tempi, 4);
     660end;
     661
    588662
    589663
     
    616690  else
    617691    Result := 0;
     692end;
     693
     694function TLinkByID.GetTarget: TObject;
     695begin
     696  if FFileID > 0 then
     697    Result := ConManager.Connection[FConnectionID].MetaData.FileById[FFileID]
     698  else
     699    Result := nil;
    618700end;
    619701
     
    639721end;
    640722
     723procedure TLinkByID.WriteData(stream: TStream);
     724var
     725  tempi: Integer;
     726begin
     727  if FFileID >= 0 then
     728    tempi := FFileID * 256 + 1
     729  else
     730    tempi := 0;
     731  stream.Write(tempi, 4);
     732end;
     733
    641734
    642735
     
    667760end;
    668761
     762procedure TRawLink.WriteData(stream: TStream);
     763begin
     764  stream.Write(FRawAddress, 4);
     765end;
     766
    669767
    670768
     
    686784begin
    687785  Exit;
     786end;
     787
     788procedure TUnused.WriteData(stream: TStream);
     789var
     790  i: Integer;
     791  tempb: Byte;
     792begin
     793  tempb := 0;
     794  for i := 1 to FDataLength do
     795    stream.Write(tempb, 1);
    688796end;
    689797
     
    732840end;
    733841
     842procedure TBitSet.WriteData(stream: TStream);
     843begin
     844  stream.Write(FBits, FDataLength);
     845end;
     846
    734847
    735848
     
    758871end;
    759872
     873procedure TFloat.WriteData(stream: TStream);
     874begin
     875  stream.Write(FFloat, 4);
     876end;
     877
    760878
    761879end.
Note: See TracChangeset for help on using the changeset viewer.