-- | High-level interface to @XenCtrl@. Contains `Xen` monad and provides a safe way
-- to run any `Xen` computation.
module System.Xen.High
    (
    -- * Monad stuff
      XenT
    , Xen
    , runXenT
    -- * Domain
    , domainGetInfo
    -- ** Domain pause
    , domainPause
    , domainUnpause
    -- ** Domain powerstate
    , domainShutdown
    , domainDestroy
    ) where

import System.Xen.High.Internal (XenT, Xen, MonadXen(withXenHandle), runXenT)
import System.Xen.Types (DomainInfo, DomId, DomainShutdownReason)
import qualified System.Xen.Mid as Mid

-- | Returns a lift of domains, this function can fail with
-- 'System.Xen.Errors.InvalidDomainShutdownReason' and
-- 'System.Xen.Errors.DomainGetInfoError'.
domainGetInfo :: MonadXen m => m [DomainInfo]
domainGetInfo = withXenHandle Mid.domainGetInfo

-- | Pause domain. A paused domain still exists in memory
-- however it does not receive any timeslices from the hypervisor.
domainPause :: MonadXen m => DomId -> m Bool
domainPause = withXenHandle . Mid.domainPause

-- | Unpause a domain. The domain should have been previously paused.
domainUnpause :: MonadXen m => DomId -> m Bool
domainUnpause = withXenHandle . Mid.domainUnpause

-- | Shutdown domain. This is intended for use in fully-virtualized domains where
-- this operation is analogous to the sched_op operations in a paravirtualized domain.
domainShutdown :: MonadXen m => DomId -> DomainShutdownReason -> m Bool
domainShutdown domid reason = withXenHandle $ Mid.domainShutdown domid reason

-- | Destroy a domain.  Destroying a domain removes the domain completely from memory.
-- This function should be called after 'domainShutdown' to free up the domain resources.
domainDestroy :: MonadXen m => DomId -> m Bool
domainDestroy = withXenHandle . Mid.domainDestroy