View Issue Details

IDProjectCategoryView StatusLast Update
0033043FPCFCLpublic2018-01-20 15:42
ReporterSerge AnvarovAssigned ToMichael Van Canneyt 
PrioritynormalSeverityminorReproducibilityalways
Status resolvedResolutionfixed 
Product Version3.0.4Product Build 
Target Version3.2.0Fixed in Version3.1.1 
Summary0033043: Module StreamIO now no longer supports IO check
DescriptionThe behavior of the text I/O support functions has changed and become incompatible with Delphi. The function format changed from "function (var F: TextRec): Integer" to "procedure (var F: TextRec)". If earlier the result of the function was an error code, then now it is assumed that the procedure will write the error code into InOutRes.
As a result, the implementation of the StreamIO module does not support I/O error codes.
The new implementation is made compatible with the text I/O support functions.
The patch is included, but since there are many style fixes are made, it is probably easier to replace the entire file. It is also attached.
Steps To Reproduce{$MODE OBJFPC}
{$APPTYPE CONSOLE}
program Project1;

{$IOCHECKS OFF}

uses Classes, StreamIO;

type
  TBadStream = class(TStream)
  public
    function Write(const Buffer; Count: LongInt): LongInt; override;
  end;

function TBadStream.Write(const Buffer; Count: LongInt): LongInt;
begin
  Result := 0;
end;

var
  BadStream: TBadStream;
  DummyFile: TextFile;
begin
  BadStream := TBadStream.Create;
  try
    AssignStream(DummyFile, BadStream);
    Rewrite(DummyFile);
    try
      Writeln(DummyFile, 'Some text');
      if IOResult = 0 then
        Writeln('No error')
      else
        Writeln('I/O error occurred');
    finally
      CloseFile(DummyFile);
    end;
  finally
    BadStream.Free;
  end;
end.
Additional InformationI do not know the reasons why text I/O support functions has been changed. It may be erroneous and easier to return the old behavior. In this case, the patch is needed not for StreamIO, but for several modules in the kernel.
TagsNo tags attached.
Fixed in Revision38017
FPCOldBugId
FPCTarget
Attached Files
  • streamio.diff (4,623 bytes)
    Index: packages/fcl-base/src/streamio.pp
    ===================================================================
    --- packages/fcl-base/src/streamio.pp	(revision 37982)
    +++ packages/fcl-base/src/streamio.pp	(working copy)
    @@ -20,17 +20,17 @@
     
     interface
     
    -uses Classes,SysUtils;
    +uses SysUtils, Classes;
     
    -Procedure AssignStream(var F: Textfile; Stream: TStream);
    -Function GetStream(var F: TTextRec) : TStream;
    +procedure AssignStream(var F: TextFile; Stream: TStream);
    +function GetStream(var F: TTextRec): TStream;
     
     implementation
     
    -ResourceString
    +resourcestring
       SErrNilStream = 'Can not assign file to Nil stream';
     
    -Type
    +type
       PStream = ^TStream;
     
     { ---------------------------------------------------------------------
    @@ -37,117 +37,93 @@
         Text IO functions
       ---------------------------------------------------------------------}
     
    -
    -Function StreamRead(var F: TTextRec) : longint;
    -
    +procedure StreamRead(var F: TTextRec);
     begin
    -  Result:=0;
    -  With F do
    -    Try
    -      Bufend:=GetStream(F).Read(BufPtr^,BufSize);
    -      BufPos:=0;
    -    except
    -      Result:=100;
    -    end;
    +  try
    +    F.BufEnd := GetStream(F).Read(F.BufPtr^, F.BufSize);
    +    F.BufPos := 0;
    +  except
    +    InOutRes := 100; // see SysConsts.GetRunError
    +  end;
     end;
     
    -
    -Function StreamWrite(var F: TTextRec ): longint;
    +procedure StreamWrite(var F: TTextRec);
     begin
    -  Result:=0;
    -  with F do
    -    if (BufPos>0) then
    -      try
    -        GetStream(F).WriteBuffer(BufPtr^,BufPos);
    -        BufPos:=0;
    -      except
    -        Result:=101;
    -      end;
    +  if F.BufPos > 0 then
    +  try
    +    GetStream(F).WriteBuffer(F.BufPtr^, F.BufPos);
    +    F.BufPos := 0;
    +  except
    +    InOutRes := 101;
    +  end;
     end;
     
    -
    -Function StreamFlush(var F: TTextRec): longint;
    -
    +{$PUSH}
    +{$WARN 5024 OFF : Parameter "$1" not used}
    +procedure StreamFlush(var F: TTextRec);
     begin
    -  Result:=0;
     end;
     
    -
    -Function StreamClose(var F: TTextRec): longint;
    +procedure StreamClose(var F: TTextRec);
     begin
    -  Result:=0;
     end;
    +{$POP}
     
    -
    -Function StreamOpen(var F: TTextRec ): longint;
    -
    +procedure StreamOpen(var F: TTextRec);
     begin
    -  Result := 0;
    -  with F do
    -    begin
    -    BufPos:=0;
    -    Bufend:=0;
    -    case Mode of
    -      fmInput:
    -        begin
    -        InOutFunc:=@StreamRead;
    -        FlushFunc:=@StreamFlush;
    +  F.BufPos := 0;
    +  F.BufEnd := 0;
    +  case F.Mode of
    +    fmInput:
    +      begin
    +        F.InOutFunc := @StreamRead;
    +        F.FlushFunc := @StreamFlush;
    +      end;
    +    fmOutput, fmAppend:
    +      begin
    +        F.InOutFunc := @StreamWrite;
    +        F.FlushFunc := @StreamWrite;
    +        if F.Mode = fmAppend then
    +        try
    +          GetStream(F).Seek(0, soFromEnd);
    +        except
    +          InOutRes := 156;
             end;
    -      fmOutput,fmAppend:
    -        begin
    -        InOutFunc:=@StreamWrite;
    -        FlushFunc:=@StreamWrite;
    -        if mode=fmAppend then
    -          Try
    -            GetStream(F).Seek(0,soFromEnd);
    -          except
    -            Result:=156;
    -          end;
    -        end;
    -    end;
    -    end;
    +      end;
    +  end;
     end;
     
    -
     { ---------------------------------------------------------------------
         Public functions
       ---------------------------------------------------------------------}
     
    +procedure AssignStream(var F: TextFile; Stream: TStream);
     
    -Procedure AssignStream(var F: Textfile; Stream : TStream);
    +  procedure RaiseError;
    +  var
    +    E: EInOutError;
    +  begin
    +    E := EInOutError.CreateRes(@SErrNilStream);
    +    E.ErrorCode := 6;
    +    raise E;
    +  end;
     
    -Var
    -  E : EInoutError;
    -
     begin
    -  if (Stream=Nil) then
    -    begin
    -    E:=EInOutError.Create(SErrNilStream);
    -    E.ErrorCode:=6;
    -    Raise E;
    -    end;
    -  with TTextRec(F) do
    -    begin
    -    OpenFunc:=@StreamOpen;
    -    CloseFunc:=@StreamClose;
    - Case DefaultTextLineBreakStyle Of
    -    tlbsLF: TextRec(f).LineEnd := #10;
    -    tlbsCRLF: TextRec(f).LineEnd := #13#10;
    -    tlbsCR: TextRec(f).LineEnd := #13;
    -  End;
    -    PStream(@UserData)^:=Stream;
    -    Mode:=fmClosed;
    -    BufSize:=SizeOf(Buffer);
    -    BufPtr:=@Buffer;
    -    Name[0]:=#0;
    -    end;
    +  if Stream = nil then
    +    RaiseError;
    +  FillByte(F, SizeOf(F), 0);
    +  TTextRec(F).OpenFunc := @StreamOpen;
    +  TTextRec(F).CloseFunc := @StreamClose;
    +  TTextRec(F).LineEnd := LineEnding;
    +  PStream(@TTextRec(F).UserData)^ := Stream;
    +  TTextRec(F).Mode := fmClosed;
    +  TTextRec(F).BufSize := SizeOf(TTextRec(F).Buffer);
    +  TTextRec(F).BufPtr := @TTextRec(F).Buffer;
     end;
     
    -
    -Function GetStream(var F: TTextRec) : TStream;
    -
    +function GetStream(var F: TTextRec): TStream;
     begin
    -  Result:=PStream(@F.Userdata)^;
    +  Result := PStream(@F.UserData)^;
     end;
     
     end.
    
    streamio.diff (4,623 bytes)
  • streamio.pp (3,016 bytes)
    {
        This file is part of the Free Component Library (FCL)
        Copyright (c) 1999-2000 by the Free Pascal development team
    
        This unit converts a stream to a regular text file.
    
        See the file COPYING.FPC, included in this distribution,
        for details about the copyright.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
     **********************************************************************}
    
    {$mode objfpc}
    {$H+}
    
    unit StreamIO;
    
    interface
    
    uses SysUtils, Classes;
    
    procedure AssignStream(var F: TextFile; Stream: TStream);
    function GetStream(var F: TTextRec): TStream;
    
    implementation
    
    resourcestring
      SErrNilStream = 'Can not assign file to Nil stream';
    
    type
      PStream = ^TStream;
    
    { ---------------------------------------------------------------------
        Text IO functions
      ---------------------------------------------------------------------}
    
    procedure StreamRead(var F: TTextRec);
    begin
      try
        F.BufEnd := GetStream(F).Read(F.BufPtr^, F.BufSize);
        F.BufPos := 0;
      except
        InOutRes := 100; // see SysConsts.GetRunError
      end;
    end;
    
    procedure StreamWrite(var F: TTextRec);
    begin
      if F.BufPos > 0 then
      try
        GetStream(F).WriteBuffer(F.BufPtr^, F.BufPos);
        F.BufPos := 0;
      except
        InOutRes := 101;
      end;
    end;
    
    {$PUSH}
    {$WARN 5024 OFF : Parameter "$1" not used}
    procedure StreamFlush(var F: TTextRec);
    begin
    end;
    
    procedure StreamClose(var F: TTextRec);
    begin
    end;
    {$POP}
    
    procedure StreamOpen(var F: TTextRec);
    begin
      F.BufPos := 0;
      F.BufEnd := 0;
      case F.Mode of
        fmInput:
          begin
            F.InOutFunc := @StreamRead;
            F.FlushFunc := @StreamFlush;
          end;
        fmOutput, fmAppend:
          begin
            F.InOutFunc := @StreamWrite;
            F.FlushFunc := @StreamWrite;
            if F.Mode = fmAppend then
            try
              GetStream(F).Seek(0, soFromEnd);
            except
              InOutRes := 156;
            end;
          end;
      end;
    end;
    
    { ---------------------------------------------------------------------
        Public functions
      ---------------------------------------------------------------------}
    
    procedure AssignStream(var F: TextFile; Stream: TStream);
    
      procedure RaiseError;
      var
        E: EInOutError;
      begin
        E := EInOutError.CreateRes(@SErrNilStream);
        E.ErrorCode := 6;
        raise E;
      end;
    
    begin
      if Stream = nil then
        RaiseError;
      FillByte(F, SizeOf(F), 0);
      TTextRec(F).OpenFunc := @StreamOpen;
      TTextRec(F).CloseFunc := @StreamClose;
      TTextRec(F).LineEnd := LineEnding;
      PStream(@TTextRec(F).UserData)^ := Stream;
      TTextRec(F).Mode := fmClosed;
      TTextRec(F).BufSize := SizeOf(TTextRec(F).Buffer);
      TTextRec(F).BufPtr := @TTextRec(F).Buffer;
    end;
    
    function GetStream(var F: TTextRec): TStream;
    begin
      Result := PStream(@F.UserData)^;
    end;
    
    end.
    
    streamio.pp (3,016 bytes)

Activities

Serge Anvarov

2018-01-17 08:40

reporter  

streamio.diff (4,623 bytes)
Index: packages/fcl-base/src/streamio.pp
===================================================================
--- packages/fcl-base/src/streamio.pp	(revision 37982)
+++ packages/fcl-base/src/streamio.pp	(working copy)
@@ -20,17 +20,17 @@
 
 interface
 
-uses Classes,SysUtils;
+uses SysUtils, Classes;
 
-Procedure AssignStream(var F: Textfile; Stream: TStream);
-Function GetStream(var F: TTextRec) : TStream;
+procedure AssignStream(var F: TextFile; Stream: TStream);
+function GetStream(var F: TTextRec): TStream;
 
 implementation
 
-ResourceString
+resourcestring
   SErrNilStream = 'Can not assign file to Nil stream';
 
-Type
+type
   PStream = ^TStream;
 
 { ---------------------------------------------------------------------
@@ -37,117 +37,93 @@
     Text IO functions
   ---------------------------------------------------------------------}
 
-
-Function StreamRead(var F: TTextRec) : longint;
-
+procedure StreamRead(var F: TTextRec);
 begin
-  Result:=0;
-  With F do
-    Try
-      Bufend:=GetStream(F).Read(BufPtr^,BufSize);
-      BufPos:=0;
-    except
-      Result:=100;
-    end;
+  try
+    F.BufEnd := GetStream(F).Read(F.BufPtr^, F.BufSize);
+    F.BufPos := 0;
+  except
+    InOutRes := 100; // see SysConsts.GetRunError
+  end;
 end;
 
-
-Function StreamWrite(var F: TTextRec ): longint;
+procedure StreamWrite(var F: TTextRec);
 begin
-  Result:=0;
-  with F do
-    if (BufPos>0) then
-      try
-        GetStream(F).WriteBuffer(BufPtr^,BufPos);
-        BufPos:=0;
-      except
-        Result:=101;
-      end;
+  if F.BufPos > 0 then
+  try
+    GetStream(F).WriteBuffer(F.BufPtr^, F.BufPos);
+    F.BufPos := 0;
+  except
+    InOutRes := 101;
+  end;
 end;
 
-
-Function StreamFlush(var F: TTextRec): longint;
-
+{$PUSH}
+{$WARN 5024 OFF : Parameter "$1" not used}
+procedure StreamFlush(var F: TTextRec);
 begin
-  Result:=0;
 end;
 
-
-Function StreamClose(var F: TTextRec): longint;
+procedure StreamClose(var F: TTextRec);
 begin
-  Result:=0;
 end;
+{$POP}
 
-
-Function StreamOpen(var F: TTextRec ): longint;
-
+procedure StreamOpen(var F: TTextRec);
 begin
-  Result := 0;
-  with F do
-    begin
-    BufPos:=0;
-    Bufend:=0;
-    case Mode of
-      fmInput:
-        begin
-        InOutFunc:=@StreamRead;
-        FlushFunc:=@StreamFlush;
+  F.BufPos := 0;
+  F.BufEnd := 0;
+  case F.Mode of
+    fmInput:
+      begin
+        F.InOutFunc := @StreamRead;
+        F.FlushFunc := @StreamFlush;
+      end;
+    fmOutput, fmAppend:
+      begin
+        F.InOutFunc := @StreamWrite;
+        F.FlushFunc := @StreamWrite;
+        if F.Mode = fmAppend then
+        try
+          GetStream(F).Seek(0, soFromEnd);
+        except
+          InOutRes := 156;
         end;
-      fmOutput,fmAppend:
-        begin
-        InOutFunc:=@StreamWrite;
-        FlushFunc:=@StreamWrite;
-        if mode=fmAppend then
-          Try
-            GetStream(F).Seek(0,soFromEnd);
-          except
-            Result:=156;
-          end;
-        end;
-    end;
-    end;
+      end;
+  end;
 end;
 
-
 { ---------------------------------------------------------------------
     Public functions
   ---------------------------------------------------------------------}
 
+procedure AssignStream(var F: TextFile; Stream: TStream);
 
-Procedure AssignStream(var F: Textfile; Stream : TStream);
+  procedure RaiseError;
+  var
+    E: EInOutError;
+  begin
+    E := EInOutError.CreateRes(@SErrNilStream);
+    E.ErrorCode := 6;
+    raise E;
+  end;
 
-Var
-  E : EInoutError;
-
 begin
-  if (Stream=Nil) then
-    begin
-    E:=EInOutError.Create(SErrNilStream);
-    E.ErrorCode:=6;
-    Raise E;
-    end;
-  with TTextRec(F) do
-    begin
-    OpenFunc:=@StreamOpen;
-    CloseFunc:=@StreamClose;
- Case DefaultTextLineBreakStyle Of
-    tlbsLF: TextRec(f).LineEnd := #10;
-    tlbsCRLF: TextRec(f).LineEnd := #13#10;
-    tlbsCR: TextRec(f).LineEnd := #13;
-  End;
-    PStream(@UserData)^:=Stream;
-    Mode:=fmClosed;
-    BufSize:=SizeOf(Buffer);
-    BufPtr:=@Buffer;
-    Name[0]:=#0;
-    end;
+  if Stream = nil then
+    RaiseError;
+  FillByte(F, SizeOf(F), 0);
+  TTextRec(F).OpenFunc := @StreamOpen;
+  TTextRec(F).CloseFunc := @StreamClose;
+  TTextRec(F).LineEnd := LineEnding;
+  PStream(@TTextRec(F).UserData)^ := Stream;
+  TTextRec(F).Mode := fmClosed;
+  TTextRec(F).BufSize := SizeOf(TTextRec(F).Buffer);
+  TTextRec(F).BufPtr := @TTextRec(F).Buffer;
 end;
 
-
-Function GetStream(var F: TTextRec) : TStream;
-
+function GetStream(var F: TTextRec): TStream;
 begin
-  Result:=PStream(@F.Userdata)^;
+  Result := PStream(@F.UserData)^;
 end;
 
 end.
streamio.diff (4,623 bytes)

Serge Anvarov

2018-01-17 08:41

reporter  

streamio.pp (3,016 bytes)
{
    This file is part of the Free Component Library (FCL)
    Copyright (c) 1999-2000 by the Free Pascal development team

    This unit converts a stream to a regular text file.

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}

{$mode objfpc}
{$H+}

unit StreamIO;

interface

uses SysUtils, Classes;

procedure AssignStream(var F: TextFile; Stream: TStream);
function GetStream(var F: TTextRec): TStream;

implementation

resourcestring
  SErrNilStream = 'Can not assign file to Nil stream';

type
  PStream = ^TStream;

{ ---------------------------------------------------------------------
    Text IO functions
  ---------------------------------------------------------------------}

procedure StreamRead(var F: TTextRec);
begin
  try
    F.BufEnd := GetStream(F).Read(F.BufPtr^, F.BufSize);
    F.BufPos := 0;
  except
    InOutRes := 100; // see SysConsts.GetRunError
  end;
end;

procedure StreamWrite(var F: TTextRec);
begin
  if F.BufPos > 0 then
  try
    GetStream(F).WriteBuffer(F.BufPtr^, F.BufPos);
    F.BufPos := 0;
  except
    InOutRes := 101;
  end;
end;

{$PUSH}
{$WARN 5024 OFF : Parameter "$1" not used}
procedure StreamFlush(var F: TTextRec);
begin
end;

procedure StreamClose(var F: TTextRec);
begin
end;
{$POP}

procedure StreamOpen(var F: TTextRec);
begin
  F.BufPos := 0;
  F.BufEnd := 0;
  case F.Mode of
    fmInput:
      begin
        F.InOutFunc := @StreamRead;
        F.FlushFunc := @StreamFlush;
      end;
    fmOutput, fmAppend:
      begin
        F.InOutFunc := @StreamWrite;
        F.FlushFunc := @StreamWrite;
        if F.Mode = fmAppend then
        try
          GetStream(F).Seek(0, soFromEnd);
        except
          InOutRes := 156;
        end;
      end;
  end;
end;

{ ---------------------------------------------------------------------
    Public functions
  ---------------------------------------------------------------------}

procedure AssignStream(var F: TextFile; Stream: TStream);

  procedure RaiseError;
  var
    E: EInOutError;
  begin
    E := EInOutError.CreateRes(@SErrNilStream);
    E.ErrorCode := 6;
    raise E;
  end;

begin
  if Stream = nil then
    RaiseError;
  FillByte(F, SizeOf(F), 0);
  TTextRec(F).OpenFunc := @StreamOpen;
  TTextRec(F).CloseFunc := @StreamClose;
  TTextRec(F).LineEnd := LineEnding;
  PStream(@TTextRec(F).UserData)^ := Stream;
  TTextRec(F).Mode := fmClosed;
  TTextRec(F).BufSize := SizeOf(TTextRec(F).Buffer);
  TTextRec(F).BufPtr := @TTextRec(F).Buffer;
end;

function GetStream(var F: TTextRec): TStream;
begin
  Result := PStream(@F.UserData)^;
end;

end.
streamio.pp (3,016 bytes)

Thaddy de Koning

2018-01-17 16:33

reporter   ~0105881

Last edited: 2018-01-17 16:38

View 5 revisions

Using try /except in the context of IOResult does not seem right *at all*. This is also *not* Delphi compatible. That particular code is of course exception block free...also in Delphi.
Please explain, I don't get this....
The codeflow should be similar to e.g. C style IO error checking and not rely any on exceptions at all. This paradigm is to avoid exceptions at all cost, not introducing them through a back-door. It would hurt a lot of my code very badly.

I also do not understand what should have been changed? SVN doesn't tell me a lot? Bogus.

Marco van de Voort

2018-01-17 17:11

manager   ~0105883

Last edited: 2018-01-17 17:11

View 2 revisions

I think he means textrec internals are not the same as delphi. (probably predate Delphi compatibility, the question is more what does TP do?)

Still, the unit does use functions, while text.inc casts them to procedures:

 FileFunc = Procedure(var t : TextRec);

It is a pity that the patch is unclean and contains formatting changes, and not just essential changes, now it will have to wait till I have more time.

Thaddy de Koning

2018-01-17 17:30

reporter   ~0105885

Last edited: 2018-01-17 17:34

View 2 revisions

No, the patch should not rely on exceptions. That is my point. And it will break code.
But indeed, the *internals* of textrec are completely different.

Anyway: using exceptions in such low-level code is a "no no, plz help me god"
No way!

Marco van de Voort

2018-01-17 17:48

manager   ~0105886

Last edited: 2018-01-17 18:58

View 2 revisions

The patch does not add exceptions. It just modifies the body of the exception handler.

If you have something against the exceptions in that unit, please file a separate bug with precise, substantiated details. This is not a programming style discussion group.

Thaddy de Koning

2018-01-17 21:18

reporter   ~0105892

Last edited: 2018-01-17 21:19

View 2 revisions

Will do. Exceptions have no place there. That is code rot.

Serge Anvarov

2018-01-19 00:01

reporter   ~0105919

@Thaddy, where did you see the block "try except"? If in StreamIO, then this is normal and it was. If in the example - then read it carefully. I'm using the usual block "try finally". Or you already consider this a mistake? This has nothing to do with IOResult.

Michael Van Canneyt

2018-01-19 13:30

administrator   ~0105937

Can you please indicate where this change of behaviour has occurred according to you ?

As far as I can see, the signature of these functions has not changed in years.
If you look at text.inc, you'll see that the default implementation has been a procedure since revision 1.

The real problem is IMO that the function pointers in the text rec are untyped :(

Serge Anvarov

2018-01-20 04:26

reporter   ~0105947

Last edited: 2018-01-20 05:18

View 2 revisions

In text.inc this is the procedure. In StreamIO.pp, this is a function. Hence the error was originally (the summary can be changed to "Module StreamIO does not support I/O checking"). Apparently the module was written for Delphi, where it's a function, not a procedure.
The above example works with an error. If you apply a patch, it works as it should.

Thaddy de Koning

2018-01-20 15:22

reporter   ~0105955

function would be better: can refrain from all exceptions and streamio behaves better: you can Set InOutRes and return IOresult values throughout.

Michael Van Canneyt

2018-01-20 15:42

administrator   ~0105957

Fixed the signature of the procedures.
I didn't use your patch, it contains too much cosmetic changes.

@Thaddy, changing the signature of the functions in TTextRec is not an option, since it would require to change the implementation of all file routines, also of routines that we do not know about.

Issue History

Date Modified Username Field Change
2018-01-17 08:40 Serge Anvarov New Issue
2018-01-17 08:40 Serge Anvarov File Added: streamio.diff
2018-01-17 08:41 Serge Anvarov File Added: streamio.pp
2018-01-17 16:33 Thaddy de Koning Note Added: 0105881
2018-01-17 16:35 Thaddy de Koning Note Edited: 0105881 View Revisions
2018-01-17 16:36 Thaddy de Koning Note Edited: 0105881 View Revisions
2018-01-17 16:37 Thaddy de Koning Note Edited: 0105881 View Revisions
2018-01-17 16:38 Thaddy de Koning Note Edited: 0105881 View Revisions
2018-01-17 17:11 Marco van de Voort Note Added: 0105883
2018-01-17 17:11 Marco van de Voort Note Edited: 0105883 View Revisions
2018-01-17 17:30 Thaddy de Koning Note Added: 0105885
2018-01-17 17:34 Thaddy de Koning Note Edited: 0105885 View Revisions
2018-01-17 17:48 Marco van de Voort Note Added: 0105886
2018-01-17 18:58 Marco van de Voort Note Edited: 0105886 View Revisions
2018-01-17 21:18 Thaddy de Koning Note Added: 0105892
2018-01-17 21:19 Thaddy de Koning Note Edited: 0105892 View Revisions
2018-01-19 00:01 Serge Anvarov Note Added: 0105919
2018-01-19 13:21 Michael Van Canneyt Assigned To => Michael Van Canneyt
2018-01-19 13:21 Michael Van Canneyt Status new => assigned
2018-01-19 13:30 Michael Van Canneyt Note Added: 0105937
2018-01-19 13:30 Michael Van Canneyt Status assigned => feedback
2018-01-20 04:26 Serge Anvarov Note Added: 0105947
2018-01-20 04:26 Serge Anvarov Status feedback => assigned
2018-01-20 05:18 Serge Anvarov Note Edited: 0105947 View Revisions
2018-01-20 15:22 Thaddy de Koning Note Added: 0105955
2018-01-20 15:42 Michael Van Canneyt Fixed in Revision => 38017
2018-01-20 15:42 Michael Van Canneyt Note Added: 0105957
2018-01-20 15:42 Michael Van Canneyt Status assigned => resolved
2018-01-20 15:42 Michael Van Canneyt Fixed in Version => 3.1.1
2018-01-20 15:42 Michael Van Canneyt Resolution open => fixed
2018-01-20 15:42 Michael Van Canneyt Target Version => 3.2.0