{- | 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.SocketAddressEnumerator.SocketAddressEnumerator' is an enumerator type for 'GI.Gio.Objects.SocketAddress.SocketAddress' instances. It is returned by enumeration functions such as 'GI.Gio.Interfaces.SocketConnectable.socketConnectableEnumerate', which returns a 'GI.Gio.Objects.SocketAddressEnumerator.SocketAddressEnumerator' to list all the @/GSocketAddresses/@ which could be used to connect to that 'GI.Gio.Interfaces.SocketConnectable.SocketConnectable'. Enumeration is typically a blocking operation, so the asynchronous methods 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNextAsync' and 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNextFinish' should be used where possible. Each 'GI.Gio.Objects.SocketAddressEnumerator.SocketAddressEnumerator' can only be enumerated once. Once 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNext' has returned 'Nothing' (and no error), further enumeration with that 'GI.Gio.Objects.SocketAddressEnumerator.SocketAddressEnumerator' is not possible, and it can be unreffed. -} #define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \ && !defined(__HADDOCK_VERSION__)) module GI.Gio.Objects.SocketAddressEnumerator ( -- * Exported types SocketAddressEnumerator(..) , IsSocketAddressEnumerator , toSocketAddressEnumerator , noSocketAddressEnumerator , -- * Methods -- ** next #method:next# #if ENABLE_OVERLOADING SocketAddressEnumeratorNextMethodInfo , #endif socketAddressEnumeratorNext , -- ** nextAsync #method:nextAsync# #if ENABLE_OVERLOADING SocketAddressEnumeratorNextAsyncMethodInfo, #endif socketAddressEnumeratorNextAsync , -- ** nextFinish #method:nextFinish# #if ENABLE_OVERLOADING SocketAddressEnumeratorNextFinishMethodInfo, #endif socketAddressEnumeratorNextFinish , ) 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.Gio.Callbacks as Gio.Callbacks import {-# SOURCE #-} qualified GI.Gio.Interfaces.AsyncResult as Gio.AsyncResult import {-# SOURCE #-} qualified GI.Gio.Objects.Cancellable as Gio.Cancellable import {-# SOURCE #-} qualified GI.Gio.Objects.SocketAddress as Gio.SocketAddress -- | Memory-managed wrapper type. newtype SocketAddressEnumerator = SocketAddressEnumerator (ManagedPtr SocketAddressEnumerator) foreign import ccall "g_socket_address_enumerator_get_type" c_g_socket_address_enumerator_get_type :: IO GType instance GObject SocketAddressEnumerator where gobjectType = c_g_socket_address_enumerator_get_type -- | Type class for types which can be safely cast to `SocketAddressEnumerator`, for instance with `toSocketAddressEnumerator`. class (GObject o, O.IsDescendantOf SocketAddressEnumerator o) => IsSocketAddressEnumerator o instance (GObject o, O.IsDescendantOf SocketAddressEnumerator o) => IsSocketAddressEnumerator o instance O.HasParentTypes SocketAddressEnumerator type instance O.ParentTypes SocketAddressEnumerator = '[GObject.Object.Object] -- | Cast to `SocketAddressEnumerator`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`. toSocketAddressEnumerator :: (MonadIO m, IsSocketAddressEnumerator o) => o -> m SocketAddressEnumerator toSocketAddressEnumerator = liftIO . unsafeCastTo SocketAddressEnumerator -- | A convenience alias for `Nothing` :: `Maybe` `SocketAddressEnumerator`. noSocketAddressEnumerator :: Maybe SocketAddressEnumerator noSocketAddressEnumerator = Nothing #if ENABLE_OVERLOADING type family ResolveSocketAddressEnumeratorMethod (t :: Symbol) (o :: *) :: * where ResolveSocketAddressEnumeratorMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo ResolveSocketAddressEnumeratorMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo ResolveSocketAddressEnumeratorMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo ResolveSocketAddressEnumeratorMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo ResolveSocketAddressEnumeratorMethod "getv" o = GObject.Object.ObjectGetvMethodInfo ResolveSocketAddressEnumeratorMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo ResolveSocketAddressEnumeratorMethod "next" o = SocketAddressEnumeratorNextMethodInfo ResolveSocketAddressEnumeratorMethod "nextAsync" o = SocketAddressEnumeratorNextAsyncMethodInfo ResolveSocketAddressEnumeratorMethod "nextFinish" o = SocketAddressEnumeratorNextFinishMethodInfo ResolveSocketAddressEnumeratorMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo ResolveSocketAddressEnumeratorMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo ResolveSocketAddressEnumeratorMethod "ref" o = GObject.Object.ObjectRefMethodInfo ResolveSocketAddressEnumeratorMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo ResolveSocketAddressEnumeratorMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo ResolveSocketAddressEnumeratorMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo ResolveSocketAddressEnumeratorMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo ResolveSocketAddressEnumeratorMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo ResolveSocketAddressEnumeratorMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo ResolveSocketAddressEnumeratorMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo ResolveSocketAddressEnumeratorMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo ResolveSocketAddressEnumeratorMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo ResolveSocketAddressEnumeratorMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo ResolveSocketAddressEnumeratorMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo ResolveSocketAddressEnumeratorMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo ResolveSocketAddressEnumeratorMethod l o = O.MethodResolutionFailed l o instance (info ~ ResolveSocketAddressEnumeratorMethod t SocketAddressEnumerator, O.MethodInfo info SocketAddressEnumerator p) => OL.IsLabel t (SocketAddressEnumerator -> 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 SocketAddressEnumerator type instance O.AttributeList SocketAddressEnumerator = SocketAddressEnumeratorAttributeList type SocketAddressEnumeratorAttributeList = ('[ ] :: [(Symbol, *)]) #endif #if ENABLE_OVERLOADING #endif #if ENABLE_OVERLOADING type instance O.SignalList SocketAddressEnumerator = SocketAddressEnumeratorSignalList type SocketAddressEnumeratorSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)]) #endif -- method SocketAddressEnumerator::next -- method type : OrdinaryMethod -- Args : [Arg {argCName = "enumerator", argType = TInterface (Name {namespace = "Gio", name = "SocketAddressEnumerator"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSocketAddressEnumerator", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "cancellable", argType = TInterface (Name {namespace = "Gio", name = "Cancellable"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "optional #GCancellable object, %NULL to ignore.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TInterface (Name {namespace = "Gio", name = "SocketAddress"})) -- throws : True -- Skip return : False foreign import ccall "g_socket_address_enumerator_next" g_socket_address_enumerator_next :: Ptr SocketAddressEnumerator -> -- enumerator : TInterface (Name {namespace = "Gio", name = "SocketAddressEnumerator"}) Ptr Gio.Cancellable.Cancellable -> -- cancellable : TInterface (Name {namespace = "Gio", name = "Cancellable"}) Ptr (Ptr GError) -> -- error IO (Ptr Gio.SocketAddress.SocketAddress) {- | Retrieves the next 'GI.Gio.Objects.SocketAddress.SocketAddress' from /@enumerator@/. Note that this may block for some amount of time. (Eg, a 'GI.Gio.Objects.NetworkAddress.NetworkAddress' may need to do a DNS lookup before it can return an address.) Use 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNextAsync' if you need to avoid blocking. If /@enumerator@/ is expected to yield addresses, but for some reason is unable to (eg, because of a DNS error), then the first call to 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNext' will return an appropriate error in */@error@/. However, if the first call to 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNext' succeeds, then any further internal errors (other than /@cancellable@/ being triggered) will be ignored. -} socketAddressEnumeratorNext :: (B.CallStack.HasCallStack, MonadIO m, IsSocketAddressEnumerator a, Gio.Cancellable.IsCancellable b) => a {- ^ /@enumerator@/: a 'GI.Gio.Objects.SocketAddressEnumerator.SocketAddressEnumerator' -} -> Maybe (b) {- ^ /@cancellable@/: optional 'GI.Gio.Objects.Cancellable.Cancellable' object, 'Nothing' to ignore. -} -> m Gio.SocketAddress.SocketAddress {- ^ __Returns:__ a 'GI.Gio.Objects.SocketAddress.SocketAddress' (owned by the caller), or 'Nothing' on error (in which case */@error@/ will be set) or if there are no more addresses. /(Can throw 'Data.GI.Base.GError.GError')/ -} socketAddressEnumeratorNext enumerator cancellable = liftIO $ do enumerator' <- unsafeManagedPtrCastPtr enumerator maybeCancellable <- case cancellable of Nothing -> return nullPtr Just jCancellable -> do jCancellable' <- unsafeManagedPtrCastPtr jCancellable return jCancellable' onException (do result <- propagateGError $ g_socket_address_enumerator_next enumerator' maybeCancellable checkUnexpectedReturnNULL "socketAddressEnumeratorNext" result result' <- (wrapObject Gio.SocketAddress.SocketAddress) result touchManagedPtr enumerator whenJust cancellable touchManagedPtr return result' ) (do return () ) #if ENABLE_OVERLOADING data SocketAddressEnumeratorNextMethodInfo instance (signature ~ (Maybe (b) -> m Gio.SocketAddress.SocketAddress), MonadIO m, IsSocketAddressEnumerator a, Gio.Cancellable.IsCancellable b) => O.MethodInfo SocketAddressEnumeratorNextMethodInfo a signature where overloadedMethod _ = socketAddressEnumeratorNext #endif -- method SocketAddressEnumerator::next_async -- method type : OrdinaryMethod -- Args : [Arg {argCName = "enumerator", argType = TInterface (Name {namespace = "Gio", name = "SocketAddressEnumerator"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSocketAddressEnumerator", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "cancellable", argType = TInterface (Name {namespace = "Gio", name = "Cancellable"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "optional #GCancellable object, %NULL to ignore.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "callback", argType = TInterface (Name {namespace = "Gio", name = "AsyncReadyCallback"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "a #GAsyncReadyCallback to call when the request\n is satisfied", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = 3, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the data to pass to callback function", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "g_socket_address_enumerator_next_async" g_socket_address_enumerator_next_async :: Ptr SocketAddressEnumerator -> -- enumerator : TInterface (Name {namespace = "Gio", name = "SocketAddressEnumerator"}) Ptr Gio.Cancellable.Cancellable -> -- cancellable : TInterface (Name {namespace = "Gio", name = "Cancellable"}) FunPtr Gio.Callbacks.C_AsyncReadyCallback -> -- callback : TInterface (Name {namespace = "Gio", name = "AsyncReadyCallback"}) Ptr () -> -- user_data : TBasicType TPtr IO () {- | Asynchronously retrieves the next 'GI.Gio.Objects.SocketAddress.SocketAddress' from /@enumerator@/ and then calls /@callback@/, which must call 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNextFinish' to get the result. It is an error to call this multiple times before the previous callback has finished. -} socketAddressEnumeratorNextAsync :: (B.CallStack.HasCallStack, MonadIO m, IsSocketAddressEnumerator a, Gio.Cancellable.IsCancellable b) => a {- ^ /@enumerator@/: a 'GI.Gio.Objects.SocketAddressEnumerator.SocketAddressEnumerator' -} -> Maybe (b) {- ^ /@cancellable@/: optional 'GI.Gio.Objects.Cancellable.Cancellable' object, 'Nothing' to ignore. -} -> Maybe (Gio.Callbacks.AsyncReadyCallback) {- ^ /@callback@/: a 'GI.Gio.Callbacks.AsyncReadyCallback' to call when the request is satisfied -} -> m () socketAddressEnumeratorNextAsync enumerator cancellable callback = liftIO $ do enumerator' <- unsafeManagedPtrCastPtr enumerator maybeCancellable <- case cancellable of Nothing -> return nullPtr Just jCancellable -> do jCancellable' <- unsafeManagedPtrCastPtr jCancellable return jCancellable' maybeCallback <- case callback of Nothing -> return (castPtrToFunPtr nullPtr) Just jCallback -> do ptrcallback <- callocMem :: IO (Ptr (FunPtr Gio.Callbacks.C_AsyncReadyCallback)) jCallback' <- Gio.Callbacks.mk_AsyncReadyCallback (Gio.Callbacks.wrap_AsyncReadyCallback (Just ptrcallback) (Gio.Callbacks.drop_closures_AsyncReadyCallback jCallback)) poke ptrcallback jCallback' return jCallback' let userData = nullPtr g_socket_address_enumerator_next_async enumerator' maybeCancellable maybeCallback userData touchManagedPtr enumerator whenJust cancellable touchManagedPtr return () #if ENABLE_OVERLOADING data SocketAddressEnumeratorNextAsyncMethodInfo instance (signature ~ (Maybe (b) -> Maybe (Gio.Callbacks.AsyncReadyCallback) -> m ()), MonadIO m, IsSocketAddressEnumerator a, Gio.Cancellable.IsCancellable b) => O.MethodInfo SocketAddressEnumeratorNextAsyncMethodInfo a signature where overloadedMethod _ = socketAddressEnumeratorNextAsync #endif -- method SocketAddressEnumerator::next_finish -- method type : OrdinaryMethod -- Args : [Arg {argCName = "enumerator", argType = TInterface (Name {namespace = "Gio", name = "SocketAddressEnumerator"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSocketAddressEnumerator", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "result", argType = TInterface (Name {namespace = "Gio", name = "AsyncResult"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GAsyncResult", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TInterface (Name {namespace = "Gio", name = "SocketAddress"})) -- throws : True -- Skip return : False foreign import ccall "g_socket_address_enumerator_next_finish" g_socket_address_enumerator_next_finish :: Ptr SocketAddressEnumerator -> -- enumerator : TInterface (Name {namespace = "Gio", name = "SocketAddressEnumerator"}) Ptr Gio.AsyncResult.AsyncResult -> -- result : TInterface (Name {namespace = "Gio", name = "AsyncResult"}) Ptr (Ptr GError) -> -- error IO (Ptr Gio.SocketAddress.SocketAddress) {- | Retrieves the result of a completed call to 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNextAsync'. See 'GI.Gio.Objects.SocketAddressEnumerator.socketAddressEnumeratorNext' for more information about error handling. -} socketAddressEnumeratorNextFinish :: (B.CallStack.HasCallStack, MonadIO m, IsSocketAddressEnumerator a, Gio.AsyncResult.IsAsyncResult b) => a {- ^ /@enumerator@/: a 'GI.Gio.Objects.SocketAddressEnumerator.SocketAddressEnumerator' -} -> b {- ^ /@result@/: a 'GI.Gio.Interfaces.AsyncResult.AsyncResult' -} -> m Gio.SocketAddress.SocketAddress {- ^ __Returns:__ a 'GI.Gio.Objects.SocketAddress.SocketAddress' (owned by the caller), or 'Nothing' on error (in which case */@error@/ will be set) or if there are no more addresses. /(Can throw 'Data.GI.Base.GError.GError')/ -} socketAddressEnumeratorNextFinish enumerator result_ = liftIO $ do enumerator' <- unsafeManagedPtrCastPtr enumerator result_' <- unsafeManagedPtrCastPtr result_ onException (do result <- propagateGError $ g_socket_address_enumerator_next_finish enumerator' result_' checkUnexpectedReturnNULL "socketAddressEnumeratorNextFinish" result result' <- (wrapObject Gio.SocketAddress.SocketAddress) result touchManagedPtr enumerator touchManagedPtr result_ return result' ) (do return () ) #if ENABLE_OVERLOADING data SocketAddressEnumeratorNextFinishMethodInfo instance (signature ~ (b -> m Gio.SocketAddress.SocketAddress), MonadIO m, IsSocketAddressEnumerator a, Gio.AsyncResult.IsAsyncResult b) => O.MethodInfo SocketAddressEnumeratorNextFinishMethodInfo a signature where overloadedMethod _ = socketAddressEnumeratorNextFinish #endif