{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc)
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.Notify.Functions
    (

 -- * Methods
-- ** getAppName #method:getAppName#

    getAppName                              ,


-- ** getServerCaps #method:getServerCaps#

    getServerCaps                           ,


-- ** getServerInfo #method:getServerInfo#

    getServerInfo                           ,


-- ** init #method:init#

    init                                    ,


-- ** isInitted #method:isInitted#

    isInitted                               ,


-- ** setAppName #method:setAppName#

    setAppName                              ,


-- ** uninit #method:uninit#

    uninit                                  ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL


-- function notify_uninit
-- Args : []
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "notify_uninit" notify_uninit ::
    IO ()

{- |
Uninitialized libnotify.

This should be called when the program no longer needs libnotify for
the rest of its lifecycle, typically just before exitting.
-}
uninit ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m ()
uninit  = liftIO $ do
    notify_uninit
    return ()


-- function notify_set_app_name
-- Args : [Arg {argCName = "app_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The name of the application", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "notify_set_app_name" notify_set_app_name ::
    CString ->                              -- app_name : TBasicType TUTF8
    IO ()

{- |
Sets the application name.
-}
setAppName ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    T.Text
    {- ^ /@appName@/: The name of the application -}
    -> m ()
setAppName appName = liftIO $ do
    appName' <- textToCString appName
    notify_set_app_name appName'
    freeMem appName'
    return ()


-- function notify_is_initted
-- Args : []
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "notify_is_initted" notify_is_initted ::
    IO CInt

{- |
Gets whether or not libnotify is initialized.
-}
isInitted ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Bool
    {- ^ __Returns:__ 'True' if libnotify is initialized, or 'False' otherwise. -}
isInitted  = liftIO $ do
    result <- notify_is_initted
    let result' = (/= 0) result
    return result'


-- function notify_init
-- Args : [Arg {argCName = "app_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The name of the application initializing libnotify.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "notify_init" notify_init ::
    CString ->                              -- app_name : TBasicType TUTF8
    IO CInt

{- |
Initialized libnotify. This must be called before any other functions.
-}
init ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    T.Text
    {- ^ /@appName@/: The name of the application initializing libnotify. -}
    -> m Bool
    {- ^ __Returns:__ 'True' if successful, or 'False' on error. -}
init appName = liftIO $ do
    appName' <- textToCString appName
    result <- notify_init appName'
    let result' = (/= 0) result
    freeMem appName'
    return result'


-- function notify_get_server_info
-- Args : [Arg {argCName = "ret_name", argType = TBasicType TUTF8, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a location to store the server name, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "ret_vendor", argType = TBasicType TUTF8, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a location to store the server vendor, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "ret_version", argType = TBasicType TUTF8, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a location to store the server version, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "ret_spec_version", argType = TBasicType TUTF8, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a location to store the version the service is compliant with, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "notify_get_server_info" notify_get_server_info ::
    Ptr CString ->                          -- ret_name : TBasicType TUTF8
    Ptr CString ->                          -- ret_vendor : TBasicType TUTF8
    Ptr CString ->                          -- ret_version : TBasicType TUTF8
    Ptr CString ->                          -- ret_spec_version : TBasicType TUTF8
    IO CInt

{- |
Synchronously queries the server for its information, specifically, the name, vendor,
server version, and the version of the notifications specification that it
is compliant with.
-}
getServerInfo ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m ((Bool, T.Text, T.Text, T.Text, T.Text))
    {- ^ __Returns:__ 'True' if successful, and the variables passed will be set, 'False'
         on error. The returned strings must be freed with g_free -}
getServerInfo  = liftIO $ do
    retName <- allocMem :: IO (Ptr CString)
    retVendor <- allocMem :: IO (Ptr CString)
    retVersion <- allocMem :: IO (Ptr CString)
    retSpecVersion <- allocMem :: IO (Ptr CString)
    result <- notify_get_server_info retName retVendor retVersion retSpecVersion
    let result' = (/= 0) result
    retName' <- peek retName
    retName'' <- cstringToText retName'
    freeMem retName'
    retVendor' <- peek retVendor
    retVendor'' <- cstringToText retVendor'
    freeMem retVendor'
    retVersion' <- peek retVersion
    retVersion'' <- cstringToText retVersion'
    freeMem retVersion'
    retSpecVersion' <- peek retSpecVersion
    retSpecVersion'' <- cstringToText retSpecVersion'
    freeMem retSpecVersion'
    freeMem retName
    freeMem retVendor
    freeMem retVersion
    freeMem retSpecVersion
    return (result', retName'', retVendor'', retVersion'', retSpecVersion'')


-- function notify_get_server_caps
-- Args : []
-- Lengths : []
-- returnType : Just (TGList (TBasicType TUTF8))
-- throws : False
-- Skip return : False

foreign import ccall "notify_get_server_caps" notify_get_server_caps ::
    IO (Ptr (GList CString))

{- |
Synchronously queries the server for its capabilities and returns them in a 'GI.GLib.Structs.List.List'.
-}
getServerCaps ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m [T.Text]
    {- ^ __Returns:__ a 'GI.GLib.Structs.List.List' of server capability strings. Free
  the list elements with 'GI.GLib.Functions.free' and the list itself with @/g_list_free()/@. -}
getServerCaps  = liftIO $ do
    result <- notify_get_server_caps
    result' <- unpackGList result
    result'' <- mapM cstringToText result'
    mapGList freeMem result
    g_list_free result
    return result''


-- function notify_get_app_name
-- Args : []
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "notify_get_app_name" notify_get_app_name ::
    IO CString

{- |
Gets the application name registered.
-}
getAppName ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m T.Text
    {- ^ __Returns:__ The registered application name, passed to 'GI.Notify.Functions.init'. -}
getAppName  = liftIO $ do
    result <- notify_get_app_name
    checkUnexpectedReturnNULL "getAppName" result
    result' <- cstringToText result
    return result'