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.

88 lines
1.9 KiB

{-# LANGUAGE OverloadedStrings #-}
14 years ago
module Network.XMPP.Monad where
14 years ago
import Control.Applicative((<$>))
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Trans.Class
14 years ago
import Control.Monad.Trans.State
import Data.ByteString as BS
import Data.Text(Text)
14 years ago
import Data.Conduit
14 years ago
import Data.Conduit.Binary as CB
import Data.Conduit.Hexpat as HXC
14 years ago
import Data.Conduit.List as CL
import Data.Conduit.Text as CT
14 years ago
import qualified Data.Text as Text
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
import Text.XML.Expat.SAX
import Text.XML.Expat.Tree
import Text.XML.Expat.Format
parseOpts = ParseOptions (Just UTF8) Nothing
pushN :: Element -> XMPPMonad ()
pushN x = do
sink <- gets sConPush
liftIO . sink $ formatNode' x
14 years ago
14 years ago
push :: Stanza -> XMPPMonad ()
push = pushN . pickleElem stanzaP
14 years ago
14 years ago
pushOpen :: Element -> XMPPMonad ()
pushOpen (Element name attrs children) = do
sink <- gets sConPush
let sax = StartElement name attrs
liftIO . sink $ formatSAX' [sax]
forM children pushN
return ()
14 years ago
pulls :: Sink Event IO a -> XMPPMonad a
pulls snk = do
14 years ago
source <- gets sConSrc
14 years ago
lift $ source $$ snk
14 years ago
pullE :: XMPPMonad Element
pullE = do
14 years ago
pulls elementFromEvents
14 years ago
pullPickle p = unpickleElem p <$> pullE
14 years ago
pull :: XMPPMonad Stanza
pull = pullPickle stanzaP
-- pull :: XMPPMonad Stanza
-- pull = elementToStanza <$> pullE
14 years ago
xmppFromHandle
:: Handle -> Text -> Text -> Maybe Text
-> XMPPMonad a
-> IO (a, XMPPState)
14 years ago
xmppFromHandle handle hostname username resource f = runResourceT $ do
liftIO $ hSetBuffering handle NoBuffering
raw <- bufferSource $ CB.sourceHandle handle
src <- bufferSource $ raw $= HXC.parseBS parseOpts
14 years ago
let st = XMPPState
src
raw
(liftIO . BS.hPut handle)
14 years ago
(Just handle)
def
False
hostname
username
resource
runStateT f st