diff --git a/source/eventcore/driver.d b/source/eventcore/driver.d index 554af06..c8ed56e 100644 --- a/source/eventcore/driver.d +++ b/source/eventcore/driver.d @@ -12,6 +12,7 @@ interface EventDriver { @property EventDriverEvents events(); @property EventDriverSignals signals(); @property EventDriverSockets sockets(); + @property EventDriverDNS dns(); @property EventDriverFiles files(); @property EventDriverWatchers watchers(); @@ -106,6 +107,12 @@ interface EventDriverSockets { void releaseRef(SocketFD descriptor); } +interface EventDriverDNS { +@safe: /*@nogc:*/ nothrow: + DNSLookupID lookupHost(string name, DNSLookupCallback on_lookup_finished); + void cancelLookup(DNSLookupID handle); +} + interface EventDriverFiles { @safe: /*@nogc:*/ nothrow: FileFD open(string path, FileOpenMode mode); @@ -202,6 +209,7 @@ alias ConnectCallback = void delegate(StreamSocketFD, ConnectStatus); alias AcceptCallback = void delegate(StreamListenSocketFD, StreamSocketFD); alias IOCallback = void delegate(StreamSocketFD, IOStatus, size_t); alias DatagramIOCallback = void delegate(DatagramSocketFD, IOStatus, size_t, scope Address); +alias DNSLookupCallback = void delegate(DNSLookupID, scope Address[] results); alias FileIOCallback = void delegate(FileFD, IOStatus, size_t); alias EventCallback = void delegate(EventID); alias SignalCallback = void delegate(int); @@ -315,3 +323,4 @@ alias EventID = Handle!("Event", FD); alias TimerID = Handle!("Timer", int); alias WatcherID = Handle!("Watcher", int); alias EventWaitID = Handle!("EventWait", int); +alias DNSLookupID = Handle!("DNS", int); diff --git a/source/eventcore/drivers/libasync.d b/source/eventcore/drivers/libasync.d index c2fb831..828d7ae 100644 --- a/source/eventcore/drivers/libasync.d +++ b/source/eventcore/drivers/libasync.d @@ -14,6 +14,7 @@ final class LibasyncEventDriver : EventDriver { LibasyncEventDriverCore m_core; LibasyncEventDriverFiles m_files; LibasyncEventDriverSockets m_sockets; + LibasyncEventDriverDNS m_dns; LibasyncEventDriverTimers m_timers; LibasyncEventDriverEvents m_events; LibasyncEventDriverSignals m_signals; @@ -25,6 +26,7 @@ final class LibasyncEventDriver : EventDriver { m_core = new LibasyncEventDriverCore(); m_files = new LibasyncEventDriverFiles(); m_sockets = new LibasyncEventDriverSockets(); + m_dns = new LibasyncEventDriverDNS(); m_timers = new LibasyncEventDriverTimers(); m_events = new LibasyncEventDriverEvents(); m_signals = new LibasyncEventDriverSignals(); @@ -34,19 +36,20 @@ final class LibasyncEventDriver : EventDriver { override @property LibasyncEventDriverCore core() { return m_core; } override @property LibasyncEventDriverFiles files() { return m_files; } override @property LibasyncEventDriverSockets sockets() { return m_sockets; } + override @property LibasyncEventDriverDNS dns() { return m_dns; } override @property LibasyncEventDriverTimers timers() { return m_timers; } override @property LibasyncEventDriverEvents events() { return m_events; } override @property LibasyncEventDriverSignals signals() { return m_signals; } override @property LibasyncEventDriverWatchers watchers() { return m_watchers; } -} -final class LibasyncEventDriverCore : EventDriverCore { -@safe: /*@nogc:*/ nothrow: override void dispose() { assert(false, "TODO!"); } +} +final class LibasyncEventDriverCore : EventDriverCore { +@safe: /*@nogc:*/ nothrow: override size_t waiterCount() { assert(false, "TODO!"); @@ -130,6 +133,31 @@ final class LibasyncEventDriverSockets : EventDriverSockets { assert(false, "TODO!"); } + override DatagramSocketFD createDatagramSocket(scope Address bind_address, scope Address target_address) + { + assert(false, "TODO!"); + } + + override void receive(DatagramSocketFD socket, ubyte[] buffer, IOMode mode, DatagramIOCallback on_receive_finish) + { + assert(false, "TODO!"); + } + + override void cancelReceive(DatagramSocketFD socket) + { + assert(false, "TODO!"); + } + + override void send(DatagramSocketFD socket, const(ubyte)[] buffer, IOMode mode, DatagramIOCallback on_send_finish, Address target_address = null) + { + assert(false, "TODO!"); + } + + override void cancelSend(DatagramSocketFD socket) + { + assert(false, "TODO!"); + } + override void addRef(SocketFD descriptor) { assert(false, "TODO!"); @@ -141,6 +169,21 @@ final class LibasyncEventDriverSockets : EventDriverSockets { } } +final class LibasyncEventDriverDNS : EventDriverDNS { +@safe: /*@nogc:*/ nothrow: + + DNSLookupID lookupHost(string name, DNSLookupCallback on_lookup_finished) + { + assert(false, "TODO!"); + } + + void cancelLookup(DNSLookupID handle) + { + assert(false, "TODO!"); + } +} + + final class LibasyncEventDriverFiles : EventDriverFiles { @safe: /*@nogc:*/ nothrow: override FileFD open(string path, FileOpenMode mode) @@ -153,12 +196,22 @@ final class LibasyncEventDriverFiles : EventDriverFiles { assert(false, "TODO!"); } - override void write(FileFD file, ulong offset, ubyte[] buffer, IOCallback on_write_finish) + override void close(FileFD file) { assert(false, "TODO!"); } - override void read(FileFD file, ulong offset, ubyte[] buffer, IOCallback on_read_finish) + override ulong getSize(FileFD file) + { + assert(false, "TODO!"); + } + + override void write(FileFD file, ulong offset, const(ubyte)[] buffer, FileIOCallback on_write_finish) + { + assert(false, "TODO!"); + } + + override void read(FileFD file, ulong offset, ubyte[] buffer, FileIOCallback on_read_finish) { assert(false, "TODO!"); } diff --git a/source/eventcore/drivers/posix.d b/source/eventcore/drivers/posix.d index 8b2eb82..8752ef4 100644 --- a/source/eventcore/drivers/posix.d +++ b/source/eventcore/drivers/posix.d @@ -46,6 +46,7 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver { alias SignalsDriver = PosixEventDriverSignals!Loop; alias TimerDriver = LoopTimeoutTimerDriver; alias SocketsDriver = PosixEventDriverSockets!Loop; + alias DNSDriver = EventDriverDNS_GAI!(EventsDriver, SignalsDriver); alias FileDriver = ThreadedFileEventDriver!EventsDriver; alias WatcherDriver = PosixEventDriverWatchers!Loop; @@ -55,6 +56,7 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver { SignalsDriver m_signals; LoopTimeoutTimerDriver m_timers; SocketsDriver m_sockets; + DNSDriver m_dns; FileDriver m_files; WatcherDriver m_watchers; } @@ -67,6 +69,7 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver { m_timers = new TimerDriver; m_core = new CoreDriver(m_loop, m_timers); m_sockets = new SocketsDriver(m_loop); + m_dns = new DNSDriver(m_events, m_signals); m_files = new FileDriver(m_events); m_watchers = new WatcherDriver(m_loop); } @@ -77,6 +80,7 @@ final class PosixEventDriver(Loop : PosixEventLoop) : EventDriver { final override @property SignalsDriver signals() { return m_signals; } final override @property TimerDriver timers() { return m_timers; } final override @property SocketsDriver sockets() { return m_sockets; } + final override @property DNSDriver dns() { return m_dns; } final override @property FileDriver files() { return m_files; } final override @property WatcherDriver watchers() { return m_watchers; } @@ -747,6 +751,25 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets } +/// getaddrinfo_a based asynchronous lookups +final class EventDriverDNS_GAI(Events : EventDriverEvents, Signals : EventDriverSignals) : EventDriverDNS { + this(Events events, Signals signals) + { + } + + + override DNSLookupID lookupHost(string name, DNSLookupCallback on_lookup_finished) + { + assert(false, "TODO!"); + } + + override void cancelLookup(DNSLookupID handle) + { + assert(false, "TODO!"); + } +} + + final class PosixEventDriverEvents(Loop : PosixEventLoop) : EventDriverEvents { @safe: /*@nogc:*/ nothrow: private Loop m_loop;