module Network.XMPP.Types (
HostName
, Password
, PortNumber
, Resource
, UserName,
EnumeratorEvent (..),
Challenge (..),
Success (..),
TLSState (..),
JID (..),
StanzaID (..),
From,
To,
XMLLang,
Stanza (..),
MessageType (..),
Message (..),
PresenceType (..),
Presence (..),
IQ (..),
InternalEvent (..),
XMLEvent (..),
ConnectionState (..),
ClientEvent (..),
StreamState (..),
AuthenticationState (..),
Certificate,
ConnectResult (..),
OpenStreamResult (..),
SecureWithTLSResult (..),
AuthenticateResult (..),
ServerAddress (..),
XMPPError (..),
StanzaError (..),
StanzaErrorType (..),
StanzaErrorCondition (..),
Timeout,
TimeoutEvent (..),
StreamError (..),
XMLString
) where
import GHC.IO.Handle (Handle, hPutStr, hFlush, hSetBuffering, hWaitForInput)
import qualified Network as N
import qualified Control.Exception as CE
import Control.Monad.State hiding (State)
import Data.XML.Types
import Network.TLS
import Network.TLS.Cipher
import qualified Control.Monad.Error as CME
type XMLString = String
instance Eq ConnectionState where
Disconnected == Disconnected = True
(Connected p h) == (Connected p_ h_) = p == p_ && h == h_
_ == _ = False
data XMPPError = UncaughtEvent deriving (Eq, Show)
instance CME.Error XMPPError where
strMsg "UncaughtEvent" = UncaughtEvent
type HostName = String
type PortNumber = Integer
type UserName = String
type Password = String
type Resource = String
data XMLEvent = XEBeginStream String | XEFeatures String |
XEChallenge Challenge | XESuccess Success |
XEEndStream | XEIQ IQ | XEPresence Presence |
XEMessage Message | XEProceed |
XEOther String deriving (Show)
data EnumeratorEvent = EnumeratorDone |
EnumeratorXML XMLEvent |
EnumeratorException CE.SomeException
deriving (Show)
data InternalEvent s m = IEC (ClientEvent s m) | IEE EnumeratorEvent | IET (TimeoutEvent s m) deriving (Show)
data TimeoutEvent s m = TimeoutEvent StanzaID Timeout (StateT s m ())
instance Show (TimeoutEvent s m) where
show (TimeoutEvent (SID i) t _) = "TimeoutEvent (ID: " ++ (show i) ++ ", timeout: " ++ (show t) ++ ")"
data StreamState = PreStream |
PreFeatures StreamProperties |
PostFeatures StreamProperties StreamFeatures
data AuthenticationState = NoAuthentication | AuthenticatingPreChallenge1 String String (Maybe Resource) | AuthenticatingPreChallenge2 String String (Maybe Resource) | AuthenticatingPreSuccess String String (Maybe Resource) | AuthenticatedUnbound String (Maybe Resource) | AuthenticatedBound String Resource
data ClientEvent s m = CEOpenStream N.HostName PortNumber
(OpenStreamResult -> StateT s m ()) |
CESecureWithTLS Certificate (Certificate -> Bool)
(SecureWithTLSResult -> StateT s m ()) |
CEAuthenticate UserName Password (Maybe Resource)
(AuthenticateResult -> StateT s m ()) |
CEMessage Message (Maybe (Message -> StateT s m Bool)) (Maybe (Timeout, StateT s m ())) (Maybe (StreamError -> StateT s m ())) |
CEPresence Presence (Maybe (Presence -> StateT s m Bool)) (Maybe (Timeout, StateT s m ())) (Maybe (StreamError -> StateT s m ())) |
CEIQ IQ (Maybe (IQ -> StateT s m Bool)) (Maybe (Timeout, StateT s m ())) (Maybe (StreamError -> StateT s m ())) |
CEAction (Maybe (StateT s m Bool)) (StateT s m ())
instance Show (ClientEvent s m) where
show (CEOpenStream h p _) = "CEOpenStream " ++ h ++ " " ++ (show p)
show (CESecureWithTLS c _ _) = "CESecureWithTLS " ++ c
show (CEAuthenticate u p r _) = "CEAuthenticate " ++ u ++ " " ++ p ++ " " ++
(show r)
show (CEIQ s _ _ _) = "CEIQ"
show (CEMessage s _ _ _) = "CEMessage"
show (CEPresence s _ _ _) = "CEPresence"
show (CEAction _ _) = "CEAction"
type StreamID = String
data ConnectionState = Disconnected | Connected ServerAddress Handle
data TLSState = NoTLS | PreProceed | PreHandshake | PostHandshake TLSCtx
data Challenge = Chal String deriving (Show)
data Success = Succ String deriving (Show)
data StanzaID = SID String deriving (Eq, Show)
type From = JID
type To = JID
type XMLLang = String
data Stanza = Stanza { stanzaID :: Maybe StanzaID
, stanzaFrom :: Maybe From
, stanzaTo :: Maybe To
, stanzaLang :: Maybe XMLLang } deriving (Eq, Show)
data MessageType = Chat |
Error_ |
Groupchat |
Headline |
Normal |
OtherMessageType String deriving (Eq, Show)
data Message = Message { messageStanza :: Stanza
, messageType :: MessageType
, messagePayload :: [Element] } |
MessageError { messageErrorStanza :: Stanza
, messageErrorPayload :: Maybe [Element]
, messageErrorStanzaError :: StanzaError } deriving (Eq, Show)
data PresenceType = Subscribe |
Subscribed |
Unsubscribe |
Unsubscribed |
Probe |
Available |
Unavailable
deriving (Eq, Show)
data Presence = Presence { presenceStanza :: Stanza
, presenceType :: PresenceType
, presencePayload :: [Element] } |
PresenceError { presenceErrorStanza :: Stanza
, presenceErrorPayload :: Maybe [Element]
, presenceErrorStanzaError :: StanzaError } deriving (Eq, Show)
data StanzaErrorType = Cancel |
Continue |
Modify |
Auth |
Wait
deriving (Eq, Show)
data StanzaErrorCondition = BadRequest |
Conflict |
FeatureNotImplemented |
Forbidden |
Gone |
InternalServerError |
ItemNotFound |
JIDMalformed |
NotAcceptable |
NotAllowed |
NotAuthorized |
PaymentRequired |
RecipientUnavailable |
Redirect |
RegistrationRequired |
RemoteServerNotFound |
RemoteServerTimeout |
ResourceConstraint |
ServiceUnavailable |
SubscriptionRequired |
UndefinedCondition |
UnexpectedRequest
deriving (Eq, Show)
data IQ = IQGet { iqGetStanza :: Stanza, iqGetPayload :: Element } |
IQSet { iqSetStanza :: Stanza, iqSetPayload :: Element } |
IQResult { iqResultStanza :: Stanza
, iqResultPayload :: Maybe Element } |
IQError { iqErrorStanza :: Stanza, iqErrorPayload :: Maybe Element, iqErrorStanzaError :: StanzaError } deriving (Eq, Show)
data StanzaError = StanzaError { stanzaErrorType :: StanzaErrorType
, stanzaErrorCondition :: StanzaErrorCondition
, stanzaErrorText :: Maybe String
, stanzaErrorApplicationSpecificCondition ::
Maybe Element } deriving (Eq, Show)
type StreamProperties = Float
type StreamFeatures = String
data ConnectResult = ConnectSuccess StreamProperties StreamFeatures (Maybe Resource) |
ConnectOpenStreamFailure |
ConnectSecureWithTLSFailure |
ConnectAuthenticateFailure
data OpenStreamResult = OpenStreamSuccess StreamProperties StreamFeatures |
OpenStreamFailure
data SecureWithTLSResult = SecureWithTLSSuccess StreamProperties StreamFeatures | SecureWithTLSFailure
data AuthenticateResult = AuthenticateSuccess StreamProperties StreamFeatures Resource | AuthenticateFailure
type Certificate = String
data JID = JID { jidNode :: Maybe String
, jidServer :: String
, jidResource :: Maybe String } deriving (Eq, Show)
data ServerAddress = ServerAddress N.HostName N.PortNumber deriving (Eq)
type Timeout = Int
data StreamError = StreamError