{-# LANGUAGE TypeApplications #-}
#if (MIN_VERSION_haskell_gi_overloading(1,0,0) && !defined(__HADDOCK_VERSION__))
#define ENABLE_OVERLOADING
#endif
module GI.Gio.Interfaces.Converter
(
Converter(..) ,
IsConverter ,
toConverter ,
#if defined(ENABLE_OVERLOADING)
ResolveConverterMethod ,
#endif
#if defined(ENABLE_OVERLOADING)
ConverterConvertMethodInfo ,
#endif
converterConvert ,
#if defined(ENABLE_OVERLOADING)
ConverterResetMethodInfo ,
#endif
converterReset ,
) 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.BasicTypes as B.Types
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GArray as B.GArray
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GHashTable as B.GHT
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.GI.Base.Signals as B.Signals
import qualified Control.Monad.IO.Class as MIO
import qualified Data.Coerce as Coerce
import qualified Data.Text as T
import qualified Data.Kind as DK
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 GHC.Records as R
import qualified Data.Word as DW
import qualified Data.Int as DI
import qualified System.Posix.Types as SPT
import qualified Foreign.C.Types as FCT
#if MIN_VERSION_base(4,18,0)
import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.Gio.Enums as Gio.Enums
import {-# SOURCE #-} qualified GI.Gio.Flags as Gio.Flags
#else
import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.Gio.Enums as Gio.Enums
import {-# SOURCE #-} qualified GI.Gio.Flags as Gio.Flags
#endif
newtype Converter = Converter (SP.ManagedPtr Converter)
deriving (Converter -> Converter -> Bool
(Converter -> Converter -> Bool)
-> (Converter -> Converter -> Bool) -> Eq Converter
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Converter -> Converter -> Bool
== :: Converter -> Converter -> Bool
$c/= :: Converter -> Converter -> Bool
/= :: Converter -> Converter -> Bool
Eq)
instance SP.ManagedPtrNewtype Converter where
toManagedPtr :: Converter -> ManagedPtr Converter
toManagedPtr (Converter ManagedPtr Converter
p) = ManagedPtr Converter
p
foreign import ccall "g_converter_get_type"
c_g_converter_get_type :: IO B.Types.GType
instance B.Types.TypedObject Converter where
glibType :: IO GType
glibType = IO GType
c_g_converter_get_type
instance B.Types.GObject Converter
class (SP.GObject o, O.IsDescendantOf Converter o) => IsConverter o
instance (SP.GObject o, O.IsDescendantOf Converter o) => IsConverter o
instance O.HasParentTypes Converter
type instance O.ParentTypes Converter = '[GObject.Object.Object]
toConverter :: (MIO.MonadIO m, IsConverter o) => o -> m Converter
toConverter :: forall (m :: * -> *) o.
(MonadIO m, IsConverter o) =>
o -> m Converter
toConverter = IO Converter -> m Converter
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
MIO.liftIO (IO Converter -> m Converter)
-> (o -> IO Converter) -> o -> m Converter
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ManagedPtr Converter -> Converter) -> o -> IO Converter
forall o o'.
(HasCallStack, ManagedPtrNewtype o, TypedObject o,
ManagedPtrNewtype o', TypedObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
B.ManagedPtr.unsafeCastTo ManagedPtr Converter -> Converter
Converter
instance B.GValue.IsGValue (Maybe Converter) where
gvalueGType_ :: IO GType
gvalueGType_ = IO GType
c_g_converter_get_type
gvalueSet_ :: Ptr GValue -> Maybe Converter -> IO ()
gvalueSet_ Ptr GValue
gv Maybe Converter
P.Nothing = Ptr GValue -> Ptr Converter -> IO ()
forall a. GObject a => Ptr GValue -> Ptr a -> IO ()
B.GValue.set_object Ptr GValue
gv (Ptr Converter
forall a. Ptr a
FP.nullPtr :: FP.Ptr Converter)
gvalueSet_ Ptr GValue
gv (P.Just Converter
obj) = Converter -> (Ptr Converter -> IO ()) -> IO ()
forall a c.
(HasCallStack, ManagedPtrNewtype a) =>
a -> (Ptr a -> IO c) -> IO c
B.ManagedPtr.withManagedPtr Converter
obj (Ptr GValue -> Ptr Converter -> IO ()
forall a. GObject a => Ptr GValue -> Ptr a -> IO ()
B.GValue.set_object Ptr GValue
gv)
gvalueGet_ :: Ptr GValue -> IO (Maybe Converter)
gvalueGet_ Ptr GValue
gv = do
Ptr Converter
ptr <- Ptr GValue -> IO (Ptr Converter)
forall a. GObject a => Ptr GValue -> IO (Ptr a)
B.GValue.get_object Ptr GValue
gv :: IO (FP.Ptr Converter)
if Ptr Converter
ptr Ptr Converter -> Ptr Converter -> Bool
forall a. Eq a => a -> a -> Bool
/= Ptr Converter
forall a. Ptr a
FP.nullPtr
then Converter -> Maybe Converter
forall a. a -> Maybe a
P.Just (Converter -> Maybe Converter)
-> IO Converter -> IO (Maybe Converter)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ManagedPtr Converter -> Converter)
-> Ptr Converter -> IO Converter
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
B.ManagedPtr.newObject ManagedPtr Converter -> Converter
Converter Ptr Converter
ptr
else Maybe Converter -> IO (Maybe Converter)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Converter
forall a. Maybe a
P.Nothing
#if defined(ENABLE_OVERLOADING)
instance O.HasAttributeList Converter
type instance O.AttributeList Converter = ConverterAttributeList
type ConverterAttributeList = ('[ ] :: [(Symbol, DK.Type)])
#endif
#if defined(ENABLE_OVERLOADING)
#endif
#if defined(ENABLE_OVERLOADING)
type family ResolveConverterMethod (t :: Symbol) (o :: DK.Type) :: DK.Type where
ResolveConverterMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
ResolveConverterMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
ResolveConverterMethod "convert" o = ConverterConvertMethodInfo
ResolveConverterMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
ResolveConverterMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
ResolveConverterMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
ResolveConverterMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
ResolveConverterMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
ResolveConverterMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
ResolveConverterMethod "ref" o = GObject.Object.ObjectRefMethodInfo
ResolveConverterMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
ResolveConverterMethod "reset" o = ConverterResetMethodInfo
ResolveConverterMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
ResolveConverterMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
ResolveConverterMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
ResolveConverterMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
ResolveConverterMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
ResolveConverterMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
ResolveConverterMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
ResolveConverterMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
ResolveConverterMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
ResolveConverterMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
ResolveConverterMethod "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
ResolveConverterMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
ResolveConverterMethod l o = O.MethodResolutionFailed l o
instance (info ~ ResolveConverterMethod t Converter, O.OverloadedMethod info Converter p) => OL.IsLabel t (Converter -> p) where
#if MIN_VERSION_base(4,10,0)
fromLabel = O.overloadedMethod @info
#else
fromLabel _ = O.overloadedMethod @info
#endif
#if MIN_VERSION_base(4,13,0)
instance (info ~ ResolveConverterMethod t Converter, O.OverloadedMethod info Converter p, R.HasField t Converter p) => R.HasField t Converter p where
getField = O.overloadedMethod @info
#endif
instance (info ~ ResolveConverterMethod t Converter, O.OverloadedMethodInfo info Converter) => OL.IsLabel t (O.MethodProxy info Converter) where
#if MIN_VERSION_base(4,10,0)
fromLabel = O.MethodProxy
#else
fromLabel _ = O.MethodProxy
#endif
#endif
foreign import ccall "g_converter_convert" g_converter_convert ::
Ptr Converter ->
Ptr Word8 ->
FCT.CSize ->
Ptr Word8 ->
FCT.CSize ->
CUInt ->
Ptr FCT.CSize ->
Ptr FCT.CSize ->
Ptr (Ptr GError) ->
IO CUInt
converterConvert ::
(B.CallStack.HasCallStack, MonadIO m, IsConverter a) =>
a
-> Maybe (ByteString)
-> Maybe (ByteString)
-> [Gio.Flags.ConverterFlags]
-> m ((Gio.Enums.ConverterResult, FCT.CSize, FCT.CSize))
converterConvert :: forall (m :: * -> *) a.
(HasCallStack, MonadIO m, IsConverter a) =>
a
-> Maybe ByteString
-> Maybe ByteString
-> [ConverterFlags]
-> m (ConverterResult, CSize, CSize)
converterConvert a
converter Maybe ByteString
inbuf Maybe ByteString
outbuf [ConverterFlags]
flags = IO (ConverterResult, CSize, CSize)
-> m (ConverterResult, CSize, CSize)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (ConverterResult, CSize, CSize)
-> m (ConverterResult, CSize, CSize))
-> IO (ConverterResult, CSize, CSize)
-> m (ConverterResult, CSize, CSize)
forall a b. (a -> b) -> a -> b
$ do
let outbufSize :: CSize
outbufSize = case Maybe ByteString
outbuf of
Maybe ByteString
Nothing -> CSize
0
Just ByteString
jOutbuf -> Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CSize) -> Int -> CSize
forall a b. (a -> b) -> a -> b
$ ByteString -> Int
B.length ByteString
jOutbuf
let inbufSize :: CSize
inbufSize = case Maybe ByteString
inbuf of
Maybe ByteString
Nothing -> CSize
0
Just ByteString
jInbuf -> Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CSize) -> Int -> CSize
forall a b. (a -> b) -> a -> b
$ ByteString -> Int
B.length ByteString
jInbuf
Ptr Converter
converter' <- a -> IO (Ptr Converter)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
converter
Ptr Word8
maybeInbuf <- case Maybe ByteString
inbuf of
Maybe ByteString
Nothing -> Ptr Word8 -> IO (Ptr Word8)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr Word8
forall a. Ptr a
FP.nullPtr
Just ByteString
jInbuf -> do
Ptr Word8
jInbuf' <- ByteString -> IO (Ptr Word8)
packByteString ByteString
jInbuf
Ptr Word8 -> IO (Ptr Word8)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr Word8
jInbuf'
Ptr Word8
maybeOutbuf <- case Maybe ByteString
outbuf of
Maybe ByteString
Nothing -> Ptr Word8 -> IO (Ptr Word8)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr Word8
forall a. Ptr a
FP.nullPtr
Just ByteString
jOutbuf -> do
Ptr Word8
jOutbuf' <- ByteString -> IO (Ptr Word8)
packByteString ByteString
jOutbuf
Ptr Word8 -> IO (Ptr Word8)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr Word8
jOutbuf'
let flags' :: CUInt
flags' = [ConverterFlags] -> CUInt
forall b a. (Num b, IsGFlag a) => [a] -> b
gflagsToWord [ConverterFlags]
flags
Ptr CSize
bytesRead <- IO (Ptr CSize)
forall a. Storable a => IO (Ptr a)
allocMem :: IO (Ptr FCT.CSize)
Ptr CSize
bytesWritten <- IO (Ptr CSize)
forall a. Storable a => IO (Ptr a)
allocMem :: IO (Ptr FCT.CSize)
IO (ConverterResult, CSize, CSize)
-> IO () -> IO (ConverterResult, CSize, CSize)
forall a b. IO a -> IO b -> IO a
onException (do
CUInt
result <- (Ptr (Ptr GError) -> IO CUInt) -> IO CUInt
forall a. (Ptr (Ptr GError) -> IO a) -> IO a
propagateGError ((Ptr (Ptr GError) -> IO CUInt) -> IO CUInt)
-> (Ptr (Ptr GError) -> IO CUInt) -> IO CUInt
forall a b. (a -> b) -> a -> b
$ Ptr Converter
-> Ptr Word8
-> CSize
-> Ptr Word8
-> CSize
-> CUInt
-> Ptr CSize
-> Ptr CSize
-> Ptr (Ptr GError)
-> IO CUInt
g_converter_convert Ptr Converter
converter' Ptr Word8
maybeInbuf CSize
inbufSize Ptr Word8
maybeOutbuf CSize
outbufSize CUInt
flags' Ptr CSize
bytesRead Ptr CSize
bytesWritten
let result' :: ConverterResult
result' = (Int -> ConverterResult
forall a. Enum a => Int -> a
toEnum (Int -> ConverterResult)
-> (CUInt -> Int) -> CUInt -> ConverterResult
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CUInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral) CUInt
result
CSize
bytesRead' <- Ptr CSize -> IO CSize
forall a. Storable a => Ptr a -> IO a
peek Ptr CSize
bytesRead
CSize
bytesWritten' <- Ptr CSize -> IO CSize
forall a. Storable a => Ptr a -> IO a
peek Ptr CSize
bytesWritten
a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
converter
Ptr Word8 -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr Word8
maybeInbuf
Ptr Word8 -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr Word8
maybeOutbuf
Ptr CSize -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr CSize
bytesRead
Ptr CSize -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr CSize
bytesWritten
(ConverterResult, CSize, CSize)
-> IO (ConverterResult, CSize, CSize)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ConverterResult
result', CSize
bytesRead', CSize
bytesWritten')
) (do
Ptr Word8 -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr Word8
maybeInbuf
Ptr Word8 -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr Word8
maybeOutbuf
Ptr CSize -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr CSize
bytesRead
Ptr CSize -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr CSize
bytesWritten
)
#if defined(ENABLE_OVERLOADING)
data ConverterConvertMethodInfo
instance (signature ~ (Maybe (ByteString) -> Maybe (ByteString) -> [Gio.Flags.ConverterFlags] -> m ((Gio.Enums.ConverterResult, FCT.CSize, FCT.CSize))), MonadIO m, IsConverter a) => O.OverloadedMethod ConverterConvertMethodInfo a signature where
overloadedMethod = converterConvert
instance O.OverloadedMethodInfo ConverterConvertMethodInfo a where
overloadedMethodInfo = P.Just (O.ResolvedSymbolInfo {
O.resolvedSymbolName = "GI.Gio.Interfaces.Converter.converterConvert",
O.resolvedSymbolURL = "https://hackage.haskell.org/package/gi-gio-2.0.34/docs/GI-Gio-Interfaces-Converter.html#v:converterConvert"
})
#endif
foreign import ccall "g_converter_reset" g_converter_reset ::
Ptr Converter ->
IO ()
converterReset ::
(B.CallStack.HasCallStack, MonadIO m, IsConverter a) =>
a
-> m ()
converterReset :: forall (m :: * -> *) a.
(HasCallStack, MonadIO m, IsConverter a) =>
a -> m ()
converterReset a
converter = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Ptr Converter
converter' <- a -> IO (Ptr Converter)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
converter
Ptr Converter -> IO ()
g_converter_reset Ptr Converter
converter'
a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
converter
() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
#if defined(ENABLE_OVERLOADING)
data ConverterResetMethodInfo
instance (signature ~ (m ()), MonadIO m, IsConverter a) => O.OverloadedMethod ConverterResetMethodInfo a signature where
overloadedMethod = converterReset
instance O.OverloadedMethodInfo ConverterResetMethodInfo a where
overloadedMethodInfo = P.Just (O.ResolvedSymbolInfo {
O.resolvedSymbolName = "GI.Gio.Interfaces.Converter.converterReset",
O.resolvedSymbolURL = "https://hackage.haskell.org/package/gi-gio-2.0.34/docs/GI-Gio-Interfaces-Converter.html#v:converterReset"
})
#endif
#if defined(ENABLE_OVERLOADING)
type instance O.SignalList Converter = ConverterSignalList
type ConverterSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, DK.Type)])
#endif