summaryrefslogtreecommitdiff
path: root/Presence/main.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2013-07-01 13:37:37 -0400
committerjoe <joe@jerkface.net>2013-07-01 13:37:37 -0400
commitd725430b020c07aff6271337f4c1a04ebffc9bee (patch)
tree45bd14ded67c277c3c141fabbb3ee307c0bc9f24 /Presence/main.hs
parentaed611f7cb8bbe7a263c18bddb0c24fd3d900850 (diff)
Moved set of announced presences from fromPeer thread to the associated
UnixSession.
Diffstat (limited to 'Presence/main.hs')
-rw-r--r--Presence/main.hs22
1 files changed, 20 insertions, 2 deletions
diff --git a/Presence/main.hs b/Presence/main.hs
index 816d1537..9c11baae 100644
--- a/Presence/main.hs
+++ b/Presence/main.hs
@@ -61,20 +61,25 @@ data UnixSession = UnixSession {
61 localhost :: Peer, -- ByteString, 61 localhost :: Peer, -- ByteString,
62 unix_uid :: (IORef (Maybe UserID)), 62 unix_uid :: (IORef (Maybe UserID)),
63 unix_resource :: (IORef (Maybe L.ByteString)), 63 unix_resource :: (IORef (Maybe L.ByteString)),
64 announced :: TVar (Set JID),
64 presence_state :: PresenceState 65 presence_state :: PresenceState
65} 66}
66 67
67instance XMPPSession UnixSession where 68instance XMPPSession UnixSession where
68 data XMPPClass UnixSession = UnixSessions PresenceState 69 data XMPPClass UnixSession = UnixSessions PresenceState
70
69 newSession (UnixSessions state) sock = do 71 newSession (UnixSessions state) sock = do
70 muid <- getLocalPeerCred sock 72 muid <- getLocalPeerCred sock
71 L.putStrLn $ "SESSION: open " <++> bshow muid 73 L.putStrLn $ "SESSION: open " <++> bshow muid
72 uid_ref <- newIORef muid 74 uid_ref <- newIORef muid
73 res_ref <- newIORef Nothing 75 res_ref <- newIORef Nothing
74 return $ UnixSession (hostname state) uid_ref res_ref state 76 jids <- newTVarIO Set.empty
77 return $ UnixSession (hostname state) uid_ref res_ref jids state
78
75 setResource s resource = do 79 setResource s resource = do
76 writeIORef (unix_resource s) (Just resource) 80 writeIORef (unix_resource s) (Just resource)
77 L.putStrLn $ "SESSION: resource " <++> resource 81 L.putStrLn $ "SESSION: resource " <++> resource
82
78 getJID s = do 83 getJID s = do
79 let host = localhost s 84 let host = localhost s
80 muid <- readIORef (unix_uid s) 85 muid <- readIORef (unix_uid s)
@@ -91,19 +96,32 @@ instance XMPPSession UnixSession where
91 -- let jid = user <++> "@" <++> host <++?> "/" <++$> rsc 96 -- let jid = user <++> "@" <++> host <++?> "/" <++$> rsc
92 L.putStrLn $ "SESSION: jid " <++> L.show (JID (Just user) host rsc) 97 L.putStrLn $ "SESSION: jid " <++> L.show (JID (Just user) host rsc)
93 return (JID (Just user) host rsc) 98 return (JID (Just user) host rsc)
94 closeSession _ = L.putStrLn "SESSION: close" 99
100 closeSession session = do
101 L.putStrLn "SESSION: close"
102 js <- fmap Set.toList (readTVarIO . announced $ session)
103 let offline jid = Presence jid Offline
104 forM_ js $ announcePresence session . offline
105
95 subscribe session Nothing = do 106 subscribe session Nothing = do
96 let tmvar = localSubscriber (presence_state session) 107 let tmvar = localSubscriber (presence_state session)
97 atomically $ subscribeToChan tmvar 108 atomically $ subscribeToChan tmvar
98 subscribe session (Just jid) = do -- UNUSED as yet 109 subscribe session (Just jid) = do -- UNUSED as yet
99 let tvar = subscriberMap (presence_state session) 110 let tvar = subscriberMap (presence_state session)
100 atomically $ subscribeToMap tvar jid 111 atomically $ subscribeToMap tvar jid
112
101 announcePresence session (Presence jid status) = do 113 announcePresence session (Presence jid status) = do
102 (greedy,subs) <- atomically $ do 114 (greedy,subs) <- atomically $ do
103 subs <- readTVar $ subscriberMap (presence_state session) 115 subs <- readTVar $ subscriberMap (presence_state session)
104 greedy <- fmap snd $ readTMVar $ localSubscriber (presence_state session) 116 greedy <- fmap snd $ readTMVar $ localSubscriber (presence_state session)
105 return (greedy,subs) 117 return (greedy,subs)
106 update_presence (Just greedy) (fmap snd subs) (Set.singleton jid) (const status) 118 update_presence (Just greedy) (fmap snd subs) (Set.singleton jid) (const status)
119 liftIO . atomically $ do
120 jids <- readTVar . announced $ session
121 writeTVar (announced session)
122 $ case status of
123 Offline -> Set.delete jid jids
124 _ -> Set.insert jid jids
107 125
108 126
109subscribeToChan tmvar = 127subscribeToChan tmvar =