{- | Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte License : LGPL-2.1 Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc) 'GI.Gio.Objects.MemoryInputStream.MemoryInputStream' is a class for using arbitrary memory chunks as input for GIO streaming input operations. As of GLib 2.34, 'GI.Gio.Objects.MemoryInputStream.MemoryInputStream' implements 'GI.Gio.Interfaces.PollableInputStream.PollableInputStream'. -} #define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \ && !defined(__HADDOCK_VERSION__)) module GI.Gio.Objects.MemoryInputStream ( -- * Exported types MemoryInputStream(..) , IsMemoryInputStream , toMemoryInputStream , noMemoryInputStream , -- * Methods -- ** addBytes #method:addBytes# #if ENABLE_OVERLOADING MemoryInputStreamAddBytesMethodInfo , #endif memoryInputStreamAddBytes , -- ** addData #method:addData# #if ENABLE_OVERLOADING MemoryInputStreamAddDataMethodInfo , #endif memoryInputStreamAddData , -- ** new #method:new# memoryInputStreamNew , -- ** newFromBytes #method:newFromBytes# memoryInputStreamNewFromBytes , -- ** newFromData #method:newFromData# memoryInputStreamNewFromData , ) 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.GLib.Callbacks as GLib.Callbacks import qualified GI.GLib.Structs.Bytes as GLib.Bytes import qualified GI.GObject.Objects.Object as GObject.Object import {-# SOURCE #-} qualified GI.Gio.Interfaces.PollableInputStream as Gio.PollableInputStream import {-# SOURCE #-} qualified GI.Gio.Interfaces.Seekable as Gio.Seekable import {-# SOURCE #-} qualified GI.Gio.Objects.InputStream as Gio.InputStream -- | Memory-managed wrapper type. newtype MemoryInputStream = MemoryInputStream (ManagedPtr MemoryInputStream) foreign import ccall "g_memory_input_stream_get_type" c_g_memory_input_stream_get_type :: IO GType instance GObject MemoryInputStream where gobjectType = c_g_memory_input_stream_get_type -- | Type class for types which can be safely cast to `MemoryInputStream`, for instance with `toMemoryInputStream`. class (GObject o, O.IsDescendantOf MemoryInputStream o) => IsMemoryInputStream o instance (GObject o, O.IsDescendantOf MemoryInputStream o) => IsMemoryInputStream o instance O.HasParentTypes MemoryInputStream type instance O.ParentTypes MemoryInputStream = '[Gio.InputStream.InputStream, GObject.Object.Object, Gio.PollableInputStream.PollableInputStream, Gio.Seekable.Seekable] -- | Cast to `MemoryInputStream`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`. toMemoryInputStream :: (MonadIO m, IsMemoryInputStream o) => o -> m MemoryInputStream toMemoryInputStream = liftIO . unsafeCastTo MemoryInputStream -- | A convenience alias for `Nothing` :: `Maybe` `MemoryInputStream`. noMemoryInputStream :: Maybe MemoryInputStream noMemoryInputStream = Nothing #if ENABLE_OVERLOADING type family ResolveMemoryInputStreamMethod (t :: Symbol) (o :: *) :: * where ResolveMemoryInputStreamMethod "addBytes" o = MemoryInputStreamAddBytesMethodInfo ResolveMemoryInputStreamMethod "addData" o = MemoryInputStreamAddDataMethodInfo ResolveMemoryInputStreamMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo ResolveMemoryInputStreamMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo ResolveMemoryInputStreamMethod "canPoll" o = Gio.PollableInputStream.PollableInputStreamCanPollMethodInfo ResolveMemoryInputStreamMethod "canSeek" o = Gio.Seekable.SeekableCanSeekMethodInfo ResolveMemoryInputStreamMethod "canTruncate" o = Gio.Seekable.SeekableCanTruncateMethodInfo ResolveMemoryInputStreamMethod "clearPending" o = Gio.InputStream.InputStreamClearPendingMethodInfo ResolveMemoryInputStreamMethod "close" o = Gio.InputStream.InputStreamCloseMethodInfo ResolveMemoryInputStreamMethod "closeAsync" o = Gio.InputStream.InputStreamCloseAsyncMethodInfo ResolveMemoryInputStreamMethod "closeFinish" o = Gio.InputStream.InputStreamCloseFinishMethodInfo ResolveMemoryInputStreamMethod "createSource" o = Gio.PollableInputStream.PollableInputStreamCreateSourceMethodInfo ResolveMemoryInputStreamMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo ResolveMemoryInputStreamMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo ResolveMemoryInputStreamMethod "getv" o = GObject.Object.ObjectGetvMethodInfo ResolveMemoryInputStreamMethod "hasPending" o = Gio.InputStream.InputStreamHasPendingMethodInfo ResolveMemoryInputStreamMethod "isClosed" o = Gio.InputStream.InputStreamIsClosedMethodInfo ResolveMemoryInputStreamMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo ResolveMemoryInputStreamMethod "isReadable" o = Gio.PollableInputStream.PollableInputStreamIsReadableMethodInfo ResolveMemoryInputStreamMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo ResolveMemoryInputStreamMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo ResolveMemoryInputStreamMethod "read" o = Gio.InputStream.InputStreamReadMethodInfo ResolveMemoryInputStreamMethod "readAll" o = Gio.InputStream.InputStreamReadAllMethodInfo ResolveMemoryInputStreamMethod "readAllAsync" o = Gio.InputStream.InputStreamReadAllAsyncMethodInfo ResolveMemoryInputStreamMethod "readAllFinish" o = Gio.InputStream.InputStreamReadAllFinishMethodInfo ResolveMemoryInputStreamMethod "readAsync" o = Gio.InputStream.InputStreamReadAsyncMethodInfo ResolveMemoryInputStreamMethod "readBytes" o = Gio.InputStream.InputStreamReadBytesMethodInfo ResolveMemoryInputStreamMethod "readBytesAsync" o = Gio.InputStream.InputStreamReadBytesAsyncMethodInfo ResolveMemoryInputStreamMethod "readBytesFinish" o = Gio.InputStream.InputStreamReadBytesFinishMethodInfo ResolveMemoryInputStreamMethod "readFinish" o = Gio.InputStream.InputStreamReadFinishMethodInfo ResolveMemoryInputStreamMethod "readNonblocking" o = Gio.PollableInputStream.PollableInputStreamReadNonblockingMethodInfo ResolveMemoryInputStreamMethod "ref" o = GObject.Object.ObjectRefMethodInfo ResolveMemoryInputStreamMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo ResolveMemoryInputStreamMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo ResolveMemoryInputStreamMethod "seek" o = Gio.Seekable.SeekableSeekMethodInfo ResolveMemoryInputStreamMethod "skip" o = Gio.InputStream.InputStreamSkipMethodInfo ResolveMemoryInputStreamMethod "skipAsync" o = Gio.InputStream.InputStreamSkipAsyncMethodInfo ResolveMemoryInputStreamMethod "skipFinish" o = Gio.InputStream.InputStreamSkipFinishMethodInfo ResolveMemoryInputStreamMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo ResolveMemoryInputStreamMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo ResolveMemoryInputStreamMethod "tell" o = Gio.Seekable.SeekableTellMethodInfo ResolveMemoryInputStreamMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo ResolveMemoryInputStreamMethod "truncate" o = Gio.Seekable.SeekableTruncateMethodInfo ResolveMemoryInputStreamMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo ResolveMemoryInputStreamMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo ResolveMemoryInputStreamMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo ResolveMemoryInputStreamMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo ResolveMemoryInputStreamMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo ResolveMemoryInputStreamMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo ResolveMemoryInputStreamMethod "setPending" o = Gio.InputStream.InputStreamSetPendingMethodInfo ResolveMemoryInputStreamMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo ResolveMemoryInputStreamMethod l o = O.MethodResolutionFailed l o instance (info ~ ResolveMemoryInputStreamMethod t MemoryInputStream, O.MethodInfo info MemoryInputStream p) => OL.IsLabel t (MemoryInputStream -> 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 MemoryInputStream type instance O.AttributeList MemoryInputStream = MemoryInputStreamAttributeList type MemoryInputStreamAttributeList = ('[ ] :: [(Symbol, *)]) #endif #if ENABLE_OVERLOADING #endif #if ENABLE_OVERLOADING type instance O.SignalList MemoryInputStream = MemoryInputStreamSignalList type MemoryInputStreamSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)]) #endif -- method MemoryInputStream::new -- method type : Constructor -- Args : [] -- Lengths : [] -- returnType : Just (TInterface (Name {namespace = "Gio", name = "MemoryInputStream"})) -- throws : False -- Skip return : False foreign import ccall "g_memory_input_stream_new" g_memory_input_stream_new :: IO (Ptr MemoryInputStream) {- | Creates a new empty 'GI.Gio.Objects.MemoryInputStream.MemoryInputStream'. -} memoryInputStreamNew :: (B.CallStack.HasCallStack, MonadIO m) => m MemoryInputStream {- ^ __Returns:__ a new 'GI.Gio.Objects.InputStream.InputStream' -} memoryInputStreamNew = liftIO $ do result <- g_memory_input_stream_new checkUnexpectedReturnNULL "memoryInputStreamNew" result result' <- (wrapObject MemoryInputStream) result return result' #if ENABLE_OVERLOADING #endif -- method MemoryInputStream::new_from_bytes -- method type : Constructor -- Args : [Arg {argCName = "bytes", argType = TInterface (Name {namespace = "GLib", name = "Bytes"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GBytes", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TInterface (Name {namespace = "Gio", name = "MemoryInputStream"})) -- throws : False -- Skip return : False foreign import ccall "g_memory_input_stream_new_from_bytes" g_memory_input_stream_new_from_bytes :: Ptr GLib.Bytes.Bytes -> -- bytes : TInterface (Name {namespace = "GLib", name = "Bytes"}) IO (Ptr MemoryInputStream) {- | Creates a new 'GI.Gio.Objects.MemoryInputStream.MemoryInputStream' with data from the given /@bytes@/. /Since: 2.34/ -} memoryInputStreamNewFromBytes :: (B.CallStack.HasCallStack, MonadIO m) => GLib.Bytes.Bytes {- ^ /@bytes@/: a 'GI.GLib.Structs.Bytes.Bytes' -} -> m MemoryInputStream {- ^ __Returns:__ new 'GI.Gio.Objects.InputStream.InputStream' read from /@bytes@/ -} memoryInputStreamNewFromBytes bytes = liftIO $ do bytes' <- unsafeManagedPtrGetPtr bytes result <- g_memory_input_stream_new_from_bytes bytes' checkUnexpectedReturnNULL "memoryInputStreamNewFromBytes" result result' <- (wrapObject MemoryInputStream) result touchManagedPtr bytes return result' #if ENABLE_OVERLOADING #endif -- method MemoryInputStream::new_from_data -- method type : Constructor -- Args : [Arg {argCName = "data", argType = TCArray False (-1) 1 (TBasicType TUInt8), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "input data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "len", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "length of the data, may be -1 if @data is a nul-terminated string", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "destroy", argType = TInterface (Name {namespace = "GLib", name = "DestroyNotify"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "function that is called to free @data, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [Arg {argCName = "len", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "length of the data, may be -1 if @data is a nul-terminated string", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- returnType : Just (TInterface (Name {namespace = "Gio", name = "MemoryInputStream"})) -- throws : False -- Skip return : False foreign import ccall "g_memory_input_stream_new_from_data" g_memory_input_stream_new_from_data :: Ptr Word8 -> -- data : TCArray False (-1) 1 (TBasicType TUInt8) Int64 -> -- len : TBasicType TInt64 FunPtr GLib.Callbacks.C_DestroyNotify -> -- destroy : TInterface (Name {namespace = "GLib", name = "DestroyNotify"}) IO (Ptr MemoryInputStream) {- | Creates a new 'GI.Gio.Objects.MemoryInputStream.MemoryInputStream' with data in memory of a given size. -} memoryInputStreamNewFromData :: (B.CallStack.HasCallStack, MonadIO m) => ByteString {- ^ /@data@/: input data -} -> Maybe (GLib.Callbacks.DestroyNotify) {- ^ /@destroy@/: function that is called to free /@data@/, or 'Nothing' -} -> m MemoryInputStream {- ^ __Returns:__ new 'GI.Gio.Objects.InputStream.InputStream' read from /@data@/ of /@len@/ bytes. -} memoryInputStreamNewFromData data_ destroy = liftIO $ do let len = fromIntegral $ B.length data_ data_' <- packByteString data_ maybeDestroy <- case destroy of Nothing -> return (castPtrToFunPtr nullPtr) Just jDestroy -> do ptrdestroy <- callocMem :: IO (Ptr (FunPtr GLib.Callbacks.C_DestroyNotify)) jDestroy' <- GLib.Callbacks.mk_DestroyNotify (GLib.Callbacks.wrap_DestroyNotify (Just ptrdestroy) jDestroy) poke ptrdestroy jDestroy' return jDestroy' result <- g_memory_input_stream_new_from_data data_' len maybeDestroy checkUnexpectedReturnNULL "memoryInputStreamNewFromData" result result' <- (wrapObject MemoryInputStream) result return result' #if ENABLE_OVERLOADING #endif -- method MemoryInputStream::add_bytes -- method type : OrdinaryMethod -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "MemoryInputStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GMemoryInputStream", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "bytes", argType = TInterface (Name {namespace = "GLib", name = "Bytes"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "input data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "g_memory_input_stream_add_bytes" g_memory_input_stream_add_bytes :: Ptr MemoryInputStream -> -- stream : TInterface (Name {namespace = "Gio", name = "MemoryInputStream"}) Ptr GLib.Bytes.Bytes -> -- bytes : TInterface (Name {namespace = "GLib", name = "Bytes"}) IO () {- | Appends /@bytes@/ to data that can be read from the input stream. /Since: 2.34/ -} memoryInputStreamAddBytes :: (B.CallStack.HasCallStack, MonadIO m, IsMemoryInputStream a) => a {- ^ /@stream@/: a 'GI.Gio.Objects.MemoryInputStream.MemoryInputStream' -} -> GLib.Bytes.Bytes {- ^ /@bytes@/: input data -} -> m () memoryInputStreamAddBytes stream bytes = liftIO $ do stream' <- unsafeManagedPtrCastPtr stream bytes' <- unsafeManagedPtrGetPtr bytes g_memory_input_stream_add_bytes stream' bytes' touchManagedPtr stream touchManagedPtr bytes return () #if ENABLE_OVERLOADING data MemoryInputStreamAddBytesMethodInfo instance (signature ~ (GLib.Bytes.Bytes -> m ()), MonadIO m, IsMemoryInputStream a) => O.MethodInfo MemoryInputStreamAddBytesMethodInfo a signature where overloadedMethod _ = memoryInputStreamAddBytes #endif -- method MemoryInputStream::add_data -- method type : OrdinaryMethod -- Args : [Arg {argCName = "stream", argType = TInterface (Name {namespace = "Gio", name = "MemoryInputStream"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GMemoryInputStream", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TCArray False (-1) 2 (TBasicType TUInt8), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "input data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "len", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "length of the data, may be -1 if @data is a nul-terminated string", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "destroy", argType = TInterface (Name {namespace = "GLib", name = "DestroyNotify"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "function that is called to free @data, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [Arg {argCName = "len", argType = TBasicType TInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "length of the data, may be -1 if @data is a nul-terminated string", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "g_memory_input_stream_add_data" g_memory_input_stream_add_data :: Ptr MemoryInputStream -> -- stream : TInterface (Name {namespace = "Gio", name = "MemoryInputStream"}) Ptr Word8 -> -- data : TCArray False (-1) 2 (TBasicType TUInt8) Int64 -> -- len : TBasicType TInt64 FunPtr GLib.Callbacks.C_DestroyNotify -> -- destroy : TInterface (Name {namespace = "GLib", name = "DestroyNotify"}) IO () {- | Appends /@data@/ to data that can be read from the input stream -} memoryInputStreamAddData :: (B.CallStack.HasCallStack, MonadIO m, IsMemoryInputStream a) => a {- ^ /@stream@/: a 'GI.Gio.Objects.MemoryInputStream.MemoryInputStream' -} -> ByteString {- ^ /@data@/: input data -} -> Maybe (GLib.Callbacks.DestroyNotify) {- ^ /@destroy@/: function that is called to free /@data@/, or 'Nothing' -} -> m () memoryInputStreamAddData stream data_ destroy = liftIO $ do let len = fromIntegral $ B.length data_ stream' <- unsafeManagedPtrCastPtr stream data_' <- packByteString data_ maybeDestroy <- case destroy of Nothing -> return (castPtrToFunPtr nullPtr) Just jDestroy -> do ptrdestroy <- callocMem :: IO (Ptr (FunPtr GLib.Callbacks.C_DestroyNotify)) jDestroy' <- GLib.Callbacks.mk_DestroyNotify (GLib.Callbacks.wrap_DestroyNotify (Just ptrdestroy) jDestroy) poke ptrdestroy jDestroy' return jDestroy' g_memory_input_stream_add_data stream' data_' len maybeDestroy touchManagedPtr stream return () #if ENABLE_OVERLOADING data MemoryInputStreamAddDataMethodInfo instance (signature ~ (ByteString -> Maybe (GLib.Callbacks.DestroyNotify) -> m ()), MonadIO m, IsMemoryInputStream a) => O.MethodInfo MemoryInputStreamAddDataMethodInfo a signature where overloadedMethod _ = memoryInputStreamAddData #endif