    {- |
    Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
    License    : LGPL-2.1
    Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

    'GI.Gio.Objects.DBusActionGroup.DBusActionGroup' is an implementation of the 'GI.Gio.Interfaces.ActionGroup.ActionGroup'
    interface that can be used as a proxy for an action group
    that is exported over D-Bus with 'GI.Gio.Objects.DBusConnection.dBusConnectionExportActionGroup'.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Objects.DBusActionGroup
        (

    -- * Exported types
        DBusActionGroup(..)                     ,
        IsDBusActionGroup                       ,
        toDBusActionGroup                       ,
        noDBusActionGroup                       ,

     -- * Methods
    -- ** get #method:get#

        dBusActionGroupGet                      ,

        ) where

    import Data.GI.Base.ShortPrelude
    import qualified Data.GI.Base.ShortPrelude as SP
    import qualified Data.GI.Base.Overloading as O
    import qualified Prelude as P

    import qualified Data.GI.Base.Attributes as GI.Attributes
    import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
    import qualified Data.GI.Base.GError as B.GError
    import qualified Data.GI.Base.GVariant as B.GVariant
    import qualified Data.GI.Base.GValue as B.GValue
    import qualified Data.GI.Base.GParamSpec as B.GParamSpec
    import qualified Data.GI.Base.CallStack as B.CallStack
    import qualified Data.Text as T
    import qualified Data.ByteString.Char8 as B
    import qualified Data.Map as Map
    import qualified Foreign.Ptr as FP

    import qualified GI.GObject.Objects.Object as GObject.Object
    import {-# SOURCE #-} qualified GI.Gio.Interfaces.ActionGroup as Gio.ActionGroup
    import {-# SOURCE #-} qualified GI.Gio.Interfaces.RemoteActionGroup as Gio.RemoteActionGroup
    import {-# SOURCE #-} qualified GI.Gio.Objects.DBusConnection as Gio.DBusConnection

    -- | Memory-managed wrapper type.
    newtype DBusActionGroup = DBusActionGroup (ManagedPtr DBusActionGroup)
    foreign import ccall "g_dbus_action_group_get_type"
        c_g_dbus_action_group_get_type :: IO GType

    instance GObject DBusActionGroup where
        gobjectType _ = c_g_dbus_action_group_get_type

    -- | Type class for types which can be safely cast to `DBusActionGroup`, for instance with `toDBusActionGroup`.
    class GObject o => IsDBusActionGroup o
    #if MIN_VERSION_base(4,9,0)
    instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError DBusActionGroup a) =>
        IsDBusActionGroup a
    #endif
    instance IsDBusActionGroup DBusActionGroup
    instance GObject.Object.IsObject DBusActionGroup
    instance Gio.ActionGroup.IsActionGroup DBusActionGroup
    instance Gio.RemoteActionGroup.IsRemoteActionGroup DBusActionGroup

    -- | Cast to `DBusActionGroup`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
    toDBusActionGroup :: (MonadIO m, IsDBusActionGroup o) => o -> m DBusActionGroup
    toDBusActionGroup = liftIO . unsafeCastTo DBusActionGroup

    -- | A convenience alias for `Nothing` :: `Maybe` `DBusActionGroup`.
    noDBusActionGroup :: Maybe DBusActionGroup
    noDBusActionGroup = Nothing

    #if ENABLE_OVERLOADING
    type family ResolveDBusActionGroupMethod (t :: Symbol) (o :: *) :: * where
        ResolveDBusActionGroupMethod "actionAdded" o = Gio.ActionGroup.ActionGroupActionAddedMethodInfo
        ResolveDBusActionGroupMethod "actionEnabledChanged" o = Gio.ActionGroup.ActionGroupActionEnabledChangedMethodInfo
        ResolveDBusActionGroupMethod "actionRemoved" o = Gio.ActionGroup.ActionGroupActionRemovedMethodInfo
        ResolveDBusActionGroupMethod "actionStateChanged" o = Gio.ActionGroup.ActionGroupActionStateChangedMethodInfo
        ResolveDBusActionGroupMethod "activateAction" o = Gio.ActionGroup.ActionGroupActivateActionMethodInfo
        ResolveDBusActionGroupMethod "activateActionFull" o = Gio.RemoteActionGroup.RemoteActionGroupActivateActionFullMethodInfo
        ResolveDBusActionGroupMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveDBusActionGroupMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveDBusActionGroupMethod "changeActionState" o = Gio.ActionGroup.ActionGroupChangeActionStateMethodInfo
        ResolveDBusActionGroupMethod "changeActionStateFull" o = Gio.RemoteActionGroup.RemoteActionGroupChangeActionStateFullMethodInfo
        ResolveDBusActionGroupMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveDBusActionGroupMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveDBusActionGroupMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveDBusActionGroupMethod "hasAction" o = Gio.ActionGroup.ActionGroupHasActionMethodInfo
        ResolveDBusActionGroupMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveDBusActionGroupMethod "listActions" o = Gio.ActionGroup.ActionGroupListActionsMethodInfo
        ResolveDBusActionGroupMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveDBusActionGroupMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveDBusActionGroupMethod "queryAction" o = Gio.ActionGroup.ActionGroupQueryActionMethodInfo
        ResolveDBusActionGroupMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveDBusActionGroupMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveDBusActionGroupMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveDBusActionGroupMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveDBusActionGroupMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveDBusActionGroupMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveDBusActionGroupMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveDBusActionGroupMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveDBusActionGroupMethod "getActionEnabled" o = Gio.ActionGroup.ActionGroupGetActionEnabledMethodInfo
        ResolveDBusActionGroupMethod "getActionParameterType" o = Gio.ActionGroup.ActionGroupGetActionParameterTypeMethodInfo
        ResolveDBusActionGroupMethod "getActionState" o = Gio.ActionGroup.ActionGroupGetActionStateMethodInfo
        ResolveDBusActionGroupMethod "getActionStateHint" o = Gio.ActionGroup.ActionGroupGetActionStateHintMethodInfo
        ResolveDBusActionGroupMethod "getActionStateType" o = Gio.ActionGroup.ActionGroupGetActionStateTypeMethodInfo
        ResolveDBusActionGroupMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveDBusActionGroupMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveDBusActionGroupMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveDBusActionGroupMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveDBusActionGroupMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveDBusActionGroupMethod l o = O.MethodResolutionFailed l o

    instance (info ~ ResolveDBusActionGroupMethod t DBusActionGroup, O.MethodInfo info DBusActionGroup p) => O.IsLabelProxy t (DBusActionGroup -> p) where
        fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveDBusActionGroupMethod t DBusActionGroup, O.MethodInfo info DBusActionGroup p) => O.IsLabel t (DBusActionGroup -> p) where
    #if MIN_VERSION_base(4,10,0)
        fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
    #else
        fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
    #endif
    #endif

    #endif

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList DBusActionGroup
    type instance O.AttributeList DBusActionGroup = DBusActionGroupAttributeList
    type DBusActionGroupAttributeList = ('[ ] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    #endif

    #if ENABLE_OVERLOADING
    type instance O.SignalList DBusActionGroup = DBusActionGroupSignalList
    type DBusActionGroupSignalList = ('[ '("actionAdded", Gio.ActionGroup.ActionGroupActionAddedSignalInfo), '("actionEnabledChanged", Gio.ActionGroup.ActionGroupActionEnabledChangedSignalInfo), '("actionRemoved", Gio.ActionGroup.ActionGroupActionRemovedSignalInfo), '("actionStateChanged", Gio.ActionGroup.ActionGroupActionStateChangedSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

    -- method DBusActionGroup::get
    -- method type : MemberFunction
    -- Args : [Arg {argCName = "connection", argType = TInterface (Name {namespace = "Gio", name = "DBusConnection"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GDBusConnection", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "bus_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the bus name which exports the action\n    group or %NULL if @connection is not a message bus connection", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "object_path", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the object path at which the action group is exported", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "DBusActionGroup"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_dbus_action_group_get" g_dbus_action_group_get ::
        Ptr Gio.DBusConnection.DBusConnection -> -- connection : TInterface (Name {namespace = "Gio", name = "DBusConnection"})
        CString ->                              -- bus_name : TBasicType TUTF8
        CString ->                              -- object_path : TBasicType TUTF8
        IO (Ptr DBusActionGroup)

    {- |
    Obtains a 'GI.Gio.Objects.DBusActionGroup.DBusActionGroup' for the action group which is exported at
    the given /@busName@/ and /@objectPath@/.

    The thread default main context is taken at the time of this call.
    All signals on the menu model (and any linked models) are reported
    with respect to this context.  All calls on the returned menu model
    (and linked models) must also originate from this same context, with
    the thread default main context unchanged.

    This call is non-blocking.  The returned action group may or may not
    already be filled in.  The correct thing to do is connect the signals
    for the action group to monitor for changes and then to call
    'GI.Gio.Interfaces.ActionGroup.actionGroupListActions' to get the initial list.

    /Since: 2.32/
    -}
    dBusActionGroupGet ::
        (B.CallStack.HasCallStack, MonadIO m, Gio.DBusConnection.IsDBusConnection a) =>
        a
        {- ^ /@connection@/: A 'GI.Gio.Objects.DBusConnection.DBusConnection' -}
        -> Maybe (T.Text)
        {- ^ /@busName@/: the bus name which exports the action
        group or 'Nothing' if /@connection@/ is not a message bus connection -}
        -> T.Text
        {- ^ /@objectPath@/: the object path at which the action group is exported -}
        -> m DBusActionGroup
        {- ^ __Returns:__ a 'GI.Gio.Objects.DBusActionGroup.DBusActionGroup' -}
    dBusActionGroupGet connection busName objectPath = liftIO $ do
        connection' <- unsafeManagedPtrCastPtr connection
        maybeBusName <- case busName of
            Nothing -> return nullPtr
            Just jBusName -> do
                jBusName' <- textToCString jBusName
                return jBusName'
        objectPath' <- textToCString objectPath
        result <- g_dbus_action_group_get connection' maybeBusName objectPath'
        checkUnexpectedReturnNULL "dBusActionGroupGet" result
        result' <- (wrapObject DBusActionGroup) result
        touchManagedPtr connection
        freeMem maybeBusName
        freeMem objectPath'
        return result'

    #if ENABLE_OVERLOADING
    #endif