summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@googlemail.com>2012-11-18 00:21:33 +0000
committerDominik Picheta <dominikpicheta@googlemail.com>2012-11-18 00:21:33 +0000
commitc841a09592f9807a6ea64ddff2f698f1412215dc (patch)
tree531745019ec1dc1ddb1051e013930a8f5599b80a
parent1047c4414cf247dd0499aaef3813d2f28048e731 (diff)
downloadNim-c841a09592f9807a6ea64ddff2f698f1412215dc.tar.gz
Async fixes for IRC module.
-rw-r--r--lib/pure/irc.nim19
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/pure/irc.nim b/lib/pure/irc.nim
index c546b25db..81a1befb5 100644
--- a/lib/pure/irc.nim
+++ b/lib/pure/irc.nim
@@ -33,7 +33,12 @@ type
     address: string
     port: TPort
     nick, user, realname, serverPass: string
-    sock: TSocket
+    case isAsync: bool
+    of false:
+      sock: TSocket
+    of true:
+      handleEvent: proc (irc: var TAsyncIRC, ev: TIRCEvent) {.closure.}
+      asyncSock: PAsyncSocket
     status: TInfo
     lastPing: float
     lastPong: float
@@ -44,8 +49,6 @@ type
 
   PAsyncIRC* = ref TAsyncIRC
   TAsyncIRC* = object of TIRC
-    handleEvent: proc (irc: var TAsyncIRC, ev: TIRCEvent) {.closure.}
-    asyncSock: PAsyncSocket
 
   TIRCMType* = enum
     MUnknown,
@@ -92,7 +95,10 @@ proc send*(irc: var TIRC, message: string, sendImmediately = false) =
 
   if sendMsg:
     try:
-      irc.sock.send(message & "\c\L")
+      if irc.isAsync:
+        irc.asyncSock.send(message & "\c\L")
+      else:
+        irc.sock.send(message & "\c\L")
     except EOS:
       # Assuming disconnection of every EOS could be bad,
       # but I can't exactly check for EBrokenPipe.
@@ -359,10 +365,10 @@ proc handleRead(s: PAsyncSocket, irc: PAsyncIRC) =
       var ev: TIRCEvent
       irc[].close()
       ev.typ = EvDisconnected
-      irc.handleEvent(irc[], ev)
+      irc[].handleEvent(irc[], ev)
     else:
       var ev = irc[].processLine(line.string)
-      irc.handleEvent(irc[], ev)
+      irc[].handleEvent(irc[], ev)
 
 discard """proc handleRead(h: PObject) =
   var irc = PAsyncIRC(h)
@@ -409,6 +415,7 @@ proc asyncIRC*(address: string, port: TPort = 6667.TPort,
   ## synchronous IRC client implementation, use ``irc`` for that.
   
   new(result)
+  result.isAsync = true
   result.address = address
   result.port = port
   result.nick = nick