You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
1.9 KiB

{-# LANGUAGE OverloadedStrings #-}
14 years ago
module Network.XMPP.Monad where
14 years ago
import Control.Applicative((<$>))
import Control.Monad.IO.Class
import Control.Monad.Trans.Class
14 years ago
import Control.Monad.Trans.Resource
14 years ago
import Control.Monad.Trans.State
import Data.ByteString as BS
14 years ago
import Data.Conduit
14 years ago
import Data.Conduit.Binary as CB
14 years ago
import Data.Conduit.List as CL
import Data.Conduit.TLS
14 years ago
import Data.Text(Text)
14 years ago
import Data.XML.Pickle
import Data.XML.Types
14 years ago
14 years ago
import Network.XMPP.Types
import Network.XMPP.Marshal
import Network.XMPP.Pickle
14 years ago
14 years ago
import System.IO
14 years ago
import Text.XML.Stream.Elements
import Text.XML.Stream.Parse as XP
import Text.XML.Stream.Render as XR
pushN :: Element -> XMPPMonad ()
pushN x = do
sink <- gets sConPush
14 years ago
lift . sink $ elementToEvents x
14 years ago
14 years ago
push :: Stanza -> XMPPMonad ()
push = pushN . pickleElem stanzaP
14 years ago
14 years ago
pushOpen :: Element -> XMPPMonad ()
14 years ago
pushOpen e = do
sink <- gets sConPush
14 years ago
lift . sink $ openElementToEvents e
return ()
14 years ago
14 years ago
pulls :: Sink Event (ResourceT IO) a -> XMPPMonad a
14 years ago
pulls snk = do
14 years ago
source <- gets sConSrc
(src', r) <- lift $ source $$+ snk
modify $ (\s -> s {sConSrc = src'})
return r
14 years ago
14 years ago
pullE :: XMPPMonad Element
pullE = pulls elementFromEvents
14 years ago
pullPickle :: Show b => PU [Node] b -> XMPPMonad b
pullPickle p = unpickleElem p <$> pullE
14 years ago
pull :: XMPPMonad Stanza
pull = pullPickle stanzaP
xmppFromHandle
:: Handle -> Text -> Text -> Maybe Text
-> XMPPMonad a
-> IO (a, XMPPState)
14 years ago
xmppFromHandle handle hostname username res f = runResourceT $ do
14 years ago
liftIO $ hSetBuffering handle NoBuffering
let raw = CB.sourceHandle handle $= conduitStdout
let src = raw $= XP.parseBytes def
14 years ago
let st = XMPPState
src
(raw)
14 years ago
(\xs -> CL.sourceList xs
$$ XR.renderBytes def =$ conduitStdout =$ CB.sinkHandle handle)
14 years ago
(BS.hPut handle)
14 years ago
(Just handle)
def
False
hostname
username
14 years ago
res
14 years ago
runStateT f st