From b92159385785e531985f5c4b7ba5bea44926bd0b Mon Sep 17 00:00:00 2001 From: Philipp Balzarek Date: Wed, 13 Nov 2013 13:23:17 +0100 Subject: [PATCH] change handling returned annotations: Annotations are appended to the list --- source/Network/Xmpp/Concurrent.hs | 6 +++--- source/Network/Xmpp/Concurrent/Types.hs | 5 +++-- source/Network/Xmpp/IM/Roster.hs | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/source/Network/Xmpp/Concurrent.hs b/source/Network/Xmpp/Concurrent.hs index 5ecf681..4970eaf 100644 --- a/source/Network/Xmpp/Concurrent.hs +++ b/source/Network/Xmpp/Concurrent.hs @@ -58,12 +58,12 @@ runHandlers hs sta = go hs sta [] where go [] _ _ = return () go (h:hands) sta' as = do res <- h sta' as - forM_ res $ uncurry (go hands) + forM_ res $ \(sta, as') -> go hands sta (as ++ as') toChan :: TChan (Annotated Stanza) -> StanzaHandler toChan stanzaC _ sta as = do atomically $ writeTChan stanzaC (sta, as) - return [(sta, as)] + return [(sta, [])] handleIQ :: TVar IQHandlers -> StanzaHandler @@ -72,7 +72,7 @@ handleIQ iqHands out sta as = do IQRequestS i -> handleIQRequest iqHands i >> return [] IQResultS i -> handleIQResponse iqHands (Right i) >> return [] IQErrorS i -> handleIQResponse iqHands (Left i) >> return [] - _ -> return [(sta, as)] + _ -> return [(sta, [])] where -- If the IQ request has a namespace, send it through the appropriate channel. handleIQRequest :: TVar IQHandlers -> IQRequest -> IO () diff --git a/source/Network/Xmpp/Concurrent/Types.hs b/source/Network/Xmpp/Concurrent/Types.hs index 3dde2a9..a0f237d 100644 --- a/source/Network/Xmpp/Concurrent/Types.hs +++ b/source/Network/Xmpp/Concurrent/Types.hs @@ -22,8 +22,9 @@ import Network.Xmpp.Types type StanzaHandler = (Stanza -> IO Bool) -- ^ outgoing stanza -> Stanza -- ^ stanza to handle - -> [Annotation] - -> IO [(Stanza, [Annotation])] -- ^ modified stanzas (if any) + -> [Annotation] -- ^ annotations added by previous handlers + -> IO [(Stanza, [Annotation])] -- ^ modified stanzas and + -- /additional/ annotations data Annotation = forall f. (Typeable f, Show f) => Annotation f diff --git a/source/Network/Xmpp/IM/Roster.hs b/source/Network/Xmpp/IM/Roster.hs index 03b76b0..a3c09a1 100644 --- a/source/Network/Xmpp/IM/Roster.hs +++ b/source/Network/Xmpp/IM/Roster.hs @@ -86,12 +86,12 @@ initRoster session = do Just roster -> atomically $ writeTVar (rosterRef session) roster handleRoster :: TVar Roster -> StanzaHandler -handleRoster ref out sta as = case sta of +handleRoster ref out sta _ = case sta of IQRequestS (iqr@IQRequest{iqRequestPayload = iqb@Element{elementName = en}}) | nameNamespace en == Just "jabber:iq:roster" -> do case iqRequestFrom iqr of - Just _from -> return [(sta, as)] -- Don't handle roster pushes + Just _from -> return [(sta, [])] -- Don't handle roster pushes -- from unauthorized sources Nothing -> case unpickleElem xpQuery iqb of Right Query{ queryVer = v @@ -104,7 +104,7 @@ handleRoster ref out sta as = case sta of errorM "Pontarius.Xmpp" "Invalid roster query" _ <- out $ badRequest iqr return [] - _ -> return [(sta, as)] + _ -> return [(sta, [])] where handleUpdate v' update = atomically $ modifyTVar ref $ \(Roster v is) -> Roster (v' `mplus` v) $ case qiSubscription update of