diff options
Diffstat (limited to 'Presence/XMPPServer.hs')
-rw-r--r-- | Presence/XMPPServer.hs | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/Presence/XMPPServer.hs b/Presence/XMPPServer.hs index 19e721b0..cf7aca70 100644 --- a/Presence/XMPPServer.hs +++ b/Presence/XMPPServer.hs | |||
@@ -8,6 +8,8 @@ module XMPPServer | |||
8 | ( xmppServer | 8 | ( xmppServer |
9 | , quitXmpp | 9 | , quitXmpp |
10 | , ConnectionKey(..) | 10 | , ConnectionKey(..) |
11 | , ConnectionData(..) | ||
12 | , ConnectionType(..) | ||
11 | , XMPPServerParameters(..) | 13 | , XMPPServerParameters(..) |
12 | , XMPPServer | 14 | , XMPPServer |
13 | , xmppConnections | 15 | , xmppConnections |
@@ -202,7 +204,7 @@ data XMPPServerParameters = | |||
202 | , xmppTellMyNameToPeer :: SockAddr -> IO Text | 204 | , xmppTellMyNameToPeer :: SockAddr -> IO Text |
203 | , xmppTellClientHisName :: ConnectionKey -> IO Text | 205 | , xmppTellClientHisName :: ConnectionKey -> IO Text |
204 | , xmppTellPeerHisName :: ConnectionKey -> IO Text | 206 | , xmppTellPeerHisName :: ConnectionKey -> IO Text |
205 | , xmppNewConnection :: ConnectionKey -> SockAddr -> TChan Stanza -> IO () | 207 | , xmppNewConnection :: ConnectionKey -> ConnectionData -> TChan Stanza -> IO () |
206 | , xmppEOF :: ConnectionKey -> IO () | 208 | , xmppEOF :: ConnectionKey -> IO () |
207 | , xmppRosterBuddies :: ConnectionKey -> IO [Text] | 209 | , xmppRosterBuddies :: ConnectionKey -> IO [Text] |
208 | , xmppRosterSubscribers :: ConnectionKey -> IO [Text] | 210 | , xmppRosterSubscribers :: ConnectionKey -> IO [Text] |
@@ -902,7 +904,7 @@ makePong namespace mid to from = | |||
902 | ] | 904 | ] |
903 | 905 | ||
904 | 906 | ||
905 | xmppInbound :: Server ConnectionKey SockAddr releaseKey XML.Event | 907 | xmppInbound :: Server ConnectionKey ConnectionData releaseKey XML.Event |
906 | -> XMPPServerParameters | 908 | -> XMPPServerParameters |
907 | -> ConnectionKey | 909 | -> ConnectionKey |
908 | -> SockAddr | 910 | -> SockAddr |
@@ -1250,16 +1252,16 @@ slotsToSource slots nesting lastStanza needsFlush rdone = | |||
1250 | ,readTMVar rdone >> return (return ()) | 1252 | ,readTMVar rdone >> return (return ()) |
1251 | ] | 1253 | ] |
1252 | 1254 | ||
1253 | forkConnection :: Server ConnectionKey SockAddr releaseKey XML.Event | 1255 | forkConnection :: Server ConnectionKey ConnectionData releaseKey XML.Event |
1254 | -> XMPPServerParameters | 1256 | -> XMPPServerParameters |
1255 | -> ConnectionKey | 1257 | -> ConnectionKey |
1256 | -> SockAddr | 1258 | -> ConnectionData |
1257 | -> FlagCommand | 1259 | -> FlagCommand |
1258 | -> Source IO XML.Event | 1260 | -> Source IO XML.Event |
1259 | -> Sink (Flush XML.Event) IO () | 1261 | -> Sink (Flush XML.Event) IO () |
1260 | -> TChan Stanza | 1262 | -> TChan Stanza |
1261 | -> IO (TChan Stanza) | 1263 | -> IO (TChan Stanza) |
1262 | forkConnection sv xmpp k laddr pingflag src snk stanzas = do | 1264 | forkConnection sv xmpp k (ConnectionData laddr _) pingflag src snk stanzas = do |
1263 | let (namespace,tellmyname) = case k of | 1265 | let (namespace,tellmyname) = case k of |
1264 | ClientKey {} -> ("jabber:client", xmppTellMyNameToClient xmpp k) | 1266 | ClientKey {} -> ("jabber:client", xmppTellMyNameToClient xmpp k) |
1265 | PeerKey {} -> ("jabber:server",xmppTellMyNameToPeer xmpp laddr) | 1267 | PeerKey {} -> ("jabber:server",xmppTellMyNameToPeer xmpp laddr) |
@@ -1404,7 +1406,7 @@ data PeerState | |||
1404 | | PeerConnected (TChan Stanza) | 1406 | | PeerConnected (TChan Stanza) |
1405 | -} | 1407 | -} |
1406 | 1408 | ||
1407 | peerKey :: SocketLike sock => Maybe SockAddr -> sock -> IO (ConnectionKey,SockAddr) | 1409 | peerKey :: SocketLike sock => Maybe SockAddr -> sock -> IO (ConnectionKey,ConnectionData) |
1408 | peerKey outgoingPeerPort sock = do | 1410 | peerKey outgoingPeerPort sock = do |
1409 | addr <- getSocketName sock | 1411 | addr <- getSocketName sock |
1410 | peer <- | 1412 | peer <- |
@@ -1413,13 +1415,13 @@ peerKey outgoingPeerPort sock = do | |||
1413 | else return addr -- Weird hack: addr is would-be peer name | 1415 | else return addr -- Weird hack: addr is would-be peer name |
1414 | laddr <- getSocketName sock | 1416 | laddr <- getSocketName sock |
1415 | let peerport = fromMaybe 5269 $ outgoingPeerPort >>= sockAddrPort | 1417 | let peerport = fromMaybe 5269 $ outgoingPeerPort >>= sockAddrPort |
1416 | return $ (PeerKey (peer `withPort` fromIntegral peerport),laddr) | 1418 | return $ (PeerKey (peer `withPort` fromIntegral peerport),ConnectionData laddr XMPP) |
1417 | 1419 | ||
1418 | clientKey :: SocketLike sock => sock -> IO (ConnectionKey,SockAddr) | 1420 | clientKey :: SocketLike sock => sock -> IO (ConnectionKey,ConnectionData) |
1419 | clientKey sock = do | 1421 | clientKey sock = do |
1420 | addr <- getSocketName sock | 1422 | addr <- getSocketName sock |
1421 | paddr <- getPeerName sock | 1423 | paddr <- getPeerName sock |
1422 | return $ (ClientKey addr,paddr) | 1424 | return $ (ClientKey addr,ConnectionData paddr XMPP) |
1423 | 1425 | ||
1424 | xmlifyRosterItems :: Monad m => Set Text -> Text -> Set Text -> ConduitM i Event m () | 1426 | xmlifyRosterItems :: Monad m => Set Text -> Text -> Set Text -> ConduitM i Event m () |
1425 | xmlifyRosterItems solicited stype set = mapM_ item (Set.toList set) | 1427 | xmlifyRosterItems solicited stype set = mapM_ item (Set.toList set) |
@@ -1488,7 +1490,7 @@ sendRoster query xmpp clientKey replyto = do | |||
1488 | -} | 1490 | -} |
1489 | 1491 | ||
1490 | 1492 | ||
1491 | socketFromKey :: Server ConnectionKey SockAddr releaseKey XML.Event -> ConnectionKey -> IO SockAddr | 1493 | socketFromKey :: Server ConnectionKey ConnectionData releaseKey XML.Event -> ConnectionKey -> IO SockAddr |
1492 | socketFromKey sv k = do | 1494 | socketFromKey sv k = do |
1493 | map <- atomically $ readTVar (conmap sv) | 1495 | map <- atomically $ readTVar (conmap sv) |
1494 | let mcd = Map.lookup k map | 1496 | let mcd = Map.lookup k map |
@@ -1498,7 +1500,7 @@ socketFromKey sv k = do | |||
1498 | PeerKey addr -> return addr | 1500 | PeerKey addr -> return addr |
1499 | -- XXX: ? wrong address | 1501 | -- XXX: ? wrong address |
1500 | -- Shouldnt happen anyway. | 1502 | -- Shouldnt happen anyway. |
1501 | Just cd -> return $ cdata cd | 1503 | Just cd -> return $ cdAddr $ cdata cd |
1502 | 1504 | ||
1503 | class StanzaFirstTag a where | 1505 | class StanzaFirstTag a where |
1504 | stanzaFirstTag :: StanzaWrap a -> IO XML.Event | 1506 | stanzaFirstTag :: StanzaWrap a -> IO XML.Event |
@@ -1658,8 +1660,8 @@ makeErrorStanza stanza = do | |||
1658 | ] | 1660 | ] |
1659 | 1661 | ||
1660 | monitor :: | 1662 | monitor :: |
1661 | Server ConnectionKey SockAddr releaseKey XML.Event | 1663 | Server ConnectionKey ConnectionData releaseKey XML.Event |
1662 | -> ConnectionParameters ConnectionKey SockAddr | 1664 | -> ConnectionParameters ConnectionKey ConnectionData |
1663 | -> XMPPServerParameters | 1665 | -> XMPPServerParameters |
1664 | -> IO b | 1666 | -> IO b |
1665 | monitor sv params xmpp = do | 1667 | monitor sv params xmpp = do |
@@ -1823,13 +1825,22 @@ monitor sv params xmpp = do | |||
1823 | where | 1825 | where |
1824 | _ = str :: String | 1826 | _ = str :: String |
1825 | 1827 | ||
1828 | data ConnectionType = XMPP | Tox | ||
1829 | deriving (Eq,Ord,Enum,Show,Read) | ||
1830 | |||
1831 | data ConnectionData = ConnectionData | ||
1832 | { cdAddr :: SockAddr | ||
1833 | , cdType :: ConnectionType | ||
1834 | } | ||
1835 | deriving (Eq,Ord,Show) | ||
1836 | |||
1826 | data XMPPServer | 1837 | data XMPPServer |
1827 | = forall releaseKey. | 1838 | = forall releaseKey. |
1828 | XMPPServer { _xmpp_sv :: Server ConnectionKey SockAddr releaseKey XML.Event | 1839 | XMPPServer { _xmpp_sv :: Server ConnectionKey ConnectionData releaseKey XML.Event |
1829 | , _xmpp_peer_params :: ConnectionParameters ConnectionKey SockAddr | 1840 | , _xmpp_peer_params :: ConnectionParameters ConnectionKey ConnectionData |
1830 | } | 1841 | } |
1831 | 1842 | ||
1832 | grokPeer :: XMPPServer -> ConnectionKey -> (SockAddr, ConnectionParameters ConnectionKey SockAddr, Miliseconds) | 1843 | grokPeer :: XMPPServer -> ConnectionKey -> (SockAddr, ConnectionParameters ConnectionKey ConnectionData, Miliseconds) |
1833 | grokPeer sv (PeerKey addr) = (addr, _xmpp_peer_params sv, 10000) | 1844 | grokPeer sv (PeerKey addr) = (addr, _xmpp_peer_params sv, 10000) |
1834 | 1845 | ||
1835 | xmppConnections :: XMPPServer -> IO (Connection.Manager TCPStatus Text) | 1846 | xmppConnections :: XMPPServer -> IO (Connection.Manager TCPStatus Text) |
@@ -1838,7 +1849,7 @@ xmppConnections xsv@XMPPServer{_xmpp_sv=sv} = tcpManager (grokPeer xsv) (Just . | |||
1838 | resolvPeer :: Text -> IO (Maybe ConnectionKey) | 1849 | resolvPeer :: Text -> IO (Maybe ConnectionKey) |
1839 | resolvPeer str = fmap PeerKey <$> listToMaybe <$> resolvePeer str | 1850 | resolvPeer str = fmap PeerKey <$> listToMaybe <$> resolvePeer str |
1840 | 1851 | ||
1841 | xmppEventChannel :: XMPPServer -> TChan ((ConnectionKey, SockAddr), ConnectionEvent Event) | 1852 | xmppEventChannel :: XMPPServer -> TChan ((ConnectionKey, ConnectionData), ConnectionEvent Event) |
1842 | xmppEventChannel XMPPServer{_xmpp_sv=sv} = serverEvent sv | 1853 | xmppEventChannel XMPPServer{_xmpp_sv=sv} = serverEvent sv |
1843 | 1854 | ||
1844 | quitXmpp :: XMPPServer -> IO () | 1855 | quitXmpp :: XMPPServer -> IO () |