Browse Source

--- Merging r34727 into '.':
U packages/fcl-base/src/streamex.pp
--- Recording mergeinfo for merge of r34727 into '.':
U .
--- Merging r34728 into '.':
G packages/fcl-base/src/streamex.pp
--- Recording mergeinfo for merge of r34728 into '.':
G .
--- Merging r34748 into '.':
U packages/fcl-base/src/fptimer.pp
--- Recording mergeinfo for merge of r34748 into '.':
G .
--- Merging r34988 into '.':
U packages/fcl-base/src/syncobjs.pp
--- Recording mergeinfo for merge of r34988 into '.':
G .

# revisions: 34727,34728,34748,34988

git-svn-id: branches/fixes_3_0@36000 -

marco 8 years ago
parent
commit
13204c0b26

+ 1 - 0
packages/fcl-base/src/fptimer.pp

@@ -334,6 +334,7 @@ Var
   Diff: Extended;
    
 begin
+  Result:=False;
     { Use Counter*fInterval to avoid numerical errors resulting from adding
       small values (AInterval/cMilliSecs) to a large real number (TDateTime),
       even when using Extended precision }

+ 32 - 30
packages/fcl-base/src/streamex.pp

@@ -86,13 +86,14 @@ type
    { TTextReader }
 
    TTextReader = class(TObject)
+   Protected
+     function IsEof: Boolean; virtual; abstract;
    public
      constructor Create; virtual;
      procedure Reset; virtual; abstract;
      procedure Close; virtual; abstract;
-     function IsEof: Boolean; virtual; abstract;
      procedure ReadLine(out AString: string); virtual; abstract; overload;
-     function ReadLine: string; virtual; abstract; overload;
+     function ReadLine: string; overload;
      property Eof: Boolean read IsEof;
    end;
 
@@ -102,10 +103,13 @@ type
    private
      FBufferRead: Integer;
      FBufferPosition: Integer;
+     FClosed,
      FOwnsStream: Boolean;
      FStream: TStream;
      FBuffer: array of Byte;
      procedure FillBuffer;
+   Protected  
+     function IsEof: Boolean; override;
    public
      constructor Create(AStream: TStream; ABufferSize: Integer;
        AOwnsStream: Boolean); virtual;
@@ -113,9 +117,7 @@ type
      destructor Destroy; override;
      procedure Reset; override;
      procedure Close; override;
-     function IsEof: Boolean; override;
      procedure ReadLine(out AString: string); override; overload;
-     function ReadLine: string; override; overload;
      property BaseStream: TStream read FStream;
      property OwnsStream: Boolean read FOwnsStream write FOwnsStream;
    end;
@@ -125,15 +127,15 @@ type
    TStringReader = class(TTextReader)
    private
      FReader: TTextReader;
+   Protected  
+     function IsEof: Boolean; override;
    public
      constructor Create(const AString: string; ABufferSize: Integer); virtual;
      constructor Create(const AString: string); virtual;
      destructor Destroy; override;
      procedure Reset; override;
      procedure Close; override;
-     function IsEof: Boolean; override;
      procedure ReadLine(out AString: string); override; overload;
-     function ReadLine: string; override; overload;
    end;
 
    { TFileReader }
@@ -141,6 +143,8 @@ type
    TFileReader = class(TTextReader)
    private
      FReader: TTextReader;
+   Protected
+     function IsEof: Boolean; override;
    public
      constructor Create(const AFileName: TFileName; AMode: Word;
        ARights: Cardinal; ABufferSize: Integer); virtual;
@@ -151,9 +155,7 @@ type
      destructor Destroy; override;
      procedure Reset; override;
      procedure Close; override;
-     function IsEof: Boolean; override;
      procedure ReadLine(out AString: string); override; overload;
-     function ReadLine: string; override; overload;
    end;
 
   { allows you to represent just a small window of a bigger stream as a substream. 
@@ -331,6 +333,12 @@ begin
   inherited Create;
 end;
 
+function TTextReader.ReadLine: string;
+
+begin
+  ReadLine(Result);
+end;
+
 { TStreamReader }
 
 constructor TStreamReader.Create(AStream: TStream; ABufferSize: Integer;
@@ -341,6 +349,7 @@ begin
     raise EArgumentException.CreateFmt(SParamIsNil, ['AStream']);
   FStream := AStream;
   FOwnsStream := AOwnsStream;
+  FClosed:=False;
   if ABufferSize >= MIN_BUFFER_SIZE then
     SetLength(FBuffer, ABufferSize)
   else
@@ -360,9 +369,17 @@ end;
 
 procedure TStreamReader.FillBuffer;
 begin
-  FBufferRead := FStream.Read(FBuffer[0], Pred(Length(FBuffer)));
-  FBuffer[FBufferRead] := 0;
-  FBufferPosition := 0;
+  if FClosed then 
+    begin
+    FBufferRead:=0;
+    FBufferPosition:=0;
+    end
+  else  
+    begin
+    FBufferRead := FStream.Read(FBuffer[0], Pred(Length(FBuffer)));
+    FBuffer[FBufferRead] := 0;
+    FBufferPosition := 0;
+    end;
 end;
 
 procedure TStreamReader.Reset;
@@ -376,15 +393,13 @@ end;
 procedure TStreamReader.Close;
 begin
   if FOwnsStream then
-  begin
-    FStream.Free;
-    FStream := nil;
-  end;
+    FreeAndNil(FStream);
+  FClosed:=True;
 end;
 
 function TStreamReader.IsEof: Boolean;
 begin
-  if not Assigned(FStream) then
+  if FClosed or not Assigned(FStream) then
     Exit(True);
   Result := FBufferPosition >= FBufferRead;
   if Result then
@@ -401,6 +416,7 @@ var
 begin
   VPosition := FBufferPosition;
   SetLength(AString, 0);
+  if FClosed then exit;
   repeat
     VPByte := @FBuffer[FBufferPosition];
     while (FBufferPosition < FBufferRead) and not (VPByte^ in [10, 13]) do
@@ -441,10 +457,6 @@ begin
   end;
 end;
 
-function TStreamReader.ReadLine: string;
-begin
-  ReadLine(Result);
-end;
 
 { TStringReader }
 
@@ -485,11 +497,6 @@ begin
   FReader.ReadLine(AString);
 end;
 
-function TStringReader.ReadLine: string;
-begin
-  ReadLine(Result);
-end;
-
 { TFileReader }
 
 constructor TFileReader.Create(const AFileName: TFileName; AMode: Word;
@@ -542,11 +549,6 @@ begin
   FReader.ReadLine(AString);
 end;
 
-function TFileReader.ReadLine: string;
-begin
-  ReadLine(Result);
-end;
-
 { TStreamHelper }
 
 function TStreamHelper.readwordLE:word;

+ 9 - 0
packages/fcl-base/src/syncobjs.pp

@@ -28,6 +28,10 @@ const
   INFINITE = Cardinal(-1);
 
 type
+   ESyncObjectException = Class(Exception);
+   ELockException = Class(ESyncObjectException);
+   ELockRecursionException = Class(ESyncObjectException);
+   
    TWaitResult = (wrSignaled, wrTimeout, wrAbandoned, wrError);
 
    TSynchroObject = class(TObject)
@@ -79,6 +83,9 @@ type
 
 implementation
 
+Resourcestring
+  SErrEventCreateFailed = 'Failed to create OS basic event with name "%s"'; 
+
 { ---------------------------------------------------------------------
     Real syncobjs implementation
   ---------------------------------------------------------------------}
@@ -150,6 +157,8 @@ constructor TEventObject.Create(EventAttributes : PSecurityAttributes;
 
 begin
   FHandle := BasicEventCreate(EventAttributes, AManualReset, InitialState, Name);
+  if (FHandle=Nil) then
+    Raise ESyncObjectException.CreateFmt(SErrEventCreateFailed,[Name]);
   FManualReset:=AManualReset;
 end;