module Qtc.Classes.Types (
Object(..), objectNull, objectIsNull, objectCast, objectFromPtr, objectFromPtr_nf, withObjectPtr, ptrFromObject, objectListFromPtrList, objectListFromPtrList_nf
, QVoid, TQVoid, CQVoid, withQVoidResult
, QMetaObject, TQMetaObject, CQMetaObject, withQMetaObjectResult
, QString, TQString, CQString
, QByteArray, TQByteArray, CQByteArray, withQByteArrayResult
, QResource, TQResource, CQResource, withQResourceResult
, QTransform, TQTransform, CQTransform, withQTransformResult
, Element, TElement, CElement, withElementResult
, PaintContext, TPaintContext, CPaintContext, withPaintContextResult
, ExtraSelection, TExtraSelection, CExtraSelection
, QTextInlineObject, TQTextInlineObject, CQTextInlineObject
, QTextObjectInterface, TQTextObjectInterface, CQTextObjectInterface
, QImageTextKeyLang, TQImageTextKeyLang, CQImageTextKeyLang
, Q_IPV6ADDR, TQ_IPV6ADDR, CQ_IPV6ADDR, withQ_IPV6ADDRResult
, withObjectResult, withObjectRefResult
, intFromBool, boolFromInt
, withQListObject, withPtrPtrObject, withQListString
, withQListObjectResult, withQListObjectRefResult, withPtrPtrObjectResult, withQListStringResult
, withQListDouble, withQListDoubleResult, withQListIntResult, withQListLongResult
, CString, withCString
, withStringResult, withCStringResult
, stringFromPtr, cstringFromPtr
, newCWString, CWString, withCWString
, CDouble, toCDouble, fromCDouble, withDoubleResult
, CInt, toCInt, fromCInt, withIntResult
, CUInt, toCUInt, fromCUInt, withUnsignedIntResult
, CShort, toCShort, fromCShort, withShortResult
, CUShort, toCUShort, fromCUShort, withUnsignedShortResult
, CLong, toCLong, fromCLong, withLongResult
, CULong, toCULong, fromCULong, withUnsignedLongResult
, CLLong, toCLLong, fromCLLong, withLongLongResult
, CULLong, toCULLong, fromCULLong, withUnsignedLongLongResult
, CChar, toCChar, fromCChar, withCharResult
, CWchar, toCWchar
, CBool, toCBool, fromCBool, withBoolResult
, Ptr, nullPtr, ptrNull, ptrIsNull, ptrCast
, ForeignPtr, fptrNull, fptrIsNull, fptrCast
, FunPtr, toCFunPtr, freeHaskellFunPtr, castPtrToFunPtr
, addForeignPtrFinalizer
) where
import Foreign.C.Types
import System.IO.Unsafe (unsafePerformIO)
import Foreign.C
import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.Storable
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.ForeignPtr.Unsafe as U
import Qtc.Classes.Object
type QVoid a = Object (CQVoid a)
type TQVoid a = CQVoid a
data CQVoid a = CQVoid
withQVoidResult :: IO (Ptr (TQVoid a)) -> IO (QVoid a)
withQVoidResult f
= withObjectRefResult f
foreign import ccall qtc_QVoid_GetFinalizer :: FunPtr (Ptr (TQVoid a) -> IO ())
type QMetaObject a = Object (CQMetaObject a)
type TQMetaObject a = CQMetaObject a
data CQMetaObject a = CQMetaObject
withQMetaObjectResult :: IO (Ptr (TQMetaObject a)) -> IO (QMetaObject a)
withQMetaObjectResult f
= withObjectRefResult f
foreign import ccall qtc_QMetaObject_GetFinalizer :: FunPtr (Ptr (TQMetaObject a) -> IO ())
type QString a = Object (CQString a)
type TQString a = CQString a
data CQString a = CQString
type QByteArray a = Object (CQByteArray a)
type TQByteArray a = CQByteArray a
data CQByteArray a = CQByteArray
withQByteArrayResult :: IO (Ptr (TQByteArray a)) -> IO (QByteArray a)
withQByteArrayResult f
= withObjectRefResult f
foreign import ccall qtc_QByteArray_GetFinalizer :: FunPtr (Ptr (TQByteArray a) -> IO ())
type QResource a = Object (CQResource a)
type TQResource a = CQResource a
data CQResource a = CQResource
withQResourceResult :: IO (Ptr (TQResource a)) -> IO (QResource a)
withQResourceResult f
= withObjectRefResult f
foreign import ccall qtc_QResource_GetFinalizer :: FunPtr (Ptr (TQResource a) -> IO ())
type Q_IPV6ADDR a = Object (CQ_IPV6ADDR a)
type TQ_IPV6ADDR a = CQ_IPV6ADDR a
data CQ_IPV6ADDR a = CQ_IPV6ADDR
withQ_IPV6ADDRResult :: IO (Ptr (TQ_IPV6ADDR a)) -> IO (Q_IPV6ADDR a)
withQ_IPV6ADDRResult f
= withObjectRefResult f
type QTransform a = Object (CQTransform a)
type TQTransform a = CQTransform a
data CQTransform a = CQTransform
withQTransformResult :: IO (Ptr (TQTransform a)) -> IO (QTransform a)
withQTransformResult f
= withObjectRefResult f
type Element a = Object (CElement a)
type TElement a = CElement a
data CElement a = CElement
withElementResult :: IO (Ptr (TElement a)) -> IO (Element a)
withElementResult f
= withObjectResult qtc_Element_getFinalizer f
foreign import ccall qtc_Element_getFinalizer :: FunPtr (Ptr (TElement a) -> IO ())
type PaintContext a = Object (CPaintContext a)
type TPaintContext a = CPaintContext a
data CPaintContext a = CPaintContext
withPaintContextResult :: IO (Ptr (TPaintContext a)) -> IO (PaintContext a)
withPaintContextResult f
= withObjectResult qtc_PaintContext_getFinalizer f
foreign import ccall qtc_PaintContext_getFinalizer :: FunPtr (Ptr (TPaintContext a) -> IO ())
type ExtraSelection a = Object (CExtraSelection a)
type TExtraSelection a = CExtraSelection a
data CExtraSelection a = CExtraSelection
type QTextInlineObject a = Object (CQTextInlineObject a)
type TQTextInlineObject a = CQTextInlineObject a
data CQTextInlineObject a = CQTextInlineObject
type QTextObjectInterface a = Object (CQTextObjectInterface a)
type TQTextObjectInterface a = CQTextObjectInterface a
data CQTextObjectInterface a = CQTextObjectInterface
type QImageTextKeyLang a = Object (CQImageTextKeyLang a)
type TQImageTextKeyLang a = CQImageTextKeyLang a
data CQImageTextKeyLang a = CQImageTextKeyLang
withObjectResult :: FunPtr (Ptr a -> IO ()) -> IO (Ptr a) -> IO (Object a)
withObjectResult f io
= do
p <- io
objectFromPtr f p
withObjectRefResult :: IO (Ptr a) -> IO (Object a)
withObjectRefResult io
= do
p <- io
objectFromPtr_nf p
withDoubleResult :: IO CDouble -> IO Double
withDoubleResult io
= do
x <- io
return (fromCDouble x)
toCDouble :: Double -> CDouble
toCDouble i = realToFrac i
fromCDouble :: CDouble -> Double
fromCDouble ci = realToFrac ci
withIntResult :: IO CInt -> IO Int
withIntResult io
= do
x <- io
return (fromCInt x)
toCInt :: Int -> CInt
toCInt i = fromIntegral i
fromCInt :: CInt -> Int
fromCInt ci = fromIntegral ci
withUnsignedIntResult :: IO CUInt -> IO Int
withUnsignedIntResult io
= do
x <- io
return (fromCUInt x)
toCUInt :: Int -> CUInt
toCUInt i = fromIntegral i
fromCUInt :: CUInt -> Int
fromCUInt ci = fromIntegral ci
withShortResult :: IO CShort -> IO Int
withShortResult io
= do
x <- io
return (fromCShort x)
toCShort :: Int -> CShort
toCShort i = fromIntegral i
fromCShort :: CShort -> Int
fromCShort ci = fromIntegral ci
withUnsignedShortResult :: IO CUShort -> IO Int
withUnsignedShortResult io
= do
x <- io
return (fromCUShort x)
toCUShort :: Int -> CUShort
toCUShort i = fromIntegral i
fromCUShort :: CUShort -> Int
fromCUShort ci = fromIntegral ci
withLongResult :: IO CLong -> IO Int
withLongResult io
= do
x <- io
return (fromCLong x)
toCLong :: Int -> CLong
toCLong i = fromIntegral i
fromCLong :: CLong -> Int
fromCLong ci = fromIntegral ci
withUnsignedLongResult :: IO CULong -> IO Int
withUnsignedLongResult io
= do
x <- io
return (fromCULong x)
toCULong :: Int -> CULong
toCULong i = fromIntegral i
fromCULong :: CULong -> Int
fromCULong ci = fromIntegral ci
withLongLongResult :: IO CLLong -> IO Int
withLongLongResult io
= do
x <- io
return (fromCLLong x)
toCLLong :: Int -> CLLong
toCLLong i = fromIntegral i
fromCLLong :: CLLong -> Int
fromCLLong ci = fromIntegral ci
withUnsignedLongLongResult :: IO CULLong -> IO Int
withUnsignedLongLongResult io
= do
x <- io
return (fromCULLong x)
toCULLong :: Int -> CULLong
toCULLong i = fromIntegral i
fromCULLong :: CULLong -> Int
fromCULLong ci = fromIntegral ci
type CBool = CInt
toCBool :: Bool -> CBool
toCBool b = toCInt (if b then 1 else 0)
withBoolResult :: IO CBool -> IO Bool
withBoolResult io
= do
x <- io
return (fromCBool x)
fromCBool :: CBool -> Bool
fromCBool cb = (cb /= 0)
intFromBool :: Bool -> Int
intFromBool b = if b then 1 else 0
boolFromInt :: Int -> Bool
boolFromInt i = (i/=0)
toCChar :: Char -> CChar
toCChar = castCharToCChar
withCharResult :: (Num a, Integral a) => IO a -> IO Char
withCharResult io
= do
x <- io
return (fromCWchar x)
fromCChar :: CChar -> Char
fromCChar = castCCharToChar
toCWchar :: (Num a) => Char -> a
toCWchar = fromIntegral . fromEnum
fromCWchar :: (Num a, Integral a) => a -> Char
fromCWchar = toEnum . fromIntegral
withQtWStringResult :: (Ptr CWchar -> IO CInt) -> IO String
withQtWStringResult f
= do
len <- f nullPtr
if (len<=0)
then return ""
else withCWString (replicate (fromCInt len) ' ') $ \cstr ->
do f cstr
peekCWString cstr
withStringResult :: IO (Ptr (TQString a)) -> IO String
withStringResult io
= do
qs <- io
s <- withQtWStringResult (qtc_QString_GetString qs)
qtc_QString_Delete qs
return s
stringFromPtr :: Ptr (TQString a) -> IO String
stringFromPtr qptr
= do s <- withQtWStringResult (qtc_QString_GetString qptr)
qtc_QString_Delete qptr
return s
foreign import ccall "qtc_QString_Delete" qtc_QString_Delete :: Ptr (TQString a) -> IO ()
foreign import ccall "qtc_QString_GetString" qtc_QString_GetString :: Ptr (TQString a) -> Ptr CWchar -> IO CInt
withQtStringResult :: (Ptr CChar -> IO CInt) -> IO String
withQtStringResult f
= do
len <- f nullPtr
if (len<=0)
then return ""
else withCString (replicate (fromCInt len) ' ') $ \cstr ->
do f cstr
peekCString cstr
withCStringResult :: IO (Ptr (TQByteArray a)) -> IO String
withCStringResult io
= do
qba <- io
s <- withQtStringResult (qtc_QByteArray_GetByteArray qba)
qtc_QByteArray_Delete qba
return s
cstringFromPtr :: Ptr (TQByteArray a) -> IO String
cstringFromPtr qptr
= do s <- withQtStringResult (qtc_QByteArray_GetByteArray qptr)
qtc_QByteArray_Delete qptr
return s
foreign import ccall "qtc_QByteArray_Delete" qtc_QByteArray_Delete :: Ptr (TQByteArray a) -> IO ()
foreign import ccall "qtc_QByteArray_GetByteArray" qtc_QByteArray_GetByteArray :: Ptr (TQByteArray a) -> Ptr CChar -> IO CInt
withQListStringResult :: (Ptr (Ptr (TQString a)) -> IO CInt) -> IO [String]
withQListStringResult f
= do
clen <- f nullPtr
let len = fromCInt clen
if (len <= 0)
then return []
else allocaArray len $ \carr ->
do f carr
arr <- peekArray len carr
mapM stringFromPtr arr
withQListIntResult :: (Ptr CInt -> IO CInt) -> IO [Int]
withQListIntResult f
= do
clen <- f nullPtr
let len = fromCInt clen
if (len <= 0)
then return []
else allocaArray len $ \carr ->
do f carr
xs <- peekArray len carr
return (map fromCInt xs)
withQListLongResult :: (Ptr CLong -> IO CInt) -> IO [Int]
withQListLongResult f
= do
clen <- f nullPtr
let len = fromCInt clen
if (len <= 0)
then return []
else allocaArray len $ \carr ->
do f carr
xs <- peekArray len carr
return (map fromCLong xs)
withQListDouble :: [Double] -> (CInt -> Ptr CDouble -> IO b) -> IO b
withQListDouble xs f
= withArray (map toCDouble xs) $ \carr ->
f (toCInt (length xs)) carr
withQListDoubleResult :: (Ptr CDouble -> IO CInt) -> IO [Double]
withQListDoubleResult f
= do
clen <- f nullPtr
let len = fromCInt clen
if (len <= 0)
then return []
else allocaArray len $ \carr ->
do f carr
xs <- peekArray len carr
return (map fromCDouble xs)
withQListObjectResult :: FunPtr (Ptr a -> IO ()) -> (Ptr (Ptr a) -> IO CInt) -> IO [Object a]
withQListObjectResult ff f
= do
clen <- f nullPtr
let len = fromCInt clen
if (len <= 0)
then return []
else allocaArray len $ \carr ->
do f carr
ps <- peekArray len carr
objectListFromPtrList ff ps
withQListObjectRefResult :: (Ptr (Ptr a) -> IO CInt) -> IO [Object a]
withQListObjectRefResult f
= do
clen <- f nullPtr
let len = fromCInt clen
if (len <= 0)
then return []
else allocaArray len $ \carr ->
do f carr
ps <- peekArray len carr
objectListFromPtrList_nf ps
withPtrPtrObjectResult :: (Ptr (Ptr ()) -> IO CInt) -> IO [Object ()]
withPtrPtrObjectResult f
= do
clen <- f nullPtr
let len = fromCInt clen
if (len <= 0)
then return []
else allocaArray len $ \carr ->
do f carr
ps <- peekArray len carr
objectListFromPtrList_nf ps
withQListString :: [String] -> (CInt -> Ptr CWString -> IO a) -> IO a
withQListString xs f
= withCWStrings xs [] $ \cxs ->
withArray0 ptrNull cxs $ \carr ->
f (toCInt len) carr
where
len = length xs
withCWStrings [] cxs f
= f (reverse cxs)
withCWStrings (x:xs) cxs f
= withCWString x $ \cx ->
withCWStrings xs (cx:cxs) f
withQListObject :: [Object a] -> (CInt -> Ptr (Ptr a) -> IO b) -> IO b
withQListObject xs f
= withArray0 ptrNull (map ptrFromObject xs) $ \carr ->
f (toCInt (length xs)) carr
withPtrPtrObject :: [Object ()] -> (CInt -> Ptr (Ptr ()) -> IO a) -> IO a
withPtrPtrObject xs f
= withArray0 ptrNull (map ptrFromObject xs) $ \carr ->
f (toCInt (length xs)) carr
toCFunPtr :: FunPtr a -> Ptr a
toCFunPtr fptr = castFunPtrToPtr fptr
ptrNull :: Ptr a
ptrNull = nullPtr
ptrIsNull :: Ptr a -> Bool
ptrIsNull p = (p == ptrNull)
ptrCast :: Ptr a -> Ptr b
ptrCast p = castPtr p
fptrNull :: IO (ForeignPtr a)
fptrNull = newForeignPtr_ nullPtr
fptrIsNull :: ForeignPtr a -> Bool
fptrIsNull fp
= ((U.unsafeForeignPtrToPtr fp) == ptrNull)
fptrCast :: ForeignPtr a -> ForeignPtr b
fptrCast p = castForeignPtr p