module Network.XMMS.Utilities where
import Foreign
import Foreign.Ptr
import Foreign.C.Types
import Foreign.C.String
import Foreign.ForeignPtr
import Foreign.Marshal.Alloc
import Network.XMMS.Constants
import Network.XMMS.Types
safePeekCString cstring = if cstring == nullPtr
then return ""
else peekCString cstring
withString :: String -> (CString -> IO (a)) -> IO (a)
withString s action |s == "" = action nullPtr
|otherwise = do
c_s <- newCString s
res <- action c_s
free c_s
return res
wrapCallResult :: (Ptr C_xmmsc_connection -> IO (Ptr C_xmmsc_result)) -> (Connection -> IO Result)
wrapCallResult c_function =
flip withForeignPtr
( \ptrCon -> do
result <- c_function ptrCon
newForeignPtr xmmsc_result_unref result)
foreign import ccall "xmmsclient/xmmsclient.h &xmmsc_result_unref"
xmmsc_result_unref :: FunPtr (Ptr C_xmmsc_result -> IO ())
foreign import ccall "xmmsclient/xmmsclient.h xmmsc_result_ref"
xmmsc_result_ref :: Ptr C_xmmsc_result -> IO ()
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_ref"
xmmsc_ref :: Ptr C_xmmsc_connection -> IO (Ptr C_xmmsc_connection)
foreign import ccall "xmmsclient/xmmsclient.h &xmmsc_unref"
xmmsc_unref :: FunPtr (Ptr C_xmmsc_connection -> IO ())