diff --git a/dlanguilib.visualdproj b/dlanguilib.visualdproj
index b75b2ffe..db4f5a74 100644
--- a/dlanguilib.visualdproj
+++ b/dlanguilib.visualdproj
@@ -383,6 +383,7 @@
+
@@ -398,16 +399,16 @@
-
-
-
-
+
+
+
+
diff --git a/src/dlangui/core/editable.d b/src/dlangui/core/editable.d
index 128fd8b9..fe8fb8d0 100644
--- a/src/dlangui/core/editable.d
+++ b/src/dlangui/core/editable.d
@@ -21,8 +21,8 @@ import dlangui.core.logger;
import dlangui.core.signals;
import dlangui.core.collections;
import dlangui.core.linestream;
+import dlangui.core.streams;
import std.algorithm;
-import std.stream;
import std.conv : to;
// uncomment FileFormats debug symbol to dump file formats for loaded/saved files.
@@ -1379,7 +1379,7 @@ class EditableContent {
bool load(string filename) {
clear();
try {
- std.stream.File f = new std.stream.File(filename);
+ InputStream f = new FileInputStream(filename);
scope(exit) { f.close(); }
return load(f, filename);
} catch (Exception e) {
@@ -1418,7 +1418,7 @@ class EditableContent {
if (!filename)
filename = _filename;
try {
- std.stream.File f = new std.stream.File(filename, FileMode.OutNew);
+ OutputStream f = new FileOutputStream(filename);
scope(exit) { f.close(); }
return save(f, filename, format);
} catch (Exception e) {
diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d
index 50ebe2f5..219e560c 100644
--- a/src/dlangui/core/events.d
+++ b/src/dlangui/core/events.d
@@ -514,7 +514,7 @@ struct ButtonDetails {
return _doubleClick;
}
- static final long DOUBLE_CLICK_THRESHOLD_MS = 200;
+ static long DOUBLE_CLICK_THRESHOLD_MS = 200;
void reset() {
diff --git a/src/dlangui/core/linestream.d b/src/dlangui/core/linestream.d
index 7c4ee849..ff72b241 100644
--- a/src/dlangui/core/linestream.d
+++ b/src/dlangui/core/linestream.d
@@ -50,7 +50,8 @@ Authors: Vadim Lopatin, coolreader.org@gmail.com
*/
module dlangui.core.linestream;
-import std.stream;
+import dlangui.core.streams;
+//import std.stream;
import std.stdio;
import std.conv;
import std.utf;
@@ -128,7 +129,7 @@ class OutputLineStream {
protected void flush() {
if (_len > 0) {
- _stream.writeExact(_buf.ptr, _len);
+ _stream.write(cast(ubyte[])_buf[0 .. _len]);
_len = 0;
}
}
@@ -483,7 +484,7 @@ class LineStream {
data[0] = 0xEF;
data[1] = 0xBB;
data[2] = 0xBF;
- MemoryStream stream = new MemoryStream(data);
+ InputStream stream = new MemoryInputStream(data); //new MemoryStream(data);
return create(stream, filename);
}
diff --git a/src/dlangui/core/logger.d b/src/dlangui/core/logger.d
index fff11f6a..ef0cd05b 100644
--- a/src/dlangui/core/logger.d
+++ b/src/dlangui/core/logger.d
@@ -32,7 +32,7 @@ Authors: Vadim Lopatin, coolreader.org@gmail.com
module dlangui.core.logger;
import std.stdio;
-import std.datetime;
+import std.datetime : SysTime, Clock;
/// Log levels
enum LogLevel : int {
@@ -117,7 +117,7 @@ synchronized class Log {
void log(S...)(LogLevel level, S args) {
if (logLevel >= level && logFile.isOpen) {
SysTime ts = Clock.currTime();
- logFile.writef("%04d-%02d-%02d %02d:%02d:%02d.%03d %s ", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fracSec.msecs, logLevelName(level));
+ logFile.writef("%04d-%02d-%02d %02d:%02d:%02d.%03d %s ", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fracSecs.split!("msecs").msecs, logLevelName(level));
logFile.writeln(args);
logFile.flush();
}
diff --git a/src/dlangui/core/streams.d b/src/dlangui/core/streams.d
new file mode 100644
index 00000000..93ef166a
--- /dev/null
+++ b/src/dlangui/core/streams.d
@@ -0,0 +1,80 @@
+module dlangui.core.streams;
+
+private import std.stdio;
+
+interface Closeable {
+ void close();
+ @property bool isOpen();
+}
+
+interface InputStream : Closeable {
+ size_t read(ubyte[] buffer);
+ @property bool eof();
+}
+
+interface OutputStream : Closeable {
+ void write(ubyte[] data);
+}
+
+class FileInputStream : InputStream {
+ std.stdio.File _file;
+ this(string filename) {
+ _file = std.stdio.File(filename, "rb");
+ }
+ void close() {
+ _file.close();
+ }
+ size_t read(ubyte[] buffer) {
+ ubyte[] res = _file.rawRead(buffer);
+ return res.length;
+ }
+ @property bool isOpen() {
+ return _file.isOpen;
+ }
+ @property bool eof() {
+ return _file.eof;
+ }
+}
+
+class FileOutputStream : OutputStream {
+ std.stdio.File _file;
+ this(string filename) {
+ _file = std.stdio.File(filename, "wb");
+ }
+ void close() {
+ _file.close();
+ }
+ void write(ubyte[] data) {
+ _file.rawWrite(data);
+ }
+ @property bool isOpen() {
+ return _file.isOpen;
+ }
+}
+
+class MemoryInputStream : InputStream {
+ private ubyte[] _data;
+ private size_t _pos;
+ private bool _closed;
+ this(ubyte[] data) {
+ _data = data;
+ _closed = false;
+ _pos = 0;
+ }
+ void close() {
+ _closed = true;
+ }
+ @property bool isOpen() {
+ return !_closed;
+ }
+ size_t read(ubyte[] buffer) {
+ size_t bytesRead = 0;
+ for (size_t i = 0; i < buffer.length && _pos < _data.length; bytesRead++) {
+ buffer[i++] = _data[_pos++];
+ }
+ return bytesRead;
+ }
+ @property bool eof() {
+ return _closed || (_pos >= _data.length);
+ }
+}
diff --git a/src/dlangui/graphics/images.d b/src/dlangui/graphics/images.d
index b260e199..e31d6b5d 100644
--- a/src/dlangui/graphics/images.d
+++ b/src/dlangui/graphics/images.d
@@ -40,7 +40,7 @@ import dlangui.core.logger;
import dlangui.core.types;
import dlangui.graphics.colors;
import dlangui.graphics.drawbuf;
-import std.stream;
+import dlangui.core.streams;
import std.path;
import std.conv : to;
diff --git a/src/dlangui/widgets/editors.d b/src/dlangui/widgets/editors.d
index a1aa3adc..5d3473ba 100644
--- a/src/dlangui/widgets/editors.d
+++ b/src/dlangui/widgets/editors.d
@@ -36,7 +36,7 @@ import dlangui.graphics.colors;
public import dlangui.core.editable;
import std.algorithm;
-import std.stream;
+import dlangui.core.streams;
/// Modified state change listener
interface ModifiedStateListener {