avahi-0.1: Network/Avahi/Common.hs
{-# LANGUAGE OverloadedStrings #-}
module Network.Avahi.Common where
import Data.Int
import Data.Word
import DBus.Client.Simple
-- | Service specification
data Service = Service {
serviceProtocol :: InetProtocol,
serviceName :: String,
serviceType :: String,
serviceDomain :: String,
serviceHost :: String,
serviceAddress :: Maybe String,
servicePort :: Word16,
serviceText :: String }
deriving (Eq,Show)
-- | Service browsing query
data BrowseQuery = BrowseQuery {
lookupProtocol :: InetProtocol, -- ^ Protocol to be used for lookup
lookupServiceName :: String, -- ^ Service name to find
lookupDomain :: String, -- ^ Domain to search in (usually `local')
lookupCallback :: Service -> IO () -- ^ Function to be called on found service
}
-- | Internet protocol specification
data InetProtocol =
PROTO_UNSPEC -- ^ Unspecified (any) protocol (-1)
| PROTO_INET -- ^ IPv4 protocol (0)
| PROTO_INET6 -- ^ IPv6 protocol (1)
deriving (Eq,Show)
proto2variant :: InetProtocol -> Variant
proto2variant PROTO_UNSPEC = toVariant (-1 :: Int32)
proto2variant PROTO_INET = toVariant (0 :: Int32)
proto2variant PROTO_INET6 = toVariant (1 :: Int32)
variant2proto :: Variant -> InetProtocol
variant2proto x =
case fromVariant x :: Maybe Int32 of
Nothing -> error $ "Erroneus PROTO: " ++ show x
Just (-1) -> PROTO_UNSPEC
Just 0 -> PROTO_INET
Just 1 -> PROTO_INET6
Just y -> error $ "Erroneus PROTO: " ++ show y
forceMaybe :: String -> Maybe a -> a
forceMaybe msg Nothing = error msg
forceMaybe _ (Just x) = x
fromVariant_ :: (IsVariant a) => String -> Variant -> a
fromVariant_ msg x = forceMaybe msg (fromVariant x)
iface_unspec :: Variant
iface_unspec = toVariant (-1 :: Int32)
flags_empty :: Variant
flags_empty = toVariant (0 :: Word32)
avahiBus :: BusName
avahiBus = busName_ "org.freedesktop.Avahi"
hostNameResolver :: BusName
hostNameResolver = busName_ "org.freedesktop.Avahi.HostNameResolver"
serviceResolver :: BusName
serviceResolver = busName_ "org.freedesktop.Avahi.ServiceResolver"
serverInterface :: InterfaceName
serverInterface = interfaceName_ "org.freedesktop.Avahi.Server"
avahiBrowser :: InterfaceName
avahiBrowser = interfaceName_ "org.freedesktop.Avahi.ServiceBrowser"
entryGroupInterface :: InterfaceName
entryGroupInterface = interfaceName_ "org.freedesktop.Avahi.EntryGroup"