module Network.XMPP.Core
( initiateStream
) where
import Control.Monad.State
import System.IO
import Network.XMPP.Sasl (saslAuth)
import Network.XMPP.Print
import Network.XMPP.Stream
import Network.XMPP.Types
import Network.XMPP.JID
import Network.XMPP.IQ
import Network.XMPP.Utils
initiateStream :: Handle
-> String
-> String
-> String
-> String
-> XmppStateT (JID, Stream)
initiateStream h server username password resrc =
do liftIO $ hSetBuffering h NoBuffering
resetStreamHandle h
out $ toContent $
stream Client server
attrs <- startM
case (lookupAttr "version" attrs) of
Just "1.0" -> return ()
Nothing ->
error "No version"
_ -> error "unknown version"
debug "Stream started"
m <- xtractM "/stream:features/mechanisms/mechanism/-"
let mechs = map getText m
debug $ "Mechanisms: " ++ show mechs
saslAuth mechs server username password
out $ toContent $
stream Client server
startM
xtractM "/stream:features/bind"
iqSend "bind1" Set
[ ptag "bind" [ xmlns "urn:ietf:params:xml:ns:xmpp-bind" ]
[ ptag "resource" []
[ literal $ resrc ]
]
]
my_jid <- textractM "/iq[@type='result' & @id='bind1']/bind/jid/-"
iqSend "session1" Set
[ itag "session" [xmlns "urn:ietf:params:xml:ns:xmpp-session" ] ]
xtractM "/iq[@type='result' & @id='session1']"
stream <- get
return (read $ my_jid, stream)