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

module GI.Gio.Objects.TlsCertificate
    ( 

-- * Exported types
    TlsCertificate(..)                      ,
    TlsCertificateK                         ,
    toTlsCertificate                        ,
    noTlsCertificate                        ,


 -- * Methods
-- ** tlsCertificateGetIssuer
    tlsCertificateGetIssuer                 ,


-- ** tlsCertificateIsSame
    tlsCertificateIsSame                    ,


-- ** tlsCertificateListNewFromFile
    tlsCertificateListNewFromFile           ,


-- ** tlsCertificateNewFromFile
    tlsCertificateNewFromFile               ,


-- ** tlsCertificateNewFromFiles
    tlsCertificateNewFromFiles              ,


-- ** tlsCertificateNewFromPem
    tlsCertificateNewFromPem                ,


-- ** tlsCertificateVerify
    tlsCertificateVerify                    ,




 -- * Properties
-- ** Certificate
    TlsCertificateCertificatePropertyInfo   ,
    constructTlsCertificateCertificate      ,
    getTlsCertificateCertificate            ,


-- ** CertificatePem
    TlsCertificateCertificatePemPropertyInfo,
    constructTlsCertificateCertificatePem   ,
    getTlsCertificateCertificatePem         ,


-- ** Issuer
    TlsCertificateIssuerPropertyInfo        ,
    constructTlsCertificateIssuer           ,
    getTlsCertificateIssuer                 ,


-- ** PrivateKey
    TlsCertificatePrivateKeyPropertyInfo    ,
    constructTlsCertificatePrivateKey       ,


-- ** PrivateKeyPem
    TlsCertificatePrivateKeyPemPropertyInfo ,
    constructTlsCertificatePrivateKeyPem    ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.Gio.Types
import GI.Gio.Callbacks
import qualified GI.GObject as GObject

newtype TlsCertificate = TlsCertificate (ForeignPtr TlsCertificate)
foreign import ccall "g_tls_certificate_get_type"
    c_g_tls_certificate_get_type :: IO GType

type instance ParentTypes TlsCertificate = TlsCertificateParentTypes
type TlsCertificateParentTypes = '[GObject.Object]

instance GObject TlsCertificate where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_g_tls_certificate_get_type
    

class GObject o => TlsCertificateK o
instance (GObject o, IsDescendantOf TlsCertificate o) => TlsCertificateK o

toTlsCertificate :: TlsCertificateK o => o -> IO TlsCertificate
toTlsCertificate = unsafeCastTo TlsCertificate

noTlsCertificate :: Maybe TlsCertificate
noTlsCertificate = Nothing

-- VVV Prop "certificate"
   -- Type: TByteArray
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getTlsCertificateCertificate :: (MonadIO m, TlsCertificateK o) => o -> m ByteString
getTlsCertificateCertificate obj = liftIO $ getObjectPropertyByteArray obj "certificate"

constructTlsCertificateCertificate :: ByteString -> IO ([Char], GValue)
constructTlsCertificateCertificate val = constructObjectPropertyByteArray "certificate" val

data TlsCertificateCertificatePropertyInfo
instance AttrInfo TlsCertificateCertificatePropertyInfo where
    type AttrAllowedOps TlsCertificateCertificatePropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint TlsCertificateCertificatePropertyInfo = (~) ByteString
    type AttrBaseTypeConstraint TlsCertificateCertificatePropertyInfo = TlsCertificateK
    type AttrGetType TlsCertificateCertificatePropertyInfo = ByteString
    type AttrLabel TlsCertificateCertificatePropertyInfo = "TlsCertificate::certificate"
    attrGet _ = getTlsCertificateCertificate
    attrSet _ = undefined
    attrConstruct _ = constructTlsCertificateCertificate

-- VVV Prop "certificate-pem"
   -- Type: TBasicType TUTF8
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getTlsCertificateCertificatePem :: (MonadIO m, TlsCertificateK o) => o -> m T.Text
getTlsCertificateCertificatePem obj = liftIO $ getObjectPropertyString obj "certificate-pem"

constructTlsCertificateCertificatePem :: T.Text -> IO ([Char], GValue)
constructTlsCertificateCertificatePem val = constructObjectPropertyString "certificate-pem" val

data TlsCertificateCertificatePemPropertyInfo
instance AttrInfo TlsCertificateCertificatePemPropertyInfo where
    type AttrAllowedOps TlsCertificateCertificatePemPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint TlsCertificateCertificatePemPropertyInfo = (~) T.Text
    type AttrBaseTypeConstraint TlsCertificateCertificatePemPropertyInfo = TlsCertificateK
    type AttrGetType TlsCertificateCertificatePemPropertyInfo = T.Text
    type AttrLabel TlsCertificateCertificatePemPropertyInfo = "TlsCertificate::certificate-pem"
    attrGet _ = getTlsCertificateCertificatePem
    attrSet _ = undefined
    attrConstruct _ = constructTlsCertificateCertificatePem

-- VVV Prop "issuer"
   -- Type: TInterface "Gio" "TlsCertificate"
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getTlsCertificateIssuer :: (MonadIO m, TlsCertificateK o) => o -> m TlsCertificate
getTlsCertificateIssuer obj = liftIO $ getObjectPropertyObject obj "issuer" TlsCertificate

constructTlsCertificateIssuer :: (TlsCertificateK a) => a -> IO ([Char], GValue)
constructTlsCertificateIssuer val = constructObjectPropertyObject "issuer" val

data TlsCertificateIssuerPropertyInfo
instance AttrInfo TlsCertificateIssuerPropertyInfo where
    type AttrAllowedOps TlsCertificateIssuerPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint TlsCertificateIssuerPropertyInfo = TlsCertificateK
    type AttrBaseTypeConstraint TlsCertificateIssuerPropertyInfo = TlsCertificateK
    type AttrGetType TlsCertificateIssuerPropertyInfo = TlsCertificate
    type AttrLabel TlsCertificateIssuerPropertyInfo = "TlsCertificate::issuer"
    attrGet _ = getTlsCertificateIssuer
    attrSet _ = undefined
    attrConstruct _ = constructTlsCertificateIssuer

-- VVV Prop "private-key"
   -- Type: TByteArray
   -- Flags: [PropertyWritable,PropertyConstructOnly]

constructTlsCertificatePrivateKey :: ByteString -> IO ([Char], GValue)
constructTlsCertificatePrivateKey val = constructObjectPropertyByteArray "private-key" val

data TlsCertificatePrivateKeyPropertyInfo
instance AttrInfo TlsCertificatePrivateKeyPropertyInfo where
    type AttrAllowedOps TlsCertificatePrivateKeyPropertyInfo = '[ 'AttrConstruct]
    type AttrSetTypeConstraint TlsCertificatePrivateKeyPropertyInfo = (~) ByteString
    type AttrBaseTypeConstraint TlsCertificatePrivateKeyPropertyInfo = TlsCertificateK
    type AttrGetType TlsCertificatePrivateKeyPropertyInfo = ()
    type AttrLabel TlsCertificatePrivateKeyPropertyInfo = "TlsCertificate::private-key"
    attrGet _ = undefined
    attrSet _ = undefined
    attrConstruct _ = constructTlsCertificatePrivateKey

-- VVV Prop "private-key-pem"
   -- Type: TBasicType TUTF8
   -- Flags: [PropertyWritable,PropertyConstructOnly]

constructTlsCertificatePrivateKeyPem :: T.Text -> IO ([Char], GValue)
constructTlsCertificatePrivateKeyPem val = constructObjectPropertyString "private-key-pem" val

data TlsCertificatePrivateKeyPemPropertyInfo
instance AttrInfo TlsCertificatePrivateKeyPemPropertyInfo where
    type AttrAllowedOps TlsCertificatePrivateKeyPemPropertyInfo = '[ 'AttrConstruct]
    type AttrSetTypeConstraint TlsCertificatePrivateKeyPemPropertyInfo = (~) T.Text
    type AttrBaseTypeConstraint TlsCertificatePrivateKeyPemPropertyInfo = TlsCertificateK
    type AttrGetType TlsCertificatePrivateKeyPemPropertyInfo = ()
    type AttrLabel TlsCertificatePrivateKeyPemPropertyInfo = "TlsCertificate::private-key-pem"
    attrGet _ = undefined
    attrSet _ = undefined
    attrConstruct _ = constructTlsCertificatePrivateKeyPem

type instance AttributeList TlsCertificate = TlsCertificateAttributeList
type TlsCertificateAttributeList = ('[ '("certificate", TlsCertificateCertificatePropertyInfo), '("certificate-pem", TlsCertificateCertificatePemPropertyInfo), '("issuer", TlsCertificateIssuerPropertyInfo), '("private-key", TlsCertificatePrivateKeyPropertyInfo), '("private-key-pem", TlsCertificatePrivateKeyPemPropertyInfo)] :: [(Symbol, *)])

type instance SignalList TlsCertificate = TlsCertificateSignalList
type TlsCertificateSignalList = ('[ '("notify", GObject.ObjectNotifySignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method TlsCertificate::new_from_file
-- method type : Constructor
-- Args : [Arg {argName = "file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gio" "TlsCertificate"
-- throws : True
-- Skip return : False

foreign import ccall "g_tls_certificate_new_from_file" g_tls_certificate_new_from_file :: 
    CString ->                              -- file : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr TlsCertificate)


tlsCertificateNewFromFile ::
    (MonadIO m) =>
    T.Text ->                               -- file
    m TlsCertificate
tlsCertificateNewFromFile file = liftIO $ do
    file' <- textToCString file
    onException (do
        result <- propagateGError $ g_tls_certificate_new_from_file file'
        checkUnexpectedReturnNULL "g_tls_certificate_new_from_file" result
        result' <- (wrapObject TlsCertificate) result
        freeMem file'
        return result'
     ) (do
        freeMem file'
     )

-- method TlsCertificate::new_from_files
-- method type : Constructor
-- Args : [Arg {argName = "cert_file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "key_file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "cert_file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "key_file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gio" "TlsCertificate"
-- throws : True
-- Skip return : False

foreign import ccall "g_tls_certificate_new_from_files" g_tls_certificate_new_from_files :: 
    CString ->                              -- cert_file : TBasicType TUTF8
    CString ->                              -- key_file : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr TlsCertificate)


tlsCertificateNewFromFiles ::
    (MonadIO m) =>
    T.Text ->                               -- cert_file
    T.Text ->                               -- key_file
    m TlsCertificate
tlsCertificateNewFromFiles cert_file key_file = liftIO $ do
    cert_file' <- textToCString cert_file
    key_file' <- textToCString key_file
    onException (do
        result <- propagateGError $ g_tls_certificate_new_from_files cert_file' key_file'
        checkUnexpectedReturnNULL "g_tls_certificate_new_from_files" result
        result' <- (wrapObject TlsCertificate) result
        freeMem cert_file'
        freeMem key_file'
        return result'
     ) (do
        freeMem cert_file'
        freeMem key_file'
     )

-- method TlsCertificate::new_from_pem
-- method type : Constructor
-- Args : [Arg {argName = "data", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "length", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "data", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "length", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gio" "TlsCertificate"
-- throws : True
-- Skip return : False

foreign import ccall "g_tls_certificate_new_from_pem" g_tls_certificate_new_from_pem :: 
    CString ->                              -- data : TBasicType TUTF8
    Int64 ->                                -- length : TBasicType TInt64
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr TlsCertificate)


tlsCertificateNewFromPem ::
    (MonadIO m) =>
    T.Text ->                               -- data
    Int64 ->                                -- length
    m TlsCertificate
tlsCertificateNewFromPem data_ length_ = liftIO $ do
    data_' <- textToCString data_
    onException (do
        result <- propagateGError $ g_tls_certificate_new_from_pem data_' length_
        checkUnexpectedReturnNULL "g_tls_certificate_new_from_pem" result
        result' <- (wrapObject TlsCertificate) result
        freeMem data_'
        return result'
     ) (do
        freeMem data_'
     )

-- method TlsCertificate::get_issuer
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gio" "TlsCertificate"
-- throws : False
-- Skip return : False

foreign import ccall "g_tls_certificate_get_issuer" g_tls_certificate_get_issuer :: 
    Ptr TlsCertificate ->                   -- _obj : TInterface "Gio" "TlsCertificate"
    IO (Ptr TlsCertificate)


tlsCertificateGetIssuer ::
    (MonadIO m, TlsCertificateK a) =>
    a ->                                    -- _obj
    m TlsCertificate
tlsCertificateGetIssuer _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- g_tls_certificate_get_issuer _obj'
    checkUnexpectedReturnNULL "g_tls_certificate_get_issuer" result
    result' <- (newObject TlsCertificate) result
    touchManagedPtr _obj
    return result'

-- method TlsCertificate::is_same
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "cert_two", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "cert_two", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TBoolean
-- throws : False
-- Skip return : False

foreign import ccall "g_tls_certificate_is_same" g_tls_certificate_is_same :: 
    Ptr TlsCertificate ->                   -- _obj : TInterface "Gio" "TlsCertificate"
    Ptr TlsCertificate ->                   -- cert_two : TInterface "Gio" "TlsCertificate"
    IO CInt


tlsCertificateIsSame ::
    (MonadIO m, TlsCertificateK a, TlsCertificateK b) =>
    a ->                                    -- _obj
    b ->                                    -- cert_two
    m Bool
tlsCertificateIsSame _obj cert_two = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let cert_two' = unsafeManagedPtrCastPtr cert_two
    result <- g_tls_certificate_is_same _obj' cert_two'
    let result' = (/= 0) result
    touchManagedPtr _obj
    touchManagedPtr cert_two
    return result'

-- method TlsCertificate::verify
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "identity", argType = TInterface "Gio" "SocketConnectable", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "trusted_ca", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "identity", argType = TInterface "Gio" "SocketConnectable", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "trusted_ca", argType = TInterface "Gio" "TlsCertificate", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gio" "TlsCertificateFlags"
-- throws : False
-- Skip return : False

foreign import ccall "g_tls_certificate_verify" g_tls_certificate_verify :: 
    Ptr TlsCertificate ->                   -- _obj : TInterface "Gio" "TlsCertificate"
    Ptr SocketConnectable ->                -- identity : TInterface "Gio" "SocketConnectable"
    Ptr TlsCertificate ->                   -- trusted_ca : TInterface "Gio" "TlsCertificate"
    IO CUInt


tlsCertificateVerify ::
    (MonadIO m, TlsCertificateK a, SocketConnectableK b, TlsCertificateK c) =>
    a ->                                    -- _obj
    Maybe (b) ->                            -- identity
    Maybe (c) ->                            -- trusted_ca
    m [TlsCertificateFlags]
tlsCertificateVerify _obj identity trusted_ca = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    maybeIdentity <- case identity of
        Nothing -> return nullPtr
        Just jIdentity -> do
            let jIdentity' = unsafeManagedPtrCastPtr jIdentity
            return jIdentity'
    maybeTrusted_ca <- case trusted_ca of
        Nothing -> return nullPtr
        Just jTrusted_ca -> do
            let jTrusted_ca' = unsafeManagedPtrCastPtr jTrusted_ca
            return jTrusted_ca'
    result <- g_tls_certificate_verify _obj' maybeIdentity maybeTrusted_ca
    let result' = wordToGFlags result
    touchManagedPtr _obj
    whenJust identity touchManagedPtr
    whenJust trusted_ca touchManagedPtr
    return result'

-- method TlsCertificate::list_new_from_file
-- method type : MemberFunction
-- Args : [Arg {argName = "file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "file", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TGList (TInterface "Gio" "TlsCertificate")
-- throws : True
-- Skip return : False

foreign import ccall "g_tls_certificate_list_new_from_file" g_tls_certificate_list_new_from_file :: 
    CString ->                              -- file : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr (GList (Ptr TlsCertificate)))


tlsCertificateListNewFromFile ::
    (MonadIO m) =>
    T.Text ->                               -- file
    m [TlsCertificate]
tlsCertificateListNewFromFile file = liftIO $ do
    file' <- textToCString file
    onException (do
        result <- propagateGError $ g_tls_certificate_list_new_from_file file'
        checkUnexpectedReturnNULL "g_tls_certificate_list_new_from_file" result
        result' <- unpackGList result
        result'' <- mapM (wrapObject TlsCertificate) result'
        g_list_free result
        freeMem file'
        return result''
     ) (do
        freeMem file'
     )