diff options
author | joe <joe@jerkface.net> | 2013-07-01 13:37:37 -0400 |
---|---|---|
committer | joe <joe@jerkface.net> | 2013-07-01 13:37:37 -0400 |
commit | d725430b020c07aff6271337f4c1a04ebffc9bee (patch) | |
tree | 45bd14ded67c277c3c141fabbb3ee307c0bc9f24 /Presence/main.hs | |
parent | aed611f7cb8bbe7a263c18bddb0c24fd3d900850 (diff) |
Moved set of announced presences from fromPeer thread to the associated
UnixSession.
Diffstat (limited to 'Presence/main.hs')
-rw-r--r-- | Presence/main.hs | 22 |
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 | ||
67 | instance XMPPSession UnixSession where | 68 | instance 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 | ||
109 | subscribeToChan tmvar = | 127 | subscribeToChan tmvar = |