{-# LANGUAGE ForeignFunctionInterface #-}
module Android.Log
   ( AndroidLogPriority(..)
   , androidLogPrint
   , android_log_print
   )
  where

import Control.Applicative ((<$>))
import Foreign.C.Types (CInt(..))
import Foreign.C.String
import Foreign.Marshal.Alloc

-- extern int __android_log_print(int prio, const char *tag, const char *fmt, ...);
foreign import ccall "__android_log_print" android_log_print :: CInt -> CString -> CString -> IO CInt

androidLogPrint :: AndroidLogPriority -> String -> String -> IO Int
androidLogPrint prio tag msg = do
  -- Priority
  let v = prioToCInt prio
  -- Create new strings
  tagStr <- newCString tag
  msgStr <- newCString msg

  -- Print to locat
  res <- fromIntegral <$> android_log_print v tagStr msgStr
  res `seq` return ()

  -- Free strings
  free tagStr
  free msgStr

  return res

data AndroidLogPriority =
    AndroidLogPrioAssert
  | AndroidLogPrioError
  | AndroidLogPrioWarn
  | AndroidLogPrioInfo
  | AndroidLogPrioDebug
  | AndroidLogPrioVerbose

prioToCInt :: AndroidLogPriority -> CInt
prioToCInt AndroidLogPrioAssert  = 7
prioToCInt AndroidLogPrioError   = 6
prioToCInt AndroidLogPrioWarn    = 5
prioToCInt AndroidLogPrioInfo    = 4
prioToCInt AndroidLogPrioDebug   = 3
prioToCInt AndroidLogPrioVerbose = 2