<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ --> <title>dist/build/System/Glib/GError.hs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE ScopedTypeVariables,DeriveDataTypeable #-}</span> <a name="line-2"></a> <a name="line-3"></a><span class='hs-comment'>{-# LINE 2 "./System/Glib/GError.chs" #-}</span> <a name="line-4"></a><span class='hs-comment'>-- -*-haskell-*-</span> <a name="line-5"></a><span class='hs-comment'>-- GIMP Toolkit (GTK) GError API</span> <a name="line-6"></a><span class='hs-comment'>--</span> <a name="line-7"></a><span class='hs-comment'>-- Author : Duncan Coutts</span> <a name="line-8"></a><span class='hs-comment'>--</span> <a name="line-9"></a><span class='hs-comment'>-- Created: 2 July 2004</span> <a name="line-10"></a><span class='hs-comment'>--</span> <a name="line-11"></a><span class='hs-comment'>-- Copyright (C) 2004 Duncan Coutts</span> <a name="line-12"></a><span class='hs-comment'>-- parts derived from Structs.hsc Copyright (c) 1999..2002 Axel Simon</span> <a name="line-13"></a><span class='hs-comment'>--</span> <a name="line-14"></a><span class='hs-comment'>-- This library is free software; you can redistribute it and/or</span> <a name="line-15"></a><span class='hs-comment'>-- modify it under the terms of the GNU Lesser General Public</span> <a name="line-16"></a><span class='hs-comment'>-- License as published by the Free Software Foundation; either</span> <a name="line-17"></a><span class='hs-comment'>-- version 2.1 of the License, or (at your option) any later version.</span> <a name="line-18"></a><span class='hs-comment'>--</span> <a name="line-19"></a><span class='hs-comment'>-- This library is distributed in the hope that it will be useful,</span> <a name="line-20"></a><span class='hs-comment'>-- but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="line-21"></a><span class='hs-comment'>-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span> <a name="line-22"></a><span class='hs-comment'>-- Lesser General Public License for more details.</span> <a name="line-23"></a><span class='hs-comment'>--</span> <a name="line-24"></a><span class='hs-comment'>-- |</span> <a name="line-25"></a><span class='hs-comment'>-- Maintainer : gtk2hs-users@lists.sourceforge.net</span> <a name="line-26"></a><span class='hs-comment'>-- Stability : provisional</span> <a name="line-27"></a><span class='hs-comment'>-- Portability : portable (depends on GHC)</span> <a name="line-28"></a><span class='hs-comment'>--</span> <a name="line-29"></a><span class='hs-comment'>-- Error Reporting, glib's system for reporting errors.</span> <a name="line-30"></a><span class='hs-comment'>--</span> <a name="line-31"></a><span class='hs-comment'>-- 'GError's are used by glib to report recoverable runtime errors.</span> <a name="line-32"></a><span class='hs-comment'>--</span> <a name="line-33"></a><span class='hs-comment'>-- This module provides functions for checking glib\/gtk functions that report</span> <a name="line-34"></a><span class='hs-comment'>-- 'GError's. It also provides functions for throwing and catching 'GError's as</span> <a name="line-35"></a><span class='hs-comment'>-- Haskell exceptions.</span> <a name="line-36"></a><span class='hs-comment'>--</span> <a name="line-37"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Glib</span><span class='hs-varop'>.</span><span class='hs-conid'>GError</span> <span class='hs-layout'>(</span> <a name="line-38"></a> <a name="line-39"></a> <span class='hs-comment'>-- * Data types</span> <a name="line-40"></a> <span class='hs-comment'>--</span> <a name="line-41"></a> <span class='hs-conid'>GError</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-42"></a> <span class='hs-conid'>GErrorDomain</span><span class='hs-layout'>,</span> <a name="line-43"></a> <span class='hs-conid'>GErrorCode</span><span class='hs-layout'>,</span> <a name="line-44"></a> <span class='hs-conid'>GErrorMessage</span><span class='hs-layout'>,</span> <a name="line-45"></a> <a name="line-46"></a> <span class='hs-comment'>-- * Catching GError exceptions</span> <a name="line-47"></a> <span class='hs-comment'>-- | To catch GError exceptions thrown by Gtk2Hs functions use the</span> <a name="line-48"></a> <span class='hs-comment'>-- catchGError* or handleGError* functions. They work in a similar way to</span> <a name="line-49"></a> <span class='hs-comment'>-- the standard 'Control.Exception.catch' and 'Control.Exception.handle'</span> <a name="line-50"></a> <span class='hs-comment'>-- functions.</span> <a name="line-51"></a> <span class='hs-comment'>--</span> <a name="line-52"></a> <span class='hs-comment'>-- 'catchGError' \/ 'handleGError' catches all GError exceptions, you provide</span> <a name="line-53"></a> <span class='hs-comment'>-- a handler function that gets given the GError if an exception was thrown.</span> <a name="line-54"></a> <span class='hs-comment'>-- This is the most general but is probably not what you want most of the</span> <a name="line-55"></a> <span class='hs-comment'>-- time. It just gives you the raw error code rather than a Haskell</span> <a name="line-56"></a> <span class='hs-comment'>-- enumeration of the error codes. Most of the time you will only want to</span> <a name="line-57"></a> <span class='hs-comment'>-- catch a specific error or any error from a specific error domain. To</span> <a name="line-58"></a> <span class='hs-comment'>-- catch just a single specific error use</span> <a name="line-59"></a> <span class='hs-comment'>-- 'catchGErrorJust' \/ 'handleGErrorJust'. To catch any error in a</span> <a name="line-60"></a> <span class='hs-comment'>-- particular error domain use 'catchGErrorJustDomain' \/</span> <a name="line-61"></a> <span class='hs-comment'>-- 'handleGErrorJustDomain'</span> <a name="line-62"></a> <span class='hs-comment'>--</span> <a name="line-63"></a> <span class='hs-varid'>catchGError</span><span class='hs-layout'>,</span> <a name="line-64"></a> <span class='hs-varid'>catchGErrorJust</span><span class='hs-layout'>,</span> <a name="line-65"></a> <span class='hs-varid'>catchGErrorJustDomain</span><span class='hs-layout'>,</span> <a name="line-66"></a> <a name="line-67"></a> <span class='hs-varid'>handleGError</span><span class='hs-layout'>,</span> <a name="line-68"></a> <span class='hs-varid'>handleGErrorJust</span><span class='hs-layout'>,</span> <a name="line-69"></a> <span class='hs-varid'>handleGErrorJustDomain</span><span class='hs-layout'>,</span> <a name="line-70"></a> <a name="line-71"></a> <span class='hs-varid'>failOnGError</span><span class='hs-layout'>,</span> <a name="line-72"></a> <span class='hs-varid'>throwGError</span><span class='hs-layout'>,</span> <a name="line-73"></a> <a name="line-74"></a> <span class='hs-comment'>-- * Checking for GErrors returned by glib\/gtk functions</span> <a name="line-75"></a> <span class='hs-comment'>-- | * Note, these functions are only useful to implementors</span> <a name="line-76"></a> <span class='hs-comment'>--</span> <a name="line-77"></a> <span class='hs-comment'>-- If you are wrapping a new API that reports 'GError's you should probably</span> <a name="line-78"></a> <span class='hs-comment'>-- use 'propagateGError' to convert the GError into an exception. You should</span> <a name="line-79"></a> <span class='hs-comment'>-- also note in the documentation for the function that it throws GError</span> <a name="line-80"></a> <span class='hs-comment'>-- exceptions and the Haskell enumeration for the expected glib GError</span> <a name="line-81"></a> <span class='hs-comment'>-- domain(s), so that users know what exceptions they might want to catch.</span> <a name="line-82"></a> <span class='hs-comment'>--</span> <a name="line-83"></a> <span class='hs-comment'>-- If you think it is more appropriate to use an alternate return value (eg</span> <a name="line-84"></a> <span class='hs-comment'>-- Either\/Maybe) then you should use 'checkGError'.</span> <a name="line-85"></a> <a name="line-86"></a> <span class='hs-conid'>GErrorClass</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-87"></a> <span class='hs-varid'>propagateGError</span><span class='hs-layout'>,</span> <a name="line-88"></a> <span class='hs-varid'>checkGError</span> <a name="line-89"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-90"></a> <a name="line-91"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span> <a name="line-92"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>C</span> <a name="line-93"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Glib</span><span class='hs-varop'>.</span><span class='hs-conid'>UTFString</span> <a name="line-94"></a> <a name="line-95"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>OldException</span> <a name="line-96"></a> <a name="line-97"></a> <a name="line-98"></a> <a name="line-99"></a> <a name="line-100"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Dynamic</span> <a name="line-101"></a> <a name="line-102"></a> <a name="line-103"></a><span class='hs-comment'>{-# LINE 101 "./System/Glib/GError.chs" #-}</span> <a name="line-104"></a> <a name="line-105"></a><a name="GError"></a><span class='hs-comment'>-- | A GError consists of a domain, code and a human readable message.</span> <a name="line-106"></a><a name="GError"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>GError</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GError</span> <span class='hs-varop'>!</span><span class='hs-conid'>GErrorDomain</span> <span class='hs-varop'>!</span><span class='hs-conid'>GErrorCode</span> <span class='hs-varop'>!</span><span class='hs-conid'>GErrorMessage</span> <a name="line-107"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Typeable</span> <a name="line-108"></a> <a name="line-109"></a><a name="GQuark"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>GQuark</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>CUInt</span><span class='hs-layout'>)</span> <a name="line-110"></a><span class='hs-comment'>{-# LINE 107 "./System/Glib/GError.chs" #-}</span> <a name="line-111"></a> <a name="line-112"></a><a name="GErrorDomain"></a><span class='hs-comment'>-- | A code used to identify the \'namespace\' of the error. Within each error</span> <a name="line-113"></a><a name="GErrorDomain"></a><span class='hs-comment'>-- domain all the error codes are defined in an enumeration. Each gtk\/gnome</span> <a name="line-114"></a><a name="GErrorDomain"></a><span class='hs-comment'>-- module that uses GErrors has its own error domain. The rationale behind</span> <a name="line-115"></a><a name="GErrorDomain"></a><span class='hs-comment'>-- using error domains is so that each module can organise its own error codes</span> <a name="line-116"></a><a name="GErrorDomain"></a><span class='hs-comment'>-- without having to coordinate on a global error code list.</span> <a name="line-117"></a><a name="GErrorDomain"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>GErrorDomain</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GQuark</span> <a name="line-118"></a> <a name="line-119"></a><a name="GErrorCode"></a><span class='hs-comment'>-- | A code to identify a specific error within a given 'GErrorDomain'. Most of</span> <a name="line-120"></a><a name="GErrorCode"></a><span class='hs-comment'>-- time you will not need to deal with this raw code since there is an</span> <a name="line-121"></a><a name="GErrorCode"></a><span class='hs-comment'>-- enumeration type for each error domain. Of course which enumeraton to use</span> <a name="line-122"></a><a name="GErrorCode"></a><span class='hs-comment'>-- depends on the error domain, but if you use 'catchGErrorJustDomain' or</span> <a name="line-123"></a><a name="GErrorCode"></a><span class='hs-comment'>-- 'handleGErrorJustDomain', this is worked out for you automatically.</span> <a name="line-124"></a><a name="GErrorCode"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>GErrorCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span> <a name="line-125"></a> <a name="line-126"></a><a name="GErrorMessage"></a><span class='hs-comment'>-- | A human readable error message.</span> <a name="line-127"></a><a name="GErrorMessage"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>String</span> <a name="line-128"></a> <a name="line-129"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Storable</span> <span class='hs-conid'>GError</span> <span class='hs-keyword'>where</span> <a name="line-130"></a> <span class='hs-varid'>sizeOf</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>12</span> <a name="line-131"></a><span class='hs-comment'>{-# LINE 127 "./System/Glib/GError.chs" #-}</span> <a name="line-132"></a> <span class='hs-varid'>alignment</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>alignment</span> <span class='hs-layout'>(</span><span class='hs-varid'>undefined</span><span class='hs-keyglyph'>::</span> <span class='hs-conid'>GQuark</span><span class='hs-layout'>)</span> <a name="line-133"></a> <span class='hs-varid'>peek</span> <span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <a name="line-134"></a> <span class='hs-layout'>(</span><span class='hs-varid'>domain</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GQuark</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span><span class='hs-varid'>peekByteOff</span> <span class='hs-varid'>ptr</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>::</span><span class='hs-conid'>IO</span> <span class='hs-conid'>CUInt</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>ptr</span> <a name="line-135"></a> <span class='hs-layout'>(</span><span class='hs-varid'>code</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>CInt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span><span class='hs-varid'>peekByteOff</span> <span class='hs-varid'>ptr</span> <span class='hs-num'>4</span> <span class='hs-keyglyph'>::</span><span class='hs-conid'>IO</span> <span class='hs-conid'>CInt</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>ptr</span> <a name="line-136"></a> <span class='hs-layout'>(</span><span class='hs-varid'>msgPtr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CString</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span><span class='hs-varid'>peekByteOff</span> <span class='hs-varid'>ptr</span> <span class='hs-num'>8</span> <span class='hs-keyglyph'>::</span><span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>CChar</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-varid'>ptr</span> <a name="line-137"></a> <span class='hs-varid'>msg</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>peekUTFString</span> <span class='hs-varid'>msgPtr</span> <a name="line-138"></a> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>GError</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>domain</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>code</span><span class='hs-layout'>)</span> <span class='hs-varid'>msg</span> <a name="line-139"></a> <span class='hs-varid'>poke</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"GError::poke: not implemented"</span> <a name="line-140"></a> <a name="line-141"></a><a name="GErrorClass"></a><span class='hs-comment'>-- | Each error domain's error enumeration type should be an instance of this</span> <a name="line-142"></a><a name="GErrorClass"></a><span class='hs-comment'>-- class. This class helps to hide the raw error and domain codes from the</span> <a name="line-143"></a><a name="GErrorClass"></a><span class='hs-comment'>-- user. This interface should be implemented by calling the approrpiate</span> <a name="line-144"></a><a name="GErrorClass"></a><span class='hs-comment'>-- @{error_domain}_error_quark@. It is safe to use a pure FFI call for this.</span> <a name="line-145"></a><a name="GErrorClass"></a><span class='hs-comment'>--</span> <a name="line-146"></a><a name="GErrorClass"></a><span class='hs-comment'>-- Example for 'Graphics.UI.Gtk.Gdk.Pixbuf.PixbufError':</span> <a name="line-147"></a><a name="GErrorClass"></a><span class='hs-comment'>--</span> <a name="line-148"></a><a name="GErrorClass"></a><span class='hs-comment'>-- > instance GErrorClass PixbufError where</span> <a name="line-149"></a><a name="GErrorClass"></a><span class='hs-comment'>-- > gerrorDomain _ = {#call pure unsafe pixbuf_error_quark#}</span> <a name="line-150"></a><a name="GErrorClass"></a><span class='hs-comment'>--</span> <a name="line-151"></a><a name="GErrorClass"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Enum</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>GErrorClass</span> <span class='hs-varid'>err</span> <span class='hs-keyword'>where</span> <a name="line-152"></a> <span class='hs-varid'>gerrorDomain</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>GErrorDomain</span> <span class='hs-comment'>-- ^ This must not use the value of its</span> <a name="line-153"></a> <span class='hs-comment'>-- parameter so that it is safe to pass</span> <a name="line-154"></a> <span class='hs-comment'>-- 'undefined'.</span> <a name="line-155"></a> <a name="line-156"></a><a name="propagateGError"></a><span class='hs-comment'>-- | Glib functions which report 'GError's take as a parameter a @GError</span> <a name="line-157"></a><span class='hs-comment'>-- **error@. Use this function to supply such a parameter. It checks if an</span> <a name="line-158"></a><span class='hs-comment'>-- error was reported and if so throws it as a Haskell exception.</span> <a name="line-159"></a><span class='hs-comment'>--</span> <a name="line-160"></a><span class='hs-comment'>-- Example of use:</span> <a name="line-161"></a><span class='hs-comment'>--</span> <a name="line-162"></a><span class='hs-comment'>-- > propagateGError $ \gerrorPtr -></span> <a name="line-163"></a><span class='hs-comment'>-- > {# call g_some_function_that_might_return_an_error #} a b gerrorPtr</span> <a name="line-164"></a><span class='hs-comment'>--</span> <a name="line-165"></a><span class='hs-definition'>propagateGError</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-166"></a><span class='hs-definition'>propagateGError</span> <span class='hs-varid'>action</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkGError</span> <span class='hs-varid'>action</span> <span class='hs-varid'>throwGError</span> <a name="line-167"></a> <a name="line-168"></a><a name="checkGError"></a><span class='hs-comment'>-- | Like 'propagateGError' but instead of throwing the GError as an exception</span> <a name="line-169"></a><span class='hs-comment'>-- handles the error immediately using the supplied error handler.</span> <a name="line-170"></a><span class='hs-comment'>--</span> <a name="line-171"></a><span class='hs-comment'>-- Example of use:</span> <a name="line-172"></a><span class='hs-comment'>--</span> <a name="line-173"></a><span class='hs-comment'>-- > checkGError</span> <a name="line-174"></a><span class='hs-comment'>-- > (\gerrorPtr -> {# call g_some_function_that_might_return_an_error #} a b gerrorPtr)</span> <a name="line-175"></a><span class='hs-comment'>-- > (\(GError domain code msg) -> ...)</span> <a name="line-176"></a><span class='hs-comment'>--</span> <a name="line-177"></a><span class='hs-definition'>checkGError</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-178"></a><span class='hs-definition'>checkGError</span> <span class='hs-varid'>action</span> <span class='hs-varid'>handler</span> <span class='hs-keyglyph'>=</span> <a name="line-179"></a> <span class='hs-varid'>alloca</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>errPtrPtr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>GError</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span> <a name="line-180"></a> <span class='hs-varid'>poke</span> <span class='hs-varid'>errPtrPtr</span> <span class='hs-varid'>nullPtr</span> <a name="line-181"></a> <span class='hs-varid'>result</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>action</span> <span class='hs-layout'>(</span><span class='hs-varid'>castPtr</span> <span class='hs-varid'>errPtrPtr</span><span class='hs-layout'>)</span> <a name="line-182"></a> <span class='hs-varid'>errPtr</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>peek</span> <span class='hs-varid'>errPtrPtr</span> <a name="line-183"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>errPtr</span> <span class='hs-varop'>==</span> <span class='hs-varid'>nullPtr</span> <a name="line-184"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>result</span> <a name="line-185"></a> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>gerror</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>peek</span> <span class='hs-varid'>errPtr</span> <a name="line-186"></a> <span class='hs-varid'>g_error_free</span> <span class='hs-layout'>(</span><span class='hs-varid'>castPtr</span> <span class='hs-varid'>errPtr</span><span class='hs-layout'>)</span> <a name="line-187"></a> <span class='hs-varid'>handler</span> <span class='hs-varid'>gerror</span> <a name="line-188"></a> <a name="line-189"></a><a name="throwGError"></a><span class='hs-comment'>-- | Use this if you need to explicitly throw a GError or re-throw an existing</span> <a name="line-190"></a><span class='hs-comment'>-- GError that you do not wish to handle.</span> <a name="line-191"></a><span class='hs-definition'>throwGError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GError</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-192"></a><span class='hs-definition'>throwGError</span> <span class='hs-varid'>gerror</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>evaluate</span> <span class='hs-layout'>(</span><span class='hs-varid'>throwDyn</span> <span class='hs-varid'>gerror</span><span class='hs-layout'>)</span> <a name="line-193"></a> <a name="line-194"></a><a name="catchGError"></a><span class='hs-comment'>-- | This will catch any GError exception. The handler function will receive the</span> <a name="line-195"></a><span class='hs-comment'>-- raw GError. This is probably only useful when you want to take some action</span> <a name="line-196"></a><span class='hs-comment'>-- that does not depend on which GError exception has occured, otherwise it</span> <a name="line-197"></a><span class='hs-comment'>-- would be better to use either 'catchGErrorJust' or 'catchGErrorJustDomain'.</span> <a name="line-198"></a><span class='hs-comment'>-- For example:</span> <a name="line-199"></a><span class='hs-comment'>--</span> <a name="line-200"></a><span class='hs-comment'>-- > catchGError</span> <a name="line-201"></a><span class='hs-comment'>-- > (do ...</span> <a name="line-202"></a><span class='hs-comment'>-- > ...)</span> <a name="line-203"></a><span class='hs-comment'>-- > (\(GError dom code msg) -> fail msg)</span> <a name="line-204"></a><span class='hs-comment'>--</span> <a name="line-205"></a><span class='hs-definition'>catchGError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ The computation to run</span> <a name="line-206"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Handler to invoke if an exception is raised</span> <a name="line-207"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-208"></a><span class='hs-definition'>catchGError</span> <span class='hs-varid'>action</span> <span class='hs-varid'>handler</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>catchDyn</span> <span class='hs-varid'>action</span> <span class='hs-varid'>handler</span> <a name="line-209"></a> <a name="line-210"></a><a name="catchGErrorJust"></a><span class='hs-comment'>-- | This will catch just a specific GError exception. If you need to catch a</span> <a name="line-211"></a><span class='hs-comment'>-- range of related errors, 'catchGErrorJustDomain' is probably more</span> <a name="line-212"></a><span class='hs-comment'>-- appropriate. Example:</span> <a name="line-213"></a><span class='hs-comment'>--</span> <a name="line-214"></a><span class='hs-comment'>-- > do image <- catchGErrorJust PixbufErrorCorruptImage</span> <a name="line-215"></a><span class='hs-comment'>-- > loadImage</span> <a name="line-216"></a><span class='hs-comment'>-- > (\errorMessage -> do log errorMessage</span> <a name="line-217"></a><span class='hs-comment'>-- > return mssingImagePlaceholder)</span> <a name="line-218"></a><span class='hs-comment'>--</span> <a name="line-219"></a><span class='hs-definition'>catchGErrorJust</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GErrorClass</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>err</span> <span class='hs-comment'>-- ^ The error to catch</span> <a name="line-220"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ The computation to run</span> <a name="line-221"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Handler to invoke if an exception is raised</span> <a name="line-222"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-223"></a><span class='hs-definition'>catchGErrorJust</span> <span class='hs-varid'>code</span> <span class='hs-varid'>action</span> <span class='hs-varid'>handler</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>catchGError</span> <span class='hs-varid'>action</span> <span class='hs-varid'>handler'</span> <a name="line-224"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>handler'</span> <span class='hs-varid'>gerror</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-varid'>domain</span> <span class='hs-varid'>code'</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span> <a name="line-225"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>domain</span> <span class='hs-varop'>==</span> <span class='hs-varid'>gerrorDomain</span> <span class='hs-varid'>code</span> <a name="line-226"></a> <span class='hs-varop'>&&</span> <span class='hs-varid'>code'</span> <span class='hs-varop'>==</span> <span class='hs-varid'>fromEnum</span> <span class='hs-varid'>code</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>handler</span> <span class='hs-varid'>msg</span> <a name="line-227"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwGError</span> <span class='hs-varid'>gerror</span> <a name="line-228"></a> <a name="line-229"></a><a name="catchGErrorJustDomain"></a><span class='hs-comment'>-- | Catch all GErrors from a particular error domain. The handler function</span> <a name="line-230"></a><span class='hs-comment'>-- should just deal with one error enumeration type. If you need to catch</span> <a name="line-231"></a><span class='hs-comment'>-- errors from more than one error domain, use this function twice with an</span> <a name="line-232"></a><span class='hs-comment'>-- appropriate handler functions for each.</span> <a name="line-233"></a><span class='hs-comment'>--</span> <a name="line-234"></a><span class='hs-comment'>-- > catchGErrorJustDomain</span> <a name="line-235"></a><span class='hs-comment'>-- > loadImage</span> <a name="line-236"></a><span class='hs-comment'>-- > (\err message -> case err of</span> <a name="line-237"></a><span class='hs-comment'>-- > PixbufErrorCorruptImage -> ...</span> <a name="line-238"></a><span class='hs-comment'>-- > PixbufErrorInsufficientMemory -> ...</span> <a name="line-239"></a><span class='hs-comment'>-- > PixbufErrorUnknownType -> ...</span> <a name="line-240"></a><span class='hs-comment'>-- > _ -> ...)</span> <a name="line-241"></a><span class='hs-comment'>--</span> <a name="line-242"></a><span class='hs-definition'>catchGErrorJustDomain</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GErrorClass</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ The computation to run</span> <a name="line-243"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>err</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Handler to invoke if an exception is raised</span> <a name="line-244"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-245"></a><span class='hs-definition'>catchGErrorJustDomain</span> <span class='hs-varid'>action</span> <span class='hs-layout'>(</span><span class='hs-varid'>handler</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-246"></a> <span class='hs-varid'>catchGError</span> <span class='hs-varid'>action</span> <span class='hs-varid'>handler'</span> <a name="line-247"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>handler'</span> <span class='hs-varid'>gerror</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-varid'>domain</span> <span class='hs-varid'>code</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span> <a name="line-248"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>domain</span> <span class='hs-varop'>==</span> <span class='hs-varid'>gerrorDomain</span> <span class='hs-layout'>(</span><span class='hs-varid'>undefined</span><span class='hs-keyglyph'>::</span><span class='hs-varid'>err</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>handler</span> <span class='hs-layout'>(</span><span class='hs-varid'>toEnum</span> <span class='hs-varid'>code</span><span class='hs-layout'>)</span> <span class='hs-varid'>msg</span> <a name="line-249"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwGError</span> <span class='hs-varid'>gerror</span> <a name="line-250"></a> <a name="line-251"></a><a name="handleGError"></a><span class='hs-comment'>-- | A verson of 'catchGError' with the arguments swapped around.</span> <a name="line-252"></a><span class='hs-comment'>--</span> <a name="line-253"></a><span class='hs-comment'>-- > handleGError (\(GError dom code msg) -> ...) $</span> <a name="line-254"></a><span class='hs-comment'>-- > ...</span> <a name="line-255"></a><span class='hs-comment'>--</span> <a name="line-256"></a><span class='hs-definition'>handleGError</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-257"></a><span class='hs-definition'>handleGError</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>catchGError</span> <a name="line-258"></a> <a name="line-259"></a><a name="handleGErrorJust"></a><span class='hs-comment'>-- | A verson of 'handleGErrorJust' with the arguments swapped around.</span> <a name="line-260"></a><span class='hs-definition'>handleGErrorJust</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GErrorClass</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-261"></a><span class='hs-definition'>handleGErrorJust</span> <span class='hs-varid'>code</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-layout'>(</span><span class='hs-varid'>catchGErrorJust</span> <span class='hs-varid'>code</span><span class='hs-layout'>)</span> <a name="line-262"></a> <a name="line-263"></a><a name="handleGErrorJustDomain"></a><span class='hs-comment'>-- | A verson of 'handleGErrorJustDomain' with the arguments swapped around.</span> <a name="line-264"></a><span class='hs-definition'>handleGErrorJustDomain</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GErrorClass</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>err</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-265"></a><span class='hs-definition'>handleGErrorJustDomain</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>catchGErrorJustDomain</span> <a name="line-266"></a> <a name="line-267"></a><a name="failOnGError"></a><span class='hs-comment'>-- | Catch all GError exceptions and convert them into a general failure.</span> <a name="line-268"></a><span class='hs-definition'>failOnGError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <a name="line-269"></a><span class='hs-definition'>failOnGError</span> <span class='hs-varid'>action</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>catchGError</span> <span class='hs-varid'>action</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-varid'>dom</span> <span class='hs-varid'>code</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>fail</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span> <a name="line-270"></a> <a name="line-271"></a><span class='hs-keyword'>foreign</span> <span class='hs-keyword'>import</span> <span class='hs-keyword'>ccall</span> <span class='hs-keyword'>unsafe</span> <span class='hs-str'>"g_error_free"</span> <a name="line-272"></a> <span class='hs-varid'>g_error_free</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> </pre></body> </html>