{- |
Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)
Represents a multipart HTTP message body, parsed according to the
syntax of RFC 2046. Of particular interest to HTTP are
multipart/byte-ranges and
multipart/form-data.
Although the headers of a #SoupMultipart body part will contain the
full headers from that body part, libsoup does not interpret them
according to MIME rules. For example, each body part is assumed to
have "binary" Content-Transfer-Encoding, even if its headers
explicitly state otherwise. In other words, don't try to use
#SoupMultipart for handling real MIME multiparts.
-}
module GI.Soup.Structs.Multipart
(
-- * Exported types
Multipart(..) ,
noMultipart ,
-- * Methods
-- ** multipartAppendFormFile
MultipartAppendFormFileMethodInfo ,
multipartAppendFormFile ,
-- ** multipartAppendFormString
MultipartAppendFormStringMethodInfo ,
multipartAppendFormString ,
-- ** multipartAppendPart
MultipartAppendPartMethodInfo ,
multipartAppendPart ,
-- ** multipartFree
MultipartFreeMethodInfo ,
multipartFree ,
-- ** multipartGetLength
MultipartGetLengthMethodInfo ,
multipartGetLength ,
-- ** multipartGetPart
MultipartGetPartMethodInfo ,
multipartGetPart ,
-- ** multipartNew
multipartNew ,
-- ** multipartNewFromMessage
multipartNewFromMessage ,
-- ** multipartToMessage
MultipartToMessageMethodInfo ,
multipartToMessage ,
) where
import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import GI.Soup.Types
import GI.Soup.Callbacks
newtype Multipart = Multipart (ForeignPtr Multipart)
foreign import ccall "soup_multipart_get_type" c_soup_multipart_get_type ::
IO GType
instance BoxedObject Multipart where
boxedType _ = c_soup_multipart_get_type
noMultipart :: Maybe Multipart
noMultipart = Nothing
type instance AttributeList Multipart = MultipartAttributeList
type MultipartAttributeList = ('[ ] :: [(Symbol, *)])
-- method Multipart::new
-- method type : Constructor
-- Args : [Arg {argCName = "mime_type", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface "Soup" "Multipart")
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_new" soup_multipart_new ::
CString -> -- mime_type : TBasicType TUTF8
IO (Ptr Multipart)
multipartNew ::
(MonadIO m) =>
T.Text -- mimeType
-> m Multipart -- result
multipartNew mimeType = liftIO $ do
mimeType' <- textToCString mimeType
result <- soup_multipart_new mimeType'
checkUnexpectedReturnNULL "soup_multipart_new" result
result' <- (wrapBoxed Multipart) result
freeMem mimeType'
return result'
-- method Multipart::new_from_message
-- method type : Constructor
-- Args : [Arg {argCName = "headers", argType = TInterface "Soup" "MessageHeaders", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "body", argType = TInterface "Soup" "MessageBody", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface "Soup" "Multipart")
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_new_from_message" soup_multipart_new_from_message ::
Ptr MessageHeaders -> -- headers : TInterface "Soup" "MessageHeaders"
Ptr MessageBody -> -- body : TInterface "Soup" "MessageBody"
IO (Ptr Multipart)
multipartNewFromMessage ::
(MonadIO m) =>
MessageHeaders -- headers
-> MessageBody -- body
-> m (Maybe Multipart) -- result
multipartNewFromMessage headers body = liftIO $ do
let headers' = unsafeManagedPtrGetPtr headers
let body' = unsafeManagedPtrGetPtr body
result <- soup_multipart_new_from_message headers' body'
maybeResult <- convertIfNonNull result $ \result' -> do
result'' <- (wrapBoxed Multipart) result'
return result''
touchManagedPtr headers
touchManagedPtr body
return maybeResult
-- method Multipart::append_form_file
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Soup" "Multipart", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "control_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "filename", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "content_type", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "body", argType = TInterface "Soup" "Buffer", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_append_form_file" soup_multipart_append_form_file ::
Ptr Multipart -> -- _obj : TInterface "Soup" "Multipart"
CString -> -- control_name : TBasicType TUTF8
CString -> -- filename : TBasicType TUTF8
CString -> -- content_type : TBasicType TUTF8
Ptr Buffer -> -- body : TInterface "Soup" "Buffer"
IO ()
multipartAppendFormFile ::
(MonadIO m) =>
Multipart -- _obj
-> T.Text -- controlName
-> T.Text -- filename
-> T.Text -- contentType
-> Buffer -- body
-> m () -- result
multipartAppendFormFile _obj controlName filename contentType body = liftIO $ do
let _obj' = unsafeManagedPtrGetPtr _obj
controlName' <- textToCString controlName
filename' <- textToCString filename
contentType' <- textToCString contentType
let body' = unsafeManagedPtrGetPtr body
soup_multipart_append_form_file _obj' controlName' filename' contentType' body'
touchManagedPtr _obj
touchManagedPtr body
freeMem controlName'
freeMem filename'
freeMem contentType'
return ()
data MultipartAppendFormFileMethodInfo
instance (signature ~ (T.Text -> T.Text -> T.Text -> Buffer -> m ()), MonadIO m) => MethodInfo MultipartAppendFormFileMethodInfo Multipart signature where
overloadedMethod _ = multipartAppendFormFile
-- method Multipart::append_form_string
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Soup" "Multipart", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "control_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_append_form_string" soup_multipart_append_form_string ::
Ptr Multipart -> -- _obj : TInterface "Soup" "Multipart"
CString -> -- control_name : TBasicType TUTF8
CString -> -- data : TBasicType TUTF8
IO ()
multipartAppendFormString ::
(MonadIO m) =>
Multipart -- _obj
-> T.Text -- controlName
-> T.Text -- data_
-> m () -- result
multipartAppendFormString _obj controlName data_ = liftIO $ do
let _obj' = unsafeManagedPtrGetPtr _obj
controlName' <- textToCString controlName
data_' <- textToCString data_
soup_multipart_append_form_string _obj' controlName' data_'
touchManagedPtr _obj
freeMem controlName'
freeMem data_'
return ()
data MultipartAppendFormStringMethodInfo
instance (signature ~ (T.Text -> T.Text -> m ()), MonadIO m) => MethodInfo MultipartAppendFormStringMethodInfo Multipart signature where
overloadedMethod _ = multipartAppendFormString
-- method Multipart::append_part
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Soup" "Multipart", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "headers", argType = TInterface "Soup" "MessageHeaders", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "body", argType = TInterface "Soup" "Buffer", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_append_part" soup_multipart_append_part ::
Ptr Multipart -> -- _obj : TInterface "Soup" "Multipart"
Ptr MessageHeaders -> -- headers : TInterface "Soup" "MessageHeaders"
Ptr Buffer -> -- body : TInterface "Soup" "Buffer"
IO ()
multipartAppendPart ::
(MonadIO m) =>
Multipart -- _obj
-> MessageHeaders -- headers
-> Buffer -- body
-> m () -- result
multipartAppendPart _obj headers body = liftIO $ do
let _obj' = unsafeManagedPtrGetPtr _obj
let headers' = unsafeManagedPtrGetPtr headers
let body' = unsafeManagedPtrGetPtr body
soup_multipart_append_part _obj' headers' body'
touchManagedPtr _obj
touchManagedPtr headers
touchManagedPtr body
return ()
data MultipartAppendPartMethodInfo
instance (signature ~ (MessageHeaders -> Buffer -> m ()), MonadIO m) => MethodInfo MultipartAppendPartMethodInfo Multipart signature where
overloadedMethod _ = multipartAppendPart
-- method Multipart::free
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Soup" "Multipart", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_free" soup_multipart_free ::
Ptr Multipart -> -- _obj : TInterface "Soup" "Multipart"
IO ()
multipartFree ::
(MonadIO m) =>
Multipart -- _obj
-> m () -- result
multipartFree _obj = liftIO $ do
let _obj' = unsafeManagedPtrGetPtr _obj
soup_multipart_free _obj'
touchManagedPtr _obj
return ()
data MultipartFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => MethodInfo MultipartFreeMethodInfo Multipart signature where
overloadedMethod _ = multipartFree
-- method Multipart::get_length
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Soup" "Multipart", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_get_length" soup_multipart_get_length ::
Ptr Multipart -> -- _obj : TInterface "Soup" "Multipart"
IO Int32
multipartGetLength ::
(MonadIO m) =>
Multipart -- _obj
-> m Int32 -- result
multipartGetLength _obj = liftIO $ do
let _obj' = unsafeManagedPtrGetPtr _obj
result <- soup_multipart_get_length _obj'
touchManagedPtr _obj
return result
data MultipartGetLengthMethodInfo
instance (signature ~ (m Int32), MonadIO m) => MethodInfo MultipartGetLengthMethodInfo Multipart signature where
overloadedMethod _ = multipartGetLength
-- method Multipart::get_part
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Soup" "Multipart", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "part", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "headers", argType = TInterface "Soup" "MessageHeaders", direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "body", argType = TInterface "Soup" "Buffer", direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_get_part" soup_multipart_get_part ::
Ptr Multipart -> -- _obj : TInterface "Soup" "Multipart"
Int32 -> -- part : TBasicType TInt
Ptr (Ptr MessageHeaders) -> -- headers : TInterface "Soup" "MessageHeaders"
Ptr Buffer -> -- body : TInterface "Soup" "Buffer"
IO CInt
multipartGetPart ::
(MonadIO m) =>
Multipart -- _obj
-> Int32 -- part
-> m (Bool,MessageHeaders,Buffer) -- result
multipartGetPart _obj part = liftIO $ do
let _obj' = unsafeManagedPtrGetPtr _obj
headers <- allocMem :: IO (Ptr (Ptr MessageHeaders))
body <- callocBoxedBytes 16 :: IO (Ptr Buffer)
result <- soup_multipart_get_part _obj' part headers body
let result' = (/= 0) result
headers' <- peek headers
headers'' <- (newBoxed MessageHeaders) headers'
body' <- (wrapBoxed Buffer) body
touchManagedPtr _obj
freeMem headers
return (result', headers'', body')
data MultipartGetPartMethodInfo
instance (signature ~ (Int32 -> m (Bool,MessageHeaders,Buffer)), MonadIO m) => MethodInfo MultipartGetPartMethodInfo Multipart signature where
overloadedMethod _ = multipartGetPart
-- method Multipart::to_message
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Soup" "Multipart", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "dest_headers", argType = TInterface "Soup" "MessageHeaders", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "dest_body", argType = TInterface "Soup" "MessageBody", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False
foreign import ccall "soup_multipart_to_message" soup_multipart_to_message ::
Ptr Multipart -> -- _obj : TInterface "Soup" "Multipart"
Ptr MessageHeaders -> -- dest_headers : TInterface "Soup" "MessageHeaders"
Ptr MessageBody -> -- dest_body : TInterface "Soup" "MessageBody"
IO ()
multipartToMessage ::
(MonadIO m) =>
Multipart -- _obj
-> MessageHeaders -- destHeaders
-> MessageBody -- destBody
-> m () -- result
multipartToMessage _obj destHeaders destBody = liftIO $ do
let _obj' = unsafeManagedPtrGetPtr _obj
let destHeaders' = unsafeManagedPtrGetPtr destHeaders
let destBody' = unsafeManagedPtrGetPtr destBody
soup_multipart_to_message _obj' destHeaders' destBody'
touchManagedPtr _obj
touchManagedPtr destHeaders
touchManagedPtr destBody
return ()
data MultipartToMessageMethodInfo
instance (signature ~ (MessageHeaders -> MessageBody -> m ()), MonadIO m) => MethodInfo MultipartToMessageMethodInfo Multipart signature where
overloadedMethod _ = multipartToMessage
type family ResolveMultipartMethod (t :: Symbol) (o :: *) :: * where
ResolveMultipartMethod "appendFormFile" o = MultipartAppendFormFileMethodInfo
ResolveMultipartMethod "appendFormString" o = MultipartAppendFormStringMethodInfo
ResolveMultipartMethod "appendPart" o = MultipartAppendPartMethodInfo
ResolveMultipartMethod "free" o = MultipartFreeMethodInfo
ResolveMultipartMethod "toMessage" o = MultipartToMessageMethodInfo
ResolveMultipartMethod "getLength" o = MultipartGetLengthMethodInfo
ResolveMultipartMethod "getPart" o = MultipartGetPartMethodInfo
ResolveMultipartMethod l o = MethodResolutionFailed l o
instance (info ~ ResolveMultipartMethod t Multipart, MethodInfo info Multipart p) => IsLabelProxy t (Multipart -> p) where
fromLabelProxy _ = overloadedMethod (MethodProxy :: MethodProxy info)
#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveMultipartMethod t Multipart, MethodInfo info Multipart p) => IsLabel t (Multipart -> p) where
fromLabel _ = overloadedMethod (MethodProxy :: MethodProxy info)
#endif