haskell-gi-base 0.10 → 0.10.1
raw patch · 3 files changed
+241/−239 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.GI.Base.BasicTypes: gtypeToCGType :: GType -> CGType
- Data.GI.Base.BasicTypes: instance Exception UnexpectedNullPointerReturn
- Data.GI.Base.BasicTypes: instance Show UnexpectedNullPointerReturn
- Data.GI.Base.BasicTypes: instance Typeable UnexpectedNullPointerReturn
- Data.GI.Base.BasicTypes: nullPtrErrorMsg :: UnexpectedNullPointerReturn -> Text
- Data.GI.Base.BasicTypes: unwrapPtr :: PtrWrapped a -> Ptr a
- Data.GI.Base.Closure: instance BoxedObject Closure
- Data.GI.Base.GError: instance BoxedObject GError
- Data.GI.Base.GError: instance Exception GError
- Data.GI.Base.GError: instance Show GError
- Data.GI.Base.GError: instance Typeable GError
- Data.GI.Base.GValue: instance BoxedObject GValue
- Data.GI.Base.GValue: instance IsGValue (Ptr a)
- Data.GI.Base.GValue: instance IsGValue Bool
- Data.GI.Base.GValue: instance IsGValue Double
- Data.GI.Base.GValue: instance IsGValue Float
- Data.GI.Base.GValue: instance IsGValue GType
- Data.GI.Base.GValue: instance IsGValue Int32
- Data.GI.Base.GValue: instance IsGValue Int64
- Data.GI.Base.GValue: instance IsGValue String
- Data.GI.Base.GValue: instance IsGValue Text
- Data.GI.Base.GValue: instance IsGValue Word32
- Data.GI.Base.GValue: instance IsGValue Word64
- Data.GI.Base.GVariant: instance (Eq key, Eq value) => Eq (GVariantDictEntry key value)
- Data.GI.Base.GVariant: instance (IsGVariant a, IsGVariant b) => IsGVariant (a, b)
- Data.GI.Base.GVariant: instance (IsGVariant a, IsGVariant b, IsGVariant c) => IsGVariant (a, b, c)
- Data.GI.Base.GVariant: instance (IsGVariant a, IsGVariant b, IsGVariant c, IsGVariant d) => IsGVariant (a, b, c, d)
- Data.GI.Base.GVariant: instance (IsGVariant a, IsGVariant b, IsGVariant c, IsGVariant d, IsGVariant e) => IsGVariant (a, b, c, d, e)
- Data.GI.Base.GVariant: instance (IsGVariant a, IsGVariantBasicType a, IsGVariant b) => IsGVariant (GVariantDictEntry a b)
- Data.GI.Base.GVariant: instance (IsGVariant a, IsGVariantBasicType a, IsGVariant b) => IsGVariant (Map a b)
- Data.GI.Base.GVariant: instance (Show key, Show value) => Show (GVariantDictEntry key value)
- Data.GI.Base.GVariant: instance Eq GVariantHandle
- Data.GI.Base.GVariant: instance Eq GVariantObjectPath
- Data.GI.Base.GVariant: instance Eq GVariantSignature
- Data.GI.Base.GVariant: instance Eq a => Eq (GVariantSinglet a)
- Data.GI.Base.GVariant: instance IsGVariant ()
- Data.GI.Base.GVariant: instance IsGVariant Bool
- Data.GI.Base.GVariant: instance IsGVariant ByteString
- Data.GI.Base.GVariant: instance IsGVariant Double
- Data.GI.Base.GVariant: instance IsGVariant GVariant
- Data.GI.Base.GVariant: instance IsGVariant GVariantHandle
- Data.GI.Base.GVariant: instance IsGVariant GVariantObjectPath
- Data.GI.Base.GVariant: instance IsGVariant GVariantSignature
- Data.GI.Base.GVariant: instance IsGVariant Int16
- Data.GI.Base.GVariant: instance IsGVariant Int32
- Data.GI.Base.GVariant: instance IsGVariant Int64
- Data.GI.Base.GVariant: instance IsGVariant Text
- Data.GI.Base.GVariant: instance IsGVariant Word16
- Data.GI.Base.GVariant: instance IsGVariant Word32
- Data.GI.Base.GVariant: instance IsGVariant Word64
- Data.GI.Base.GVariant: instance IsGVariant Word8
- Data.GI.Base.GVariant: instance IsGVariant a => IsGVariant (GVariantSinglet a)
- Data.GI.Base.GVariant: instance IsGVariant a => IsGVariant (Maybe a)
- Data.GI.Base.GVariant: instance IsGVariant a => IsGVariant [a]
- Data.GI.Base.GVariant: instance IsGVariantBasicType Bool
- Data.GI.Base.GVariant: instance IsGVariantBasicType Double
- Data.GI.Base.GVariant: instance IsGVariantBasicType GVariantHandle
- Data.GI.Base.GVariant: instance IsGVariantBasicType GVariantObjectPath
- Data.GI.Base.GVariant: instance IsGVariantBasicType GVariantSignature
- Data.GI.Base.GVariant: instance IsGVariantBasicType Int16
- Data.GI.Base.GVariant: instance IsGVariantBasicType Int32
- Data.GI.Base.GVariant: instance IsGVariantBasicType Int64
- Data.GI.Base.GVariant: instance IsGVariantBasicType Text
- Data.GI.Base.GVariant: instance IsGVariantBasicType Word16
- Data.GI.Base.GVariant: instance IsGVariantBasicType Word32
- Data.GI.Base.GVariant: instance IsGVariantBasicType Word64
- Data.GI.Base.GVariant: instance IsGVariantBasicType Word8
- Data.GI.Base.GVariant: instance Ord GVariantHandle
- Data.GI.Base.GVariant: instance Ord GVariantObjectPath
- Data.GI.Base.GVariant: instance Ord GVariantSignature
- Data.GI.Base.GVariant: instance Show GVariantHandle
- Data.GI.Base.GVariant: instance Show GVariantObjectPath
- Data.GI.Base.GVariant: instance Show GVariantSignature
- Data.GI.Base.GVariant: instance Show a => Show (GVariantSinglet a)
- Data.GI.Base.Overloading: instance (HasAttribute attr o) => HasAttr attr o
- Data.GI.Base.Properties: instance SignalInfo GObjectNotifySignalInfo
+ Data.GI.Base.BasicTypes: [gtypeToCGType] :: GType -> CGType
+ Data.GI.Base.BasicTypes: [nullPtrErrorMsg] :: UnexpectedNullPointerReturn -> Text
+ Data.GI.Base.BasicTypes: [unwrapPtr] :: PtrWrapped a -> Ptr a
+ Data.GI.Base.BasicTypes: instance GHC.Exception.Exception Data.GI.Base.BasicTypes.UnexpectedNullPointerReturn
+ Data.GI.Base.BasicTypes: instance GHC.Show.Show Data.GI.Base.BasicTypes.UnexpectedNullPointerReturn
+ Data.GI.Base.Closure: instance Data.GI.Base.BasicTypes.BoxedObject Data.GI.Base.Closure.Closure
+ Data.GI.Base.GError: instance Data.GI.Base.BasicTypes.BoxedObject Data.GI.Base.GError.GError
+ Data.GI.Base.GError: instance GHC.Exception.Exception Data.GI.Base.GError.GError
+ Data.GI.Base.GError: instance GHC.Show.Show Data.GI.Base.GError.GError
+ Data.GI.Base.GValue: instance Data.GI.Base.BasicTypes.BoxedObject Data.GI.Base.GValue.GValue
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue (GHC.Ptr.Ptr a)
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue Data.GI.Base.BasicTypes.GType
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue Data.Text.Internal.Text
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Base.String
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Int.Int32
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Int.Int64
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Types.Bool
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Types.Double
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Types.Float
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Word.Word32
+ Data.GI.Base.GValue: instance Data.GI.Base.GValue.IsGValue GHC.Word.Word64
+ Data.GI.Base.GVariant: instance (Data.GI.Base.GVariant.IsGVariant a, Data.GI.Base.GVariant.IsGVariant b) => Data.GI.Base.GVariant.IsGVariant (a, b)
+ Data.GI.Base.GVariant: instance (Data.GI.Base.GVariant.IsGVariant a, Data.GI.Base.GVariant.IsGVariant b, Data.GI.Base.GVariant.IsGVariant c) => Data.GI.Base.GVariant.IsGVariant (a, b, c)
+ Data.GI.Base.GVariant: instance (Data.GI.Base.GVariant.IsGVariant a, Data.GI.Base.GVariant.IsGVariant b, Data.GI.Base.GVariant.IsGVariant c, Data.GI.Base.GVariant.IsGVariant d) => Data.GI.Base.GVariant.IsGVariant (a, b, c, d)
+ Data.GI.Base.GVariant: instance (Data.GI.Base.GVariant.IsGVariant a, Data.GI.Base.GVariant.IsGVariant b, Data.GI.Base.GVariant.IsGVariant c, Data.GI.Base.GVariant.IsGVariant d, Data.GI.Base.GVariant.IsGVariant e) => Data.GI.Base.GVariant.IsGVariant (a, b, c, d, e)
+ Data.GI.Base.GVariant: instance (Data.GI.Base.GVariant.IsGVariant a, Data.GI.Base.GVariant.IsGVariantBasicType a, Data.GI.Base.GVariant.IsGVariant b) => Data.GI.Base.GVariant.IsGVariant (Data.GI.Base.GVariant.GVariantDictEntry a b)
+ Data.GI.Base.GVariant: instance (Data.GI.Base.GVariant.IsGVariant a, Data.GI.Base.GVariant.IsGVariantBasicType a, Data.GI.Base.GVariant.IsGVariant b) => Data.GI.Base.GVariant.IsGVariant (Data.Map.Base.Map a b)
+ Data.GI.Base.GVariant: instance (GHC.Classes.Eq key, GHC.Classes.Eq value) => GHC.Classes.Eq (Data.GI.Base.GVariant.GVariantDictEntry key value)
+ Data.GI.Base.GVariant: instance (GHC.Show.Show key, GHC.Show.Show value) => GHC.Show.Show (Data.GI.Base.GVariant.GVariantDictEntry key value)
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant ()
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant Data.ByteString.Internal.ByteString
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant Data.GI.Base.BasicTypes.GVariant
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant Data.GI.Base.GVariant.GVariantHandle
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant Data.GI.Base.GVariant.GVariantObjectPath
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant Data.GI.Base.GVariant.GVariantSignature
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant Data.Text.Internal.Text
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Int.Int16
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Int.Int32
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Int.Int64
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Types.Bool
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Types.Double
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Word.Word16
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Word.Word32
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Word.Word64
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant GHC.Word.Word8
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant a => Data.GI.Base.GVariant.IsGVariant (Data.GI.Base.GVariant.GVariantSinglet a)
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant a => Data.GI.Base.GVariant.IsGVariant (GHC.Base.Maybe a)
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariant a => Data.GI.Base.GVariant.IsGVariant [a]
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType Data.GI.Base.GVariant.GVariantHandle
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType Data.GI.Base.GVariant.GVariantObjectPath
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType Data.GI.Base.GVariant.GVariantSignature
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType Data.Text.Internal.Text
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Int.Int16
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Int.Int32
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Int.Int64
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Types.Bool
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Types.Double
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Word.Word16
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Word.Word32
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Word.Word64
+ Data.GI.Base.GVariant: instance Data.GI.Base.GVariant.IsGVariantBasicType GHC.Word.Word8
+ Data.GI.Base.GVariant: instance GHC.Classes.Eq Data.GI.Base.GVariant.GVariantHandle
+ Data.GI.Base.GVariant: instance GHC.Classes.Eq Data.GI.Base.GVariant.GVariantObjectPath
+ Data.GI.Base.GVariant: instance GHC.Classes.Eq Data.GI.Base.GVariant.GVariantSignature
+ Data.GI.Base.GVariant: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.GI.Base.GVariant.GVariantSinglet a)
+ Data.GI.Base.GVariant: instance GHC.Classes.Ord Data.GI.Base.GVariant.GVariantHandle
+ Data.GI.Base.GVariant: instance GHC.Classes.Ord Data.GI.Base.GVariant.GVariantObjectPath
+ Data.GI.Base.GVariant: instance GHC.Classes.Ord Data.GI.Base.GVariant.GVariantSignature
+ Data.GI.Base.GVariant: instance GHC.Show.Show Data.GI.Base.GVariant.GVariantHandle
+ Data.GI.Base.GVariant: instance GHC.Show.Show Data.GI.Base.GVariant.GVariantObjectPath
+ Data.GI.Base.GVariant: instance GHC.Show.Show Data.GI.Base.GVariant.GVariantSignature
+ Data.GI.Base.GVariant: instance GHC.Show.Show a => GHC.Show.Show (Data.GI.Base.GVariant.GVariantSinglet a)
+ Data.GI.Base.Overloading: instance Data.GI.Base.Overloading.HasAttribute attr o => Data.GI.Base.Overloading.HasAttr attr o
+ Data.GI.Base.Properties: instance Data.GI.Base.Signals.SignalInfo Data.GI.Base.Properties.GObjectNotifySignalInfo
- Data.GI.Base.GError: type GErrorCode = CInt
+ Data.GI.Base.GError: type GErrorCode = Int32
- Data.GI.Base.Properties: constructObjectPropertyBoxed :: BoxedObject a => String -> a -> IO (String, GValue)
+ Data.GI.Base.Properties: constructObjectPropertyBoxed :: (BoxedObject a) => String -> a -> IO (String, GValue)
- Data.GI.Base.ShortPrelude: class Monad (m :: * -> *)
+ Data.GI.Base.ShortPrelude: class Applicative m => Monad (m :: * -> *)
- Data.GI.Base.ShortPrelude: length :: [a] -> Int
+ Data.GI.Base.ShortPrelude: length :: Foldable t => forall a. t a -> Int
- Data.GI.Base.ShortPrelude: mapM :: Monad m => (a -> m b) -> [a] -> m [b]
+ Data.GI.Base.ShortPrelude: mapM :: Traversable t => forall a (m :: * -> *) b. Monad m => (a -> m b) -> t a -> m (t b)
- Data.GI.Base.ShortPrelude: mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
+ Data.GI.Base.ShortPrelude: mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
- Data.GI.Base.ShortPrelude: when :: Monad m => Bool -> m () -> m ()
+ Data.GI.Base.ShortPrelude: when :: Applicative f => Bool -> f () -> f ()
Files
- haskell-gi-base.cabal +1/−1
- src/Data/GI/Base/GError.chs +0/−238
- src/Data/GI/Base/GError.hsc +240/−0
haskell-gi-base.cabal view
@@ -1,5 +1,5 @@ name: haskell-gi-base-version: 0.10+version: 0.10.1 synopsis: Foundation for libraries generated by haskell-gi description: Foundation for libraries generated by haskell-gi homepage: https://github.com/haskell-gi/haskell-gi-base
− src/Data/GI/Base/GError.chs
@@ -1,238 +0,0 @@-{-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables #-}---- | To catch GError exceptions use the--- catchGError* or handleGError* functions. They work in a similar--- way to the standard 'Control.Exception.catch' and--- 'Control.Exception.handle' functions.------ To catch just a single specific error use 'catchGErrorJust' \/--- 'handleGErrorJust'. To catch any error in a particular error domain--- use 'catchGErrorJustDomain' \/ 'handleGErrorJustDomain'------ For convenience, generated code also includes specialized variants--- of 'catchGErrorJust' \/ 'handleGErrorJust' for each error type. For--- example, for errors of type 'GI.GdkPixbuf.PixbufError' one could--- invoke 'GI.GdkPixbuf.catchPixbufError' \/--- 'GI.GdkPixbuf.handlePixbufError'. The definition is simply------ > catchPixbufError :: IO a -> (PixbufError -> GErrorMessage -> IO a) -> IO a--- > catchPixbufError = catchGErrorJustDomain------ Notice that the type is suitably specialized, so only--- errors of type 'GI.GdkPixbuf.PixbufError' will be caught.-module Data.GI.Base.GError- (- -- * Unpacking GError- --- GError(..)- , gerrorDomain- , gerrorCode- , gerrorMessage-- , GErrorDomain- , GErrorCode- , GErrorMessage-- -- * Catching GError exceptions- , catchGErrorJust- , catchGErrorJustDomain-- , handleGErrorJust- , handleGErrorJustDomain-- -- * Creating new 'GError's- , gerrorNew-- -- * Implementation specific details- -- | The following are used in the implementation- -- of the bindings, and are in general not necessary for using the- -- API.- , GErrorClass(..)-- , propagateGError- , checkGError-- ) where--#if __GLASGOW_HASKELL__ < 710-import Control.Applicative ((<$>))-#endif--import Foreign (poke, peek)-import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)-import Foreign.Ptr (Ptr, plusPtr, nullPtr)-import Foreign.C-import Control.Exception-import Data.Text (Text)-import Data.Typeable (Typeable)--import Data.GI.Base.BasicTypes (BoxedObject(..), GType(..))-import Data.GI.Base.BasicConversions (withTextCString, cstringToText)-import Data.GI.Base.ManagedPtr (wrapBoxed)-import Data.GI.Base.Utils (allocMem, freeMem)--#include <glib.h>---- | A GError, consisting of a domain, code and a human readable--- message. These can be accessed by 'gerrorDomain', 'gerrorCode' and--- 'gerrorMessage' below.-newtype GError = GError (ForeignPtr GError)- deriving (Typeable, Show)--instance Exception GError--foreign import ccall "g_error_get_type" g_error_get_type :: IO GType--instance BoxedObject GError where- boxedType _ = g_error_get_type---- | A GQuark.-type GQuark = {# type GQuark #}---- | A code used to identify the "namespace" of the error. Within each error--- domain all the error codes are defined in an enumeration. Each gtk\/gnome--- module that uses GErrors has its own error domain. The rationale behind--- using error domains is so that each module can organise its own error codes--- without having to coordinate on a global error code list.-type GErrorDomain = GQuark---- | A code to identify a specific error within a given 'GErrorDomain'. Most of--- time you will not need to deal with this raw code since there is an--- enumeration type for each error domain. Of course which enumeration to use--- depends on the error domain, but if you use 'catchGErrorJustDomain' or--- 'handleGErrorJustDomain', this is worked out for you automatically.-type GErrorCode = {# type gint #}---- | A human readable error message.-type GErrorMessage = Text--foreign import ccall "g_error_new_literal" g_error_new_literal ::- GQuark -> GErrorCode -> CString -> IO (Ptr GError)---- | Create a new 'GError'.-gerrorNew :: GErrorDomain -> GErrorCode -> GErrorMessage -> IO GError-gerrorNew domain code message =- withTextCString message $ \cstring ->- g_error_new_literal domain code cstring >>= wrapBoxed GError---- | Return the domain for the given `GError`. This is a GQuark, a--- textual representation can be obtained with--- `GI.GLib.quarkToString`.-gerrorDomain :: GError -> IO GQuark-gerrorDomain (GError fptr) =- withForeignPtr fptr $ \ptr ->- peek $ ptr `plusPtr` {# offsetof GError->domain #}---- | The numeric code for the given `GError`.-gerrorCode :: GError -> IO GErrorCode-gerrorCode (GError fptr) =- withForeignPtr fptr $ \ptr ->- peek $ ptr `plusPtr` {# offsetof GError->code #}---- | A text message describing the `GError`.-gerrorMessage :: GError -> IO GErrorMessage-gerrorMessage (GError fptr) =- withForeignPtr fptr $ \ptr ->- (peek $ ptr `plusPtr` {# offsetof GError->message #}) >>= cstringToText---- | Each error domain's error enumeration type should be an instance of this--- class. This class helps to hide the raw error and domain codes from the--- user.------ Example for 'GI.GdkPixbuf.PixbufError':------ > instance GErrorClass PixbufError where--- > gerrorClassDomain _ = "gdk-pixbuf-error-quark"----class Enum err => GErrorClass err where- gerrorClassDomain :: err -> Text -- ^ This must not use the value of its- -- parameter so that it is safe to pass- -- 'undefined'.--foreign import ccall unsafe "g_quark_try_string" g_quark_try_string ::- CString -> IO GQuark---- | Given the string representation of an error domain returns the--- corresponding error quark.-gErrorQuarkFromDomain :: Text -> IO GQuark-gErrorQuarkFromDomain domain = withTextCString domain g_quark_try_string---- | This will catch just a specific GError exception. If you need to catch a--- range of related errors, 'catchGErrorJustDomain' is probably more--- appropriate. Example:------ > do image <- catchGErrorJust PixbufErrorCorruptImage--- > loadImage--- > (\errorMessage -> do log errorMessage--- > return mssingImagePlaceholder)----catchGErrorJust :: GErrorClass err => err -- ^ The error to catch- -> IO a -- ^ The computation to run- -> (GErrorMessage -> IO a) -- ^ Handler to invoke if- -- an exception is raised- -> IO a-catchGErrorJust code action handler = do- domainQuark <- gErrorQuarkFromDomain $ gerrorClassDomain code- catch action (handler' domainQuark)- where handler' quark gerror = do- domain <- gerrorDomain gerror- code' <- gerrorCode gerror- if domain == quark && code' == (fromIntegral . fromEnum) code- then gerrorMessage gerror >>= handler- else throw gerror -- Pass it on---- | Catch all GErrors from a particular error domain. The handler function--- should just deal with one error enumeration type. If you need to catch--- errors from more than one error domain, use this function twice with an--- appropriate handler functions for each.------ > catchGErrorJustDomain--- > loadImage--- > (\err message -> case err of--- > PixbufErrorCorruptImage -> ...--- > PixbufErrorInsufficientMemory -> ...--- > PixbufErrorUnknownType -> ...--- > _ -> ...)----catchGErrorJustDomain :: forall err a. GErrorClass err =>- IO a -- ^ The computation to run- -> (err -> GErrorMessage -> IO a) -- ^ Handler to invoke if an exception is raised- -> IO a-catchGErrorJustDomain action handler = do- domainQuark <- gErrorQuarkFromDomain $ gerrorClassDomain (undefined::err)- catch action (handler' domainQuark)- where handler' quark gerror = do- domain <- gerrorDomain gerror- if domain == quark- then do- code <- (toEnum . fromIntegral) <$> gerrorCode gerror- msg <- gerrorMessage gerror- handler code msg- else throw gerror---- | A verson of 'handleGErrorJust' with the arguments swapped around.-handleGErrorJust :: GErrorClass err => err -> (GErrorMessage -> IO a) -> IO a -> IO a-handleGErrorJust code = flip (catchGErrorJust code)---- | A verson of 'catchGErrorJustDomain' with the arguments swapped around.-handleGErrorJustDomain :: GErrorClass err => (err -> GErrorMessage -> IO a) -> IO a -> IO a-handleGErrorJustDomain = flip catchGErrorJustDomain---- | Run the given function catching possible 'GError's in its--- execution. If a 'GError' is emitted this throws the corresponding--- exception.-propagateGError :: (Ptr (Ptr GError) -> IO a) -> IO a-propagateGError f = checkGError f throw---- | Like 'propagateGError', but allows to specify a custom handler--- instead of just throwing the exception.-checkGError :: (Ptr (Ptr GError) -> IO a) -> (GError -> IO a) -> IO a-checkGError f handler = do- gerrorPtr <- allocMem- poke gerrorPtr nullPtr- result <- f gerrorPtr- gerror <- peek gerrorPtr- freeMem gerrorPtr- if gerror /= nullPtr- then wrapBoxed GError gerror >>= handler- else return result
+ src/Data/GI/Base/GError.hsc view
@@ -0,0 +1,240 @@+{-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables #-}++-- | To catch GError exceptions use the+-- catchGError* or handleGError* functions. They work in a similar+-- way to the standard 'Control.Exception.catch' and+-- 'Control.Exception.handle' functions.+--+-- To catch just a single specific error use 'catchGErrorJust' \/+-- 'handleGErrorJust'. To catch any error in a particular error domain+-- use 'catchGErrorJustDomain' \/ 'handleGErrorJustDomain'+--+-- For convenience, generated code also includes specialized variants+-- of 'catchGErrorJust' \/ 'handleGErrorJust' for each error type. For+-- example, for errors of type 'GI.GdkPixbuf.PixbufError' one could+-- invoke 'GI.GdkPixbuf.catchPixbufError' \/+-- 'GI.GdkPixbuf.handlePixbufError'. The definition is simply+--+-- > catchPixbufError :: IO a -> (PixbufError -> GErrorMessage -> IO a) -> IO a+-- > catchPixbufError = catchGErrorJustDomain+--+-- Notice that the type is suitably specialized, so only+-- errors of type 'GI.GdkPixbuf.PixbufError' will be caught.+module Data.GI.Base.GError+ (+ -- * Unpacking GError+ --+ GError(..)+ , gerrorDomain+ , gerrorCode+ , gerrorMessage++ , GErrorDomain+ , GErrorCode+ , GErrorMessage++ -- * Catching GError exceptions+ , catchGErrorJust+ , catchGErrorJustDomain++ , handleGErrorJust+ , handleGErrorJustDomain++ -- * Creating new 'GError's+ , gerrorNew++ -- * Implementation specific details+ -- | The following are used in the implementation+ -- of the bindings, and are in general not necessary for using the+ -- API.+ , GErrorClass(..)++ , propagateGError+ , checkGError++ ) where++#if __GLASGOW_HASKELL__ < 710+import Control.Applicative ((<$>))+#endif++import Foreign (poke, peek)+import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)+import Foreign.Ptr (Ptr, plusPtr, nullPtr)+import Foreign.C+import Control.Exception+import Data.Text (Text)+import Data.Typeable (Typeable)+import Data.Int+import Data.Word++import Data.GI.Base.BasicTypes (BoxedObject(..), GType(..))+import Data.GI.Base.BasicConversions (withTextCString, cstringToText)+import Data.GI.Base.ManagedPtr (wrapBoxed)+import Data.GI.Base.Utils (allocMem, freeMem)++#include <glib.h>++-- | A GError, consisting of a domain, code and a human readable+-- message. These can be accessed by 'gerrorDomain', 'gerrorCode' and+-- 'gerrorMessage' below.+newtype GError = GError (ForeignPtr GError)+ deriving (Typeable, Show)++instance Exception GError++foreign import ccall "g_error_get_type" g_error_get_type :: IO GType++instance BoxedObject GError where+ boxedType _ = g_error_get_type++-- | A GQuark.+type GQuark = #type GQuark++-- | A code used to identify the "namespace" of the error. Within each error+-- domain all the error codes are defined in an enumeration. Each gtk\/gnome+-- module that uses GErrors has its own error domain. The rationale behind+-- using error domains is so that each module can organise its own error codes+-- without having to coordinate on a global error code list.+type GErrorDomain = GQuark++-- | A code to identify a specific error within a given 'GErrorDomain'. Most of+-- time you will not need to deal with this raw code since there is an+-- enumeration type for each error domain. Of course which enumeration to use+-- depends on the error domain, but if you use 'catchGErrorJustDomain' or+-- 'handleGErrorJustDomain', this is worked out for you automatically.+type GErrorCode = #type gint++-- | A human readable error message.+type GErrorMessage = Text++foreign import ccall "g_error_new_literal" g_error_new_literal ::+ GQuark -> GErrorCode -> CString -> IO (Ptr GError)++-- | Create a new 'GError'.+gerrorNew :: GErrorDomain -> GErrorCode -> GErrorMessage -> IO GError+gerrorNew domain code message =+ withTextCString message $ \cstring ->+ g_error_new_literal domain code cstring >>= wrapBoxed GError++-- | Return the domain for the given `GError`. This is a GQuark, a+-- textual representation can be obtained with+-- `GI.GLib.quarkToString`.+gerrorDomain :: GError -> IO GQuark+gerrorDomain (GError fptr) =+ withForeignPtr fptr $ \ptr ->+ peek $ ptr `plusPtr` #{offset GError, domain}++-- | The numeric code for the given `GError`.+gerrorCode :: GError -> IO GErrorCode+gerrorCode (GError fptr) =+ withForeignPtr fptr $ \ptr ->+ peek $ ptr `plusPtr` #{offset GError, code}++-- | A text message describing the `GError`.+gerrorMessage :: GError -> IO GErrorMessage+gerrorMessage (GError fptr) =+ withForeignPtr fptr $ \ptr ->+ (peek $ ptr `plusPtr` #{offset GError, message}) >>= cstringToText++-- | Each error domain's error enumeration type should be an instance of this+-- class. This class helps to hide the raw error and domain codes from the+-- user.+--+-- Example for 'GI.GdkPixbuf.PixbufError':+--+-- > instance GErrorClass PixbufError where+-- > gerrorClassDomain _ = "gdk-pixbuf-error-quark"+--+class Enum err => GErrorClass err where+ gerrorClassDomain :: err -> Text -- ^ This must not use the value of its+ -- parameter so that it is safe to pass+ -- 'undefined'.++foreign import ccall unsafe "g_quark_try_string" g_quark_try_string ::+ CString -> IO GQuark++-- | Given the string representation of an error domain returns the+-- corresponding error quark.+gErrorQuarkFromDomain :: Text -> IO GQuark+gErrorQuarkFromDomain domain = withTextCString domain g_quark_try_string++-- | This will catch just a specific GError exception. If you need to catch a+-- range of related errors, 'catchGErrorJustDomain' is probably more+-- appropriate. Example:+--+-- > do image <- catchGErrorJust PixbufErrorCorruptImage+-- > loadImage+-- > (\errorMessage -> do log errorMessage+-- > return mssingImagePlaceholder)+--+catchGErrorJust :: GErrorClass err => err -- ^ The error to catch+ -> IO a -- ^ The computation to run+ -> (GErrorMessage -> IO a) -- ^ Handler to invoke if+ -- an exception is raised+ -> IO a+catchGErrorJust code action handler = do+ domainQuark <- gErrorQuarkFromDomain $ gerrorClassDomain code+ catch action (handler' domainQuark)+ where handler' quark gerror = do+ domain <- gerrorDomain gerror+ code' <- gerrorCode gerror+ if domain == quark && code' == (fromIntegral . fromEnum) code+ then gerrorMessage gerror >>= handler+ else throw gerror -- Pass it on++-- | Catch all GErrors from a particular error domain. The handler function+-- should just deal with one error enumeration type. If you need to catch+-- errors from more than one error domain, use this function twice with an+-- appropriate handler functions for each.+--+-- > catchGErrorJustDomain+-- > loadImage+-- > (\err message -> case err of+-- > PixbufErrorCorruptImage -> ...+-- > PixbufErrorInsufficientMemory -> ...+-- > PixbufErrorUnknownType -> ...+-- > _ -> ...)+--+catchGErrorJustDomain :: forall err a. GErrorClass err =>+ IO a -- ^ The computation to run+ -> (err -> GErrorMessage -> IO a) -- ^ Handler to invoke if an exception is raised+ -> IO a+catchGErrorJustDomain action handler = do+ domainQuark <- gErrorQuarkFromDomain $ gerrorClassDomain (undefined::err)+ catch action (handler' domainQuark)+ where handler' quark gerror = do+ domain <- gerrorDomain gerror+ if domain == quark+ then do+ code <- (toEnum . fromIntegral) <$> gerrorCode gerror+ msg <- gerrorMessage gerror+ handler code msg+ else throw gerror++-- | A verson of 'handleGErrorJust' with the arguments swapped around.+handleGErrorJust :: GErrorClass err => err -> (GErrorMessage -> IO a) -> IO a -> IO a+handleGErrorJust code = flip (catchGErrorJust code)++-- | A verson of 'catchGErrorJustDomain' with the arguments swapped around.+handleGErrorJustDomain :: GErrorClass err => (err -> GErrorMessage -> IO a) -> IO a -> IO a+handleGErrorJustDomain = flip catchGErrorJustDomain++-- | Run the given function catching possible 'GError's in its+-- execution. If a 'GError' is emitted this throws the corresponding+-- exception.+propagateGError :: (Ptr (Ptr GError) -> IO a) -> IO a+propagateGError f = checkGError f throw++-- | Like 'propagateGError', but allows to specify a custom handler+-- instead of just throwing the exception.+checkGError :: (Ptr (Ptr GError) -> IO a) -> (GError -> IO a) -> IO a+checkGError f handler = do+ gerrorPtr <- allocMem+ poke gerrorPtr nullPtr+ result <- f gerrorPtr+ gerror <- peek gerrorPtr+ freeMem gerrorPtr+ if gerror /= nullPtr+ then wrapBoxed GError gerror >>= handler+ else return result