    {- |
    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.TlsFileDatabase.TlsFileDatabase' is implemented by 'GI.Gio.Objects.TlsDatabase.TlsDatabase' objects which load
    their certificate information from a file. It is an interface which
    TLS library specific subtypes implement.

    /Since: 2.30/
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Interfaces.TlsFileDatabase
        (

    -- * Exported types
        TlsFileDatabase(..)                     ,
        noTlsFileDatabase                       ,
        IsTlsFileDatabase                       ,
        toTlsFileDatabase                       ,

     -- * Methods
    -- ** new #method:new#

        tlsFileDatabaseNew                      ,

     -- * Properties
    -- ** anchors #attr:anchors#
    {- | The path to a file containing PEM encoded certificate authority
    root anchors. The certificates in this file will be treated as
    root authorities for the purpose of verifying other certificates
    via the 'GI.Gio.Objects.TlsDatabase.tlsDatabaseVerifyChain' operation.

    /Since: 2.30/
    -}
    #if ENABLE_OVERLOADING
        TlsFileDatabaseAnchorsPropertyInfo      ,
    #endif
        clearTlsFileDatabaseAnchors             ,
        constructTlsFileDatabaseAnchors         ,
        getTlsFileDatabaseAnchors               ,
        setTlsFileDatabaseAnchors               ,
    #if ENABLE_OVERLOADING
        tlsFileDatabaseAnchors                  ,
    #endif

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

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

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

    #endif

    foreign import ccall "g_tls_file_database_get_type"
        c_g_tls_file_database_get_type :: IO GType

    instance GObject TlsFileDatabase where
        gobjectType _ = c_g_tls_file_database_get_type

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

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

    -- VVV Prop "anchors"
       -- Type: TBasicType TUTF8
       -- Flags: [PropertyReadable,PropertyWritable,PropertyConstruct]
       -- Nullable: (Nothing,Nothing)

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

    @
    'Data.GI.Base.Attributes.get' tlsFileDatabase #anchors
    @
    -}
    getTlsFileDatabaseAnchors :: (MonadIO m, IsTlsFileDatabase o) => o -> m (Maybe T.Text)
    getTlsFileDatabaseAnchors obj = liftIO $ getObjectPropertyString obj "anchors"

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

    @
    'Data.GI.Base.Attributes.set' tlsFileDatabase [ #anchors 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setTlsFileDatabaseAnchors :: (MonadIO m, IsTlsFileDatabase o) => o -> T.Text -> m ()
    setTlsFileDatabaseAnchors obj val = liftIO $ setObjectPropertyString obj "anchors" (Just val)

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

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

    @
    'Data.GI.Base.Attributes.clear' #anchors
    @
    -}
    clearTlsFileDatabaseAnchors :: (MonadIO m, IsTlsFileDatabase o) => o -> m ()
    clearTlsFileDatabaseAnchors obj = liftIO $ setObjectPropertyString obj "anchors" (Nothing :: Maybe T.Text)

    #if ENABLE_OVERLOADING
    data TlsFileDatabaseAnchorsPropertyInfo
    instance AttrInfo TlsFileDatabaseAnchorsPropertyInfo where
        type AttrAllowedOps TlsFileDatabaseAnchorsPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet, 'AttrClear]
        type AttrSetTypeConstraint TlsFileDatabaseAnchorsPropertyInfo = (~) T.Text
        type AttrBaseTypeConstraint TlsFileDatabaseAnchorsPropertyInfo = IsTlsFileDatabase
        type AttrGetType TlsFileDatabaseAnchorsPropertyInfo = (Maybe T.Text)
        type AttrLabel TlsFileDatabaseAnchorsPropertyInfo = "anchors"
        type AttrOrigin TlsFileDatabaseAnchorsPropertyInfo = TlsFileDatabase
        attrGet _ = getTlsFileDatabaseAnchors
        attrSet _ = setTlsFileDatabaseAnchors
        attrConstruct _ = constructTlsFileDatabaseAnchors
        attrClear _ = clearTlsFileDatabaseAnchors
    #endif

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList TlsFileDatabase
    type instance O.AttributeList TlsFileDatabase = TlsFileDatabaseAttributeList
    type TlsFileDatabaseAttributeList = ('[ '("anchors", TlsFileDatabaseAnchorsPropertyInfo)] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    tlsFileDatabaseAnchors :: AttrLabelProxy "anchors"
    tlsFileDatabaseAnchors = AttrLabelProxy

    #endif

    #if ENABLE_OVERLOADING
    type family ResolveTlsFileDatabaseMethod (t :: Symbol) (o :: *) :: * where
        ResolveTlsFileDatabaseMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveTlsFileDatabaseMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveTlsFileDatabaseMethod "createCertificateHandle" o = Gio.TlsDatabase.TlsDatabaseCreateCertificateHandleMethodInfo
        ResolveTlsFileDatabaseMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveTlsFileDatabaseMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveTlsFileDatabaseMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveTlsFileDatabaseMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificateForHandle" o = Gio.TlsDatabase.TlsDatabaseLookupCertificateForHandleMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificateForHandleAsync" o = Gio.TlsDatabase.TlsDatabaseLookupCertificateForHandleAsyncMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificateForHandleFinish" o = Gio.TlsDatabase.TlsDatabaseLookupCertificateForHandleFinishMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificateIssuer" o = Gio.TlsDatabase.TlsDatabaseLookupCertificateIssuerMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificateIssuerAsync" o = Gio.TlsDatabase.TlsDatabaseLookupCertificateIssuerAsyncMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificateIssuerFinish" o = Gio.TlsDatabase.TlsDatabaseLookupCertificateIssuerFinishMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificatesIssuedBy" o = Gio.TlsDatabase.TlsDatabaseLookupCertificatesIssuedByMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificatesIssuedByAsync" o = Gio.TlsDatabase.TlsDatabaseLookupCertificatesIssuedByAsyncMethodInfo
        ResolveTlsFileDatabaseMethod "lookupCertificatesIssuedByFinish" o = Gio.TlsDatabase.TlsDatabaseLookupCertificatesIssuedByFinishMethodInfo
        ResolveTlsFileDatabaseMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveTlsFileDatabaseMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveTlsFileDatabaseMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveTlsFileDatabaseMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveTlsFileDatabaseMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveTlsFileDatabaseMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveTlsFileDatabaseMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveTlsFileDatabaseMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveTlsFileDatabaseMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveTlsFileDatabaseMethod "verifyChain" o = Gio.TlsDatabase.TlsDatabaseVerifyChainMethodInfo
        ResolveTlsFileDatabaseMethod "verifyChainAsync" o = Gio.TlsDatabase.TlsDatabaseVerifyChainAsyncMethodInfo
        ResolveTlsFileDatabaseMethod "verifyChainFinish" o = Gio.TlsDatabase.TlsDatabaseVerifyChainFinishMethodInfo
        ResolveTlsFileDatabaseMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveTlsFileDatabaseMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveTlsFileDatabaseMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveTlsFileDatabaseMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveTlsFileDatabaseMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveTlsFileDatabaseMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveTlsFileDatabaseMethod l o = O.MethodResolutionFailed l o

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveTlsFileDatabaseMethod t TlsFileDatabase, O.MethodInfo info TlsFileDatabase p) => O.IsLabel t (TlsFileDatabase -> 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 TlsFileDatabase::new
    -- method type : MemberFunction
    -- Args : [Arg {argCName = "anchors", argType = TBasicType TFileName, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "filename of anchor certificate authorities.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Gio", name = "TlsFileDatabase"}))
    -- throws : True
    -- Skip return : False

    foreign import ccall "g_tls_file_database_new" g_tls_file_database_new ::
        CString ->                              -- anchors : TBasicType TFileName
        Ptr (Ptr GError) ->                     -- error
        IO (Ptr TlsFileDatabase)

    {- |
    Creates a new 'GI.Gio.Interfaces.TlsFileDatabase.TlsFileDatabase' which uses anchor certificate authorities
    in /@anchors@/ to verify certificate chains.

    The certificates in /@anchors@/ must be PEM encoded.

    /Since: 2.30/
    -}
    tlsFileDatabaseNew ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        [Char]
        {- ^ /@anchors@/: filename of anchor certificate authorities. -}
        -> m TlsFileDatabase
        {- ^ __Returns:__ the new
    'GI.Gio.Interfaces.TlsFileDatabase.TlsFileDatabase', or 'Nothing' on error /(Can throw 'Data.GI.Base.GError.GError')/ -}
    tlsFileDatabaseNew anchors = liftIO $ do
        anchors' <- stringToCString anchors
        onException (do
            result <- propagateGError $ g_tls_file_database_new anchors'
            checkUnexpectedReturnNULL "tlsFileDatabaseNew" result
            result' <- (wrapObject TlsFileDatabase) result
            freeMem anchors'
            return result'
         ) (do
            freeMem anchors'
         )

    #if ENABLE_OVERLOADING
    #endif