Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > bab1cacd8e2fabe194c2f4c3efef49f3 > files > 132

ghc-glib-devel-0.11.2-3.fc14.i686.rpm

<?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'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ptr</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;-</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'>-- &gt; instance GErrorClass PixbufError where</span>
<a name="line-149"></a><a name="GErrorClass"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</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'>-&gt;</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'>-- &gt; propagateGError $ \gerrorPtr -&gt;</span>
<a name="line-163"></a><span class='hs-comment'>-- &gt; {# 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'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; checkGError</span>
<a name="line-174"></a><span class='hs-comment'>-- &gt; (\gerrorPtr -&gt; {# call g_some_function_that_might_return_an_error #} a b gerrorPtr)</span>
<a name="line-175"></a><span class='hs-comment'>-- &gt; (\(GError domain code msg) -&gt; ...)</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'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>&lt;-</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'>&lt;-</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'>&lt;-</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'>-&gt;</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'>-- &gt; catchGError</span>
<a name="line-201"></a><span class='hs-comment'>-- &gt; (do ...</span>
<a name="line-202"></a><span class='hs-comment'>-- &gt; ...)</span>
<a name="line-203"></a><span class='hs-comment'>-- &gt; (\(GError dom code msg) -&gt; 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'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>GError</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; do image &lt;- catchGErrorJust PixbufErrorCorruptImage</span>
<a name="line-215"></a><span class='hs-comment'>-- &gt; loadImage</span>
<a name="line-216"></a><span class='hs-comment'>-- &gt; (\errorMessage -&gt; do log errorMessage</span>
<a name="line-217"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>&amp;&amp;</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'>-- &gt; catchGErrorJustDomain</span>
<a name="line-235"></a><span class='hs-comment'>-- &gt; loadImage</span>
<a name="line-236"></a><span class='hs-comment'>-- &gt; (\err message -&gt; case err of</span>
<a name="line-237"></a><span class='hs-comment'>-- &gt; PixbufErrorCorruptImage -&gt; ...</span>
<a name="line-238"></a><span class='hs-comment'>-- &gt; PixbufErrorInsufficientMemory -&gt; ...</span>
<a name="line-239"></a><span class='hs-comment'>-- &gt; PixbufErrorUnknownType -&gt; ...</span>
<a name="line-240"></a><span class='hs-comment'>-- &gt; _ -&gt; ...)</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'>=&gt;</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'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; handleGError (\(GError dom code msg) -&gt; ...) $</span>
<a name="line-254"></a><span class='hs-comment'>-- &gt; ...</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'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GErrorMessage</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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>