Implemented reuse server socket parameter
[delight/dlt-lib.git] / dlt / _externals.dlt
blobfb3c19e3eebd8828f6afd11f5ca5584695920ad4
1 module dlt._externals
3 # Do not import this module. It is used internally when instantiating the Main class.
5 static import std.c.stdlib
6 import dlt.io: Printer
7 import stdio = std.stdio
8 import cstream = std.cstream
9 import std.date
10 import dlt.log: LogManager, StreamAppender
11 import dlt.time: Clock
12 import dlt.io: FileSystem, format
13 import dlt.net
14 import socket = std.socket
15 import std.string: split, atoi
16 import dlt.externals.fs: HostFS
17 import dlt.externals.net: HostNetwork
19 Clock systemClock
20 LogManager logManager
22 # TODO: this is a mess. It creates dependencies on all kinds of modules. The system
23 # get these from all over the place.
25 class Externals:
26         Printer? _stdout, _stderr
27         Network? _network
28         FileSystem? _fs
30         public Printer stdout():
31                 if not _stdout:
32                         _stdout = new Printer(cstream.dout)
33                 return notnull(_stdout)
35         public Printer stderr():
36                 if not _stderr:
37                         _stderr = new Printer(cstream.derr)
38                 return notnull(_stderr)
40         public FileSystem fs():
41                 if not _fs: _fs = new HostFS()
42                 return notnull(_fs)
44         public Clock systemClock():
45                 return .systemClock
47         public void SystemExit(dlt.core.SystemExit ex):
48                 Printer err = stderr()
49                 err.write(ex.toString())
50                 err.write("\n")
51                 err.flush()
52                 std.c.stdlib.exit(ex.exitCode)
54         public LogManager logManager():
55                 return .logManager
57         public ServerSocketFactory serverSocketFactory():
58                 return network.server
60         public ClientSocketFactory clientSocketFactory():
61                 return network.client
63         public Network network():
64                 if not _network:
65                         _network = new HostNetwork()
66                 return notnull(_network)
68 class HostClock extends Clock:
69         Date now():
70                 Date dt
71                 d_time t = getUTCtime()
73                 dt.year = YearFromTime(t)
74                 dt.month = MonthFromTime(t) + 1
75                 dt.day = DateFromTime(t) + 1
77                 dt.hour = HourFromTime(t)
78                 dt.minute = MinFromTime(t)
79                 dt.second = SecFromTime(t)
80                 dt.ms = msFromTime(t)
82                 dt.weekday = WeekDay(t)
83                 dt.tzcorrection = LocalTZA + DaylightSavingTA(t)
85                 return dt
87         override string toString():
88                 Date n = now
89                 return format("{:d4}-{:d2}-{:d2} {:d2}:{:d2}:{:d2},{:d3}",
90                         n.year,
91                         n.month,
92                         n.day,
93                         n.hour,
94                         n.minute,
95                         n.second,
96                         n.ms).idup
98 void log_impl(int level, string src, string msg, ...):
99         logManager.log(level, src, msg, _arguments, _argptr)
101 # Unit-tests get run before main. Make sure logging is available so they don't crash.
102 static this():
103         logManager = new LogManager()
104         systemClock = new HostClock()
105         __log = &log_impl
106         logManager.appenders ~= new StreamAppender(new Printer(cstream.derr), systemClock)