{-# LINE 1 "System/Libnotify/Server.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "System/Libnotify/Server.hsc" #-}
-- | System.Libnotify.Server module deals with notification server info processing and
-- initialized applications managing.
{-# OPTIONS_HADDOCK prune #-}


{-# LINE 7 "System/Libnotify/Server.hsc" #-}

module System.Libnotify.Server
  ( getAppName, setAppName, getServerCaps, getServerInfo
  ) where

import Foreign
import Foreign.C
import System.Glib.GList

import System.Libnotify.Types (ServerInfo(..))

-- | Returns registered application name.
getAppName :: IO String
getAppName = do
  p_appName <- notify_get_app_name
  peekCString p_appName

foreign import ccall unsafe "libnotify/notify.h notify_get_app_name"
  notify_get_app_name :: IO CString

-- | Updates registered application name.
setAppName :: String -> IO ()
setAppName appName =
  withCString appName $ \p_appName ->
  notify_set_app_name p_appName

foreign import ccall unsafe "libnotify/notify.h notify_set_app_name"
  notify_set_app_name :: CString -> IO ()

-- | Returns server capability strings.
getServerCaps :: IO [String]
getServerCaps = do
  g_type_init
  p_caps <- notify_get_server_caps >>= readGList
  mapM peekCString p_caps

foreign import ccall unsafe "libnotify/notify.h notify_get_server_caps"
  notify_get_server_caps :: IO GList

-- | Returns server information.
getServerInfo :: IO ServerInfo
getServerInfo =
  alloca $ \p_name ->
  alloca $ \p_vendor ->
  alloca $ \p_version ->
  alloca $ \p_specVersion -> do
    g_type_init
    notify_get_server_info p_name p_vendor p_version p_specVersion
    name        <- peekCString =<< peek p_name
    vendor      <- peekCString =<< peek p_vendor
    version     <- peekCString =<< peek p_version
    specVersion <- peekCString =<< peek p_specVersion
    return $ ServerInfo
      { serverName        = name
      , serverVendor      = vendor
      , serverVersion     = version
      , serverSpecVersion = specVersion
      }

foreign import ccall unsafe "libnotify/notify.h notify_get_server_info"
  notify_get_server_info :: (Ptr CString)
                         -> (Ptr CString)
                         -> (Ptr CString)
                         -> (Ptr CString)
                         -> IO Bool

foreign import ccall safe "g_type_init"
  g_type_init :: IO ()