-- GENERATED by C->Haskell Compiler, version 0.16.4 Crystal Seed, 24 Jan 2009 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "./System/LibVirt/Errors.chs" #-}{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables, StandaloneDeriving, DeriveDataTypeable #-}


{-# LINE 3 "./System/LibVirt/Errors.chs" #-}


module System.LibVirt.Errors
  (Error (..), ErrorLevel (..),
   ErrorDomain (..), ErrorNumber (..),
   catchVirtError,
   exceptionOnMinusOne,
   ptrToConnection, ptrToDomain, ptrToNetwork,
   connectionToPtr, domainToPtr, networkToPtr)
  where

import qualified Control.Exception as E
import Data.Generics
import Foreign
import Foreign.C.Types
import Foreign.C.String

import System.LibVirt.Internal
{-# LINE 22 "./System/LibVirt/Errors.chs" #-}

data ErrorLevel = ErrNone
                | ErrWarning
                | ErrError
                deriving (Eq,Show)
instance Enum ErrorLevel where
  fromEnum ErrNone = 0
  fromEnum ErrWarning = 1
  fromEnum ErrError = 2

  toEnum 0 = ErrNone
  toEnum 1 = ErrWarning
  toEnum 2 = ErrError
  toEnum unmatched = error ("ErrorLevel.toEnum: Cannot match " ++ show unmatched)

{-# LINE 24 "./System/LibVirt/Errors.chs" #-}
deriving instance Data ErrorLevel
deriving instance Typeable ErrorLevel

data ErrorDomain = FromNone
                 | FromXen
                 | FromXend
                 | FromXenstore
                 | FromSexpr
                 | FromXml
                 | FromDom
                 | FromRpc
                 | FromProxy
                 | FromConf
                 | FromQemu
                 | FromNet
                 | FromTest
                 | FromRemote
                 | FromOpenvz
                 | FromXenxm
                 | FromStatsLinux
                 | FromLxc
                 | FromStorage
                 | FromNetwork
                 | FromDomain
                 | FromUml
                 | FromNodedev
                 | FromXenInotify
                 | FromSecurity
                 | FromVbox
                 | FromInterface
                 | FromOne
                 | FromEsx
                 | FromPhyp
                 | FromSecret
                 | FromCpu
                 | FromXenapi
                 | FromNwfilter
                 | FromHook
                 | FromDomainSnapshot
                 | FromAudit
                 | FromSysinfo
                 | FromStreams
                 | FromVmware
                 | FromEvent
                 | FromLibxl
                 | FromLocking
                 | FromHyperv
                 | FromCapabilities
                 | FromUri
                 | FromAuth
                 | FromDbus
                 deriving (Eq,Show)
instance Enum ErrorDomain where
  fromEnum FromNone = 0
  fromEnum FromXen = 1
  fromEnum FromXend = 2
  fromEnum FromXenstore = 3
  fromEnum FromSexpr = 4
  fromEnum FromXml = 5
  fromEnum FromDom = 6
  fromEnum FromRpc = 7
  fromEnum FromProxy = 8
  fromEnum FromConf = 9
  fromEnum FromQemu = 10
  fromEnum FromNet = 11
  fromEnum FromTest = 12
  fromEnum FromRemote = 13
  fromEnum FromOpenvz = 14
  fromEnum FromXenxm = 15
  fromEnum FromStatsLinux = 16
  fromEnum FromLxc = 17
  fromEnum FromStorage = 18
  fromEnum FromNetwork = 19
  fromEnum FromDomain = 20
  fromEnum FromUml = 21
  fromEnum FromNodedev = 22
  fromEnum FromXenInotify = 23
  fromEnum FromSecurity = 24
  fromEnum FromVbox = 25
  fromEnum FromInterface = 26
  fromEnum FromOne = 27
  fromEnum FromEsx = 28
  fromEnum FromPhyp = 29
  fromEnum FromSecret = 30
  fromEnum FromCpu = 31
  fromEnum FromXenapi = 32
  fromEnum FromNwfilter = 33
  fromEnum FromHook = 34
  fromEnum FromDomainSnapshot = 35
  fromEnum FromAudit = 36
  fromEnum FromSysinfo = 37
  fromEnum FromStreams = 38
  fromEnum FromVmware = 39
  fromEnum FromEvent = 40
  fromEnum FromLibxl = 41
  fromEnum FromLocking = 42
  fromEnum FromHyperv = 43
  fromEnum FromCapabilities = 44
  fromEnum FromUri = 45
  fromEnum FromAuth = 46
  fromEnum FromDbus = 47

  toEnum 0 = FromNone
  toEnum 1 = FromXen
  toEnum 2 = FromXend
  toEnum 3 = FromXenstore
  toEnum 4 = FromSexpr
  toEnum 5 = FromXml
  toEnum 6 = FromDom
  toEnum 7 = FromRpc
  toEnum 8 = FromProxy
  toEnum 9 = FromConf
  toEnum 10 = FromQemu
  toEnum 11 = FromNet
  toEnum 12 = FromTest
  toEnum 13 = FromRemote
  toEnum 14 = FromOpenvz
  toEnum 15 = FromXenxm
  toEnum 16 = FromStatsLinux
  toEnum 17 = FromLxc
  toEnum 18 = FromStorage
  toEnum 19 = FromNetwork
  toEnum 20 = FromDomain
  toEnum 21 = FromUml
  toEnum 22 = FromNodedev
  toEnum 23 = FromXenInotify
  toEnum 24 = FromSecurity
  toEnum 25 = FromVbox
  toEnum 26 = FromInterface
  toEnum 27 = FromOne
  toEnum 28 = FromEsx
  toEnum 29 = FromPhyp
  toEnum 30 = FromSecret
  toEnum 31 = FromCpu
  toEnum 32 = FromXenapi
  toEnum 33 = FromNwfilter
  toEnum 34 = FromHook
  toEnum 35 = FromDomainSnapshot
  toEnum 36 = FromAudit
  toEnum 37 = FromSysinfo
  toEnum 38 = FromStreams
  toEnum 39 = FromVmware
  toEnum 40 = FromEvent
  toEnum 41 = FromLibxl
  toEnum 42 = FromLocking
  toEnum 43 = FromHyperv
  toEnum 44 = FromCapabilities
  toEnum 45 = FromUri
  toEnum 46 = FromAuth
  toEnum 47 = FromDbus
  toEnum unmatched = error ("ErrorDomain.toEnum: Cannot match " ++ show unmatched)

{-# LINE 28 "./System/LibVirt/Errors.chs" #-}
deriving instance Data ErrorDomain
deriving instance Typeable ErrorDomain

data Error = Error {
  veCode :: ErrorNumber,
  veDomain :: ErrorDomain,
  veMessage :: String,
  veLevel :: ErrorLevel,
  veConnect :: Connection,
  veDom :: Domain,
  veStr1 :: Maybe String,
  veStr2 :: Maybe String,
  veStr3 :: Maybe String,
  veInt1 :: Int,
  veInt2 :: Int,
  veNet :: Network }
  deriving (Eq, Show, Data, Typeable)

instance E.Exception Error

type VirtErrorPtr = Ptr (Error)
{-# LINE 49 "./System/LibVirt/Errors.chs" #-}

data ErrorNumber = ErrOk
                 | ErrInternalError
                 | ErrNoMemory
                 | ErrNoSupport
                 | ErrUnknownHost
                 | ErrNoConnect
                 | ErrInvalidConn
                 | ErrInvalidDomain
                 | ErrInvalidArg
                 | ErrOperationFailed
                 | ErrGetFailed
                 | ErrPostFailed
                 | ErrHttpError
                 | ErrSexprSerial
                 | ErrNoXen
                 | ErrXenCall
                 | ErrOsType
                 | ErrNoKernel
                 | ErrNoRoot
                 | ErrNoSource
                 | ErrNoTarget
                 | ErrNoName
                 | ErrNoOs
                 | ErrNoDevice
                 | ErrNoXenstore
                 | ErrDriverFull
                 | ErrCallFailed
                 | ErrXmlError
                 | ErrDomExist
                 | ErrOperationDenied
                 | ErrOpenFailed
                 | ErrReadFailed
                 | ErrParseFailed
                 | ErrConfSyntax
                 | ErrWriteFailed
                 | ErrXmlDetail
                 | ErrInvalidNetwork
                 | ErrNetworkExist
                 | ErrSystemError
                 | ErrRpc
                 | ErrGnutlsError
                 | WarNoNetwork
                 | ErrNoDomain
                 | ErrNoNetwork
                 | ErrInvalidMac
                 | ErrAuthFailed
                 | ErrInvalidStoragePool
                 | ErrInvalidStorageVol
                 | WarNoStorage
                 | ErrNoStoragePool
                 | ErrNoStorageVol
                 | WarNoNode
                 | ErrInvalidNodeDevice
                 | ErrNoNodeDevice
                 | ErrNoSecurityModel
                 | ErrOperationInvalid
                 | WarNoInterface
                 | ErrNoInterface
                 | ErrInvalidInterface
                 | ErrMultipleInterfaces
                 | WarNoNwfilter
                 | ErrInvalidNwfilter
                 | ErrNoNwfilter
                 | ErrBuildFirewall
                 | WarNoSecret
                 | ErrInvalidSecret
                 | ErrNoSecret
                 | ErrConfigUnsupported
                 | ErrOperationTimeout
                 | ErrMigratePersistFailed
                 | ErrHookScriptFailed
                 | ErrInvalidDomainSnapshot
                 | ErrNoDomainSnapshot
                 | ErrInvalidStream
                 | ErrArgumentUnsupported
                 | ErrStorageProbeFailed
                 | ErrStoragePoolBuilt
                 | ErrSnapshotRevertRisky
                 | ErrOperationAborted
                 | ErrAuthCancelled
                 | ErrNoDomainMetadata
                 | ErrMigrateUnsafe
                 | ErrOverflow
                 | ErrBlockCopyActive
                 deriving (Eq,Show)
instance Enum ErrorNumber where
  fromEnum ErrOk = 0
  fromEnum ErrInternalError = 1
  fromEnum ErrNoMemory = 2
  fromEnum ErrNoSupport = 3
  fromEnum ErrUnknownHost = 4
  fromEnum ErrNoConnect = 5
  fromEnum ErrInvalidConn = 6
  fromEnum ErrInvalidDomain = 7
  fromEnum ErrInvalidArg = 8
  fromEnum ErrOperationFailed = 9
  fromEnum ErrGetFailed = 10
  fromEnum ErrPostFailed = 11
  fromEnum ErrHttpError = 12
  fromEnum ErrSexprSerial = 13
  fromEnum ErrNoXen = 14
  fromEnum ErrXenCall = 15
  fromEnum ErrOsType = 16
  fromEnum ErrNoKernel = 17
  fromEnum ErrNoRoot = 18
  fromEnum ErrNoSource = 19
  fromEnum ErrNoTarget = 20
  fromEnum ErrNoName = 21
  fromEnum ErrNoOs = 22
  fromEnum ErrNoDevice = 23
  fromEnum ErrNoXenstore = 24
  fromEnum ErrDriverFull = 25
  fromEnum ErrCallFailed = 26
  fromEnum ErrXmlError = 27
  fromEnum ErrDomExist = 28
  fromEnum ErrOperationDenied = 29
  fromEnum ErrOpenFailed = 30
  fromEnum ErrReadFailed = 31
  fromEnum ErrParseFailed = 32
  fromEnum ErrConfSyntax = 33
  fromEnum ErrWriteFailed = 34
  fromEnum ErrXmlDetail = 35
  fromEnum ErrInvalidNetwork = 36
  fromEnum ErrNetworkExist = 37
  fromEnum ErrSystemError = 38
  fromEnum ErrRpc = 39
  fromEnum ErrGnutlsError = 40
  fromEnum WarNoNetwork = 41
  fromEnum ErrNoDomain = 42
  fromEnum ErrNoNetwork = 43
  fromEnum ErrInvalidMac = 44
  fromEnum ErrAuthFailed = 45
  fromEnum ErrInvalidStoragePool = 46
  fromEnum ErrInvalidStorageVol = 47
  fromEnum WarNoStorage = 48
  fromEnum ErrNoStoragePool = 49
  fromEnum ErrNoStorageVol = 50
  fromEnum WarNoNode = 51
  fromEnum ErrInvalidNodeDevice = 52
  fromEnum ErrNoNodeDevice = 53
  fromEnum ErrNoSecurityModel = 54
  fromEnum ErrOperationInvalid = 55
  fromEnum WarNoInterface = 56
  fromEnum ErrNoInterface = 57
  fromEnum ErrInvalidInterface = 58
  fromEnum ErrMultipleInterfaces = 59
  fromEnum WarNoNwfilter = 60
  fromEnum ErrInvalidNwfilter = 61
  fromEnum ErrNoNwfilter = 62
  fromEnum ErrBuildFirewall = 63
  fromEnum WarNoSecret = 64
  fromEnum ErrInvalidSecret = 65
  fromEnum ErrNoSecret = 66
  fromEnum ErrConfigUnsupported = 67
  fromEnum ErrOperationTimeout = 68
  fromEnum ErrMigratePersistFailed = 69
  fromEnum ErrHookScriptFailed = 70
  fromEnum ErrInvalidDomainSnapshot = 71
  fromEnum ErrNoDomainSnapshot = 72
  fromEnum ErrInvalidStream = 73
  fromEnum ErrArgumentUnsupported = 74
  fromEnum ErrStorageProbeFailed = 75
  fromEnum ErrStoragePoolBuilt = 76
  fromEnum ErrSnapshotRevertRisky = 77
  fromEnum ErrOperationAborted = 78
  fromEnum ErrAuthCancelled = 79
  fromEnum ErrNoDomainMetadata = 80
  fromEnum ErrMigrateUnsafe = 81
  fromEnum ErrOverflow = 82
  fromEnum ErrBlockCopyActive = 83

  toEnum 0 = ErrOk
  toEnum 1 = ErrInternalError
  toEnum 2 = ErrNoMemory
  toEnum 3 = ErrNoSupport
  toEnum 4 = ErrUnknownHost
  toEnum 5 = ErrNoConnect
  toEnum 6 = ErrInvalidConn
  toEnum 7 = ErrInvalidDomain
  toEnum 8 = ErrInvalidArg
  toEnum 9 = ErrOperationFailed
  toEnum 10 = ErrGetFailed
  toEnum 11 = ErrPostFailed
  toEnum 12 = ErrHttpError
  toEnum 13 = ErrSexprSerial
  toEnum 14 = ErrNoXen
  toEnum 15 = ErrXenCall
  toEnum 16 = ErrOsType
  toEnum 17 = ErrNoKernel
  toEnum 18 = ErrNoRoot
  toEnum 19 = ErrNoSource
  toEnum 20 = ErrNoTarget
  toEnum 21 = ErrNoName
  toEnum 22 = ErrNoOs
  toEnum 23 = ErrNoDevice
  toEnum 24 = ErrNoXenstore
  toEnum 25 = ErrDriverFull
  toEnum 26 = ErrCallFailed
  toEnum 27 = ErrXmlError
  toEnum 28 = ErrDomExist
  toEnum 29 = ErrOperationDenied
  toEnum 30 = ErrOpenFailed
  toEnum 31 = ErrReadFailed
  toEnum 32 = ErrParseFailed
  toEnum 33 = ErrConfSyntax
  toEnum 34 = ErrWriteFailed
  toEnum 35 = ErrXmlDetail
  toEnum 36 = ErrInvalidNetwork
  toEnum 37 = ErrNetworkExist
  toEnum 38 = ErrSystemError
  toEnum 39 = ErrRpc
  toEnum 40 = ErrGnutlsError
  toEnum 41 = WarNoNetwork
  toEnum 42 = ErrNoDomain
  toEnum 43 = ErrNoNetwork
  toEnum 44 = ErrInvalidMac
  toEnum 45 = ErrAuthFailed
  toEnum 46 = ErrInvalidStoragePool
  toEnum 47 = ErrInvalidStorageVol
  toEnum 48 = WarNoStorage
  toEnum 49 = ErrNoStoragePool
  toEnum 50 = ErrNoStorageVol
  toEnum 51 = WarNoNode
  toEnum 52 = ErrInvalidNodeDevice
  toEnum 53 = ErrNoNodeDevice
  toEnum 54 = ErrNoSecurityModel
  toEnum 55 = ErrOperationInvalid
  toEnum 56 = WarNoInterface
  toEnum 57 = ErrNoInterface
  toEnum 58 = ErrInvalidInterface
  toEnum 59 = ErrMultipleInterfaces
  toEnum 60 = WarNoNwfilter
  toEnum 61 = ErrInvalidNwfilter
  toEnum 62 = ErrNoNwfilter
  toEnum 63 = ErrBuildFirewall
  toEnum 64 = WarNoSecret
  toEnum 65 = ErrInvalidSecret
  toEnum 66 = ErrNoSecret
  toEnum 67 = ErrConfigUnsupported
  toEnum 68 = ErrOperationTimeout
  toEnum 69 = ErrMigratePersistFailed
  toEnum 70 = ErrHookScriptFailed
  toEnum 71 = ErrInvalidDomainSnapshot
  toEnum 72 = ErrNoDomainSnapshot
  toEnum 73 = ErrInvalidStream
  toEnum 74 = ErrArgumentUnsupported
  toEnum 75 = ErrStorageProbeFailed
  toEnum 76 = ErrStoragePoolBuilt
  toEnum 77 = ErrSnapshotRevertRisky
  toEnum 78 = ErrOperationAborted
  toEnum 79 = ErrAuthCancelled
  toEnum 80 = ErrNoDomainMetadata
  toEnum 81 = ErrMigrateUnsafe
  toEnum 82 = ErrOverflow
  toEnum 83 = ErrBlockCopyActive
  toEnum unmatched = error ("ErrorNumber.toEnum: Cannot match " ++ show unmatched)

{-# LINE 51 "./System/LibVirt/Errors.chs" #-}

deriving instance Data ErrorNumber
deriving instance Typeable ErrorNumber

data UnknownError = UnknownError
  deriving (Eq, Show, Data, Typeable)

instance E.Exception UnknownError

peekCString' :: CString -> IO (Maybe String)
peekCString' ptr
  | ptr == nullPtr = return Nothing
  | otherwise = Just `fmap` peekCString ptr

convertError :: Ptr () -> IO (Maybe Error)
convertError ptr
  | ptr == nullPtr = return Nothing
  | otherwise = do
  let err = castPtr ptr :: VirtErrorPtr
  code <- (\ptr -> do {peekByteOff ptr 0 ::IO CInt}) err
  domain <- (\ptr -> do {peekByteOff ptr 4 ::IO CInt}) err
  message <- peekCString =<< (\ptr -> do {peekByteOff ptr 8 ::IO (Ptr CChar)}) err
  level <- (\ptr -> do {peekByteOff ptr 12 ::IO CInt}) err
  conn <- ptrToConnection' =<< (\ptr -> do {peekByteOff ptr 16 ::IO (Ptr ())}) err
  dom  <- ptrToDomain' =<< (\ptr -> do {peekByteOff ptr 20 ::IO (Ptr ())}) err
  str1 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 24 ::IO (Ptr CChar)}) err
  str2 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 28 ::IO (Ptr CChar)}) err
  str3 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 32 ::IO (Ptr CChar)}) err
  int1 <- (\ptr -> do {peekByteOff ptr 36 ::IO CInt}) err
  int2 <- (\ptr -> do {peekByteOff ptr 40 ::IO CInt}) err
  net  <- ptrToNetwork' =<< (\ptr -> do {peekByteOff ptr 44 ::IO (Ptr ())}) err
  return $ Just $ Error {
             veCode = toEnum $ fromIntegral code,
             veDomain = toEnum $ fromIntegral domain,
             veMessage = message,
             veLevel = toEnum $ fromIntegral level,
             veConnect = conn,
             veDom = dom,
             veStr1 = str1,
             veStr2 = str2,
             veStr3 = str3,
             veInt1 = fromIntegral int1,
             veInt2 = fromIntegral int2,
             veNet = net }

getLastError :: IO (Maybe Error)
getLastError =
  getLastError'_ >>= \res ->
  convertError res >>= \res' ->
  return (res')
{-# LINE 97 "./System/LibVirt/Errors.chs" #-}

catchVirtError :: IO a -> (Error -> IO b) -> IO (Either b a)
catchVirtError m f = do
  (Right `fmap` m) `E.catch` (\e -> Left `fmap` f e)

exceptionOnMinusOne :: CInt -> IO Int
exceptionOnMinusOne x = do
  if x == -1
    then handleError' (fromIntegral x)
    else return (fromIntegral x)

handleError :: IO a
handleError = do
    merr <- getLastError
    case merr of
      Just err -> E.throw err
      Nothing  -> E.throw UnknownError

handleError' :: a -> IO a
handleError' x = do
    merr <- getLastError
    case merr of
      Just err -> E.throw err
      Nothing  -> return x

ptrToConnection :: Ptr () -> IO Connection
ptrToConnection ptr
  | ptr == nullPtr = handleError
  | otherwise      = return $ Connection (castPtr ptr)

ptrToConnection' :: Ptr () -> IO Connection
ptrToConnection' ptr = return $ Connection (castPtr ptr)

connectionToPtr :: Connection -> Ptr ()
connectionToPtr (Connection ptr) = castPtr ptr

ptrToDomain :: Ptr () -> IO Domain
ptrToDomain ptr
  | ptr == nullPtr = handleError
  | otherwise      = return $ Domain (castPtr ptr)

ptrToDomain' :: Ptr () -> IO Domain
ptrToDomain' ptr = return $ Domain (castPtr ptr)

domainToPtr :: Domain -> Ptr ()
domainToPtr (Domain ptr) = castPtr ptr

ptrToNetwork :: Ptr () -> IO Network
ptrToNetwork ptr
  | ptr == nullPtr = handleError
  | otherwise      = return $ Network (castPtr ptr)

ptrToNetwork' :: Ptr () -> IO Network
ptrToNetwork' ptr = return $ Network (castPtr ptr)

networkToPtr :: Network -> Ptr ()
networkToPtr (Network ptr) = castPtr ptr


foreign import ccall safe "System/LibVirt/Errors.chs.h virGetLastError"
  getLastError'_ :: (IO (Ptr ()))