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

    A 'GI.Gio.Objects.DBusObjectProxy.DBusObjectProxy' is an object used to represent a remote object
    with one or more D-Bus interfaces. Normally, you don\'t instantiate
    a 'GI.Gio.Objects.DBusObjectProxy.DBusObjectProxy' yourself - typically 'GI.Gio.Objects.DBusObjectManagerClient.DBusObjectManagerClient'
    is used to obtain it.

    /Since: 2.30/
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Objects.DBusObjectProxy
        (

    -- * Exported types
        DBusObjectProxy(..)                     ,
        IsDBusObjectProxy                       ,
        toDBusObjectProxy                       ,
        noDBusObjectProxy                       ,

     -- * Methods
    -- ** getConnection #method:getConnection#

    #if ENABLE_OVERLOADING
        DBusObjectProxyGetConnectionMethodInfo  ,
    #endif
        dBusObjectProxyGetConnection            ,

    -- ** new #method:new#

        dBusObjectProxyNew                      ,

     -- * Properties
    -- ** gConnection #attr:gConnection#
    {- | The connection of the proxy.

    /Since: 2.30/
    -}
    #if ENABLE_OVERLOADING
        DBusObjectProxyGConnectionPropertyInfo  ,
    #endif
        constructDBusObjectProxyGConnection     ,
    #if ENABLE_OVERLOADING
        dBusObjectProxyGConnection              ,
    #endif
        getDBusObjectProxyGConnection           ,

    -- ** gObjectPath #attr:gObjectPath#
    {- | The object path of the proxy.

    /Since: 2.30/
    -}
    #if ENABLE_OVERLOADING
        DBusObjectProxyGObjectPathPropertyInfo  ,
    #endif
        constructDBusObjectProxyGObjectPath     ,
    #if ENABLE_OVERLOADING
        dBusObjectProxyGObjectPath              ,
    #endif
        getDBusObjectProxyGObjectPath           ,

        ) 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.DBusObject as Gio.DBusObject
    import {-# SOURCE #-} qualified GI.Gio.Objects.DBusConnection as Gio.DBusConnection

    -- | Memory-managed wrapper type.
    newtype DBusObjectProxy = DBusObjectProxy (ManagedPtr DBusObjectProxy)
    foreign import ccall "g_dbus_object_proxy_get_type"
        c_g_dbus_object_proxy_get_type :: IO GType

    instance GObject DBusObjectProxy where
        gobjectType _ = c_g_dbus_object_proxy_get_type

    -- | Type class for types which can be safely cast to `DBusObjectProxy`, for instance with `toDBusObjectProxy`.
    class GObject o => IsDBusObjectProxy o
    #if MIN_VERSION_base(4,9,0)
    instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError DBusObjectProxy a) =>
        IsDBusObjectProxy a
    #endif
    instance IsDBusObjectProxy DBusObjectProxy
    instance GObject.Object.IsObject DBusObjectProxy
    instance Gio.DBusObject.IsDBusObject DBusObjectProxy

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

    -- | A convenience alias for `Nothing` :: `Maybe` `DBusObjectProxy`.
    noDBusObjectProxy :: Maybe DBusObjectProxy
    noDBusObjectProxy = Nothing

    #if ENABLE_OVERLOADING
    type family ResolveDBusObjectProxyMethod (t :: Symbol) (o :: *) :: * where
        ResolveDBusObjectProxyMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveDBusObjectProxyMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveDBusObjectProxyMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveDBusObjectProxyMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveDBusObjectProxyMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveDBusObjectProxyMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveDBusObjectProxyMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveDBusObjectProxyMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveDBusObjectProxyMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveDBusObjectProxyMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveDBusObjectProxyMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveDBusObjectProxyMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveDBusObjectProxyMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveDBusObjectProxyMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveDBusObjectProxyMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveDBusObjectProxyMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveDBusObjectProxyMethod "getConnection" o = DBusObjectProxyGetConnectionMethodInfo
        ResolveDBusObjectProxyMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveDBusObjectProxyMethod "getInterface" o = Gio.DBusObject.DBusObjectGetInterfaceMethodInfo
        ResolveDBusObjectProxyMethod "getInterfaces" o = Gio.DBusObject.DBusObjectGetInterfacesMethodInfo
        ResolveDBusObjectProxyMethod "getObjectPath" o = Gio.DBusObject.DBusObjectGetObjectPathMethodInfo
        ResolveDBusObjectProxyMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveDBusObjectProxyMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveDBusObjectProxyMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveDBusObjectProxyMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveDBusObjectProxyMethod l o = O.MethodResolutionFailed l o

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

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

    -- VVV Prop "g-connection"
       -- Type: TInterface (Name {namespace = "Gio", name = "DBusConnection"})
       -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]
       -- Nullable: (Nothing,Nothing)

    {- |
    Get the value of the “@g-connection@” property.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' dBusObjectProxy #gConnection
    @
    -}
    getDBusObjectProxyGConnection :: (MonadIO m, IsDBusObjectProxy o) => o -> m (Maybe Gio.DBusConnection.DBusConnection)
    getDBusObjectProxyGConnection obj = liftIO $ getObjectPropertyObject obj "g-connection" Gio.DBusConnection.DBusConnection

    {- |
    Construct a `GValueConstruct` with valid value for the “@g-connection@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
    -}
    constructDBusObjectProxyGConnection :: (IsDBusObjectProxy o, Gio.DBusConnection.IsDBusConnection a) => a -> IO (GValueConstruct o)
    constructDBusObjectProxyGConnection val = constructObjectPropertyObject "g-connection" (Just val)

    #if ENABLE_OVERLOADING
    data DBusObjectProxyGConnectionPropertyInfo
    instance AttrInfo DBusObjectProxyGConnectionPropertyInfo where
        type AttrAllowedOps DBusObjectProxyGConnectionPropertyInfo = '[ 'AttrConstruct, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint DBusObjectProxyGConnectionPropertyInfo = Gio.DBusConnection.IsDBusConnection
        type AttrBaseTypeConstraint DBusObjectProxyGConnectionPropertyInfo = IsDBusObjectProxy
        type AttrGetType DBusObjectProxyGConnectionPropertyInfo = (Maybe Gio.DBusConnection.DBusConnection)
        type AttrLabel DBusObjectProxyGConnectionPropertyInfo = "g-connection"
        type AttrOrigin DBusObjectProxyGConnectionPropertyInfo = DBusObjectProxy
        attrGet _ = getDBusObjectProxyGConnection
        attrSet _ = undefined
        attrConstruct _ = constructDBusObjectProxyGConnection
        attrClear _ = undefined
    #endif

    -- VVV Prop "g-object-path"
       -- Type: TBasicType TUTF8
       -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]
       -- Nullable: (Nothing,Nothing)

    {- |
    Get the value of the “@g-object-path@” property.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' dBusObjectProxy #gObjectPath
    @
    -}
    getDBusObjectProxyGObjectPath :: (MonadIO m, IsDBusObjectProxy o) => o -> m (Maybe T.Text)
    getDBusObjectProxyGObjectPath obj = liftIO $ getObjectPropertyString obj "g-object-path"

    {- |
    Construct a `GValueConstruct` with valid value for the “@g-object-path@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
    -}
    constructDBusObjectProxyGObjectPath :: (IsDBusObjectProxy o) => T.Text -> IO (GValueConstruct o)
    constructDBusObjectProxyGObjectPath val = constructObjectPropertyString "g-object-path" (Just val)

    #if ENABLE_OVERLOADING
    data DBusObjectProxyGObjectPathPropertyInfo
    instance AttrInfo DBusObjectProxyGObjectPathPropertyInfo where
        type AttrAllowedOps DBusObjectProxyGObjectPathPropertyInfo = '[ 'AttrConstruct, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint DBusObjectProxyGObjectPathPropertyInfo = (~) T.Text
        type AttrBaseTypeConstraint DBusObjectProxyGObjectPathPropertyInfo = IsDBusObjectProxy
        type AttrGetType DBusObjectProxyGObjectPathPropertyInfo = (Maybe T.Text)
        type AttrLabel DBusObjectProxyGObjectPathPropertyInfo = "g-object-path"
        type AttrOrigin DBusObjectProxyGObjectPathPropertyInfo = DBusObjectProxy
        attrGet _ = getDBusObjectProxyGObjectPath
        attrSet _ = undefined
        attrConstruct _ = constructDBusObjectProxyGObjectPath
        attrClear _ = undefined
    #endif

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList DBusObjectProxy
    type instance O.AttributeList DBusObjectProxy = DBusObjectProxyAttributeList
    type DBusObjectProxyAttributeList = ('[ '("gConnection", DBusObjectProxyGConnectionPropertyInfo), '("gObjectPath", DBusObjectProxyGObjectPathPropertyInfo)] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    dBusObjectProxyGConnection :: AttrLabelProxy "gConnection"
    dBusObjectProxyGConnection = AttrLabelProxy

    dBusObjectProxyGObjectPath :: AttrLabelProxy "gObjectPath"
    dBusObjectProxyGObjectPath = AttrLabelProxy

    #endif

    #if ENABLE_OVERLOADING
    type instance O.SignalList DBusObjectProxy = DBusObjectProxySignalList
    type DBusObjectProxySignalList = ('[ '("interfaceAdded", Gio.DBusObject.DBusObjectInterfaceAddedSignalInfo), '("interfaceRemoved", Gio.DBusObject.DBusObjectInterfaceRemovedSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

    -- method DBusObjectProxy::new
    -- method type : Constructor
    -- 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 = "object_path", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the object path", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "DBusObjectProxy"}))
    -- throws : False
    -- Skip return : False

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

    {- |
    Creates a new 'GI.Gio.Objects.DBusObjectProxy.DBusObjectProxy' for the given connection and
    object path.

    /Since: 2.30/
    -}
    dBusObjectProxyNew ::
        (B.CallStack.HasCallStack, MonadIO m, Gio.DBusConnection.IsDBusConnection a) =>
        a
        {- ^ /@connection@/: a 'GI.Gio.Objects.DBusConnection.DBusConnection' -}
        -> T.Text
        {- ^ /@objectPath@/: the object path -}
        -> m DBusObjectProxy
        {- ^ __Returns:__ a new 'GI.Gio.Objects.DBusObjectProxy.DBusObjectProxy' -}
    dBusObjectProxyNew connection objectPath = liftIO $ do
        connection' <- unsafeManagedPtrCastPtr connection
        objectPath' <- textToCString objectPath
        result <- g_dbus_object_proxy_new connection' objectPath'
        checkUnexpectedReturnNULL "dBusObjectProxyNew" result
        result' <- (wrapObject DBusObjectProxy) result
        touchManagedPtr connection
        freeMem objectPath'
        return result'

    #if ENABLE_OVERLOADING
    #endif

    -- method DBusObjectProxy::get_connection
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "proxy", argType = TInterface (Name {namespace = "Gio", name = "DBusObjectProxy"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GDBusObjectProxy", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "DBusConnection"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_dbus_object_proxy_get_connection" g_dbus_object_proxy_get_connection ::
        Ptr DBusObjectProxy ->                  -- proxy : TInterface (Name {namespace = "Gio", name = "DBusObjectProxy"})
        IO (Ptr Gio.DBusConnection.DBusConnection)

    {- |
    Gets the connection that /@proxy@/ is for.

    /Since: 2.30/
    -}
    dBusObjectProxyGetConnection ::
        (B.CallStack.HasCallStack, MonadIO m, IsDBusObjectProxy a) =>
        a
        {- ^ /@proxy@/: a 'GI.Gio.Objects.DBusObjectProxy.DBusObjectProxy' -}
        -> m Gio.DBusConnection.DBusConnection
        {- ^ __Returns:__ A 'GI.Gio.Objects.DBusConnection.DBusConnection'. Do not free, the
      object is owned by /@proxy@/. -}
    dBusObjectProxyGetConnection proxy = liftIO $ do
        proxy' <- unsafeManagedPtrCastPtr proxy
        result <- g_dbus_object_proxy_get_connection proxy'
        checkUnexpectedReturnNULL "dBusObjectProxyGetConnection" result
        result' <- (newObject Gio.DBusConnection.DBusConnection) result
        touchManagedPtr proxy
        return result'

    #if ENABLE_OVERLOADING
    data DBusObjectProxyGetConnectionMethodInfo
    instance (signature ~ (m Gio.DBusConnection.DBusConnection), MonadIO m, IsDBusObjectProxy a) => O.MethodInfo DBusObjectProxyGetConnectionMethodInfo a signature where
        overloadedMethod _ = dBusObjectProxyGetConnection

    #endif