src/transport.c
branchnew-transport
changeset 155 c59d3eaff0fb
parent 154 f4472119de3b
child 156 6534a4ac957b
--- a/src/transport.c	Tue Apr 28 17:52:48 2009 +0300
+++ b/src/transport.c	Tue Apr 28 20:27:45 2009 +0300
@@ -1,14 +1,15 @@
 #include "transport_internal.h"
 
+#include <assert.h>
 
-void transport_bind (transport_t *transport, const struct transport_type *type, const struct transport_info *info)
+void transport_init (transport_t *transport, const struct transport_type *type, const struct transport_info *info)
 {
     // not already bound
-    assert(!transport->type && !transport->info);
+    assert(!transport->type);
 
     // store
     transport->type = type;
-    *transport->info = info;
+    transport->info = *info;
 }
 
 void* transport_check (transport_t *transport, const struct transport_type *type)
@@ -19,3 +20,44 @@
     // ok
     return transport;
 }
+
+void transport_connected (transport_t *transport, const error_t *err, bool direct)
+{
+    // update state
+    transport->connected = true;
+
+    if (direct || !transport->type->methods._connected) {
+        // user callback
+        if (err)
+            // connect failed
+            transport->info.cb_tbl->on_error(transport, err, transport->info.cb_arg);
+        else
+            // connect succesfull
+            transport->info.cb_tbl->on_connect(transport, transport->info.cb_arg);
+
+    } else {
+        // wrapper method
+        transport->type->methods._connected(transport, err);
+    }
+}
+
+void transport_invoke (transport_t *transport, short what)
+{
+    // on_ready
+    if (what & TRANSPORT_READ && transport->info.cb_tbl->on_read)
+        transport->info.cb_tbl->on_read(transport, transport->info.cb_arg);
+
+    // on_write
+    if (what & TRANSPORT_WRITE && transport->info.cb_tbl->on_write)
+        transport->info.cb_tbl->on_write(transport, transport->info.cb_arg);
+
+}
+
+void transport_error (transport_t *transport, const error_t *err)
+{
+    // update state
+    transport->connected = false;
+
+    // invoke callback
+    transport->info.cb_tbl->on_error(transport, err, transport->info.cb_arg);
+}