-- GENERATED by C->Haskell Compiler, version 0.28.1 Switcheroo, 1 April 2016 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Graphics/QML/Internal/BindObj.chs" #-}
{-# LANGUAGE
    ForeignFunctionInterface
  #-}

module Graphics.QML.Internal.BindObj where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.ForeignPtr as C2HSImp
import qualified Foreign.Ptr as C2HSImp



import Graphics.QML.Internal.Types
import Graphics.QML.Internal.BindPrim
{-# LINE 8 "src/Graphics/QML/Internal/BindObj.chs" #-}


import Control.Exception (bracket)
import Control.Monad (void)
import Foreign.C.Types
import Foreign.Marshal.Utils (fromBool, toBool)
import Foreign.Ptr
import Foreign.ForeignPtr
import qualified Foreign.ForeignPtr.Unsafe as UnsafeFPtr 
import Foreign.StablePtr



marshalStable :: a -> (Ptr () -> IO b) -> IO b
marshalStable obj f = do
  sPtr <- newStablePtr obj
  res <- f $ castStablePtrToPtr sPtr
  return res

fromStable :: Ptr () -> IO a
fromStable =
  deRefStablePtr . castPtrToStablePtr

hsqmlGetNextClassId :: IO ((CInt))
hsqmlGetNextClassId =
  hsqmlGetNextClassId'_ >>= \res ->
  let {res' = id res} in
  return (res')

{-# LINE 33 "src/Graphics/QML/Internal/BindObj.chs" #-}


foreign import ccall "wrapper"  
  marshalFunc :: UniformFunc -> IO (FunPtr UniformFunc)

newtype HsQMLClassHandle = HsQMLClassHandle (C2HSImp.ForeignPtr (HsQMLClassHandle))
withHsQMLClassHandle :: HsQMLClassHandle -> (C2HSImp.Ptr HsQMLClassHandle -> IO b) -> IO b
withHsQMLClassHandle (HsQMLClassHandle fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 38 "src/Graphics/QML/Internal/BindObj.chs" #-}


foreign import ccall "hsqml.h &hsqml_finalise_class_handle"
  hsqmlFinaliseClassHandlePtr :: FunPtr (Ptr (HsQMLClassHandle) -> IO ())

newClassHandle :: Ptr HsQMLClassHandle -> IO (Maybe HsQMLClassHandle)
newClassHandle p =
  if nullPtr == p
    then return Nothing
    else do
      fp <- newForeignPtr hsqmlFinaliseClassHandlePtr p
      return $ Just $ HsQMLClassHandle fp

hsqmlCreateClass :: (Ptr CUInt) -> (Ptr CUInt) -> (Ptr CChar) -> (ClassInfo) -> (Ptr (FunPtr UniformFunc)) -> (Ptr (FunPtr UniformFunc)) -> IO ((Maybe HsQMLClassHandle))
hsqmlCreateClass a1 a2 a3 a4 a5 a6 =
  let {a1' = id a1} in 
  let {a2' = id a2} in 
  let {a3' = id a3} in 
  marshalStable a4 $ \a4' -> 
  let {a5' = id a5} in 
  let {a6' = id a6} in 
  hsqmlCreateClass'_ a1' a2' a3' a4' a5' a6' >>= \res ->
  newClassHandle res >>= \res' ->
  return (res')

{-# LINE 58 "src/Graphics/QML/Internal/BindObj.chs" #-}


withMaybeHsQMLObjectHandle ::
    Maybe HsQMLObjectHandle -> (Ptr HsQMLObjectHandle -> IO b) -> IO b
withMaybeHsQMLObjectHandle (Just (HsQMLObjectHandle fp)) = withForeignPtr fp
withMaybeHsQMLObjectHandle Nothing = \f -> f nullPtr

newtype HsQMLObjectHandle = HsQMLObjectHandle (C2HSImp.ForeignPtr (HsQMLObjectHandle))
withHsQMLObjectHandle :: HsQMLObjectHandle -> (C2HSImp.Ptr HsQMLObjectHandle -> IO b) -> IO b
withHsQMLObjectHandle (HsQMLObjectHandle fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 65 "src/Graphics/QML/Internal/BindObj.chs" #-}


foreign import ccall "hsqml.h &hsqml_finalise_object_handle"
  hsqmlFinaliseObjectHandlePtr :: FunPtr (Ptr (HsQMLObjectHandle) -> IO ())

foreign import ccall "hsqml.h &hsqml_finalise_object_weak_handle"
  hsqmlFinaliseObjectWeakHandlePtr :: FunPtr (Ptr (HsQMLObjectHandle) -> IO ())

newObjectHandle :: Ptr HsQMLObjectHandle -> IO HsQMLObjectHandle
newObjectHandle p = do
  fp <- newForeignPtr hsqmlFinaliseObjectHandlePtr p
  return $ HsQMLObjectHandle fp

isNullObjectHandle :: HsQMLObjectHandle -> Bool
isNullObjectHandle (HsQMLObjectHandle fp) =
  nullPtr == UnsafeFPtr.unsafeForeignPtrToPtr fp

hsqmlCreateObject :: (a) -> (HsQMLClassHandle) -> IO ((HsQMLObjectHandle))
hsqmlCreateObject a1 a2 =
  marshalStable a1 $ \a1' -> 
  withHsQMLClassHandle a2 $ \a2' -> 
  hsqmlCreateObject'_ a1' a2' >>= \res ->
  newObjectHandle res >>= \res' ->
  return (res')

{-# LINE 85 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlObjectSetActive :: (Maybe HsQMLObjectHandle) -> IO ((Bool))
hsqmlObjectSetActive a1 =
  withMaybeHsQMLObjectHandle a1 $ \a1' -> 
  hsqmlObjectSetActive'_ a1' >>= \res ->
  let {res' = toBool res} in
  return (res')

{-# LINE 89 "src/Graphics/QML/Internal/BindObj.chs" #-}


withActiveObject :: HsQMLObjectHandle -> IO () -> IO ()
withActiveObject hndl action =
    bracket
        (hsqmlObjectSetActive $ Just hndl)
        (\ok -> if ok then void $ hsqmlObjectSetActive Nothing else return ())
        (\ok -> if ok then action else return ())

hsqmlObjectGetHsTyperep :: (HsQMLObjectHandle) -> IO ((ClassInfo))
hsqmlObjectGetHsTyperep a1 =
  withHsQMLObjectHandle a1 $ \a1' -> 
  hsqmlObjectGetHsTyperep'_ a1' >>= \res ->
  fromStable res >>= \res' ->
  return (res')

{-# LINE 100 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlObjectGetHsValue :: (HsQMLObjectHandle) -> IO ((a))
hsqmlObjectGetHsValue a1 =
  withHsQMLObjectHandle a1 $ \a1' -> 
  hsqmlObjectGetHsValue'_ a1' >>= \res ->
  fromStable res >>= \res' ->
  return (res')

{-# LINE 104 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlObjectGetPointer :: (HsQMLObjectHandle) -> IO ((Ptr ()))
hsqmlObjectGetPointer a1 =
  withHsQMLObjectHandle a1 $ \a1' -> 
  hsqmlObjectGetPointer'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')

{-# LINE 108 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlObjectGetJval :: (HsQMLObjectHandle) -> IO ((HsQMLJValHandle))
hsqmlObjectGetJval a1 =
  withHsQMLObjectHandle a1 $ \a1' -> 
  hsqmlObjectGetJval'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')

{-# LINE 112 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlGetObjectFromPointer :: (Ptr ()) -> IO ((HsQMLObjectHandle))
hsqmlGetObjectFromPointer a1 =
  let {a1' = id a1} in 
  hsqmlGetObjectFromPointer'_ a1' >>= \res ->
  newObjectHandle res >>= \res' ->
  return (res')

{-# LINE 116 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlGetObjectFromJval :: (HsQMLJValHandle) -> IO ((HsQMLObjectHandle))
hsqmlGetObjectFromJval a1 =
  let {a1' = id a1} in 
  hsqmlGetObjectFromJval'_ a1' >>= \res ->
  newObjectHandle res >>= \res' ->
  return (res')

{-# LINE 120 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlObjectReferenceHandle :: (Ptr HsQMLObjectHandle) -> (Bool) -> IO ()
hsqmlObjectReferenceHandle a1 a2 =
  let {a1' = id a1} in 
  let {a2' = fromBool a2} in 
  hsqmlObjectReferenceHandle'_ a1' a2' >>
  return ()

{-# LINE 125 "src/Graphics/QML/Internal/BindObj.chs" #-}


copyObjectHandle :: HsQMLObjectHandle -> Bool -> IO HsQMLObjectHandle
copyObjectHandle (HsQMLObjectHandle fp) weak = do
    withForeignPtr fp $ \p -> do
        hsqmlObjectReferenceHandle p weak
        fp' <- newForeignPtr final p
        return $ HsQMLObjectHandle fp'
    where final = if weak
                  then hsqmlFinaliseObjectWeakHandlePtr
                  else hsqmlFinaliseObjectHandlePtr

hsqmlFireSignal :: (HsQMLObjectHandle) -> (Int) -> (Ptr (Ptr ())) -> IO ()
hsqmlFireSignal a1 a2 a3 =
  withHsQMLObjectHandle a1 $ \a1' -> 
  let {a2' = fromIntegral a2} in 
  let {a3' = id a3} in 
  hsqmlFireSignal'_ a1' a2' a3' >>
  return ()

{-# LINE 141 "src/Graphics/QML/Internal/BindObj.chs" #-}


newtype HsQMLObjFinaliserHandle = HsQMLObjFinaliserHandle (C2HSImp.ForeignPtr (HsQMLObjFinaliserHandle))
withHsQMLObjFinaliserHandle :: HsQMLObjFinaliserHandle -> (C2HSImp.Ptr HsQMLObjFinaliserHandle -> IO b) -> IO b
withHsQMLObjFinaliserHandle (HsQMLObjFinaliserHandle fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 143 "src/Graphics/QML/Internal/BindObj.chs" #-}


foreign import ccall "hsqml.h &hsqml_finalise_obj_finaliser"
  hsqmlFinaliseObjFinaliserPtr :: FunPtr (Ptr HsQMLObjFinaliserHandle -> IO ())

type ObjFinaliserFunc = Ptr HsQMLObjectHandle -> IO ()

foreign import ccall "wrapper"  
  marshalObjFinaliser :: ObjFinaliserFunc -> IO (FunPtr ObjFinaliserFunc)

newObjFinaliserHandle ::
    Ptr HsQMLObjFinaliserHandle -> IO HsQMLObjFinaliserHandle
newObjFinaliserHandle p = do
    fp <- newForeignPtr hsqmlFinaliseObjFinaliserPtr p
    return $ HsQMLObjFinaliserHandle fp

hsqmlCreateObjFinaliser :: (FunPtr ObjFinaliserFunc) -> IO ((HsQMLObjFinaliserHandle))
hsqmlCreateObjFinaliser a1 =
  let {a1' = id a1} in 
  hsqmlCreateObjFinaliser'_ a1' >>= \res ->
  newObjFinaliserHandle res >>= \res' ->
  return (res')

{-# LINE 161 "src/Graphics/QML/Internal/BindObj.chs" #-}


hsqmlObjectAddFinaliser :: (HsQMLObjectHandle) -> (HsQMLObjFinaliserHandle) -> IO ()
hsqmlObjectAddFinaliser a1 a2 =
  withHsQMLObjectHandle a1 $ \a1' -> 
  withHsQMLObjFinaliserHandle a2 $ \a2' -> 
  hsqmlObjectAddFinaliser'_ a1' a2' >>
  return ()

{-# LINE 166 "src/Graphics/QML/Internal/BindObj.chs" #-}



foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_get_next_class_id"
  hsqmlGetNextClassId'_ :: (IO C2HSImp.CInt)

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_create_class"
  hsqmlCreateClass'_ :: ((C2HSImp.Ptr C2HSImp.CUInt) -> ((C2HSImp.Ptr C2HSImp.CUInt) -> ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO ()))))) -> ((C2HSImp.Ptr (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO ()))))) -> (IO (C2HSImp.Ptr (HsQMLClassHandle)))))))))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_create_object"
  hsqmlCreateObject'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (HsQMLClassHandle)) -> (IO (C2HSImp.Ptr (HsQMLObjectHandle)))))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_object_set_active"
  hsqmlObjectSetActive'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (IO C2HSImp.CInt))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_object_get_hs_typerep"
  hsqmlObjectGetHsTyperep'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (IO (C2HSImp.Ptr ())))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_object_get_hs_value"
  hsqmlObjectGetHsValue'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (IO (C2HSImp.Ptr ())))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_object_get_pointer"
  hsqmlObjectGetPointer'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (IO (C2HSImp.Ptr ())))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_object_get_jval"
  hsqmlObjectGetJval'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (IO (HsQMLJValHandle)))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_get_object_from_pointer"
  hsqmlGetObjectFromPointer'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr (HsQMLObjectHandle))))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_get_object_from_jval"
  hsqmlGetObjectFromJval'_ :: ((HsQMLJValHandle) -> (IO (C2HSImp.Ptr (HsQMLObjectHandle))))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_object_reference_handle"
  hsqmlObjectReferenceHandle'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (C2HSImp.CInt -> (IO ())))

foreign import ccall safe "Graphics/QML/Internal/BindObj.chs.h hsqml_fire_signal"
  hsqmlFireSignal'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (C2HSImp.CInt -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO ()))))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_create_obj_finaliser"
  hsqmlCreateObjFinaliser'_ :: ((C2HSImp.FunPtr ((C2HSImp.Ptr (HsQMLObjectHandle)) -> (IO ()))) -> (IO (C2HSImp.Ptr (HsQMLObjFinaliserHandle))))

foreign import ccall unsafe "Graphics/QML/Internal/BindObj.chs.h hsqml_object_add_finaliser"
  hsqmlObjectAddFinaliser'_ :: ((C2HSImp.Ptr (HsQMLObjectHandle)) -> ((C2HSImp.Ptr (HsQMLObjFinaliserHandle)) -> (IO ())))