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

    The GRemoteActionGroup interface is implemented by 'GI.Gio.Interfaces.ActionGroup.ActionGroup'
    instances that either transmit action invocations to other processes
    or receive action invocations in the local process from other
    processes.

    The interface has @_full@ variants of the two
    methods on 'GI.Gio.Interfaces.ActionGroup.ActionGroup' used to activate actions:
    'GI.Gio.Interfaces.ActionGroup.actionGroupActivateAction' and
    'GI.Gio.Interfaces.ActionGroup.actionGroupChangeActionState'. These variants allow a
    \"platform data\" 'GVariant' to be specified: a dictionary providing
    context for the action invocation (for example: timestamps, startup
    notification IDs, etc).

    'GI.Gio.Objects.DBusActionGroup.DBusActionGroup' implements 'GI.Gio.Interfaces.RemoteActionGroup.RemoteActionGroup'.  This provides a
    mechanism to send platform data for action invocations over D-Bus.

    Additionally, 'GI.Gio.Objects.DBusConnection.dBusConnectionExportActionGroup' will check if
    the exported 'GI.Gio.Interfaces.ActionGroup.ActionGroup' implements 'GI.Gio.Interfaces.RemoteActionGroup.RemoteActionGroup' and use the
    @_full@ variants of the calls if available.  This
    provides a mechanism by which to receive platform data for action
    invocations that arrive by way of D-Bus.

    /Since: 2.32/
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Interfaces.RemoteActionGroup
        (

    -- * Exported types
        RemoteActionGroup(..)                   ,
        noRemoteActionGroup                     ,
        IsRemoteActionGroup                     ,
        toRemoteActionGroup                     ,

     -- * Methods
    -- ** activateActionFull #method:activateActionFull#

    #if ENABLE_OVERLOADING
        RemoteActionGroupActivateActionFullMethodInfo,
    #endif
        remoteActionGroupActivateActionFull     ,

    -- ** changeActionStateFull #method:changeActionStateFull#

    #if ENABLE_OVERLOADING
        RemoteActionGroupChangeActionStateFullMethodInfo,
    #endif
        remoteActionGroupChangeActionStateFull  ,

        ) 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

    -- interface RemoteActionGroup
    -- | Memory-managed wrapper type.
    newtype RemoteActionGroup = RemoteActionGroup (ManagedPtr RemoteActionGroup)
    -- | A convenience alias for `Nothing` :: `Maybe` `RemoteActionGroup`.
    noRemoteActionGroup :: Maybe RemoteActionGroup
    noRemoteActionGroup = Nothing

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

    #endif

    foreign import ccall "g_remote_action_group_get_type"
        c_g_remote_action_group_get_type :: IO GType

    instance GObject RemoteActionGroup where
        gobjectType _ = c_g_remote_action_group_get_type

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

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

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

    #if ENABLE_OVERLOADING
    #endif

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

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveRemoteActionGroupMethod t RemoteActionGroup, O.MethodInfo info RemoteActionGroup p) => O.IsLabel t (RemoteActionGroup -> 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

    -- method RemoteActionGroup::activate_action_full
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Gio", name = "RemoteActionGroup"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GDBusActionGroup", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "action_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the action to activate", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "parameter", argType = TVariant, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the optional parameter to the activation", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "platform_data", argType = TVariant, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the platform data to send", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_remote_action_group_activate_action_full" g_remote_action_group_activate_action_full ::
        Ptr RemoteActionGroup ->                -- remote : TInterface (Name {namespace = "Gio", name = "RemoteActionGroup"})
        CString ->                              -- action_name : TBasicType TUTF8
        Ptr GVariant ->                         -- parameter : TVariant
        Ptr GVariant ->                         -- platform_data : TVariant
        IO ()

    {- |
    Activates the remote action.

    This is the same as 'GI.Gio.Interfaces.ActionGroup.actionGroupActivateAction' except that it
    allows for provision of \"platform data\" to be sent along with the
    activation request.  This typically contains details such as the user
    interaction timestamp or startup notification information.

    /@platformData@/ must be non-'Nothing' and must have the type
    @/G_VARIANT_TYPE_VARDICT/@.  If it is floating, it will be consumed.

    /Since: 2.32/
    -}
    remoteActionGroupActivateActionFull ::
        (B.CallStack.HasCallStack, MonadIO m, IsRemoteActionGroup a) =>
        a
        {- ^ /@remote@/: a 'GI.Gio.Objects.DBusActionGroup.DBusActionGroup' -}
        -> T.Text
        {- ^ /@actionName@/: the name of the action to activate -}
        -> Maybe (GVariant)
        {- ^ /@parameter@/: the optional parameter to the activation -}
        -> GVariant
        {- ^ /@platformData@/: the platform data to send -}
        -> m ()
    remoteActionGroupActivateActionFull remote actionName parameter platformData = liftIO $ do
        remote' <- unsafeManagedPtrCastPtr remote
        actionName' <- textToCString actionName
        maybeParameter <- case parameter of
            Nothing -> return nullPtr
            Just jParameter -> do
                jParameter' <- unsafeManagedPtrGetPtr jParameter
                return jParameter'
        platformData' <- unsafeManagedPtrGetPtr platformData
        g_remote_action_group_activate_action_full remote' actionName' maybeParameter platformData'
        touchManagedPtr remote
        whenJust parameter touchManagedPtr
        touchManagedPtr platformData
        freeMem actionName'
        return ()

    #if ENABLE_OVERLOADING
    data RemoteActionGroupActivateActionFullMethodInfo
    instance (signature ~ (T.Text -> Maybe (GVariant) -> GVariant -> m ()), MonadIO m, IsRemoteActionGroup a) => O.MethodInfo RemoteActionGroupActivateActionFullMethodInfo a signature where
        overloadedMethod _ = remoteActionGroupActivateActionFull

    #endif

    -- method RemoteActionGroup::change_action_state_full
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Gio", name = "RemoteActionGroup"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GRemoteActionGroup", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "action_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the action to change the state of", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "value", argType = TVariant, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the new requested value for the state", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "platform_data", argType = TVariant, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the platform data to send", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_remote_action_group_change_action_state_full" g_remote_action_group_change_action_state_full ::
        Ptr RemoteActionGroup ->                -- remote : TInterface (Name {namespace = "Gio", name = "RemoteActionGroup"})
        CString ->                              -- action_name : TBasicType TUTF8
        Ptr GVariant ->                         -- value : TVariant
        Ptr GVariant ->                         -- platform_data : TVariant
        IO ()

    {- |
    Changes the state of a remote action.

    This is the same as 'GI.Gio.Interfaces.ActionGroup.actionGroupChangeActionState' except that
    it allows for provision of \"platform data\" to be sent along with the
    state change request.  This typically contains details such as the
    user interaction timestamp or startup notification information.

    /@platformData@/ must be non-'Nothing' and must have the type
    @/G_VARIANT_TYPE_VARDICT/@.  If it is floating, it will be consumed.

    /Since: 2.32/
    -}
    remoteActionGroupChangeActionStateFull ::
        (B.CallStack.HasCallStack, MonadIO m, IsRemoteActionGroup a) =>
        a
        {- ^ /@remote@/: a 'GI.Gio.Interfaces.RemoteActionGroup.RemoteActionGroup' -}
        -> T.Text
        {- ^ /@actionName@/: the name of the action to change the state of -}
        -> GVariant
        {- ^ /@value@/: the new requested value for the state -}
        -> GVariant
        {- ^ /@platformData@/: the platform data to send -}
        -> m ()
    remoteActionGroupChangeActionStateFull remote actionName value platformData = liftIO $ do
        remote' <- unsafeManagedPtrCastPtr remote
        actionName' <- textToCString actionName
        value' <- unsafeManagedPtrGetPtr value
        platformData' <- unsafeManagedPtrGetPtr platformData
        g_remote_action_group_change_action_state_full remote' actionName' value' platformData'
        touchManagedPtr remote
        touchManagedPtr value
        touchManagedPtr platformData
        freeMem actionName'
        return ()

    #if ENABLE_OVERLOADING
    data RemoteActionGroupChangeActionStateFullMethodInfo
    instance (signature ~ (T.Text -> GVariant -> GVariant -> m ()), MonadIO m, IsRemoteActionGroup a) => O.MethodInfo RemoteActionGroupChangeActionStateFullMethodInfo a signature where
        overloadedMethod _ = remoteActionGroupChangeActionStateFull

    #endif