summaryrefslogtreecommitdiff
path: root/Presence/XMPPServer.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2013-06-17 01:18:37 -0400
committerjoe <joe@jerkface.net>2013-06-17 01:18:37 -0400
commit87c5c2ae4fb60b58dcfb172c5e9b44151b02d777 (patch)
tree4fd16ee881ce7360be3f01b729acb07f275d7526 /Presence/XMPPServer.hs
parent1f679837dcc881b4de211d55234ad793815ed26b (diff)
XMPPSession class
Diffstat (limited to 'Presence/XMPPServer.hs')
-rw-r--r--Presence/XMPPServer.hs28
1 files changed, 22 insertions, 6 deletions
diff --git a/Presence/XMPPServer.hs b/Presence/XMPPServer.hs
index ace36f80..87745e96 100644
--- a/Presence/XMPPServer.hs
+++ b/Presence/XMPPServer.hs
@@ -2,6 +2,7 @@
2{-# LANGUAGE ScopedTypeVariables #-} 2{-# LANGUAGE ScopedTypeVariables #-}
3{-# LANGUAGE ViewPatterns #-} 3{-# LANGUAGE ViewPatterns #-}
4{-# LANGUAGE TupleSections #-} 4{-# LANGUAGE TupleSections #-}
5{-# LANGUAGE TypeFamilies #-}
5module XMPPServer where -- ( listenForXmppClients ) where 6module XMPPServer where -- ( listenForXmppClients ) where
6 7
7import Data.HList.TypeEqGeneric1() 8import Data.HList.TypeEqGeneric1()
@@ -12,6 +13,7 @@ import Server
12import Data.ByteString.Lazy.Char8 as L 13import Data.ByteString.Lazy.Char8 as L
13 ( hPutStrLn 14 ( hPutStrLn
14 , unlines 15 , unlines
16 , ByteString
15 , pack 17 , pack
16 , unpack ) 18 , unpack )
17import qualified Data.ByteString.Lazy.Char8 as L 19import qualified Data.ByteString.Lazy.Char8 as L
@@ -22,7 +24,7 @@ import System.IO
22import Data.HList 24import Data.HList
23import AdaptServer 25import AdaptServer
24import Text.XML.HaXml.Lex (xmlLex) 26import Text.XML.HaXml.Lex (xmlLex)
25import Text.XML.HaXml.Parse (xmlParseWith,element,{-doctypedecl,-}processinginstruction,elemOpenTag,elemCloseTag) 27import Text.XML.HaXml.Parse (XParser,xmlParseWith,element,{-doctypedecl,-}processinginstruction,elemOpenTag,elemCloseTag)
26import Text.XML.HaXml.Types as Hax hiding (Element) -- (ElemTag,QName(..),Namespace(..),Element(..),Content(..),AttValue(..)) 28import Text.XML.HaXml.Types as Hax hiding (Element) -- (ElemTag,QName(..),Namespace(..),Element(..),Content(..),AttValue(..))
27import qualified Text.XML.HaXml.Types as Hax (Element(..)) 29import qualified Text.XML.HaXml.Types as Hax (Element(..))
28import Text.XML.HaXml.Posn (Posn) 30import Text.XML.HaXml.Posn (Posn)
@@ -37,6 +39,13 @@ import Network.Socket
37import Data.String 39import Data.String
38 40
39 41
42class XMPPSession session where
43 data XMPPClass session
44 newSession :: XMPPClass session -> Socket -> Handle -> IO session
45 setResource :: session -> ByteString -> IO ()
46 getJID :: session -> IO ByteString
47 closeSession :: session -> IO ()
48
40 49
41greet host = L.unlines 50greet host = L.unlines
42 [ "<?xml version='1.0'?>" 51 [ "<?xml version='1.0'?>"
@@ -56,13 +65,19 @@ greet host = L.unlines
56 , "</stream:features>" 65 , "</stream:features>"
57 ] 66 ]
58 67
59startCon sock st = do 68newtype TaggedXMPPSession s = TaggedXMPPSession s
69
70startCon session_factory sock st = do
60 let h = hOccursFst st :: Handle 71 let h = hOccursFst st :: Handle
61 cred <- getLocalPeerCred sock 72 cred <- getLocalPeerCred sock
62 Prelude.putStrLn $ "PEER CRED: "++show cred 73 Prelude.putStrLn $ "PEER CRED: "++show cred
63 pname <- getPeerName sock 74 pname <- getPeerName sock
75 session <- newSession session_factory sock h
64 Prelude.putStrLn $ "PEER NAME: "++show pname 76 Prelude.putStrLn $ "PEER NAME: "++show pname
65 return (ConnectionFinalizer (return ()) .*. st) 77
78 return ( ConnectionFinalizer (return ())
79 .*. TaggedXMPPSession session
80 .*. st)
66 81
67iq_query_unavailable host id mjid xmlns kind = L.unlines $ 82iq_query_unavailable host id mjid xmlns kind = L.unlines $
68 [ "<iq type='error'" 83 [ "<iq type='error'"
@@ -228,7 +243,8 @@ mapRight f (Left y,ls) = (Left y ,ls)
228 243
229xmppParse :: [(Posn, TokenT)] -> (Either String XmppObject, [(Posn, TokenT)]) 244xmppParse :: [(Posn, TokenT)] -> (Either String XmppObject, [(Posn, TokenT)])
230xmppParse ls = runTryParse $ do 245xmppParse ls = runTryParse $ do
231 let xml tag = mapRight tag . flip xmlParseWith ls 246 let xml :: (t -> b) -> XParser t -> (Either String b, [(Posn, TokenT)])
247 xml tag = mapRight tag . flip xmlParseWith ls
232 Try . xml Element $ element 248 Try . xml Element $ element
233 Try . xml OpenTag $ elemOpenTag 249 Try . xml OpenTag $ elemOpenTag
234 Try . xml CloseTag $ elemCloseTag streamName 250 Try . xml CloseTag $ elemCloseTag streamName
@@ -253,11 +269,11 @@ xmppParseOld ls =
253 269
254 270
255 271
256listenForXmppClients port st = do 272listenForXmppClients session_factory port st = do
257 let (start,dopkt) = 273 let (start,dopkt) =
258 adaptServer ( xmlLex "stream" . unpack 274 adaptServer ( xmlLex "stream" . unpack
259 , xmppParse) 275 , xmppParse)
260 (startCon,doCon) 276 (startCon session_factory,doCon)
261 doServer (port .*. st) 277 doServer (port .*. st)
262 dopkt 278 dopkt
263 start 279 start