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

An opaque type used to iterate over a @/SoupMessageHeaders/@
structure.

After intializing the iterator with
'GI.Soup.Functions.messageHeadersIterInit', call
'GI.Soup.Structs.MessageHeadersIter.messageHeadersIterNext' to fetch data from it.

You may not modify the headers while iterating over them.
-}

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

module GI.Soup.Structs.MessageHeadersIter
    (

-- * Exported types
    MessageHeadersIter(..)                  ,
    newZeroMessageHeadersIter               ,
    noMessageHeadersIter                    ,


 -- * Methods
-- ** init #method:init#

    messageHeadersIterInit                  ,


-- ** next #method:next#

#if ENABLE_OVERLOADING
    MessageHeadersIterNextMethodInfo        ,
#endif
    messageHeadersIterNext                  ,




    ) 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 {-# SOURCE #-} qualified GI.Soup.Structs.MessageHeaders as Soup.MessageHeaders

-- | Memory-managed wrapper type.
newtype MessageHeadersIter = MessageHeadersIter (ManagedPtr MessageHeadersIter)
instance WrappedPtr MessageHeadersIter where
    wrappedPtrCalloc = callocBytes 24
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 24 >=> wrapPtr MessageHeadersIter)
    wrappedPtrFree = Just ptr_to_g_free

-- | Construct a `MessageHeadersIter` struct initialized to zero.
newZeroMessageHeadersIter :: MonadIO m => m MessageHeadersIter
newZeroMessageHeadersIter = liftIO $ wrappedPtrCalloc >>= wrapPtr MessageHeadersIter

instance tag ~ 'AttrSet => Constructible MessageHeadersIter tag where
    new _ attrs = do
        o <- newZeroMessageHeadersIter
        GI.Attributes.set o attrs
        return o


-- | A convenience alias for `Nothing` :: `Maybe` `MessageHeadersIter`.
noMessageHeadersIter :: Maybe MessageHeadersIter
noMessageHeadersIter = Nothing


#if ENABLE_OVERLOADING
instance O.HasAttributeList MessageHeadersIter
type instance O.AttributeList MessageHeadersIter = MessageHeadersIterAttributeList
type MessageHeadersIterAttributeList = ('[ ] :: [(Symbol, *)])
#endif

-- method MessageHeadersIter::next
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "iter", argType = TInterface (Name {namespace = "Soup", name = "MessageHeadersIter"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a %SoupMessageHeadersIter", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "pointer to a variable to return\nthe header name in", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "value", argType = TBasicType TUTF8, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "pointer to a variable to return\nthe header value in", 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 "soup_message_headers_iter_next" soup_message_headers_iter_next ::
    Ptr MessageHeadersIter ->               -- iter : TInterface (Name {namespace = "Soup", name = "MessageHeadersIter"})
    Ptr CString ->                          -- name : TBasicType TUTF8
    Ptr CString ->                          -- value : TBasicType TUTF8
    IO CInt

{- |
Yields the next name\/value pair in the @/SoupMessageHeaders/@ being
iterated by /@iter@/. If /@iter@/ has already yielded the last header,
then 'GI.Soup.Structs.MessageHeadersIter.messageHeadersIterNext' will return 'False' and /@name@/
and /@value@/ will be unchanged.
-}
messageHeadersIterNext ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    MessageHeadersIter
    {- ^ /@iter@/: a @/SoupMessageHeadersIter/@ -}
    -> m ((Bool, T.Text, T.Text))
    {- ^ __Returns:__ 'True' if another name and value were returned, 'False'
if the end of the headers has been reached. -}
messageHeadersIterNext iter = liftIO $ do
    iter' <- unsafeManagedPtrGetPtr iter
    name <- allocMem :: IO (Ptr CString)
    value <- allocMem :: IO (Ptr CString)
    result <- soup_message_headers_iter_next iter' name value
    let result' = (/= 0) result
    name' <- peek name
    name'' <- cstringToText name'
    value' <- peek value
    value'' <- cstringToText value'
    touchManagedPtr iter
    freeMem name
    freeMem value
    return (result', name'', value'')

#if ENABLE_OVERLOADING
data MessageHeadersIterNextMethodInfo
instance (signature ~ (m ((Bool, T.Text, T.Text))), MonadIO m) => O.MethodInfo MessageHeadersIterNextMethodInfo MessageHeadersIter signature where
    overloadedMethod _ = messageHeadersIterNext

#endif

-- method MessageHeadersIter::init
-- method type : MemberFunction
-- Args : [Arg {argCName = "iter", argType = TInterface (Name {namespace = "Soup", name = "MessageHeadersIter"}), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a pointer to a %SoupMessageHeadersIter\nstructure", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing},Arg {argCName = "hdrs", argType = TInterface (Name {namespace = "Soup", name = "MessageHeaders"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a %SoupMessageHeaders", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "soup_message_headers_iter_init" soup_message_headers_iter_init ::
    Ptr MessageHeadersIter ->               -- iter : TInterface (Name {namespace = "Soup", name = "MessageHeadersIter"})
    Ptr Soup.MessageHeaders.MessageHeaders -> -- hdrs : TInterface (Name {namespace = "Soup", name = "MessageHeaders"})
    IO ()

{- |
Initializes /@iter@/ for iterating /@hdrs@/.
-}
messageHeadersIterInit ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Soup.MessageHeaders.MessageHeaders
    {- ^ /@hdrs@/: a @/SoupMessageHeaders/@ -}
    -> m (MessageHeadersIter)
messageHeadersIterInit hdrs = liftIO $ do
    iter <- callocBytes 24 :: IO (Ptr MessageHeadersIter)
    hdrs' <- unsafeManagedPtrGetPtr hdrs
    soup_message_headers_iter_init iter hdrs'
    iter' <- (wrapPtr MessageHeadersIter) iter
    touchManagedPtr hdrs
    return iter'

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type family ResolveMessageHeadersIterMethod (t :: Symbol) (o :: *) :: * where
    ResolveMessageHeadersIterMethod "next" o = MessageHeadersIterNextMethodInfo
    ResolveMessageHeadersIterMethod l o = O.MethodResolutionFailed l o

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