Browse Source

conduit 0.4, switched back to xml-conduit

master
Philipp Balzarek 14 years ago
parent
commit
9fd7e8daff
  1. 37
      src/Network/XMPP/Monad.hs
  2. 7
      src/Network/XMPP/Stream.hs
  3. 3
      src/Network/XMPP/TLS.hs
  4. 4
      src/Network/XMPP/Types.hs
  5. 22
      src/xml-conduit-testcase.hs

37
src/Network/XMPP/Monad.hs

@ -11,18 +11,19 @@ import Control.Monad.Trans.Resource
import Control.Monad.Trans.State import Control.Monad.Trans.State
import Data.ByteString as BS import Data.ByteString as BS
import Data.Default(def)
import Data.Text(Text) import Data.Text(Text)
import Data.Conduit import Data.Conduit
import Data.Conduit.Binary as CB import Data.Conduit.Binary as CB
import Data.Conduit.Hexpat as CH -- import Data.Conduit.Hexpat as CH
import Data.Conduit.List as CL import Data.Conduit.List as CL
import Data.Conduit.Text as CT import Data.Conduit.Text as CT
import Data.Conduit.TLS import Data.Conduit.TLS
import Data.XML.Pickle import Data.XML.Pickle
import Data.XML.Types import Data.XML.Types
--import Text.XML.Stream.Parse as XP import Text.XML.Stream.Parse as XP
import Text.XML.Stream.Render as XR import Text.XML.Stream.Render as XR
import Text.XML.Stream.Elements import Text.XML.Stream.Elements
@ -49,14 +50,15 @@ pushOpen e = do
lift . sink $ openElementToEvents e lift . sink $ openElementToEvents e
return () return ()
pulls :: Sink Event (ResourceT IO) a -> XMPPMonad a pulls :: Sink Event (ResourceT IO) a -> XMPPMonad a
pulls snk = do pulls snk = do
source <- gets sConSrc source <- gets sConSrc
lift $ source $$ snk (src', r) <- lift $ source $$+ snk
modify $ (\s -> s {sConSrc = src'})
return r
pullE :: XMPPMonad Element pullE :: XMPPMonad Element
pullE = pulls elementFromEvents pullE = pulls elementFromEvents
pullPickle :: Show b => PU [Node] b -> XMPPMonad b pullPickle :: Show b => PU [Node] b -> XMPPMonad b
pullPickle p = unpickleElem p <$> pullE pullPickle p = unpickleElem p <$> pullE
@ -70,13 +72,13 @@ xmppFromHandle
-> IO (a, XMPPState) -> IO (a, XMPPState)
xmppFromHandle handle hostname username resource f = runResourceT $ do xmppFromHandle handle hostname username resource f = runResourceT $ do
liftIO $ hSetBuffering handle NoBuffering liftIO $ hSetBuffering handle NoBuffering
raw <- bufferSource $ CB.sourceHandle handle let raw = CB.sourceHandle handle $= conduitStdout
src <- bufferSource $ raw $= CH.parseBS defaultParseOptions let src = raw $= XP.parseBytes def
let st = XMPPState let st = XMPPState
src src
raw (raw)
(\xs -> CL.sourceList xs (\xs -> CL.sourceList xs
$$ XR.renderBytes def =$ CB.sinkHandle handle) $$ XR.renderBytes def =$ conduitStdout =$ CB.sinkHandle handle)
(BS.hPut handle) (BS.hPut handle)
(Just handle) (Just handle)
def def
@ -85,3 +87,20 @@ xmppFromHandle handle hostname username resource f = runResourceT $ do
username username
resource resource
runStateT f st runStateT f st
xml =
[ "<?xml version='1.0'?>"
, "<stream:stream xmlns='jabber:client' "
, "xmlns:stream='http://etherx.jabber.org/streams' id='1365401808' "
, "from='examplehost.org' version='1.0' xml:lang='en'>"
, "<stream:features>"
, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
, error "Booh!"
] :: [BS.ByteString]
main :: IO ()
main = (runResourceT $ CL.sourceList xml $= XP.parseBytes def $$ CL.take 2 )
>>= print

7
src/Network/XMPP/Stream.hs

@ -14,7 +14,8 @@ import Network.XMPP.Pickle
import Network.XMPP.Types import Network.XMPP.Types
import Data.Conduit import Data.Conduit
import qualified Data.Conduit.Hexpat as CH import Data.Default(def)
-- import qualified Data.Conduit.Hexpat as CH
import Data.Conduit.List as CL import Data.Conduit.List as CL
import Data.Conduit.Text as CT import Data.Conduit.Text as CT
import Data.Default(def) import Data.Default(def)
@ -25,7 +26,7 @@ import Data.XML.Types
-- import qualified Text.XML.Stream.Parse as XP -- import qualified Text.XML.Stream.Parse as XP
import Text.XML.Stream.Elements import Text.XML.Stream.Elements
import Text.XML.Stream.Parse as XP
-- import Text.XML.Stream.Elements -- import Text.XML.Stream.Elements
@ -54,7 +55,7 @@ xmppRestartStream :: XMPPMonad ()
xmppRestartStream = do xmppRestartStream = do
raw <- gets sRawSrc raw <- gets sRawSrc
src <- gets sConSrc src <- gets sConSrc
newsrc <- lift (bufferSource $ raw $= CH.parseBS CH.defaultParseOptions) let newsrc = raw $= XP.parseBytes def
modify (\s -> s{sConSrc = newsrc}) modify (\s -> s{sConSrc = newsrc})
xmppStartStream xmppStartStream

3
src/Network/XMPP/TLS.hs

@ -40,8 +40,7 @@ xmppStartTLS params = do
pushN starttlsE pushN starttlsE
Element "{urn:ietf:params:xml:ns:xmpp-tls}proceed" [] [] <- pullE Element "{urn:ietf:params:xml:ns:xmpp-tls}proceed" [] [] <- pullE
Just handle <- gets sConHandle Just handle <- gets sConHandle
(raw', snk, push) <- lift $ TLS.tlsinit params handle (raw, snk, push) <- lift $ TLS.tlsinit params handle
raw <- lift . bufferSource $ raw'
modify (\x -> x modify (\x -> x
{ sRawSrc = raw { sRawSrc = raw
-- , sConSrc = -- Note: this momentarily leaves us in an -- , sConSrc = -- Note: this momentarily leaves us in an

4
src/Network/XMPP/Types.hs

@ -34,8 +34,8 @@ instance Show JID where
type XMPPMonad a = StateT XMPPState (ResourceT IO) a type XMPPMonad a = StateT XMPPState (ResourceT IO) a
data XMPPState = XMPPState data XMPPState = XMPPState
{ sConSrc :: BufferedSource (ResourceT IO) Event { sConSrc :: Source (ResourceT IO) Event
, sRawSrc :: BufferedSource (ResourceT IO) BS.ByteString , sRawSrc :: Source (ResourceT IO) BS.ByteString
, sConPush :: [Event] -> ResourceT IO () , sConPush :: [Event] -> ResourceT IO ()
, sConPushBS :: BS.ByteString -> IO () , sConPushBS :: BS.ByteString -> IO ()
, sConHandle :: Maybe Handle , sConHandle :: Maybe Handle

22
src/xml-conduit-testcase.hs

@ -0,0 +1,22 @@
{-# LANGUAGE OverloadedStrings #-}
module Test where
import qualified Data.ByteString as BS
import Data.Conduit
import Data.Default
import qualified Data.Conduit.List as CL
import qualified Text.XML.Stream.Parse as XP
xml =
[ "<?xml version='1.0'?>"
, "<stream:stream xmlns='jabber:client' "
, "xmlns:stream='http://etherx.jabber.org/streams' id='1365401808' "
, "from='examplehost.org' version='1.0' xml:lang='en'>"
, "<stream:features>"
, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
, error "Booh!"
] :: [BS.ByteString]
main :: IO ()
main = (runResourceT $ CL.sourceList xml $= XP.parseBytes def $$ CL.take 2 )
>>= print
Loading…
Cancel
Save