unit uutlSerialization; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// IutlFileReader = interface ['{3A9C3AE3-CAEE-44C9-85BE-0BCAA5C1BE7A}'] function LoadStream(const aFilename: String; const aStream: TStream): Boolean; end; IutlFileWriter = interface ['{3DF84644-9FC4-4A8A-88C2-73F13E72B1ED}'] procedure SaveStream(const aFilename: String; const aStream: TStream); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TutlSimpleFileReader = class(TInterfacedObject, IutlFileReader) public function LoadStream(const aFilename: String; const aStream: TStream): Boolean; end; TutlSimpleFileWriter = class(TInterfacedObject, IutlFileWriter) public procedure SaveStream(const aFilename: String; const aStream: TStream); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TutlFileReaderProxy = class(TInterfacedObject, IutlFileReader) private fReader: IutlFileReader; fPrefix: String; public function LoadStream(const aFilename: String; const aStream: TStream): Boolean; constructor Create(const aReader: IutlFileReader; const aPrefix: String); end; TutlFileWriterProxy = class(TInterfacedObject, IutlFileWriter) private fWriter: IutlFileWriter; fPrefix: String; public procedure SaveStream(const aFilename: String; const aStream: TStream); constructor Create(const aWriter: IutlFileWriter; const aPrefix: String); end; implementation //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TutlSimpleFileReader////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TutlSimpleFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean; var fs: TFileStream; begin result := FileExists(aFilename); if result then begin fs := TFileStream.Create(aFilename, fmOpenRead); try aStream.CopyFrom(fs, fs.Size - fs.Position); finally FreeAndNil(fs); end; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TutlSimpleFileWriter////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlSimpleFileWriter.SaveStream(const aFilename: String; const aStream: TStream); var fs: TFileStream; begin fs := TFileStream.Create(aFilename, fmCreate); try fs.CopyFrom(aStream, aStream.Size - aStream.Position); finally FreeAndNil(fs); end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TutlFileReaderProxy/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TutlFileReaderProxy.LoadStream(const aFilename: String; const aStream: TStream): Boolean; var dir, name: String; begin dir := ExtractFilePath(aFilename); name := ExtractFileName(aFilename); result := fReader.LoadStream(dir + fPrefix + name, aStream); end; constructor TutlFileReaderProxy.Create(const aReader: IutlFileReader; const aPrefix: String); begin inherited Create; fReader := aReader; fPrefix := aPrefix; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TutlFileWriterProxy/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlFileWriterProxy.SaveStream(const aFilename: String; const aStream: TStream); var dir, name: String; begin dir := ExtractFilePath(aFilename); name := ExtractFileName(aFilename); fWriter.SaveStream(dir + fPrefix + name, aStream); end; constructor TutlFileWriterProxy.Create(const aWriter: IutlFileWriter; const aPrefix: String); begin inherited Create; fWriter := aWriter; fPrefix := aPrefix; end; end.