packages feed

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 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