    {- |
    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.Interfaces.DesktopAppInfoLookup.DesktopAppInfoLookup' is an opaque data structure and can only be accessed
    using the following functions.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Interfaces.DesktopAppInfoLookup
        (

    -- * Exported types
        DesktopAppInfoLookup(..)                ,
        noDesktopAppInfoLookup                  ,
        IsDesktopAppInfoLookup                  ,
        toDesktopAppInfoLookup                  ,

     -- * Methods
    -- ** getDefaultForUriScheme #method:getDefaultForUriScheme#

    #if ENABLE_OVERLOADING
        DesktopAppInfoLookupGetDefaultForUriSchemeMethodInfo,
    #endif
        desktopAppInfoLookupGetDefaultForUriScheme,

        ) 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.AppInfo as Gio.AppInfo

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

    #if ENABLE_OVERLOADING
    type instance O.SignalList DesktopAppInfoLookup = DesktopAppInfoLookupSignalList
    type DesktopAppInfoLookupSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

    foreign import ccall "g_desktop_app_info_lookup_get_type"
        c_g_desktop_app_info_lookup_get_type :: IO GType

    instance GObject DesktopAppInfoLookup where
        gobjectType _ = c_g_desktop_app_info_lookup_get_type

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

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

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

    #if ENABLE_OVERLOADING
    #endif

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

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveDesktopAppInfoLookupMethod t DesktopAppInfoLookup, O.MethodInfo info DesktopAppInfoLookup p) => O.IsLabel t (DesktopAppInfoLookup -> 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 DesktopAppInfoLookup::get_default_for_uri_scheme
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "lookup", argType = TInterface (Name {namespace = "Gio", name = "DesktopAppInfoLookup"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GDesktopAppInfoLookup", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "uri_scheme", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a string containing a URI scheme.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "AppInfo"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_desktop_app_info_lookup_get_default_for_uri_scheme" g_desktop_app_info_lookup_get_default_for_uri_scheme ::
        Ptr DesktopAppInfoLookup ->             -- lookup : TInterface (Name {namespace = "Gio", name = "DesktopAppInfoLookup"})
        CString ->                              -- uri_scheme : TBasicType TUTF8
        IO (Ptr Gio.AppInfo.AppInfo)

    {-# DEPRECATED desktopAppInfoLookupGetDefaultForUriScheme ["The 'GI.Gio.Interfaces.DesktopAppInfoLookup.DesktopAppInfoLookup' interface is deprecated and unused by gio."] #-}
    {- |
    Gets the default application for launching applications
    using this URI scheme for a particular GDesktopAppInfoLookup
    implementation.

    The GDesktopAppInfoLookup interface and this function is used
    to implement 'GI.Gio.Functions.appInfoGetDefaultForUriScheme' backends
    in a GIO module. There is no reason for applications to use it
    directly. Applications should use 'GI.Gio.Functions.appInfoGetDefaultForUriScheme'.
    -}
    desktopAppInfoLookupGetDefaultForUriScheme ::
        (B.CallStack.HasCallStack, MonadIO m, IsDesktopAppInfoLookup a) =>
        a
        {- ^ /@lookup@/: a 'GI.Gio.Interfaces.DesktopAppInfoLookup.DesktopAppInfoLookup' -}
        -> T.Text
        {- ^ /@uriScheme@/: a string containing a URI scheme. -}
        -> m Gio.AppInfo.AppInfo
        {- ^ __Returns:__ 'GI.Gio.Interfaces.AppInfo.AppInfo' for given /@uriScheme@/ or 'Nothing' on error. -}
    desktopAppInfoLookupGetDefaultForUriScheme lookup uriScheme = liftIO $ do
        lookup' <- unsafeManagedPtrCastPtr lookup
        uriScheme' <- textToCString uriScheme
        result <- g_desktop_app_info_lookup_get_default_for_uri_scheme lookup' uriScheme'
        checkUnexpectedReturnNULL "desktopAppInfoLookupGetDefaultForUriScheme" result
        result' <- (wrapObject Gio.AppInfo.AppInfo) result
        touchManagedPtr lookup
        freeMem uriScheme'
        return result'

    #if ENABLE_OVERLOADING
    data DesktopAppInfoLookupGetDefaultForUriSchemeMethodInfo
    instance (signature ~ (T.Text -> m Gio.AppInfo.AppInfo), MonadIO m, IsDesktopAppInfoLookup a) => O.MethodInfo DesktopAppInfoLookupGetDefaultForUriSchemeMethodInfo a signature where
        overloadedMethod _ = desktopAppInfoLookupGetDefaultForUriScheme

    #endif