From d2f793c9b6144de4b68251d1a2b90bc311af477e Mon Sep 17 00:00:00 2001 From: Philipp Balzarek Date: Thu, 10 May 2012 16:18:32 +0200 Subject: [PATCH] add IQRequestTicket --- src/Network/XMPP.hs | 5 +++-- src/Network/XMPP/Concurrent/IQ.hs | 7 +++++-- src/Network/XMPP/Concurrent/Monad.hs | 2 +- src/Network/XMPP/Concurrent/Threads.hs | 3 +-- src/Network/XMPP/Concurrent/Types.hs | 7 ++++++- src/Tests.hs | 5 +++-- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/Network/XMPP.hs b/src/Network/XMPP.hs index 53d7ba9..8047c81 100644 --- a/src/Network/XMPP.hs +++ b/src/Network/XMPP.hs @@ -113,6 +113,8 @@ module Network.XMPP -- -- , IQRequest(..) + , IQRequestTicket + , iqRequestBody , IQRequestType(..) , IQResult(..) , IQError(..) @@ -136,8 +138,7 @@ import Network import qualified Network.TLS as TLS import Network.XMPP.Bind import Network.XMPP.Concurrent -import Network.XMPP.IM.Presence hiding (presence) -import Network.XMPP.IM.Message +import Network.XMPP.Concurrent.Types import Network.XMPP.Message import Network.XMPP.Monad import Network.XMPP.Presence diff --git a/src/Network/XMPP/Concurrent/IQ.hs b/src/Network/XMPP/Concurrent/IQ.hs index 500719c..ba5bd72 100644 --- a/src/Network/XMPP/Concurrent/IQ.hs +++ b/src/Network/XMPP/Concurrent/IQ.hs @@ -40,10 +40,13 @@ sendIQ' to tp lang body = do ref <- sendIQ to tp lang body liftIO . atomically $ takeTMVar ref -answerIQ :: (IQRequest, TVar Bool) +answerIQ :: IQRequestTicket -> Either StanzaError (Maybe Element) -> XMPP Bool -answerIQ ((IQRequest iqid from _to lang _tp bd), sentRef) answer = do +answerIQ (IQRequestTicket + sentRef + (IQRequest iqid from _to lang _tp bd)) + answer = do out <- asks outCh let response = case answer of Left err -> IQErrorS $ IQError iqid Nothing from lang err (Just bd) diff --git a/src/Network/XMPP/Concurrent/Monad.hs b/src/Network/XMPP/Concurrent/Monad.hs index 5ed5508..815ce8a 100644 --- a/src/Network/XMPP/Concurrent/Monad.hs +++ b/src/Network/XMPP/Concurrent/Monad.hs @@ -24,7 +24,7 @@ import Network.XMPP.Monad -- combination was alread handled listenIQChan :: IQRequestType -- ^ type of IQs to receive (Get / Set) -> Text -- ^ namespace of the child element - -> XMPP (Maybe ( TChan (IQRequest, TVar Bool))) + -> XMPP (Maybe ( TChan IQRequestTicket)) listenIQChan tp ns = do handlers <- asks iqHandlers liftIO . atomically $ do diff --git a/src/Network/XMPP/Concurrent/Threads.hs b/src/Network/XMPP/Concurrent/Threads.hs index 3109771..4f6a1d7 100644 --- a/src/Network/XMPP/Concurrent/Threads.hs +++ b/src/Network/XMPP/Concurrent/Threads.hs @@ -107,8 +107,7 @@ handleIQRequest handlers iq = do Nothing -> return () -- TODO: send error stanza Just ch -> do sent <- newTVar False - writeTChan ch (iq, sent) - + writeTChan ch $ IQRequestTicket sent iq handleIQResponse :: TVar IQHandlers -> Either IQError IQResult -> STM () handleIQResponse handlers iq = do (byNS, byID) <- readTVar handlers diff --git a/src/Network/XMPP/Concurrent/Types.hs b/src/Network/XMPP/Concurrent/Types.hs index c9e6cab..964d126 100644 --- a/src/Network/XMPP/Concurrent/Types.hs +++ b/src/Network/XMPP/Concurrent/Types.hs @@ -18,7 +18,7 @@ import Data.Typeable import Network.XMPP.Types -type IQHandlers = (Map.Map (IQRequestType, Text) (TChan (IQRequest, TVar Bool)) +type IQHandlers = (Map.Map (IQRequestType, Text) (TChan IQRequestTicket) , Map.Map StanzaId (TMVar IQResponse) ) @@ -60,3 +60,8 @@ type XMPP a = ReaderT Session IO a data Interrupt = Interrupt (TMVar ()) deriving Typeable instance Show Interrupt where show _ = "" instance Ex.Exception Interrupt + +data IQRequestTicket = IQRequestTicket + { sentRef :: (TVar Bool) + , iqRequestBody :: IQRequest + } diff --git a/src/Tests.hs b/src/Tests.hs index 4b4532d..76b826f 100644 --- a/src/Tests.hs +++ b/src/Tests.hs @@ -60,8 +60,9 @@ iqResponder = do >> error "hanging up" Just c -> return c forever $ do - next@(iq,_) <- liftIO . atomically $ readTChan chan - let Right payload = unpickleElem payloadP $ iqRequestPayload iq + next <- liftIO . atomically $ readTChan chan + let Right payload = unpickleElem payloadP . iqRequestPayload $ + iqRequestBody next let answerPayload = invertPayload payload let answerBody = pickleElem payloadP answerPayload answerIQ next (Right $ Just answerBody)