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

Encoding profiles for containers. Keeps track of a list of 'GI.GstPbutils.Objects.EncodingProfile.EncodingProfile'
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.GstPbutils.Objects.EncodingContainerProfile
    (

-- * Exported types
    EncodingContainerProfile(..)            ,
    IsEncodingContainerProfile              ,
    toEncodingContainerProfile              ,
    noEncodingContainerProfile              ,


 -- * Methods
-- ** addProfile #method:addProfile#

#if ENABLE_OVERLOADING
    EncodingContainerProfileAddProfileMethodInfo,
#endif
    encodingContainerProfileAddProfile      ,


-- ** containsProfile #method:containsProfile#

#if ENABLE_OVERLOADING
    EncodingContainerProfileContainsProfileMethodInfo,
#endif
    encodingContainerProfileContainsProfile ,


-- ** getProfiles #method:getProfiles#

#if ENABLE_OVERLOADING
    EncodingContainerProfileGetProfilesMethodInfo,
#endif
    encodingContainerProfileGetProfiles     ,


-- ** new #method:new#

    encodingContainerProfileNew             ,




    ) 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.GClosure as B.GClosure
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.GI.Base.Properties as B.Properties
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 GHC.OverloadedLabels as OL

import qualified GI.GObject.Objects.Object as GObject.Object
import qualified GI.Gst.Structs.Caps as Gst.Caps
import {-# SOURCE #-} qualified GI.GstPbutils.Objects.EncodingProfile as GstPbutils.EncodingProfile

-- | Memory-managed wrapper type.
newtype EncodingContainerProfile = EncodingContainerProfile (ManagedPtr EncodingContainerProfile)
foreign import ccall "gst_encoding_container_profile_get_type"
    c_gst_encoding_container_profile_get_type :: IO GType

instance GObject EncodingContainerProfile where
    gobjectType = c_gst_encoding_container_profile_get_type


-- | Type class for types which can be safely cast to `EncodingContainerProfile`, for instance with `toEncodingContainerProfile`.
class (GObject o, O.IsDescendantOf EncodingContainerProfile o) => IsEncodingContainerProfile o
instance (GObject o, O.IsDescendantOf EncodingContainerProfile o) => IsEncodingContainerProfile o

instance O.HasParentTypes EncodingContainerProfile
type instance O.ParentTypes EncodingContainerProfile = '[GstPbutils.EncodingProfile.EncodingProfile, GObject.Object.Object]

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

-- | A convenience alias for `Nothing` :: `Maybe` `EncodingContainerProfile`.
noEncodingContainerProfile :: Maybe EncodingContainerProfile
noEncodingContainerProfile = Nothing

#if ENABLE_OVERLOADING
type family ResolveEncodingContainerProfileMethod (t :: Symbol) (o :: *) :: * where
    ResolveEncodingContainerProfileMethod "addProfile" o = EncodingContainerProfileAddProfileMethodInfo
    ResolveEncodingContainerProfileMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveEncodingContainerProfileMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveEncodingContainerProfileMethod "containsProfile" o = EncodingContainerProfileContainsProfileMethodInfo
    ResolveEncodingContainerProfileMethod "copy" o = GstPbutils.EncodingProfile.EncodingProfileCopyMethodInfo
    ResolveEncodingContainerProfileMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveEncodingContainerProfileMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveEncodingContainerProfileMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveEncodingContainerProfileMethod "isEnabled" o = GstPbutils.EncodingProfile.EncodingProfileIsEnabledMethodInfo
    ResolveEncodingContainerProfileMethod "isEqual" o = GstPbutils.EncodingProfile.EncodingProfileIsEqualMethodInfo
    ResolveEncodingContainerProfileMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveEncodingContainerProfileMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveEncodingContainerProfileMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveEncodingContainerProfileMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveEncodingContainerProfileMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveEncodingContainerProfileMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveEncodingContainerProfileMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveEncodingContainerProfileMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveEncodingContainerProfileMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveEncodingContainerProfileMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveEncodingContainerProfileMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveEncodingContainerProfileMethod "getAllowDynamicOutput" o = GstPbutils.EncodingProfile.EncodingProfileGetAllowDynamicOutputMethodInfo
    ResolveEncodingContainerProfileMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveEncodingContainerProfileMethod "getDescription" o = GstPbutils.EncodingProfile.EncodingProfileGetDescriptionMethodInfo
    ResolveEncodingContainerProfileMethod "getFileExtension" o = GstPbutils.EncodingProfile.EncodingProfileGetFileExtensionMethodInfo
    ResolveEncodingContainerProfileMethod "getFormat" o = GstPbutils.EncodingProfile.EncodingProfileGetFormatMethodInfo
    ResolveEncodingContainerProfileMethod "getInputCaps" o = GstPbutils.EncodingProfile.EncodingProfileGetInputCapsMethodInfo
    ResolveEncodingContainerProfileMethod "getName" o = GstPbutils.EncodingProfile.EncodingProfileGetNameMethodInfo
    ResolveEncodingContainerProfileMethod "getPresence" o = GstPbutils.EncodingProfile.EncodingProfileGetPresenceMethodInfo
    ResolveEncodingContainerProfileMethod "getPreset" o = GstPbutils.EncodingProfile.EncodingProfileGetPresetMethodInfo
    ResolveEncodingContainerProfileMethod "getPresetName" o = GstPbutils.EncodingProfile.EncodingProfileGetPresetNameMethodInfo
    ResolveEncodingContainerProfileMethod "getProfiles" o = EncodingContainerProfileGetProfilesMethodInfo
    ResolveEncodingContainerProfileMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveEncodingContainerProfileMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveEncodingContainerProfileMethod "getRestriction" o = GstPbutils.EncodingProfile.EncodingProfileGetRestrictionMethodInfo
    ResolveEncodingContainerProfileMethod "getTypeNick" o = GstPbutils.EncodingProfile.EncodingProfileGetTypeNickMethodInfo
    ResolveEncodingContainerProfileMethod "setAllowDynamicOutput" o = GstPbutils.EncodingProfile.EncodingProfileSetAllowDynamicOutputMethodInfo
    ResolveEncodingContainerProfileMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveEncodingContainerProfileMethod "setDescription" o = GstPbutils.EncodingProfile.EncodingProfileSetDescriptionMethodInfo
    ResolveEncodingContainerProfileMethod "setEnabled" o = GstPbutils.EncodingProfile.EncodingProfileSetEnabledMethodInfo
    ResolveEncodingContainerProfileMethod "setFormat" o = GstPbutils.EncodingProfile.EncodingProfileSetFormatMethodInfo
    ResolveEncodingContainerProfileMethod "setName" o = GstPbutils.EncodingProfile.EncodingProfileSetNameMethodInfo
    ResolveEncodingContainerProfileMethod "setPresence" o = GstPbutils.EncodingProfile.EncodingProfileSetPresenceMethodInfo
    ResolveEncodingContainerProfileMethod "setPreset" o = GstPbutils.EncodingProfile.EncodingProfileSetPresetMethodInfo
    ResolveEncodingContainerProfileMethod "setPresetName" o = GstPbutils.EncodingProfile.EncodingProfileSetPresetNameMethodInfo
    ResolveEncodingContainerProfileMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveEncodingContainerProfileMethod "setRestriction" o = GstPbutils.EncodingProfile.EncodingProfileSetRestrictionMethodInfo
    ResolveEncodingContainerProfileMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveEncodingContainerProfileMethod t EncodingContainerProfile, O.MethodInfo info EncodingContainerProfile p) => OL.IsLabel t (EncodingContainerProfile -> 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

#if ENABLE_OVERLOADING
instance O.HasAttributeList EncodingContainerProfile
type instance O.AttributeList EncodingContainerProfile = EncodingContainerProfileAttributeList
type EncodingContainerProfileAttributeList = ('[ '("restrictionCaps", GstPbutils.EncodingProfile.EncodingProfileRestrictionCapsPropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

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

#endif

-- method EncodingContainerProfile::new
-- method type : Constructor
-- Args : [Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "The name of the container profile, can be %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "description", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "The description of the container profile,\n    can be %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "format", argType = TInterface (Name {namespace = "Gst", name = "Caps"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The format to use for this profile", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "preset", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "The preset to use for this profile.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "GstPbutils", name = "EncodingContainerProfile"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_encoding_container_profile_new" gst_encoding_container_profile_new ::
    CString ->                              -- name : TBasicType TUTF8
    CString ->                              -- description : TBasicType TUTF8
    Ptr Gst.Caps.Caps ->                    -- format : TInterface (Name {namespace = "Gst", name = "Caps"})
    CString ->                              -- preset : TBasicType TUTF8
    IO (Ptr EncodingContainerProfile)

{- |
Creates a new 'GI.GstPbutils.Objects.EncodingContainerProfile.EncodingContainerProfile'.
-}
encodingContainerProfileNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Maybe (T.Text)
    {- ^ /@name@/: The name of the container profile, can be 'Nothing' -}
    -> Maybe (T.Text)
    {- ^ /@description@/: The description of the container profile,
    can be 'Nothing' -}
    -> Gst.Caps.Caps
    {- ^ /@format@/: The format to use for this profile -}
    -> Maybe (T.Text)
    {- ^ /@preset@/: The preset to use for this profile. -}
    -> m EncodingContainerProfile
    {- ^ __Returns:__ The newly created 'GI.GstPbutils.Objects.EncodingContainerProfile.EncodingContainerProfile'. -}
encodingContainerProfileNew name description format preset = liftIO $ do
    maybeName <- case name of
        Nothing -> return nullPtr
        Just jName -> do
            jName' <- textToCString jName
            return jName'
    maybeDescription <- case description of
        Nothing -> return nullPtr
        Just jDescription -> do
            jDescription' <- textToCString jDescription
            return jDescription'
    format' <- unsafeManagedPtrGetPtr format
    maybePreset <- case preset of
        Nothing -> return nullPtr
        Just jPreset -> do
            jPreset' <- textToCString jPreset
            return jPreset'
    result <- gst_encoding_container_profile_new maybeName maybeDescription format' maybePreset
    checkUnexpectedReturnNULL "encodingContainerProfileNew" result
    result' <- (wrapObject EncodingContainerProfile) result
    touchManagedPtr format
    freeMem maybeName
    freeMem maybeDescription
    freeMem maybePreset
    return result'

#if ENABLE_OVERLOADING
#endif

-- method EncodingContainerProfile::add_profile
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "container", argType = TInterface (Name {namespace = "GstPbutils", name = "EncodingContainerProfile"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GstEncodingContainerProfile to use", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "profile", argType = TInterface (Name {namespace = "GstPbutils", name = "EncodingProfile"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GstEncodingProfile to add.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_encoding_container_profile_add_profile" gst_encoding_container_profile_add_profile ::
    Ptr EncodingContainerProfile ->         -- container : TInterface (Name {namespace = "GstPbutils", name = "EncodingContainerProfile"})
    Ptr GstPbutils.EncodingProfile.EncodingProfile -> -- profile : TInterface (Name {namespace = "GstPbutils", name = "EncodingProfile"})
    IO CInt

{- |
Add a 'GI.GstPbutils.Objects.EncodingProfile.EncodingProfile' to the list of profiles handled by /@container@/.

No copy of /@profile@/ will be made, if you wish to use it elsewhere after this
method you should increment its reference count.
-}
encodingContainerProfileAddProfile ::
    (B.CallStack.HasCallStack, MonadIO m, IsEncodingContainerProfile a, GstPbutils.EncodingProfile.IsEncodingProfile b) =>
    a
    {- ^ /@container@/: the 'GI.GstPbutils.Objects.EncodingContainerProfile.EncodingContainerProfile' to use -}
    -> b
    {- ^ /@profile@/: the 'GI.GstPbutils.Objects.EncodingProfile.EncodingProfile' to add. -}
    -> m Bool
    {- ^ __Returns:__ 'True' if the /@stream@/ was properly added, else 'False'. -}
encodingContainerProfileAddProfile container profile = liftIO $ do
    container' <- unsafeManagedPtrCastPtr container
    profile' <- B.ManagedPtr.disownObject profile
    result <- gst_encoding_container_profile_add_profile container' profile'
    let result' = (/= 0) result
    touchManagedPtr container
    touchManagedPtr profile
    return result'

#if ENABLE_OVERLOADING
data EncodingContainerProfileAddProfileMethodInfo
instance (signature ~ (b -> m Bool), MonadIO m, IsEncodingContainerProfile a, GstPbutils.EncodingProfile.IsEncodingProfile b) => O.MethodInfo EncodingContainerProfileAddProfileMethodInfo a signature where
    overloadedMethod _ = encodingContainerProfileAddProfile

#endif

-- method EncodingContainerProfile::contains_profile
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "container", argType = TInterface (Name {namespace = "GstPbutils", name = "EncodingContainerProfile"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstEncodingContainerProfile", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "profile", argType = TInterface (Name {namespace = "GstPbutils", name = "EncodingProfile"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstEncodingProfile", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "gst_encoding_container_profile_contains_profile" gst_encoding_container_profile_contains_profile ::
    Ptr EncodingContainerProfile ->         -- container : TInterface (Name {namespace = "GstPbutils", name = "EncodingContainerProfile"})
    Ptr GstPbutils.EncodingProfile.EncodingProfile -> -- profile : TInterface (Name {namespace = "GstPbutils", name = "EncodingProfile"})
    IO CInt

{- |
Checks if /@container@/ contains a 'GI.GstPbutils.Objects.EncodingProfile.EncodingProfile' identical to
/@profile@/.
-}
encodingContainerProfileContainsProfile ::
    (B.CallStack.HasCallStack, MonadIO m, IsEncodingContainerProfile a, GstPbutils.EncodingProfile.IsEncodingProfile b) =>
    a
    {- ^ /@container@/: a 'GI.GstPbutils.Objects.EncodingContainerProfile.EncodingContainerProfile' -}
    -> b
    {- ^ /@profile@/: a 'GI.GstPbutils.Objects.EncodingProfile.EncodingProfile' -}
    -> m Bool
    {- ^ __Returns:__ 'True' if /@container@/ contains a 'GI.GstPbutils.Objects.EncodingProfile.EncodingProfile' identical
to /@profile@/, else 'False'. -}
encodingContainerProfileContainsProfile container profile = liftIO $ do
    container' <- unsafeManagedPtrCastPtr container
    profile' <- unsafeManagedPtrCastPtr profile
    result <- gst_encoding_container_profile_contains_profile container' profile'
    let result' = (/= 0) result
    touchManagedPtr container
    touchManagedPtr profile
    return result'

#if ENABLE_OVERLOADING
data EncodingContainerProfileContainsProfileMethodInfo
instance (signature ~ (b -> m Bool), MonadIO m, IsEncodingContainerProfile a, GstPbutils.EncodingProfile.IsEncodingProfile b) => O.MethodInfo EncodingContainerProfileContainsProfileMethodInfo a signature where
    overloadedMethod _ = encodingContainerProfileContainsProfile

#endif

-- method EncodingContainerProfile::get_profiles
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "profile", argType = TInterface (Name {namespace = "GstPbutils", name = "EncodingContainerProfile"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstEncodingContainerProfile", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TGList (TInterface (Name {namespace = "GstPbutils", name = "EncodingProfile"})))
-- throws : False
-- Skip return : False

foreign import ccall "gst_encoding_container_profile_get_profiles" gst_encoding_container_profile_get_profiles ::
    Ptr EncodingContainerProfile ->         -- profile : TInterface (Name {namespace = "GstPbutils", name = "EncodingContainerProfile"})
    IO (Ptr (GList (Ptr GstPbutils.EncodingProfile.EncodingProfile)))

{- |
/No description available in the introspection data./
-}
encodingContainerProfileGetProfiles ::
    (B.CallStack.HasCallStack, MonadIO m, IsEncodingContainerProfile a) =>
    a
    {- ^ /@profile@/: a 'GI.GstPbutils.Objects.EncodingContainerProfile.EncodingContainerProfile' -}
    -> m [GstPbutils.EncodingProfile.EncodingProfile]
    {- ^ __Returns:__ 
the list of contained 'GI.GstPbutils.Objects.EncodingProfile.EncodingProfile'. -}
encodingContainerProfileGetProfiles profile = liftIO $ do
    profile' <- unsafeManagedPtrCastPtr profile
    result <- gst_encoding_container_profile_get_profiles profile'
    result' <- unpackGList result
    result'' <- mapM (newObject GstPbutils.EncodingProfile.EncodingProfile) result'
    touchManagedPtr profile
    return result''

#if ENABLE_OVERLOADING
data EncodingContainerProfileGetProfilesMethodInfo
instance (signature ~ (m [GstPbutils.EncodingProfile.EncodingProfile]), MonadIO m, IsEncodingContainerProfile a) => O.MethodInfo EncodingContainerProfileGetProfilesMethodInfo a signature where
    overloadedMethod _ = encodingContainerProfileGetProfiles

#endif