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.
94 lines
2.2 KiB
94 lines
2.2 KiB
module Network.XMPP.Monad where |
|
|
|
import Control.Applicative((<$>)) |
|
|
|
import Control.Monad.Trans |
|
import Control.Monad.Trans.State |
|
|
|
import Data.Conduit |
|
import Data.Conduit.Text as CT |
|
import Data.Conduit.Binary as CB |
|
import Data.Conduit.List as CL |
|
import Data.XML.Types |
|
|
|
import Data.Default |
|
import Data.Text |
|
|
|
import Network.XMPP.Types |
|
import Network.XMPP.Marshal |
|
|
|
import System.IO |
|
|
|
import Text.XML.Stream.Elements |
|
import Text.XML.Stream.Render as XR |
|
import Text.XML.Stream.Parse |
|
|
|
type XMPPMonad a = StateT XMPPState (ResourceT IO) a |
|
|
|
data XMPPState = XMPPState |
|
{ sConSrc :: BufferedSource IO Event |
|
, sConSink :: Sink Event IO () |
|
, sConHandle :: Maybe Handle |
|
, sFeatures :: ServerFeatures |
|
, sHaveTLS :: Bool |
|
, sHostname :: Text |
|
, sUsername :: Text |
|
, sResource :: Maybe Text |
|
} |
|
|
|
data ServerFeatures = SF |
|
{ stls :: Bool |
|
, stlsRequired :: Bool |
|
, saslMechanisms :: [Text] |
|
, other :: [Element] |
|
} deriving Show |
|
|
|
instance Default ServerFeatures where |
|
def = SF |
|
{ stls = False |
|
, stlsRequired = False |
|
, saslMechanisms = [] |
|
, other = [] |
|
} |
|
|
|
|
|
pushE :: Element -> XMPPMonad () |
|
pushE x = do |
|
sink <- gets sConSink |
|
lift $ CL.sourceList (elementToEvents x) $$ sink |
|
|
|
push :: Stanza -> XMPPMonad () |
|
push = pushE . stanzaToElement |
|
|
|
pushOpen :: Element -> XMPPMonad () |
|
pushOpen x = do |
|
sink <- gets sConSink |
|
lift $ CL.sourceList (elementToEvents' x) $$ sink |
|
|
|
|
|
pulls :: Sink Event IO a -> XMPPMonad a |
|
pulls snk = do |
|
source <- gets sConSrc |
|
lift $ source $$ snk |
|
|
|
pullE :: XMPPMonad Element |
|
pullE = do |
|
source <- gets sConSrc |
|
pulls elementFromEvents |
|
|
|
pull :: XMPPMonad Stanza |
|
pull = elementToStanza <$> pullE |
|
|
|
xmppFromHandle handle hostname username resource f = runResourceT $ do |
|
liftIO $ hSetBuffering handle NoBuffering |
|
src <- bufferSource $ CB.sourceHandle handle $= CT.decode CT.utf8 $= parseText def |
|
let st = XMPPState |
|
src |
|
(XR.renderBytes def =$ CB.sinkHandle handle) |
|
(Just handle) |
|
def |
|
False |
|
hostname |
|
username |
|
resource |
|
runStateT f st
|
|
|