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

This class represents the network related aspects of a navigation
request. It is used whenever WebKit wants to provide information
about a request that will be sent, or has been sent. Inside it you
can find the URI of the request, and, for valid URIs, a
'GI.Soup.Objects.Message.Message' object, which provides access to further information
such as headers.
-}

module GI.WebKit.Objects.NetworkRequest
    ( 

-- * Exported types
    NetworkRequest(..)                      ,
    IsNetworkRequest                        ,
    toNetworkRequest                        ,
    noNetworkRequest                        ,


 -- * Methods
-- ** getMessage #method:getMessage#
    NetworkRequestGetMessageMethodInfo      ,
    networkRequestGetMessage                ,


-- ** getUri #method:getUri#
    NetworkRequestGetUriMethodInfo          ,
    networkRequestGetUri                    ,


-- ** new #method:new#
    networkRequestNew                       ,


-- ** setUri #method:setUri#
    NetworkRequestSetUriMethodInfo          ,
    networkRequestSetUri                    ,




 -- * Properties
-- ** message #attr:message#
    NetworkRequestMessagePropertyInfo       ,
    constructNetworkRequestMessage          ,
    getNetworkRequestMessage                ,
    networkRequestMessage                   ,


-- ** uri #attr:uri#
    NetworkRequestUriPropertyInfo           ,
    constructNetworkRequestUri              ,
    getNetworkRequestUri                    ,
    networkRequestUri                       ,
    setNetworkRequestUri                    ,




    ) 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.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
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 GI.GObject.Objects.Object as GObject.Object
import qualified GI.Soup.Objects.Message as Soup.Message

newtype NetworkRequest = NetworkRequest (ManagedPtr NetworkRequest)
foreign import ccall "webkit_network_request_get_type"
    c_webkit_network_request_get_type :: IO GType

instance GObject NetworkRequest where
    gobjectType _ = c_webkit_network_request_get_type
    

class GObject o => IsNetworkRequest o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError NetworkRequest a) =>
    IsNetworkRequest a
#endif
instance IsNetworkRequest NetworkRequest
instance GObject.Object.IsObject NetworkRequest

toNetworkRequest :: IsNetworkRequest o => o -> IO NetworkRequest
toNetworkRequest = unsafeCastTo NetworkRequest

noNetworkRequest :: Maybe NetworkRequest
noNetworkRequest = Nothing

type family ResolveNetworkRequestMethod (t :: Symbol) (o :: *) :: * where
    ResolveNetworkRequestMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveNetworkRequestMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveNetworkRequestMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveNetworkRequestMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveNetworkRequestMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveNetworkRequestMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveNetworkRequestMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveNetworkRequestMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveNetworkRequestMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveNetworkRequestMethod "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveNetworkRequestMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    ResolveNetworkRequestMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveNetworkRequestMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveNetworkRequestMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveNetworkRequestMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveNetworkRequestMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveNetworkRequestMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveNetworkRequestMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveNetworkRequestMethod "getMessage" o = NetworkRequestGetMessageMethodInfo
    ResolveNetworkRequestMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveNetworkRequestMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveNetworkRequestMethod "getUri" o = NetworkRequestGetUriMethodInfo
    ResolveNetworkRequestMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveNetworkRequestMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveNetworkRequestMethod "setUri" o = NetworkRequestSetUriMethodInfo
    ResolveNetworkRequestMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveNetworkRequestMethod t NetworkRequest, O.MethodInfo info NetworkRequest p) => O.IsLabelProxy t (NetworkRequest -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveNetworkRequestMethod t NetworkRequest, O.MethodInfo info NetworkRequest p) => O.IsLabel t (NetworkRequest -> p) where
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

-- VVV Prop "message"
   -- Type: TInterface (Name {namespace = "Soup", name = "Message"})
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]
   -- Nullable: (Just False,Nothing)

getNetworkRequestMessage :: (MonadIO m, IsNetworkRequest o) => o -> m Soup.Message.Message
getNetworkRequestMessage obj = liftIO $ checkUnexpectedNothing "getNetworkRequestMessage" $ getObjectPropertyObject obj "message" Soup.Message.Message

constructNetworkRequestMessage :: (IsNetworkRequest o, Soup.Message.IsMessage a) => a -> IO (GValueConstruct o)
constructNetworkRequestMessage val = constructObjectPropertyObject "message" (Just val)

data NetworkRequestMessagePropertyInfo
instance AttrInfo NetworkRequestMessagePropertyInfo where
    type AttrAllowedOps NetworkRequestMessagePropertyInfo = '[ 'AttrConstruct, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint NetworkRequestMessagePropertyInfo = Soup.Message.IsMessage
    type AttrBaseTypeConstraint NetworkRequestMessagePropertyInfo = IsNetworkRequest
    type AttrGetType NetworkRequestMessagePropertyInfo = Soup.Message.Message
    type AttrLabel NetworkRequestMessagePropertyInfo = "message"
    type AttrOrigin NetworkRequestMessagePropertyInfo = NetworkRequest
    attrGet _ = getNetworkRequestMessage
    attrSet _ = undefined
    attrConstruct _ = constructNetworkRequestMessage
    attrClear _ = undefined

-- VVV Prop "uri"
   -- Type: TBasicType TUTF8
   -- Flags: [PropertyReadable,PropertyWritable]
   -- Nullable: (Just False,Just False)

getNetworkRequestUri :: (MonadIO m, IsNetworkRequest o) => o -> m T.Text
getNetworkRequestUri obj = liftIO $ checkUnexpectedNothing "getNetworkRequestUri" $ getObjectPropertyString obj "uri"

setNetworkRequestUri :: (MonadIO m, IsNetworkRequest o) => o -> T.Text -> m ()
setNetworkRequestUri obj val = liftIO $ setObjectPropertyString obj "uri" (Just val)

constructNetworkRequestUri :: (IsNetworkRequest o) => T.Text -> IO (GValueConstruct o)
constructNetworkRequestUri val = constructObjectPropertyString "uri" (Just val)

data NetworkRequestUriPropertyInfo
instance AttrInfo NetworkRequestUriPropertyInfo where
    type AttrAllowedOps NetworkRequestUriPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint NetworkRequestUriPropertyInfo = (~) T.Text
    type AttrBaseTypeConstraint NetworkRequestUriPropertyInfo = IsNetworkRequest
    type AttrGetType NetworkRequestUriPropertyInfo = T.Text
    type AttrLabel NetworkRequestUriPropertyInfo = "uri"
    type AttrOrigin NetworkRequestUriPropertyInfo = NetworkRequest
    attrGet _ = getNetworkRequestUri
    attrSet _ = setNetworkRequestUri
    attrConstruct _ = constructNetworkRequestUri
    attrClear _ = undefined

instance O.HasAttributeList NetworkRequest
type instance O.AttributeList NetworkRequest = NetworkRequestAttributeList
type NetworkRequestAttributeList = ('[ '("message", NetworkRequestMessagePropertyInfo), '("uri", NetworkRequestUriPropertyInfo)] :: [(Symbol, *)])

networkRequestMessage :: AttrLabelProxy "message"
networkRequestMessage = AttrLabelProxy

networkRequestUri :: AttrLabelProxy "uri"
networkRequestUri = AttrLabelProxy

type instance O.SignalList NetworkRequest = NetworkRequestSignalList
type NetworkRequestSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method NetworkRequest::new
-- method type : Constructor
-- Args : [Arg {argCName = "uri", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an URI", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "WebKit", name = "NetworkRequest"}))
-- throws : False
-- Skip return : False

foreign import ccall "webkit_network_request_new" webkit_network_request_new :: 
    CString ->                              -- uri : TBasicType TUTF8
    IO (Ptr NetworkRequest)

{- |
Creates a new 'GI.WebKit.Objects.NetworkRequest.NetworkRequest' initialized with an URI.
-}
networkRequestNew ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    T.Text
    {- ^ /@uri@/: an URI -}
    -> m NetworkRequest
    {- ^ __Returns:__ a new 'GI.WebKit.Objects.NetworkRequest.NetworkRequest', or 'Nothing' if the URI is
invalid. -}
networkRequestNew uri = liftIO $ do
    uri' <- textToCString uri
    result <- webkit_network_request_new uri'
    checkUnexpectedReturnNULL "networkRequestNew" result
    result' <- (wrapObject NetworkRequest) result
    freeMem uri'
    return result'

-- method NetworkRequest::get_message
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "request", argType = TInterface (Name {namespace = "WebKit", name = "NetworkRequest"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitNetworkRequest", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Soup", name = "Message"}))
-- throws : False
-- Skip return : False

foreign import ccall "webkit_network_request_get_message" webkit_network_request_get_message :: 
    Ptr NetworkRequest ->                   -- request : TInterface (Name {namespace = "WebKit", name = "NetworkRequest"})
    IO (Ptr Soup.Message.Message)

{- |
Obtains the 'GI.Soup.Objects.Message.Message' held and used by the given request. Notice
that modification of the SoupMessage of a request by signal
handlers is only supported (as in, will only affect what is
actually sent to the server) where explicitly documented.

@since 1.1.9
-}
networkRequestGetMessage ::
    (B.CallStack.HasCallStack, MonadIO m, IsNetworkRequest a) =>
    a
    {- ^ /@request@/: a 'GI.WebKit.Objects.NetworkRequest.NetworkRequest' -}
    -> m Soup.Message.Message
    {- ^ __Returns:__ the 'GI.Soup.Objects.Message.Message' -}
networkRequestGetMessage request = liftIO $ do
    request' <- unsafeManagedPtrCastPtr request
    result <- webkit_network_request_get_message request'
    checkUnexpectedReturnNULL "networkRequestGetMessage" result
    result' <- (newObject Soup.Message.Message) result
    touchManagedPtr request
    return result'

data NetworkRequestGetMessageMethodInfo
instance (signature ~ (m Soup.Message.Message), MonadIO m, IsNetworkRequest a) => O.MethodInfo NetworkRequestGetMessageMethodInfo a signature where
    overloadedMethod _ = networkRequestGetMessage

-- method NetworkRequest::get_uri
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "request", argType = TInterface (Name {namespace = "WebKit", name = "NetworkRequest"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitNetworkRequest", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "webkit_network_request_get_uri" webkit_network_request_get_uri :: 
    Ptr NetworkRequest ->                   -- request : TInterface (Name {namespace = "WebKit", name = "NetworkRequest"})
    IO CString

{- |
/No description available in the introspection data./

@since 1.0.0
-}
networkRequestGetUri ::
    (B.CallStack.HasCallStack, MonadIO m, IsNetworkRequest a) =>
    a
    {- ^ /@request@/: a 'GI.WebKit.Objects.NetworkRequest.NetworkRequest' -}
    -> m T.Text
    {- ^ __Returns:__ the URI of the 'GI.WebKit.Objects.NetworkRequest.NetworkRequest' -}
networkRequestGetUri request = liftIO $ do
    request' <- unsafeManagedPtrCastPtr request
    result <- webkit_network_request_get_uri request'
    checkUnexpectedReturnNULL "networkRequestGetUri" result
    result' <- cstringToText result
    touchManagedPtr request
    return result'

data NetworkRequestGetUriMethodInfo
instance (signature ~ (m T.Text), MonadIO m, IsNetworkRequest a) => O.MethodInfo NetworkRequestGetUriMethodInfo a signature where
    overloadedMethod _ = networkRequestGetUri

-- method NetworkRequest::set_uri
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "request", argType = TInterface (Name {namespace = "WebKit", name = "NetworkRequest"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #WebKitNetworkRequest", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "uri", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an URI", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "webkit_network_request_set_uri" webkit_network_request_set_uri :: 
    Ptr NetworkRequest ->                   -- request : TInterface (Name {namespace = "WebKit", name = "NetworkRequest"})
    CString ->                              -- uri : TBasicType TUTF8
    IO ()

{- |
Sets the URI held and used by the given request. When the request
has an associated 'GI.Soup.Objects.Message.Message', its URI will also be set by this
call.
-}
networkRequestSetUri ::
    (B.CallStack.HasCallStack, MonadIO m, IsNetworkRequest a) =>
    a
    {- ^ /@request@/: a 'GI.WebKit.Objects.NetworkRequest.NetworkRequest' -}
    -> T.Text
    {- ^ /@uri@/: an URI -}
    -> m ()
networkRequestSetUri request uri = liftIO $ do
    request' <- unsafeManagedPtrCastPtr request
    uri' <- textToCString uri
    webkit_network_request_set_uri request' uri'
    touchManagedPtr request
    freeMem uri'
    return ()

data NetworkRequestSetUriMethodInfo
instance (signature ~ (T.Text -> m ()), MonadIO m, IsNetworkRequest a) => O.MethodInfo NetworkRequestSetUriMethodInfo a signature where
    overloadedMethod _ = networkRequestSetUri