d-bus-0.1.3.2: Permissively licensed D-Bus client library

Safe HaskellNone
LanguageHaskell2010

DBus

Contents

Synopsis

Connection management

data ConnectionType Source

Which Bus to connect to

Constructors

System

The well-known system bus. First the environmental variable DBUS_SYSTEM_BUS_ADDRESS is checked and if it doesn't exist the address unix:path=/var/run/dbus/system_bus_socket is used

Session

The well-known session bus. Refers to the address stored in the environmental variable DBUS_SESSION_BUS_ADDRESS

Address String

The bus at the give addresss

connectBus Source

Arguments

:: ConnectionType

Bus to connect to

-> MethodCallHandler

Handler for incoming method calls

-> SignalHandler

Handler for incoming signals

-> IO DBusConnection 

Create a new connection to a message bus

checkAlive :: DBusConnection -> IO Bool Source

Check whether connection is alive

waitFor :: DBusConnection -> IO () Source

Wait until connection is closed

Message handling

objectRoot :: Objects -> Handler Source

Create a message handler that dispatches matches to the methods in a root object

ignore :: Monad m => t -> t1 -> t2 -> m () Source

Ignore all incoming messages/signals

Signals

matchSignal :: Signal a -> MatchRule -> Bool Source

Match a Signal against a rule. The argN, argNPath and arg0namespace parameter are ignored at the moment

addMatch :: (MonadIO m, MonadThrow m) => MatchRule -> DBusConnection -> m () Source

Add a match rule

removeMatch :: (MonadIO m, MonadThrow m) => MatchRule -> DBusConnection -> m () Source

Remove a match rule

addSignalHandler :: MatchSignal -> MatchRule -> (SomeSignal -> IO ()) -> DBusConnection -> IO () Source

Add a match rule for the given signal specification and call function on all incoming matching signals

signalChan :: MatchSignal -> DBusConnection -> IO (TChan SomeSignal) Source

Add a match rule for the given signal specification and put all incoming signals into the TChan

handleSignal :: Representable a => SignalDescription (FlattenRepType (RepType a)) -> Maybe Text -> MatchRule -> (a -> IO ()) -> DBusConnection -> IO () Source

Add a match rule (computed from the SignalDescription) and install a handler that tries to convert the Signal's body and passes it to the callback

Representable Types

class SingI (RepType a) => Representable a where Source

Class of types that can be represented in the D-Bus type system.

The toRep and fromRep functions form a Prism and should follow the "obvious" laws:

  • fromRep (toRep x) == Just x
  • fmap toRep (fromRep x) =<= Just x

(where x =<= y iff x is Nothing or x == y)

All DBusValues represent themselves and instances for the following "canonical" pairs are provided

Haskell type => D-Bus type

  • WordX and IntX => UIntX and IntX respectively (for X in {16, 32, 64})
  • Bool => Boolean
  • Word8 => Byte
  • Double => Double
  • Text => String
  • ObjectPath => ObjectPath
  • DBusType => Signature
  • [a] => Array of a (for Representable a)
  • ByteString => Array of Byte
  • Tuples up to length 20 => Structs of equal length where each of the members is itself Representable
  • Map => Dict where the keys can be represented by a DBusSimpleType

An instance for String is impossible because it conflicts with the instance for lists (use Text instead)

Also note that no Representable instances are provided for Int, Integer and Float.

You can automatically derive an instance for your own Types with makeRepresentable

Associated Types

type RepType a :: DBusType Source

The DBusType that represents this type

Methods

toRep :: a -> DBusValue (RepType a) Source

Conversion from Haskell to D-Bus types

fromRep :: DBusValue (RepType a) -> Maybe a Source

Conversion from D-Bus to Haskell types.

Instances

Representable Bool 
Representable Double 
Representable Int16 
Representable Int32 
Representable Int64 
Representable Word8 
Representable Word16 
Representable Word32 
Representable Word64 
Representable () 
Representable ByteString 
Representable Text 
Representable Signature 
Representable ObjectPath 
Representable Endian 
Representable HeaderField 
Representable HeaderFields 
Representable Flags 
Representable MessageType 
Representable MessageHeader 
(Representable a, SingI DBusType (RepType a)) => Representable [a] 
SingI DBusType t => Representable (DBusValue t) 
(Representable a, Representable b) => Representable (a, b) 
(Ord k, Representable k, (~) DBusType (RepType k) (DBusSimpleType r), SingI DBusSimpleType r, Representable v) => Representable (Map k v) 
(Representable a, Representable b, Representable c) => Representable (a, b, c) 
(Representable a, Representable b, Representable c, Representable d) => Representable (a, b, c, d) 
(Representable a, Representable b, Representable c, Representable d, Representable e) => Representable (a, b, c, d, e) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f) => Representable (a, b, c, d, e, f) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g) => Representable (a, b, c, d, e, f, g) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h) => Representable (a, b, c, d, e, f, g, h) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i) => Representable (a, b, c, d, e, f, g, h, i) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j) => Representable (a, b, c, d, e, f, g, h, i, j) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k) => Representable (a, b, c, d, e, f, g, h, i, j, k) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l) => Representable (a, b, c, d, e, f, g, h, i, j, k, l) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m, Representable n) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m, n) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m, Representable n, Representable o) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m, Representable n, Representable o, Representable p) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m, Representable n, Representable o, Representable p, Representable q) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m, Representable n, Representable o, Representable p, Representable q, Representable r) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m, Representable n, Representable o, Representable p, Representable q, Representable r, Representable s) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) 
(Representable a, Representable b, Representable c, Representable d, Representable e, Representable f, Representable g, Representable h, Representable i, Representable j, Representable k, Representable l, Representable m, Representable n, Representable o, Representable p, Representable q, Representable r, Representable s, Representable t) => Representable (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) 

type family FlattenRepType a :: [DBusType] Source

Equations

FlattenRepType TypeUnit = `[]` 
FlattenRepType (TypeStruct ts) = ts 
FlattenRepType (DBusSimpleType wild_1627472167) = Apply (Apply (:$) (Let1627472175TSym1 wild_1627472167)) `[]` 
FlattenRepType (TypeArray wild_1627472165) = Apply (Apply (:$) (Let1627472180TSym1 wild_1627472165)) `[]` 
FlattenRepType (TypeDict wild_1627472161 wild_1627472163) = Apply (Apply (:$) (Let1627472186TSym2 wild_1627472161 wild_1627472163)) `[]` 
FlattenRepType (TypeDictEntry wild_1627472157 wild_1627472159) = Apply (Apply (:$) (Let1627472196TSym2 wild_1627472157 wild_1627472159)) `[]` 
FlattenRepType TypeVariant = Apply (Apply (:$) Let1627472204TSym0) `[]` 

DBus specific types

DBus Values

data DBusValue :: DBusType -> * where Source

Instances

Eq (DBusValue t) 
SingI DBusType t => Show (DBusValue t) 
SingI DBusType t => Representable (DBusValue t) 
(IsMethod f, SingI DBusType t) => IsMethod (DBusValue t -> f) 
type RepType (DBusValue t) = t 
type ArgTypes (DBusValue t -> f) = (:) DBusType t (ArgTypes f) 
type ResultType (DBusValue t -> f) = ResultType f 

data DBusStruct :: [DBusType] -> * where Source

Constructors

StructSingleton :: DBusValue a -> DBusStruct `[a]` 
StructCons :: DBusValue a -> DBusStruct as -> DBusStruct (a : as) 

Instances

data SomeDBusValue where Source

Constructors

DBV :: SingI t => DBusValue t -> SomeDBusValue 

Instances

fromVariant :: SingI t => DBusValue TypeVariant -> Maybe (DBusValue t) Source

Extract a DBusValue from a Variant iff the type matches or return nothing

Signature

data DBusSimpleType Source

Types that are not composite. These can be the keys of a Dict

Instances

Eq DBusSimpleType 
Data DBusSimpleType 
Read DBusSimpleType 
Show DBusSimpleType 
Typeable * DBusSimpleType 
SingI DBusSimpleType TypeSignature 
SingI DBusSimpleType TypeObjectPath 
SingI DBusSimpleType TypeString 
SingI DBusSimpleType TypeUnixFD 
SingI DBusSimpleType TypeDouble 
SingI DBusSimpleType TypeUInt64 
SingI DBusSimpleType TypeInt64 
SingI DBusSimpleType TypeUInt32 
SingI DBusSimpleType TypeInt32 
SingI DBusSimpleType TypeUInt16 
SingI DBusSimpleType TypeInt16 
SingI DBusSimpleType TypeBoolean 
SingI DBusSimpleType TypeByte 
SEq DBusSimpleType (KProxy DBusSimpleType) 
PEq DBusSimpleType (KProxy DBusSimpleType) 
SDecide DBusSimpleType (KProxy DBusSimpleType) 
SingKind DBusSimpleType (KProxy DBusSimpleType) 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) TypeDictEntrySym0 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) TypeDictSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) Let1627472196TSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) Let1627472186TSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType DBusType -> *) DBusSimpleTypeSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType DBusType -> *) Let1627472175TSym0 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) TypeDictEntrySym1 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) TypeDictSym1 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) Let1627472196TSym1 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) Let1627472186TSym1 
data Sing DBusSimpleType where 
type (:==) DBusSimpleType a0 b0 = Equals_1627467044 a0 b0 
type Apply DBusType DBusSimpleType DBusSimpleTypeSym0 l0 = DBusSimpleTypeSym1 l0 
type Apply DBusType DBusSimpleType Let1627472175TSym0 l0 = Let1627472175TSym1 l0 
type DemoteRep DBusSimpleType (KProxy DBusSimpleType) = DBusSimpleType 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType TypeDictEntrySym0 l0 = TypeDictEntrySym1 l0 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType TypeDictSym0 l0 = TypeDictSym1 l0 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType Let1627472196TSym0 l0 = Let1627472196TSym1 l0 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType Let1627472186TSym0 l0 = Let1627472186TSym1 l0 

data DBusType Source

Instances

Eq DBusType 
Data DBusType 
Read DBusType 
Show DBusType 
Typeable * DBusType 
SingI DBusType TypeUnit 
SingI DBusType TypeVariant 
SEq DBusType (KProxy DBusType) 
PEq DBusType (KProxy DBusType) 
SDecide DBusType (KProxy DBusType) 
SingI [DBusType] n0 => SingI DBusType (TypeStruct n) 
SingI DBusType n0 => SingI DBusType (TypeArray n) 
SingI DBusSimpleType n0 => SingI DBusType (DBusSimpleType n) 
SingKind DBusType (KProxy DBusType) 
(SingI DBusSimpleType n0, SingI DBusType n1) => SingI DBusType (TypeDictEntry n n) 
(SingI DBusSimpleType n0, SingI DBusType n1) => SingI DBusType (TypeDict n n) 
Typeable ([DBusType] -> *) SignalDescription 
SuppressUnusedWarnings (TyFun [DBusType] DBusType -> *) TypeStructSym0 
SuppressUnusedWarnings (TyFun DBusType [DBusType] -> *) FlattenRepTypeSym0 
SuppressUnusedWarnings (TyFun DBusType DBusType -> *) TypeArraySym0 
SuppressUnusedWarnings (TyFun DBusType DBusType -> *) Let1627472180TSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) TypeDictEntrySym0 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) TypeDictSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) Let1627472196TSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType (TyFun DBusType DBusType -> *) -> *) Let1627472186TSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType DBusType -> *) DBusSimpleTypeSym0 
SuppressUnusedWarnings (TyFun DBusSimpleType DBusType -> *) Let1627472175TSym0 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) TypeDictEntrySym1 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) TypeDictSym1 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) Let1627472196TSym1 
SuppressUnusedWarnings (DBusSimpleType -> TyFun DBusType DBusType -> *) Let1627472186TSym1 
data Sing DBusType where 
type (:==) DBusType a0 b0 = Equals_1627467051 a0 b0 
type Apply DBusType DBusType TypeArraySym0 l0 = TypeArraySym1 l0 
type Apply DBusType DBusType Let1627472180TSym0 l0 = Let1627472180TSym1 l0 
type Apply DBusType DBusSimpleType DBusSimpleTypeSym0 l0 = DBusSimpleTypeSym1 l0 
type Apply DBusType DBusSimpleType Let1627472175TSym0 l0 = Let1627472175TSym1 l0 
type Apply DBusType DBusType (TypeDictEntrySym1 l1) l0 = TypeDictEntrySym2 l1 l0 
type Apply DBusType DBusType (TypeDictSym1 l1) l0 = TypeDictSym2 l1 l0 
type Apply DBusType DBusType (Let1627472196TSym1 l1) l0 = Let1627472196TSym2 l1 l0 
type Apply DBusType DBusType (Let1627472186TSym1 l1) l0 = Let1627472186TSym2 l1 l0 
type DemoteRep DBusType (KProxy DBusType) = DBusType 
type Apply DBusType [DBusType] TypeStructSym0 l0 = TypeStructSym1 l0 
type Apply [DBusType] DBusType FlattenRepTypeSym0 l0 = FlattenRepTypeSym1 l0 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType TypeDictEntrySym0 l0 = TypeDictEntrySym1 l0 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType TypeDictSym0 l0 = TypeDictSym1 l0 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType Let1627472196TSym0 l0 = Let1627472196TSym1 l0 
type Apply (TyFun DBusType DBusType -> *) DBusSimpleType Let1627472186TSym0 l0 = Let1627472186TSym1 l0 

Objects

newtype Object Source

Constructors

Object 

Instances

objectPath :: Text -> ObjectPath Source

Parse an object path. Contrary to the standard, empty path parts are ignored

Methods

data Method where Source

Constructors

Method :: (SingI avs, SingI ts) => MethodWrapper avs ts -> Text -> ArgumentDescription (ArgParity avs) -> ArgumentDescription (ArgParity ts) -> Method 

Instances

data MethodWrapper av rv where Source

Constructors

MReturn :: SingI ts => MethodHandlerT IO (DBusArguments ts) -> MethodWrapper [] ts 
MAsk :: SingI t => (DBusValue t -> MethodWrapper avs rv) -> MethodWrapper (t : avs) rv 

callMethod Source

Arguments

:: (Representable args, Representable ret) 
=> Text

Entity to send the message to

-> ObjectPath

Object

-> Text

Interface

-> Text

Member (method) to call

-> args

Arguments

-> [Flag]

Method call flags

-> DBusConnection

Connection to send the call over

-> IO (Either MethodError ret) 

Synchronously call a method.

This is the "cooked" version of callMethod''. It automatically converts arguments and returns values.

If the returned value's type doesn't match the expected type a MethodSignatureMissmatch is returned

You can pass in and extract multiple arguments and return values with types that are represented by DBus Structs (e.g. tuples). More specifically, multiple arguments/return values are handled in the following way:

  • If the method returns multiple values and the RepType of the expected return value is a struct it tries to match up the arguments with the struct fields
  • If the method returns a single struct and the RepType is a struct it will try to match up those two
  • If the RepType of the expected return value is not a struct it will only match if the method returned exactly one value and those two match up (as per normal)

This means that if the RepType of the expected return value is a struct it might be matched in two ways: Either by the method returning multiple values or the method returning a single struct. At the moment there is no way to exclude either

callMethod' Source

Arguments

:: Text

Entity to send the message to

-> ObjectPath

Object

-> Text

Interface

-> Text

Member (method) name

-> [SomeDBusValue]

Arguments

-> [Flag]

Method call flags

-> DBusConnection

Connection to send the call over

-> IO (STM (Either [SomeDBusValue] [SomeDBusValue])) 

Asychronously call a method.

This is the "raw" version of callMethod. It doesn't do argument conversion.

fromResponse :: Representable a => Either [SomeDBusValue] [SomeDBusValue] -> Either MethodError a Source

Try to convert the response to a method call top Haskell types

data SomeMethodDescription where Source

Constructors

SMD :: (SingI args, SingI rets) => MethodDescription args rets -> SomeMethodDescription 

Properties

data SomeProperty where Source

Constructors

SomeProperty :: forall t. SingI t => Property t -> SomeProperty 

data RemoteProperty a Source

Constructors

RP 

Instances

mkProperty :: Representable a => ObjectPath -> Text -> Text -> Maybe (MethodHandlerT IO a) -> Maybe (a -> MethodHandlerT IO Bool) -> PropertyEmitsChangedSignal -> Property (RepType a) Source

Create a property from a getter and a setter. It will emit a PropertyChanged signal when the setter is called. To change this behaviour modify the propertyEmitsChangedSignal field

mkTVarProperty :: Representable a => ObjectPath -> Text -> Text -> PropertyAccess -> PropertyEmitsChangedSignal -> TVar a -> Property (RepType a) Source

Make a property out of a TVar. The property is considered changed on every outside set, no matter if the updated value is actually different from the old one

Introspection

Message Bus

Re-exports

def :: Default a => a

The default value for this type.