summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2007-01-17 23:09:09 +0000
committerRichard Hughes <richard@hughsie.com>2007-01-17 23:09:09 +0000
commite34bbaa10953dda54a043439c6ef53d0c64d4268 (patch)
tree50f6a48b9bf3b90d34ca193c0d62bc94f0e7ee34 /docs
initial import of my local version of ohm
Diffstat (limited to 'docs')
-rw-r--r--docs/Makefile.am37
-rw-r--r--docs/config.xsl9
-rw-r--r--docs/dbus-interface.xml341
-rw-r--r--docs/docbook.css50
-rw-r--r--docs/faq.xml124
-rw-r--r--docs/index.html395
-rw-r--r--docs/index.xml.in42
-rw-r--r--docs/introduction.xml322
-rw-r--r--docs/ohm-logo.pngbin0 -> 758 bytes
-rw-r--r--docs/ohm-logo.svg150
-rw-r--r--docs/ohm-sessions.pngbin0 -> 35021 bytes
-rw-r--r--docs/ohm-sessions.svg393
-rw-r--r--docs/ohm-structure.pngbin0 -> 38899 bytes
-rw-r--r--docs/ohm-structure.svg435
14 files changed, 2298 insertions, 0 deletions
diff --git a/docs/Makefile.am b/docs/Makefile.am
new file mode 100644
index 0000000..676dd6a
--- /dev/null
+++ b/docs/Makefile.am
@@ -0,0 +1,37 @@
+IMAGE_FILES = \
+ ohm-logo.png \
+ ohm-logo.svg \
+ ohm-structure.png \
+ ohm-structure.svg \
+ ohm-sessions.png \
+ ohm-sessions.svg
+
+SPEC_XML_FILES = \
+ index.xml \
+ introduction.xml \
+ faq.xml \
+ dbus-interface.xml
+
+SPEC_HTML_FILES = \
+ index.html
+
+htmldocdir = $(DOCDIR)
+htmldoc_DATA = index.html
+
+if DOCBOOK_DOCS_ENABLED
+
+index.html : introduction.xml
+ $(XMLTO) html-nochunks -m config.xsl index.xml
+endif # DOCBOOK_DOCS_ENABLED
+
+clean-local:
+ rm -f *~
+ rm -f *.html
+
+EXTRA_DIST = \
+ index.xml.in \
+ config.xsl \
+ docbook.css \
+ $(SPEC_XML_FILES) \
+ $(IMAGE_FILES) \
+ $(SPEC_HTML_FILES)
diff --git a/docs/config.xsl b/docs/config.xsl
new file mode 100644
index 0000000..1ae0c22
--- /dev/null
+++ b/docs/config.xsl
@@ -0,0 +1,9 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+ <xsl:param name="html.stylesheet" select="'docbook.css'"/>
+ <xsl:param name="use.id.as.filename" select="1"/>
+ <xsl:param name="chunk.section.depth" select="0"/>
+
+</xsl:stylesheet>
diff --git a/docs/dbus-interface.xml b/docs/dbus-interface.xml
new file mode 100644
index 0000000..35d383b
--- /dev/null
+++ b/docs/dbus-interface.xml
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- CVSID: $Id: dbus-interface.xml 1820 2007-01-14 23:24:00Z rhughes $ -->
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="dbus-interface">
+ <title>DBUS Interface</title>
+ <para>
+ This API is currently unstable and is likely to change in the future.
+ </para>
+
+ <sect1 id="pm-intro">
+ <title>Introduction</title>
+ <para>
+ Open Hardware Manager exposes a DBUS API for programs to obtain information about
+ the power state and to change it if required.
+ </para>
+ <para>
+ The following constants are used to uniquely refer to the session-wide
+ Open Hardware Manager object when making DBUS method calls:
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>DBUS Service:</entry>
+ <entry><literal>org.freedesktop.ohm</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect1>
+
+ <sect1 id="pm-manager">
+ <title>Manager functionality</title>
+ <para>
+ The manager is the core of <literal>ohmd</literal> and processes all
+ core functionality such as loading plugins.
+ </para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>DBUS Object Path:</entry>
+ <entry><literal>/org/freedesktop/ohm/Manager</literal></entry>
+ </row>
+ <row>
+ <entry>DBUS Interface:</entry>
+ <entry><literal>org.freedesktop.ohm.Manager</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <sect2 id="pm-manager-keys">
+ <title>
+ <literal>Exported keys</literal>
+ </title>
+ <para>
+ Keys exported by the manager:
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Key</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>manager.version.major</literal></entry>
+ <entry>The major version number</entry>
+ </row>
+ <row>
+ <entry><literal>manager.version.minor</literal></entry>
+ <entry>The minor version number</entry>
+ </row>
+ <row>
+ <entry><literal>manager.version.patch</literal></entry>
+ <entry>The patch version number</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2 id="pm-manager-GetVersion">
+ <title>
+ <literal>GetVersion()</literal>
+ </title>
+ <para>
+ Gets the version of the <literal>ohmd</literal> daemon.
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Direction</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>out</entry>
+ <entry>string</entry>
+ <entry>The version, e.g. 0.2.3</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2 id="pm-manager-GetPlugins">
+ <title>
+ <literal>GetPlugins()</literal>
+ </title>
+ <para>
+ Gets the plugings currently loaded in the daemon.
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Direction</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>out</entry>
+ <entry>string array</entry>
+ <entry>A list of plugins, for instance,
+ <literal>backlight</literal>, <literal>heat-pol</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+ </sect1>
+
+ <sect1 id="pm-keystore">
+ <title>Keystore functionality</title>
+ <para>
+ The keystore is the configuration plugin and processes all
+ preferences functionality such as the getting and setting of keys.
+ Session software can attempt to redefine any keys for the current user
+ but these may not be marked override and the operation may fail.
+ </para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>DBUS Object Path:</entry>
+ <entry><literal>/org/freedesktop/ohm/Keystore</literal></entry>
+ </row>
+ <row>
+ <entry>DBUS Interface:</entry>
+ <entry><literal>org.freedesktop.ohm.Keystore</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <sect2 id="pm-keystore-GetKey">
+ <title>
+ <literal>GetKey()</literal>
+ </title>
+ <para>
+ Gets a 32 bit signed integer value.
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Direction</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>in</entry>
+ <entry>string</entry>
+ <entry>the key name, e.g. <literal>ac.state</literal></entry>
+ </row>
+ <row>
+ <entry>out</entry>
+ <entry>integer</entry>
+ <entry></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2 id="pm-keystore-SetKey">
+ <title>
+ <literal>SetKey()</literal>
+ </title>
+ <para>
+ Sets a 32 bit signed integer value.
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Direction</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>in</entry>
+ <entry>string</entry>
+ <entry>the key name, e.g. <literal>ac.state</literal></entry>
+ </row>
+ <row>
+ <entry>in</entry>
+ <entry>integer</entry>
+ <entry></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2 id="pm-keystore-AddNotifyKey">
+ <title>
+ <literal>AddNotifyKey()</literal>
+ </title>
+ <para>
+ Tells OHM that an application or plugin wants notification of this key
+ change.
+ This prevents uninteresting keys from being changed with no action
+ causing unnecessary context switches and processor usage.
+ <literal>KeyChanged</literal> signals will not be sent unless at least
+ one application has requested notifications.
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Direction</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>in</entry>
+ <entry>string</entry>
+ <entry>the key name, e.g. <literal>ac.state</literal></entry>
+ </row>
+ <row>
+ <entry>in</entry>
+ <entry>integer</entry>
+ <entry></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="pm-backlight">
+ <title>Backlight Adjustment</title>
+ <para>
+ Backlight brightness and state can be changed on most backlight hardware.
+ These are the optional DBUS methods for controlling the brightness of
+ the backlight.
+ </para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>DBUS Object Path:</entry>
+ <entry><literal>/org/freedesktop/ohm/Backlight</literal></entry>
+ </row>
+ <row>
+ <entry>DBUS Interface:</entry>
+ <entry><literal>org.freedesktop.ohm.Backlight</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <sect2 id="pm-backlight-keys">
+ <title>
+ <literal>Exported keys</literal>
+ </title>
+ <para>
+ Keys exported by this plugin:
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Key</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry><literal>backlight.value_ac</literal></entry>
+ <entry>Brightness in percentage when on AC</entry>
+ </row>
+ <row>
+ <entry><literal>backlight.value_battery</literal></entry>
+ <entry>Brightness in percentage when on battery</entry>
+ </row>
+ <row>
+ <entry><literal>backlight.value_idle</literal></entry>
+ <entry>Brightness in percentage when idle</entry>
+ </row>
+ <row>
+ <entry><literal>backlight.time_idle</literal></entry>
+ <entry>
+ The amount of time in seconds before the backlight is put
+ into idle mode, or zero to disable.
+ Idle mode is typically dimming for most backlight devices.
+ </entry>
+ </row>
+ <row>
+ <entry><literal>backlight.time_off</literal></entry>
+ <entry>
+ The amount of time in seconds before the backlight is turned
+ off, or zero to disable.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ </sect1>
+
+</chapter>
diff --git a/docs/docbook.css b/docs/docbook.css
new file mode 100644
index 0000000..50292d1
--- /dev/null
+++ b/docs/docbook.css
@@ -0,0 +1,50 @@
+body {
+ font-family: luxi sans,sans-serif;
+}
+
+table {
+ border: 0px;
+ width: 100%;
+}
+
+div.informaltable {
+ border: solid 1px;
+ background: #eeeeff;
+ width: 50%;
+}
+
+code.email {
+ color: #a00000;
+}
+
+th {
+ padding: 2px;
+ border: 0px;
+}
+
+hr {
+ border: 0;
+ width: 80%;
+ background-color: #a00000;
+ height: 1px;
+}
+
+td {
+ border: 0px;
+ padding: 5px;
+}
+
+tr {
+ border: 0px;
+ padding: 5px;
+}
+
+a {
+ color: #000000;
+ text-decoration: none;
+}
+
+a:hover {
+ color: #a00000;
+ text-decoration: none;
+}
diff --git a/docs/faq.xml b/docs/faq.xml
new file mode 100644
index 0000000..2081ae9
--- /dev/null
+++ b/docs/faq.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="faq">
+ <title>Frequently Asked Questions</title>
+ <para>
+ Please read through these common questions and answers before asking
+ developers.
+ </para>
+
+ <sect1 id="faq-sessionpolicy">
+ <title>
+ How does OHM fit in with other session policy agents?
+ </title>
+ <para>
+ At the moment, no distributions ship OHM, so there is no problem.
+ When they do, session power daemons will talk to <literal>hald</literal>
+ and <literal>ohmd</literal> together, and there should be no visible
+ changes to the user.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-specificdevice">
+ <title>
+ Why not just do a specific device hack for all the different
+ embedded hardware?
+ </title>
+ <para>
+ As lots of manufacturers are hacking the same thing, over and over.
+ We need some sort of central common framework.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-lgpl">
+ <title>
+ So it's LGPL... does that mean some of the code is closed source?
+ </title>
+ <para>
+ No. It just means that code protected by intellectual property laws
+ can be used by manufacturers, but OHM works really well without any
+ non-free stuff.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-installcode">
+ <title>
+ Can I install the latest stable code?
+ </title>
+ <para>
+ No, at the moment it is proof of concept and only really useful for
+ developers. Feel free to look at the code and spec and give feedback,
+ but please don't expect anything to actually work well yet.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-releasedate">
+ <title>
+ What is the release date plan for OHM?
+ </title>
+ <para>
+ Currently we are aiming at a 2 month stakeholder involvement prototype
+ period, and then 10 months of code polishing and maturing.
+ That gives an approximate release date of January 2008
+ </para>
+ </sect1>
+
+ <sect1 id="faq-systemprefs">
+ <title>
+ Do you need to use system GConf for the system preferences?
+ </title>
+ <para>
+ No. We plan to use a flat file for minimum dependencies and speed,
+ and also each file is going to be really small and simple.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-noxml">
+ <title>
+ Is OHM using XML to define the policy rules?
+ </title>
+ <para>
+ No, as we don't need to.
+ We are using compiled logic for speed and low dependencies.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-whysessionlayer">
+ <title>
+ Why include a session layer for embedded appliances?
+ </title>
+ <para>
+ Devices can omit the session layer, and talk directly to OHM on the
+ system bus. This removes the ability to do fast user switching or
+ have multiple logged in users and does reduce security.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-whysinglehash">
+ <title>
+ Why are all the keys exposed in a single hash table?
+ </title>
+ <para>
+ Plugins have to query to state of other plugins.
+ To store the state of each plugin in itself, we would have to do
+ inter-plugin methods, and expose the SetKey and GetKey methods on every
+ plugin.
+ We can also optimise the global keystore for a fast hash lookup to avoid
+ scalability problems.
+ This also makes it easier to code as the keystore can just be a
+ compiled <literal>.o</literal> object rather than a shared library.
+ </para>
+ </sect1>
+
+ <sect1 id="faq-restartdeps">
+ <title>
+ Will OHM break if I restart <literal>messagebus</literal> or
+ <literal>hald</literal>?
+ </title>
+ <para>
+ Yes. Please restart your computer if you want to restart these daemons.
+ </para>
+ </sect1>
+
+</chapter>
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..2158200
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,395 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Open Hardware Manager 0.0.1 Documentation</title><link rel="stylesheet" href="docbook.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.1"><meta name="description" content='Executive Summary
+ OHM is a small open source systems daemon which sits above HAL and
+ abstracts out common hardware management tasks such as system wide
+ inhibit action control and controlling heat dissipation on embedded
+ devices.
+ OHM is built using a lightweight plugin architecture.
+ Each plugin can query data from HAL or execute methods on HAL devices
+ and expose preferences for session programs to modify.
+ OHM is product and vendor neutral and is currently being developed by
+ a small team of developers.
+
+ OHM : "Resistance is futile"
+ '></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="index"></a>Open Hardware Manager 0.0.1 Documentation</h1></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Richard</span> <span class="surname">Hughes</span></h3><div class="affiliation"><div class="address"><p><br>
+            <code class="email">&lt;<a href="mailto:richard@hughsie.com">richard@hughsie.com</a>&gt;</code><br>
+          </p></div></div></div></div></div><div><p class="releaseinfo">Version 0.0.1</p></div><div><div class="abstract"><p class="title"><b>Executive Summary</b></p><p>
+ OHM is a small open source systems daemon which sits above HAL and
+ abstracts out common hardware management tasks such as system wide
+ inhibit action control and controlling heat dissipation on embedded
+ devices.
+ OHM is built using a lightweight plugin architecture.
+ Each plugin can query data from HAL or execute methods on HAL devices
+ and expose preferences for session programs to modify.
+ OHM is product and vendor neutral and is currently being developed by
+ a small team of developers.
+ </p><p>
+ OHM : <span class="emphasis"><em>"Resistance is futile"</em></span>
+ </p></div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="#introduction">1. Open Hardware Manager Introduction</a></span></dt><dd><dl><dt><span class="sect1"><a href="#introduction-description">Overall Description</a></span></dt><dt><span class="sect1"><a href="#introduction-plugins">Plugins</a></span></dt><dt><span class="sect1"><a href="#introduction-deps">Dependencies</a></span></dt></dl></dd><dt><span class="chapter"><a href="#dbus-interface">2. DBUS Interface</a></span></dt><dd><dl><dt><span class="sect1"><a href="#pm-intro">Introduction</a></span></dt><dt><span class="sect1"><a href="#pm-manager">Manager functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-manager-keys">
+ <code class="literal">Exported keys</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetVersion">
+ <code class="literal">GetVersion()</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetPlugins">
+ <code class="literal">GetPlugins()</code>
+ </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-keystore">Keystore functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-keystore-GetKey">
+ <code class="literal">GetKey()</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-SetKey">
+ <code class="literal">SetKey()</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-AddNotifyKey">
+ <code class="literal">AddNotifyKey()</code>
+ </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-backlight">Backlight Adjustment</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-backlight-keys">
+ <code class="literal">Exported keys</code>
+ </a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#faq">3. Frequently Asked Questions</a></span></dt><dd><dl><dt><span class="sect1"><a href="#faq-sessionpolicy">
+ How does OHM fit in with other session policy agents?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-specificdevice">
+ Why not just do a specific device hack for all the different
+ embedded hardware?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-lgpl">
+ So it's LGPL... does that mean some of the code is closed source?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-installcode">
+ Can I install the latest stable code?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-releasedate">
+ What is the release date plan for OHM?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-systemprefs">
+ Do you need to use system GConf for the system preferences?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-noxml">
+ Is OHM using XML to define the policy rules?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-whysessionlayer">
+ Why include a session layer for embedded appliances?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-whysinglehash">
+ Why are all the keys exposed in a single hash table?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-restartdeps">
+ Will OHM break if I restart <code class="literal">messagebus</code> or
+ <code class="literal">hald</code>?
+ </a></span></dt></dl></dd></dl></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="introduction"></a>Chapter 1. Open Hardware Manager Introduction</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#introduction-description">Overall Description</a></span></dt><dt><span class="sect1"><a href="#introduction-plugins">Plugins</a></span></dt><dt><span class="sect1"><a href="#introduction-deps">Dependencies</a></span></dt></dl></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introduction-description"></a>Overall Description</h2></div></div></div><p>
+ OHM is a small open source systems daemon which sits above HAL and
+ abstracts out common hardware management tasks such as:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ System wide power management statistics (for instance calculating
+ hysteresis of battery curves).
+ </p></li><li><p>
+ Managing system wide inhibit actions, for instance system
+ firmware updating.
+ </p></li><li><p>
+ Controlling heat dissipation on embedded and PC devices.
+ </p></li></ul></div><p>
+ OHM is built using a plugin architecture with a low-overhead messaging
+ structure.
+ This gives a very configurable base system that can be configured in many
+ different ways.
+ Each plugin can query data from HAL or execute methods on HAL devices and
+ expose preferences interfaces for session-space to use.
+ </p><div class="mediaobject" align="center"><a name="ohm-structure"></a><img src="ohm-structure.png" align="middle"></div><p>
+ OHM is LGPL licensed to allow proprietary licensed plug-ins to be used
+ where absolutely required.
+ It is also uses the minimum of memory and processor requirement to fulfill
+ the task.
+ This makes it suitable for use on the latest smart-phones, the OLPC device
+ or any other embedded products such as set top boxes.
+ </p><p>
+ HAL has traditionally been seen too heavyweight for use on an embedded device.
+ While this was once true, there have been very many developers working on
+ adding conditional compilation to parts of HAL, and to reduce memory usage.
+ This can be seen with the startup speed of 0.5.9 being 40% than of 0.5.8.
+ Context switching has been reduced, and memory pressure on coldplug has been
+ reduced for devices with a small amount of devices.
+ It is expected that <code class="literal">hald</code> will start in the few hundred
+ millisecond range and consume less than half a megabyte of RAM at coldplug.
+ </p><p>
+ Using HAL allows us to use a common framework for hardware management,
+ which means plugins designed for one architecture or chip will work on
+ any other system.
+ Working together is the best way to get high quality, maintainable code
+ rather than all the hacky systems we have now.
+ </p><div class="mediaobject" align="center"><a name="ohm-sessions"></a><img src="ohm-sessions.png" align="middle"></div><p>
+ Proof of concept code is available on the project page.
+ There are no tarball releases yet, checking out using git is the best
+ option.
+ </p><p>
+ OHM comprises:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ The <code class="literal">ohmd</code> system daemon which co-ordinates the
+ rules and acts as a keystore for multiple users.
+ </p></li><li><p>
+ The interface specification which outlines core
+ <code class="literal">ohmd</code> functionality
+ </p></li><li><p>
+ A method for plugins to request notification when keys change, for
+ example when the system AC state is changed.
+ </p></li><li><p>
+ The test suite which tests functionality
+ </p></li></ul></div><p>
+ OHM is very suitable for embedded devices that need to manage power, heat
+ and other critical tasks early in the boot sequence.
+ Using HAL, it provides an abstract method for all plugins to be written in
+ a generic way, not tied to the specific implementation of the device.
+ </p><p>
+ What OHM is not:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ A power saving daemon.
+ It is not doing power saving specifically, it is just doing device
+ specific rules that manage power and heat dissipation and other
+ hardware specific stuff.
+ </p></li><li><p>
+ An abstraction of HAL. HAL acts as the input and the output of OHM,
+ and OHM enforces policy for HAL.
+ </p></li><li><p>
+ A huge daemon with lots of dependencies.
+ </p></li><li><p>
+ API or ABI stable. Expect the ABI and API to change on a regular
+ basis until we ship 1.0.0.
+ </p></li><li><p>
+ Targeted to a particular architecture or platform.
+ </p></li><li><p>
+ Produced by any one vendor.
+ There are many contributors helping to get this done.
+ </p></li></ul></div><p>
+ Why not do everything in a session daemon?:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Sometimes we need to start very early in the boot sequence.
+ </p></li><li><p>
+ We don't want to die if X dies.
+ </p></li><li><p>
+ On a server with 100 logged in users we don't want an instance for
+ each user.
+ </p></li><li><p>
+ We need to apply policy at boot-up or before X starts.
+ </p></li></ul></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introduction-plugins"></a>Plugins</h2></div></div></div><p>
+ Plugins have keys and policy, and also install a default system
+ preferences file.
+ </p><p>
+ We need to set system preferences when there is no user logged in or we
+ are very early in the boot sequence.
+ We do this with each plugin installing a text file with the plugin key
+ name, the value, and optionally the public switch.
+ </p><p>
+ The core setup file is read from <code class="filename">/etc/ohm/core</code> and
+ plugin preferences are read from <code class="filename">/etc/ohm/plugins/{name}</code>
+ Comments are lines with first character <code class="literal">#</code> and then the
+ rest of the line is ignored.
+ Files are flat text with the following formal description,
+ <code class="literal">plugin_prefix.key value type public</code>
+ </p><div class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Important</h3><p>
+ There is a single space between the values.
+ Line endings have to be UNIX not WIN or MAC.
+ Parsing is very strict, and <code class="literal">ohmd</code> will exit with an
+ error if the syntax is not perfect. This is by design.
+ </p></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+ Public is only set if the key can be changed by the session, and if the
+ key is tried to be set, the set method will fail.
+ This is a way to enforce fine-grained rules on users when writing
+ PolicyKit rules for every action would be too great an overhead.
+ </p></div><p>
+ Plugins can tell <code class="literal">ohmd</code> that other plugins are required
+ for certain functionality, for instance, the backlight unit on a mobile
+ phone may require the temperature module to be present, so it can do the
+ temperature shutdown checks.
+ This is done with <code class="literal">ohm_module_require()</code>.
+ <code class="literal">ohmd</code> daemon will fail to load if any required plugin
+ is not present after the plugins have finished initializing.
+ </p><p>
+ Plugins can also tell <code class="literal">ohmd</code> that other plugins are suggested for certain
+ functionality, for instance, the backlight unit may work best when the
+ battery plugin is loaded so we can dim when we are low on power.
+ This is done with <code class="literal">ohm_module_suggest()</code>.
+ <code class="literal">ohmd</code> daemon will print a message to the console if any
+ suggested plugin is not present.
+ </p><p>
+ Plugins can also tell <code class="literal">ohmd</code> that other plugins are banned, for instance,
+ a proprietary battery discharge plugin maybe incompatible with the
+ standard battery plugin.
+ This is done with <code class="literal">ohm_module_prevent()</code>.
+ <code class="literal">ohmd</code> will fail to load if any prevented plugin is
+ manually loaded or loaded through a dependency of another plugin.
+ </p><p>
+ In <code class="literal">ohmd</code>, keys are created read/write by the plugin.
+ Other plugins can watch for changes on these keys (even on other modules)
+ using <code class="literal">ohm_key_monitor()</code>.
+ The callback will be issued local to the plugin when the state of this
+ key changes.
+ </p><p>
+ NOTE: There is no ordering of priority (yet?) of monitored keys.
+ Make sure that policy per key is kept to one plugin, else strange
+ races might start happening.
+ </p><p>
+ A library called <code class="literal">libohm</code> allows system and session
+ programs to easily interface with <code class="literal">ohmd</code>.
+ This library will remove the implementation detail from plugins and
+ session applications.
+ This library, like the rest of OHM will not be API or ABI stable until
+ version 1.0.0 is released.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="introduction-deps"></a>Dependencies</h2></div></div></div><p>
+ OHM is lightweight.
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ GLib 2.10.0 (required)
+ </p></li><li><p>
+ DBUS 0.70 (required)
+ </p></li><li><p>
+ HAL 0.5.8 (required)
+ </p></li><li><p>
+ PolicyKit (optional)
+ </p></li><li><p>
+ ConsoleKit (optional)
+ </p></li></ul></div></div></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="dbus-interface"></a>Chapter 2. DBUS Interface</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#pm-intro">Introduction</a></span></dt><dt><span class="sect1"><a href="#pm-manager">Manager functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-manager-keys">
+ <code class="literal">Exported keys</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetVersion">
+ <code class="literal">GetVersion()</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-manager-GetPlugins">
+ <code class="literal">GetPlugins()</code>
+ </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-keystore">Keystore functionality</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-keystore-GetKey">
+ <code class="literal">GetKey()</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-SetKey">
+ <code class="literal">SetKey()</code>
+ </a></span></dt><dt><span class="sect2"><a href="#pm-keystore-AddNotifyKey">
+ <code class="literal">AddNotifyKey()</code>
+ </a></span></dt></dl></dd><dt><span class="sect1"><a href="#pm-backlight">Backlight Adjustment</a></span></dt><dd><dl><dt><span class="sect2"><a href="#pm-backlight-keys">
+ <code class="literal">Exported keys</code>
+ </a></span></dt></dl></dd></dl></div><p>
+ This API is currently unstable and is likely to change in the future.
+ </p><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-intro"></a>Introduction</h2></div></div></div><p>
+ Open Hardware Manager exposes a DBUS API for programs to obtain information about
+ the power state and to change it if required.
+ </p><p>
+ The following constants are used to uniquely refer to the session-wide
+ Open Hardware Manager object when making DBUS method calls:
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Service:</td><td><code class="literal">org.freedesktop.ohm</code></td></tr></tbody></table></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-manager"></a>Manager functionality</h2></div></div></div><p>
+ The manager is the core of <code class="literal">ohmd</code> and processes all
+ core functionality such as loading plugins.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Object Path:</td><td><code class="literal">/org/freedesktop/ohm/Manager</code></td></tr><tr><td>DBUS Interface:</td><td><code class="literal">org.freedesktop.ohm.Manager</code></td></tr></tbody></table></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-manager-keys"></a>
+ <code class="literal">Exported keys</code>
+ </h3></div></div></div><p>
+ Keys exported by the manager:
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody><tr><td><code class="literal">manager.version.major</code></td><td>The major version number</td></tr><tr><td><code class="literal">manager.version.minor</code></td><td>The minor version number</td></tr><tr><td><code class="literal">manager.version.patch</code></td><td>The patch version number</td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-manager-GetVersion"></a>
+ <code class="literal">GetVersion()</code>
+ </h3></div></div></div><p>
+ Gets the version of the <code class="literal">ohmd</code> daemon.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>out</td><td>string</td><td>The version, e.g. 0.2.3</td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-manager-GetPlugins"></a>
+ <code class="literal">GetPlugins()</code>
+ </h3></div></div></div><p>
+ Gets the plugings currently loaded in the daemon.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>out</td><td>string array</td><td>A list of plugins, for instance,
+ <code class="literal">backlight</code>, <code class="literal">heat-pol</code></td></tr></tbody></table></div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-keystore"></a>Keystore functionality</h2></div></div></div><p>
+ The keystore is the configuration plugin and processes all
+ preferences functionality such as the getting and setting of keys.
+ Session software can attempt to redefine any keys for the current user
+ but these may not be marked override and the operation may fail.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Object Path:</td><td><code class="literal">/org/freedesktop/ohm/Keystore</code></td></tr><tr><td>DBUS Interface:</td><td><code class="literal">org.freedesktop.ohm.Keystore</code></td></tr></tbody></table></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-keystore-GetKey"></a>
+ <code class="literal">GetKey()</code>
+ </h3></div></div></div><p>
+ Gets a 32 bit signed integer value.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>in</td><td>string</td><td>the key name, e.g. <code class="literal">ac.state</code></td></tr><tr><td>out</td><td>integer</td><td> </td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-keystore-SetKey"></a>
+ <code class="literal">SetKey()</code>
+ </h3></div></div></div><p>
+ Sets a 32 bit signed integer value.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>in</td><td>string</td><td>the key name, e.g. <code class="literal">ac.state</code></td></tr><tr><td>in</td><td>integer</td><td> </td></tr></tbody></table></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-keystore-AddNotifyKey"></a>
+ <code class="literal">AddNotifyKey()</code>
+ </h3></div></div></div><p>
+ Tells OHM that an application or plugin wants notification of this key
+ change.
+ This prevents uninteresting keys from being changed with no action
+ causing unnecessary context switches and processor usage.
+ <code class="literal">KeyChanged</code> signals will not be sent unless at least
+ one application has requested notifications.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Direction</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>in</td><td>string</td><td>the key name, e.g. <code class="literal">ac.state</code></td></tr><tr><td>in</td><td>integer</td><td> </td></tr></tbody></table></div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pm-backlight"></a>Backlight Adjustment</h2></div></div></div><p>
+ Backlight brightness and state can be changed on most backlight hardware.
+ These are the optional DBUS methods for controlling the brightness of
+ the backlight.
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><tbody><tr><td>DBUS Object Path:</td><td><code class="literal">/org/freedesktop/ohm/Backlight</code></td></tr><tr><td>DBUS Interface:</td><td><code class="literal">org.freedesktop.ohm.Backlight</code></td></tr></tbody></table></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="pm-backlight-keys"></a>
+ <code class="literal">Exported keys</code>
+ </h3></div></div></div><p>
+ Keys exported by this plugin:
+ </p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th>Key</th><th>Description</th></tr></thead><tbody><tr><td><code class="literal">backlight.value_ac</code></td><td>Brightness in percentage when on AC</td></tr><tr><td><code class="literal">backlight.value_battery</code></td><td>Brightness in percentage when on battery</td></tr><tr><td><code class="literal">backlight.value_idle</code></td><td>Brightness in percentage when idle</td></tr><tr><td><code class="literal">backlight.time_idle</code></td><td>
+ The amount of time in seconds before the backlight is put
+ into idle mode, or zero to disable.
+ Idle mode is typically dimming for most backlight devices.
+ </td></tr><tr><td><code class="literal">backlight.time_off</code></td><td>
+ The amount of time in seconds before the backlight is turned
+ off, or zero to disable.
+ </td></tr></tbody></table></div></div></div></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="faq"></a>Chapter 3. Frequently Asked Questions</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#faq-sessionpolicy">
+ How does OHM fit in with other session policy agents?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-specificdevice">
+ Why not just do a specific device hack for all the different
+ embedded hardware?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-lgpl">
+ So it's LGPL... does that mean some of the code is closed source?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-installcode">
+ Can I install the latest stable code?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-releasedate">
+ What is the release date plan for OHM?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-systemprefs">
+ Do you need to use system GConf for the system preferences?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-noxml">
+ Is OHM using XML to define the policy rules?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-whysessionlayer">
+ Why include a session layer for embedded appliances?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-whysinglehash">
+ Why are all the keys exposed in a single hash table?
+ </a></span></dt><dt><span class="sect1"><a href="#faq-restartdeps">
+ Will OHM break if I restart <code class="literal">messagebus</code> or
+ <code class="literal">hald</code>?
+ </a></span></dt></dl></div><p>
+ Please read through these common questions and answers before asking
+ developers.
+ </p><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-sessionpolicy"></a>
+ How does OHM fit in with other session policy agents?
+ </h2></div></div></div><p>
+ At the moment, no distributions ship OHM, so there is no problem.
+ When they do, session power daemons will talk to <code class="literal">hald</code>
+ and <code class="literal">ohmd</code> together, and there should be no visible
+ changes to the user.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-specificdevice"></a>
+ Why not just do a specific device hack for all the different
+ embedded hardware?
+ </h2></div></div></div><p>
+ As lots of manufacturers are hacking the same thing, over and over.
+ We need some sort of central common framework.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-lgpl"></a>
+ So it's LGPL... does that mean some of the code is closed source?
+ </h2></div></div></div><p>
+ No. It just means that code protected by intellectual property laws
+ can be used by manufacturers, but OHM works really well without any
+ non-free stuff.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-installcode"></a>
+ Can I install the latest stable code?
+ </h2></div></div></div><p>
+ No, at the moment it is proof of concept and only really useful for
+ developers. Feel free to look at the code and spec and give feedback,
+ but please don't expect anything to actually work well yet.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-releasedate"></a>
+ What is the release date plan for OHM?
+ </h2></div></div></div><p>
+ Currently we are aiming at a 2 month stakeholder involvement prototype
+ period, and then 10 months of code polishing and maturing.
+ That gives an approximate release date of January 2008
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-systemprefs"></a>
+ Do you need to use system GConf for the system preferences?
+ </h2></div></div></div><p>
+ No. We plan to use a flat file for minimum dependencies and speed,
+ and also each file is going to be really small and simple.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-noxml"></a>
+ Is OHM using XML to define the policy rules?
+ </h2></div></div></div><p>
+ No, as we don't need to.
+ We are using compiled logic for speed and low dependencies.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-whysessionlayer"></a>
+ Why include a session layer for embedded appliances?
+ </h2></div></div></div><p>
+ Devices can omit the session layer, and talk directly to OHM on the
+ system bus. This removes the ability to do fast user switching or
+ have multiple logged in users and does reduce security.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-whysinglehash"></a>
+ Why are all the keys exposed in a single hash table?
+ </h2></div></div></div><p>
+ Plugins have to query to state of other plugins.
+ To store the state of each plugin in itself, we would have to do
+ inter-plugin methods, and expose the SetKey and GetKey methods on every
+ plugin.
+ We can also optimise the global keystore for a fast hash lookup to avoid
+ scalability problems.
+ This also makes it easier to code as the keystore can just be a
+ compiled <code class="literal">.o</code> object rather than a shared library.
+ </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="faq-restartdeps"></a>
+ Will OHM break if I restart <code class="literal">messagebus</code> or
+ <code class="literal">hald</code>?
+ </h2></div></div></div><p>
+ Yes. Please restart your computer if you want to restart these daemons.
+ </p></div></div></div></body></html>
diff --git a/docs/index.xml.in b/docs/index.xml.in
new file mode 100644
index 0000000..d381a92
--- /dev/null
+++ b/docs/index.xml.in
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
+
+<book id="index">
+ <bookinfo>
+ <title>Open Hardware Manager @VERSION@ Documentation</title>
+ <releaseinfo>Version @VERSION@</releaseinfo>
+ <abstract>
+ <title>Executive Summary</title>
+ <para>
+ OHM is a small open source systems daemon which sits above HAL and
+ abstracts out common hardware management tasks such as system wide
+ inhibit action control and controlling heat dissipation on embedded
+ devices.
+ OHM is built using a lightweight plugin architecture.
+ Each plugin can query data from HAL or execute methods on HAL devices
+ and expose preferences for session programs to modify.
+ OHM is product and vendor neutral and is currently being developed by
+ a small team of developers.
+ </para>
+ <para>
+ OHM : <emphasis>"Resistance is futile"</emphasis>
+ </para>
+ </abstract>
+ <date>January 17th, 2007</date>
+ <authorgroup>
+ <author>
+ <firstname>Richard</firstname>
+ <surname>Hughes</surname>
+ <affiliation>
+ <address>
+ <email>richard@hughsie.com</email>
+ </address>
+ </affiliation>
+ </author>
+ </authorgroup>
+ </bookinfo>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="introduction.xml" />
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="dbus-interface.xml" />
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="faq.xml" />
+
+</book>
diff --git a/docs/introduction.xml b/docs/introduction.xml
new file mode 100644
index 0000000..33334b6
--- /dev/null
+++ b/docs/introduction.xml
@@ -0,0 +1,322 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+
+<chapter id="introduction">
+ <title>Open Hardware Manager Introduction</title>
+
+ <sect1 id="introduction-description">
+ <title>Overall Description</title>
+
+ <para>
+ OHM is a small open source systems daemon which sits above HAL and
+ abstracts out common hardware management tasks such as:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ System wide power management statistics (for instance calculating
+ hysteresis of battery curves).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Managing system wide inhibit actions, for instance system
+ firmware updating.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Controlling heat dissipation on embedded and PC devices.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ OHM is built using a plugin architecture with a low-overhead messaging
+ structure.
+ This gives a very configurable base system that can be configured in many
+ different ways.
+ Each plugin can query data from HAL or execute methods on HAL devices and
+ expose preferences interfaces for session-space to use.
+ </para>
+
+ <mediaobject id="ohm-structure">
+ <imageobject>
+ <imagedata format="PNG" fileref="ohm-structure.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ OHM is LGPL licensed to allow proprietary licensed plug-ins to be used
+ where absolutely required.
+ It is also uses the minimum of memory and processor requirement to fulfill
+ the task.
+ This makes it suitable for use on the latest smart-phones, the OLPC device
+ or any other embedded products such as set top boxes.
+ </para>
+
+ <para>
+ HAL has traditionally been seen too heavyweight for use on an embedded device.
+ While this was once true, there have been very many developers working on
+ adding conditional compilation to parts of HAL, and to reduce memory usage.
+ This can be seen with the startup speed of 0.5.9 being 40% than of 0.5.8.
+ Context switching has been reduced, and memory pressure on coldplug has been
+ reduced for devices with a small amount of devices.
+ It is expected that <literal>hald</literal> will start in the few hundred
+ millisecond range and consume less than half a megabyte of RAM at coldplug.
+ </para>
+
+ <para>
+ Using HAL allows us to use a common framework for hardware management,
+ which means plugins designed for one architecture or chip will work on
+ any other system.
+ Working together is the best way to get high quality, maintainable code
+ rather than all the hacky systems we have now.
+ </para>
+
+ <mediaobject id="ohm-sessions">
+ <imageobject>
+ <imagedata format="PNG" fileref="ohm-sessions.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+
+ <para>
+ Proof of concept code is available on the project page.
+ There are no tarball releases yet, checking out using git is the best
+ option.
+ </para>
+
+ <para>
+ OHM comprises:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ The <literal>ohmd</literal> system daemon which co-ordinates the
+ rules and acts as a keystore for multiple users.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The interface specification which outlines core
+ <literal>ohmd</literal> functionality
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A method for plugins to request notification when keys change, for
+ example when the system AC state is changed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The test suite which tests functionality
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ OHM is very suitable for embedded devices that need to manage power, heat
+ and other critical tasks early in the boot sequence.
+ Using HAL, it provides an abstract method for all plugins to be written in
+ a generic way, not tied to the specific implementation of the device.
+ </para>
+
+ <para>
+ What OHM is not:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ A power saving daemon.
+ It is not doing power saving specifically, it is just doing device
+ specific rules that manage power and heat dissipation and other
+ hardware specific stuff.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An abstraction of HAL. HAL acts as the input and the output of OHM,
+ and OHM enforces policy for HAL.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A huge daemon with lots of dependencies.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ API or ABI stable. Expect the ABI and API to change on a regular
+ basis until we ship 1.0.0.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Targeted to a particular architecture or platform.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Produced by any one vendor.
+ There are many contributors helping to get this done.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ Why not do everything in a session daemon?:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Sometimes we need to start very early in the boot sequence.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ We don't want to die if X dies.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ On a server with 100 logged in users we don't want an instance for
+ each user.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ We need to apply policy at boot-up or before X starts.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="introduction-plugins">
+ <title>Plugins</title>
+ <para>
+ Plugins have keys and policy, and also install a default system
+ preferences file.
+ </para>
+
+ <para>
+ We need to set system preferences when there is no user logged in or we
+ are very early in the boot sequence.
+ We do this with each plugin installing a text file with the plugin key
+ name, the value, and optionally the public switch.
+ </para>
+
+ <para>
+ The core setup file is read from <filename>/etc/ohm/core</filename> and
+ plugin preferences are read from <filename>/etc/ohm/plugins/{name}</filename>
+ Comments are lines with first character <literal>#</literal> and then the
+ rest of the line is ignored.
+ Files are flat text with the following formal description,
+ <literal>plugin_prefix.key value type public</literal>
+ </para>
+ <important>
+ <para>
+ There is a single space between the values.
+ Line endings have to be UNIX not WIN or MAC.
+ Parsing is very strict, and <literal>ohmd</literal> will exit with an
+ error if the syntax is not perfect. This is by design.
+ </para>
+ </important>
+
+ <note>
+ <para>
+ Public is only set if the key can be changed by the session, and if the
+ key is tried to be set, the set method will fail.
+ This is a way to enforce fine-grained rules on users when writing
+ PolicyKit rules for every action would be too great an overhead.
+ </para>
+ </note>
+
+ <para>
+ Plugins can tell <literal>ohmd</literal> that other plugins are required
+ for certain functionality, for instance, the backlight unit on a mobile
+ phone may require the temperature module to be present, so it can do the
+ temperature shutdown checks.
+ This is done with <literal>ohm_module_require()</literal>.
+ <literal>ohmd</literal> daemon will fail to load if any required plugin
+ is not present after the plugins have finished initializing.
+ </para>
+
+ <para>
+ Plugins can also tell <literal>ohmd</literal> that other plugins are suggested for certain
+ functionality, for instance, the backlight unit may work best when the
+ battery plugin is loaded so we can dim when we are low on power.
+ This is done with <literal>ohm_module_suggest()</literal>.
+ <literal>ohmd</literal> daemon will print a message to the console if any
+ suggested plugin is not present.
+ </para>
+
+ <para>
+ Plugins can also tell <literal>ohmd</literal> that other plugins are banned, for instance,
+ a proprietary battery discharge plugin maybe incompatible with the
+ standard battery plugin.
+ This is done with <literal>ohm_module_prevent()</literal>.
+ <literal>ohmd</literal> will fail to load if any prevented plugin is
+ manually loaded or loaded through a dependency of another plugin.
+ </para>
+
+ <para>
+ In <literal>ohmd</literal>, keys are created read/write by the plugin.
+ Other plugins can watch for changes on these keys (even on other modules)
+ using <literal>ohm_key_monitor()</literal>.
+ The callback will be issued local to the plugin when the state of this
+ key changes.
+ </para>
+
+ <para>
+ NOTE: There is no ordering of priority (yet?) of monitored keys.
+ Make sure that policy per key is kept to one plugin, else strange
+ races might start happening.
+ </para>
+
+ <para>
+ A library called <literal>libohm</literal> allows system and session
+ programs to easily interface with <literal>ohmd</literal>.
+ This library will remove the implementation detail from plugins and
+ session applications.
+ This library, like the rest of OHM will not be API or ABI stable until
+ version 1.0.0 is released.
+ </para>
+
+ </sect1>
+
+ <sect1 id="introduction-deps">
+ <title>Dependencies</title>
+ <para>
+ OHM is lightweight.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ GLib 2.10.0 (required)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ DBUS 0.70 (required)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ HAL 0.5.8 (required)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ PolicyKit (optional)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ConsoleKit (optional)
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+</chapter>
diff --git a/docs/ohm-logo.png b/docs/ohm-logo.png
new file mode 100644
index 0000000..ae61d5e
--- /dev/null
+++ b/docs/ohm-logo.png
Binary files differ
diff --git a/docs/ohm-logo.svg b/docs/ohm-logo.svg
new file mode 100644
index 0000000..0679f1e
--- /dev/null
+++ b/docs/ohm-logo.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="500"
+ height="500"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.44.1"
+ sodipodi:docbase="/home/hughsie/ohm/docs"
+ sodipodi:docname="logo.svg"
+ version="1.0"
+ inkscape:export-filename="/home/hughsie/ohm/docs/ohm-logo.png"
+ inkscape:export-xdpi="9"
+ inkscape:export-ydpi="9">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path4888"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
+ style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4894"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
+ style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.49497475"
+ inkscape:cx="187.11704"
+ inkscape:cy="395.25968"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-points="true"
+ inkscape:object-nodes="true"
+ inkscape:object-points="true"
+ inkscape:object-bbox="true"
+ inkscape:window-width="1270"
+ inkscape:window-height="721"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ width="500px"
+ height="500px" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:1;fill:#afeded;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4933"
+ width="240"
+ height="60"
+ x="160"
+ y="100" />
+ <rect
+ style="opacity:1;fill:#eded8d;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4939"
+ width="240"
+ height="60"
+ x="160"
+ y="160" />
+ <rect
+ style="opacity:1;fill:#eda328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4945"
+ width="240"
+ height="60"
+ x="160"
+ y="220" />
+ <rect
+ style="opacity:1;fill:#a7a328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4953"
+ width="240"
+ height="59.999989"
+ x="160"
+ y="280" />
+ <rect
+ style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4927"
+ width="110"
+ height="319.88245"
+ x="80"
+ y="100.11755" />
+ <text
+ xml:space="preserve"
+ style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="132.48047"
+ y="190"
+ id="text4929"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan4931"
+ x="132.48047"
+ y="190"
+ style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#204a87;font-family:Bitstream Vera Sans">O</tspan><tspan
+ sodipodi:role="line"
+ x="132.48047"
+ y="290"
+ style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#204a87;font-family:Bitstream Vera Sans"
+ id="tspan1952">H</tspan><tspan
+ sodipodi:role="line"
+ x="132.48047"
+ y="390"
+ style="font-size:100px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#204a87;font-family:Bitstream Vera Sans"
+ id="tspan1954">M</tspan></text>
+ </g>
+</svg>
diff --git a/docs/ohm-sessions.png b/docs/ohm-sessions.png
new file mode 100644
index 0000000..979b077
--- /dev/null
+++ b/docs/ohm-sessions.png
Binary files differ
diff --git a/docs/ohm-sessions.svg b/docs/ohm-sessions.svg
new file mode 100644
index 0000000..bf423e0
--- /dev/null
+++ b/docs/ohm-sessions.svg
@@ -0,0 +1,393 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.44.1"
+ sodipodi:docbase="/home/hughsie/ohm/docs"
+ sodipodi:docname="ohm-sessions.svg"
+ version="1.0"
+ inkscape:export-filename="/home/hughsie/ohm/docs/ohm-sessions.png"
+ inkscape:export-xdpi="48.419998"
+ inkscape:export-ydpi="48.419998">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path4888"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
+ style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4894"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
+ style="fill-rule:evenodd;stroke:black;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="-164.42156"
+ inkscape:cy="518.3343"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-points="true"
+ inkscape:object-nodes="true"
+ inkscape:object-points="true"
+ inkscape:object-bbox="true"
+ inkscape:window-width="1270"
+ inkscape:window-height="721"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ width="1052.3622px"
+ height="744.09448px" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4927"
+ width="110"
+ height="400"
+ x="111"
+ y="304.09448" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="118.83203"
+ y="343.78198"
+ id="text4929"><tspan
+ sodipodi:role="line"
+ id="tspan4931"
+ x="118.83203"
+ y="343.78198"
+ style="font-size:40px">OHM</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:2.95964074, 5.91928148;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 710.9801,404.32514 L 849.1606,404.09751 L 849.35897,254.09448"
+ id="path5946"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 431,404.07978 L 710.9801,404.32514 L 711,214.09447 L 671,214.05008"
+ id="path5011"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ style="opacity:1;fill:#afeded;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4933"
+ width="210"
+ height="80"
+ x="221"
+ y="303.97693" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="228.75391"
+ y="343.41052"
+ id="text4935"><tspan
+ sodipodi:role="line"
+ id="tspan4937"
+ x="228.75391"
+ y="343.41052"
+ style="font-size:28px">Backlight</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 431,433.87163 L 612.58923,433.36979 L 612.11716,472.57946"
+ id="path5023"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="opacity:1;fill:#eded8d;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4939"
+ width="210"
+ height="80"
+ x="221"
+ y="383.97693" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="228.75391"
+ y="423.41052"
+ id="text4941"><tspan
+ sodipodi:role="line"
+ id="tspan4943"
+ x="228.75391"
+ y="423.41052"
+ style="font-size:28px">Inhibit</tspan></text>
+ <rect
+ style="opacity:1;fill:#eda328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4945"
+ width="210"
+ height="80"
+ x="221"
+ y="463.97693" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="228.25195"
+ y="493.15268"
+ id="text4947"><tspan
+ sodipodi:role="line"
+ id="tspan4949"
+ x="228.25195"
+ y="493.15268"
+ style="font-size:28px">Heat Mgmt</tspan><tspan
+ sodipodi:role="line"
+ x="228.25195"
+ y="528.15268"
+ style="font-size:28px"
+ id="tspan4951">Policy</tspan></text>
+ <rect
+ style="opacity:1;fill:#a7a328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4953"
+ width="210"
+ height="80"
+ x="221"
+ y="543.97693" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="228.25195"
+ y="573.15271"
+ id="text4957"><tspan
+ sodipodi:role="line"
+ x="228.25195"
+ y="573.15271"
+ style="font-size:28px"
+ id="tspan4959">Internal</tspan><tspan
+ sodipodi:role="line"
+ x="228.25195"
+ y="608.15271"
+ style="font-size:28px"
+ id="tspan4961">Protected IP</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 588.81737,170.49268 L 588.81737,134.25822"
+ id="path5009"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4989"
+ width="200"
+ height="80"
+ x="491"
+ y="64.094482" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="587.28711"
+ y="98.697983"
+ id="text4991"><tspan
+ sodipodi:role="line"
+ x="587.28711"
+ y="98.697983"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan4995">Random</tspan><tspan
+ sodipodi:role="line"
+ x="587.28711"
+ y="133.69798"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5007">Program</tspan></text>
+ <rect
+ style="opacity:1;fill:#8ae234;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4997"
+ width="200"
+ height="80"
+ x="491"
+ y="174.09447" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="587.28711"
+ y="208.69798"
+ id="text4999"><tspan
+ sodipodi:role="line"
+ id="tspan5001"
+ x="587.28711"
+ y="208.69798"
+ style="font-size:28px;text-align:center;text-anchor:middle">Session</tspan><tspan
+ sodipodi:role="line"
+ x="587.28711"
+ y="243.69798"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5003">Screensaver</tspan></text>
+ <rect
+ style="opacity:1;fill:#c17d11;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5015"
+ width="200"
+ height="80"
+ x="501"
+ y="474.09448" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="597.28711"
+ y="508.69797"
+ id="text5017"><tspan
+ sodipodi:role="line"
+ x="597.28711"
+ y="508.69797"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5021">System</tspan><tspan
+ sodipodi:role="line"
+ x="597.28711"
+ y="543.69797"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5027">Update</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 24;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 1,285.09448 L 1039.8329,285.09448 L 1039.8329,285.09448"
+ id="path5029" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 318.81737,170.49268 L 318.81737,134.25822"
+ id="path5031"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5033"
+ width="200"
+ height="80"
+ x="221"
+ y="64.094482" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="319.4082"
+ y="115.33862"
+ id="text5035"><tspan
+ sodipodi:role="line"
+ x="319.4082"
+ y="115.33862"
+ style="font-size:36px;text-align:center;text-anchor:middle"
+ id="tspan5039">Totem</tspan></text>
+ <rect
+ style="opacity:1;fill:#8ae234;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5041"
+ width="200"
+ height="80"
+ x="221"
+ y="174.09447" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="317.28711"
+ y="208.69798"
+ id="text5043"><tspan
+ sodipodi:role="line"
+ id="tspan5045"
+ x="317.28711"
+ y="208.69798"
+ style="font-size:28px;text-align:center;text-anchor:middle">Session</tspan><tspan
+ sodipodi:role="line"
+ x="317.28711"
+ y="243.69798"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5047">Screensaver</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 454.79077,402.77145 L 456,214.09447 L 421,214.25568"
+ id="path5049"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1.94685829;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.94685827, 23.36229919;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 468.16943,55.067902 L 467.11629,275.12104"
+ id="path5936"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:1;fill:#c17d11;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5938"
+ width="200"
+ height="80"
+ x="731"
+ y="174.09448" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="827.28711"
+ y="208.69801"
+ id="text5940"><tspan
+ sodipodi:role="line"
+ x="827.28711"
+ y="208.69801"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5944">Nautilus</tspan><tspan
+ sodipodi:role="line"
+ x="827.28711"
+ y="243.69801"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5950">(copying)</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95964074;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 216.72233,202.09651 L 100.88913,200.86991 L 101.00509,144.09448"
+ id="path5952"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5954"
+ width="200"
+ height="80"
+ x="1"
+ y="64.094482" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="97.287109"
+ y="98.697983"
+ id="text5956"><tspan
+ sodipodi:role="line"
+ x="97.287109"
+ y="98.697983"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5958">Random</tspan><tspan
+ sodipodi:role="line"
+ x="97.287109"
+ y="133.69798"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan5960">Program</tspan></text>
+ </g>
+</svg>
diff --git a/docs/ohm-structure.png b/docs/ohm-structure.png
new file mode 100644
index 0000000..a1bc9e5
--- /dev/null
+++ b/docs/ohm-structure.png
Binary files differ
diff --git a/docs/ohm-structure.svg b/docs/ohm-structure.svg
new file mode 100644
index 0000000..66e7ae5
--- /dev/null
+++ b/docs/ohm-structure.svg
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.44.1"
+ sodipodi:docbase="/home/hughsie/ohm/docs"
+ sodipodi:docname="ohm-structure.svg"
+ inkscape:export-filename="/home/hughsie/ohm/docs/ohm-structure.png"
+ inkscape:export-xdpi="51.209103"
+ inkscape:export-ydpi="51.209103">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path4888"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4894"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="-676.03043"
+ inkscape:cy="617.89993"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-points="true"
+ inkscape:object-nodes="true"
+ inkscape:object-points="true"
+ inkscape:object-bbox="true"
+ inkscape:window-width="1270"
+ inkscape:window-height="721"
+ inkscape:window-x="0"
+ inkscape:window-y="25" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.8838985;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 370.00001,928.75731 C 370.00001,892.19769 370.00001,892.19769 370.00001,892.19769"
+ id="path4907" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:2,24;stroke-dashoffset:0"
+ d="M 20,912.36218 L 720,912.36218 L 720,912.36218"
+ id="path1950" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2,24;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 19,313.36218 L 719,313.36218 L 719,313.36218"
+ id="path2839" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.91596603;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 389.28571,135.92782 L 389.28571,210.9042"
+ id="path3818"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.91596603;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 413.21428,208.71723 L 413.21428,133.74085"
+ id="path4903"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:1;fill:#ededed;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1878"
+ width="200"
+ height="80"
+ x="300"
+ y="52.362183" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="401.40625"
+ y="82.362183"
+ id="text1938"><tspan
+ sodipodi:role="line"
+ id="tspan1940"
+ x="401.40625"
+ y="82.362183"
+ style="font-size:32px;text-align:center;text-anchor:middle">User</tspan><tspan
+ sodipodi:role="line"
+ x="401.40625"
+ y="122.36218"
+ style="font-size:32px;text-align:center;text-anchor:middle"
+ id="tspan3796">Interface</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.91515112;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 316.33358,261.6479 C 241.40144,261.6479 241.40144,261.6479 241.40144,261.6479"
+ id="path3820" />
+ <rect
+ style="opacity:1;fill:#ad7fa8;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1880"
+ width="200"
+ height="160"
+ x="40"
+ y="132.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="141"
+ y="242.36218"
+ id="text1926"
+ inkscape:transform-center-x="21.841616"><tspan
+ sodipodi:role="line"
+ id="tspan1928"
+ x="141"
+ y="242.36218"
+ style="font-size:32px;text-align:center;text-anchor:middle">Session</tspan><tspan
+ sodipodi:role="line"
+ x="141"
+ y="282.36218"
+ style="font-size:32px;text-align:center;text-anchor:middle"
+ id="tspan3798">Policy</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="78.183594"
+ y="182.75281"
+ id="text1934"><tspan
+ sodipodi:role="line"
+ id="tspan1936"
+ x="78.183594"
+ y="182.75281"
+ style="font-size:32">UI Prefs</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:1.99146724;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:5.97440156, 1.99146719;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 40.991485,212.36218 L 238.72361,212.36218 L 238.72361,212.36218"
+ id="path2841" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:url(#Arrow1Mstart)"
+ d="M 525,262.36218 L 670,262.36218 L 670,862.36218 L 440,862.36218"
+ id="path3822"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.94025731;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 340,735.98136 C 340,812.39205 340,812.39205 340,812.39205"
+ id="path3824" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95138264;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 350,328.63 C 350,290.08787 350,290.08787 350,290.08787"
+ id="path3826"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:1;fill:#ededed;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1882"
+ width="200"
+ height="80"
+ x="320"
+ y="212.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="416.28711"
+ y="246.9657"
+ id="text1942"><tspan
+ sodipodi:role="line"
+ id="tspan1944"
+ x="416.28711"
+ y="246.9657"
+ style="font-size:28px;text-align:center;text-anchor:middle">Session</tspan><tspan
+ sodipodi:role="line"
+ x="416.28711"
+ y="281.9657"
+ style="font-size:28px;text-align:center;text-anchor:middle"
+ id="tspan3730">Daemon</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.96102691;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 276.26486,372.36218 C 227.73051,372.36218 227.73051,372.36218 227.73051,372.36218"
+ id="path3828" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.96292162;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 276.33154,481.6479 C 227.73146,481.6479 227.73146,481.6479 227.73146,481.6479"
+ id="path3830" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.96292162;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 276.33154,611.6479 C 227.73146,611.6479 227.73146,611.6479 227.73146,611.6479"
+ id="path3832" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.97630692;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 315.35714,808.66441 C 315.35714,730.10033 315.35714,730.10033 315.35714,730.10033"
+ id="path4905" />
+ <rect
+ style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1876"
+ width="110"
+ height="400"
+ x="280"
+ y="332.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="287.83203"
+ y="372.04968"
+ id="text1946"><tspan
+ sodipodi:role="line"
+ id="tspan1948"
+ x="287.83203"
+ y="372.04968"
+ style="font-size:40px">OHM</tspan></text>
+ <rect
+ style="opacity:1;fill:#afeded;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3740"
+ width="210"
+ height="80"
+ x="390"
+ y="332.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="397.75391"
+ y="371.79578"
+ id="text3742"><tspan
+ sodipodi:role="line"
+ id="tspan3744"
+ x="397.75391"
+ y="371.79578"
+ style="font-size:28">Backlight</tspan></text>
+ <rect
+ style="opacity:1;fill:#eded8d;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3746"
+ width="210"
+ height="80"
+ x="390"
+ y="412.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="397.75391"
+ y="451.79578"
+ id="text3748"><tspan
+ sodipodi:role="line"
+ id="tspan3750"
+ x="397.75391"
+ y="451.79578"
+ style="font-size:28">Inhibit</tspan></text>
+ <rect
+ style="opacity:1;fill:#eda328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3756"
+ width="210"
+ height="80"
+ x="390"
+ y="492.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="397.25195"
+ y="521.53796"
+ id="text3758"><tspan
+ sodipodi:role="line"
+ id="tspan3760"
+ x="397.25195"
+ y="521.53796"
+ style="font-size:28px">Heat Mgmt</tspan><tspan
+ sodipodi:role="line"
+ x="397.25195"
+ y="556.53796"
+ style="font-size:28px"
+ id="tspan3762">Policy</tspan></text>
+ <rect
+ style="opacity:1;fill:#a7a328;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3784"
+ width="210"
+ height="80"
+ x="390"
+ y="572.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="397.25195"
+ y="601.53796"
+ id="text3786"><tspan
+ sodipodi:role="line"
+ x="397.25195"
+ y="601.53796"
+ style="font-size:28px"
+ id="tspan3790">Internal</tspan><tspan
+ sodipodi:role="line"
+ x="397.25195"
+ y="636.53796"
+ style="font-size:28px"
+ id="tspan3794">Protected IP</tspan></text>
+ <rect
+ style="opacity:1;fill:#ad7fa8;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1884"
+ width="190"
+ height="80"
+ x="40"
+ y="332.36218" />
+ <rect
+ style="opacity:1;fill:#e9b96e;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1886"
+ width="190"
+ height="80"
+ x="40"
+ y="452.36218" />
+ <rect
+ style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1888"
+ width="190"
+ height="80"
+ x="40"
+ y="572.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="51.40625"
+ y="506.67468"
+ id="text1898"><tspan
+ sodipodi:role="line"
+ id="tspan1900"
+ x="51.40625"
+ y="506.67468"
+ style="font-size:32px">ConsoleKit</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="131.02734"
+ y="610.59656"
+ id="text1906"><tspan
+ sodipodi:role="line"
+ id="tspan1908"
+ x="131.02734"
+ y="610.59656"
+ style="font-size:24px;text-align:center;text-anchor:middle">PolicyKit</tspan><tspan
+ sodipodi:role="line"
+ x="131.02734"
+ y="640.59656"
+ style="font-size:24px;text-align:center;text-anchor:middle"
+ id="tspan3734">(permissions)</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="137.54688"
+ y="363.79074"
+ id="text1918"><tspan
+ sodipodi:role="line"
+ id="tspan1920"
+ x="137.54688"
+ y="363.79074"
+ style="font-size:28;text-align:center;text-anchor:middle">Default</tspan><tspan
+ sodipodi:role="line"
+ x="137.54688"
+ y="398.79074"
+ style="font-size:28;text-align:center;text-anchor:middle"
+ id="tspan3732">Preferences</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.8838985;stroke-linecap:square;stroke-linejoin:miter;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 340.71429,895.86061 C 340.71429,932.42023 340.71429,932.42023 340.71429,932.42023"
+ id="path3834" />
+ <rect
+ style="opacity:1;fill:#888a85;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1872"
+ width="240"
+ height="80"
+ x="240"
+ y="932.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="300"
+ y="982.36218"
+ id="text1890"><tspan
+ sodipodi:role="line"
+ id="tspan1892"
+ x="300"
+ y="982.36218"
+ style="font-size:40px">Kernel</tspan></text>
+ <rect
+ style="opacity:1;fill:#ef2929;fill-opacity:1;stroke:black;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1874"
+ width="160"
+ height="80"
+ x="280"
+ y="812.36218" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="316.07422"
+ y="862.36218"
+ id="text1894"><tspan
+ sodipodi:role="line"
+ id="tspan1896"
+ x="316.07422"
+ y="862.36218"
+ style="font-size:40px">HAL</tspan></text>
+ </g>
+</svg>