module Network.Xmpp.Concurrent.Types where
import Control.Concurrent
import Control.Concurrent.STM
import qualified Control.Exception.Lifted as Ex
import qualified Data.ByteString as BS
import Data.Default
import qualified Data.Map as Map
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Typeable
import Data.XML.Types (Element)
import Network
import Network.Xmpp.IM.Roster.Types
import Network.Xmpp.Types
import Network.Xmpp.Sasl.Types
data SessionConfiguration = SessionConfiguration
{
sessionStreamConfiguration :: StreamConfiguration
, onConnectionClosed :: Session -> XmppFailure -> IO ()
, sessionStanzaIDs :: IO (IO Text)
, extraStanzaHandlers :: [StanzaHandler]
, enableRoster :: Bool
}
instance Default SessionConfiguration where
def = SessionConfiguration { sessionStreamConfiguration = def
, onConnectionClosed = \_ _ -> return ()
, sessionStanzaIDs = do
idRef <- newTVarIO 1
return . atomically $ do
curId <- readTVar idRef
writeTVar idRef (curId + 1 :: Integer)
return . Text.pack . show $ curId
, extraStanzaHandlers = []
, enableRoster = True
}
data EventHandlers = EventHandlers
{ connectionClosedHandler :: XmppFailure -> IO ()
}
data Interrupt = Interrupt (TMVar ()) deriving Typeable
instance Show Interrupt where show _ = "<Interrupt>"
instance Ex.Exception Interrupt
type WriteSemaphore = TMVar (BS.ByteString -> IO Bool)
data Session = Session
{ stanzaCh :: TChan Stanza
, iqHandlers :: TVar IQHandlers
, writeSemaphore :: WriteSemaphore
, readerThread :: ThreadId
, idGenerator :: IO Text
, streamRef :: TMVar Stream
, eventHandlers :: TMVar EventHandlers
, stopThreads :: IO ()
, rosterRef :: TVar Roster
, conf :: SessionConfiguration
, sRealm :: HostName
, sSaslCredentials :: Maybe (ConnectionState -> [SaslHandler] , Maybe Text)
, reconnectWait :: TVar Int
}
type IQHandlers = (Map.Map (IQRequestType, Text) (TChan IQRequestTicket)
, Map.Map Text (TMVar IQResponse)
)
data IQRequestTicket = IQRequestTicket
{ answerTicket :: Either StanzaError (Maybe Element) -> IO (Maybe Bool)
, iqRequestBody :: IQRequest
}