aboutsummaryrefslogtreecommitdiff
path: root/doc/context-providers.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context-providers.html')
-rw-r--r--doc/context-providers.html611
1 files changed, 611 insertions, 0 deletions
diff --git a/doc/context-providers.html b/doc/context-providers.html
new file mode 100644
index 00000000..2018fe45
--- /dev/null
+++ b/doc/context-providers.html
@@ -0,0 +1,611 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 8.4.4" />
+<title>How to provide context properties</title>
+<style type="text/css">
+/* Debug borders */
+p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
+/*
+ border: 1px solid red;
+*/
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+tt {
+ color: navy;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ font-family: sans-serif;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+
+div.sectionbody {
+ font-family: serif;
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+
+pre {
+ padding: 0;
+ margin: 0;
+}
+
+span#author {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+span#email {
+}
+span#revision {
+ font-family: sans-serif;
+}
+
+div#footer {
+ font-family: sans-serif;
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+div#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+div#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+div#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.5em;
+ margin-bottom: 2.5em;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock {
+ padding-left: 2.0em;
+ margin-right: 10%;
+}
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock {
+ padding-left: 2.0em;
+ margin-right: 10%;
+}
+div.verseblock > div.content {
+ white-space: pre;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 2px solid silver;
+}
+
+div.exampleblock > div.content {
+ border-left: 2px solid silver;
+ padding: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+div.imageblock img { border: 1px solid silver; }
+span.image img { border-style: none; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead {
+ font-family: sans-serif;
+ font-weight: bold;
+}
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overriden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+@media print {
+ div#footer-badges { display: none; }
+}
+
+div#toctitle {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+/* Workarounds for IE6's broken and incomplete CSS2. */
+
+div.sidebar-content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+div.sidebar-title, div.image-title {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ margin-top: 0.0em;
+ margin-bottom: 0.5em;
+}
+
+div.listingblock div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock-attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock-content {
+ white-space: pre;
+}
+div.verseblock-attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+
+div.exampleblock-content {
+ border-left: 2px solid silver;
+ padding-left: 0.5em;
+}
+
+/* IE6 sets dynamically generated links as visited. */
+div#toc a:visited { color: blue; }
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+window.onload = function(){generateToc(2)}
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, October 2006. License: GPL */
+
+function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+}
+
+function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+}
+
+function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName)
+ if (mo)
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+}
+
+// This function does the work. toclevels = 1..4.
+function generateToc(toclevels) {
+ var toc = document.getElementById("toc");
+ var entries = tocEntries(document.getElementsByTagName("body")[0], toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "toc" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ document.getElementById("header").removeChild(toc);
+}
+/*]]>*/
+</script>
+</head>
+<body>
+<div id="header">
+<h1>How to provide context properties</h1>
+<div id="toc">
+ <div id="toctitle">Table of Contents</div>
+ <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
+</div>
+</div>
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph"><p>Any component can provide its own key/value pairs and make them appear
+as a <tt>ContextProperty</tt> for C++ (and in other forms for other
+languages).</p></div>
+<div class="paragraph"><p>As a provider of context properties, you need to drop one or more
+<em>property declaration</em> files into <tt>/usr/share/contextkit/providers/</tt>
+to register your properties with the context framework. This file
+follows a format described below and is used by <tt>libcontextsubscriber</tt>
+and others to find you when someone subscribes to your properties.
+The file is also used by the Context Commander to show descriptions of
+your properties and to learn about the possible values that a property
+can legally have.</p></div>
+<div class="paragraph"><p>The property declaration files also inform the context framework how
+you want to be contacted. Right now, you have to implement the
+<tt>org.freedesktop.ContextKit</tt> D-Bus interface, and register yourself on
+either the system or the session D-Bus with a suitable bus name. The
+choice of system or session bus and your bus name go into the property
+declaration file.</p></div>
+<div class="paragraph"><p>The only supported way right now to implement the
+<tt>org.freedesktop.ContextKit</tt> interface is to use the
+<a href="libcontextprovider"><tt>libcontextprovider</tt></a> library.</p></div>
+<div class="paragraph"><p>The name of the property declaration file must be
+"<em>bus-name</em><tt>.context</tt>".</p></div>
+</div>
+</div>
+<h2 id="_the_property_declaration_file">The property declaration file</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The property declaration file contains XML and must follow
+<a href="context-provider-schema.html">this XML schema</a>. A simple example
+for the <tt>Example.Random</tt> property looks like this:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>&lt;?xml version="1.0"?&gt;
+&lt;provider bus="session"
+ service="com.example.RandomProvider"&gt;
+ &lt;key name="com.example.Random"&gt;
+ &lt;type&gt;double&lt;/type&gt;
+ &lt;doc&gt;
+ A random number between 0 and 1 that changes every now and then.
+ &lt;/doc&gt;
+ &lt;/key&gt;
+&lt;/provider&gt;</tt></pre>
+</div></div>
+<div class="paragraph"><p>This file declares the single property <tt>com.example.Random</tt> and
+instructs the Content Framework to connect to the
+<tt>com.example.RandomProvider</tt> bus name on the session D-Bus. It would
+be stored as
+<tt>/usr/share/contextkit/providers/com.example.RandomProvider.context</tt></p></div>
+<div class="paragraph"><p>You need to be careful when choosing property name; see the
+"Guidelines for property providers" section for how to avoid
+conflicts.</p></div>
+<div class="paragraph"><p>When providing properties from the <a href="context-properties.html">core
+list</a>, you need to follow additional rules to make sure that your
+property declarations and the centrally maintained core list do not
+fall out of synch. See the "Providing core properties" section for
+more about them.</p></div>
+<div class="paragraph"><p>After installing a property declaration file into a directory <tt>$dir</tt>,
+you should usually execute <tt>update-contextkit-providers</tt>. This will
+update the various caches that clients like the <tt>libcontextsubscriber</tt>
+library use.</p></div>
+<div class="paragraph"><p>But, if a property declaration file is installed via a Debian package,
+you should not call <tt>update-contextkit-providers</tt> in your maintainer
+scripts. Triggers in the relevant packages take care of running
+update-contextkit-providers at the right time and only as often as
+necessary.</p></div>
+<div class="paragraph"><p>The XML element tree in the property declaration file simply consists
+of a list of <tt>key</tt> elements.</p></div>
+<div class="paragraph"><p>A <tt>key</tt> element in the property declaration tree can have a <tt>doc</tt>
+child element. The contents of this element should be plain text
+without any additional markup.</p></div>
+<h3 id="_types">Types</h3><div style="clear:left"></div>
+<div class="paragraph"><p><strong>NOTE:</strong> This is preview of things that might come, or not. For now,
+just use a <tt>type</tt> attribute in your <tt>key</tt> elements with one of
+<tt>"TRUTH"</tt>, <tt>"STRING"</tt>, <tt>"INT"</tt>, or <tt>"DOUBLE"</tt> as the value.</p></div>
+<div class="paragraph"><p>ContextKit uses the experimental <a href="context-types.html">Desktop Type
+System</a>. A property declaration should have a <tt>type</tt> element that
+conforms to the Desktop Type System.</p></div>
+<div class="paragraph"><p>For example, a property that is a enumeration would be declared like
+this:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>&lt;key name="Economy"&gt;
+ &lt;type&gt;
+ &lt;int-enum&gt;
+ &lt;up val="1" doc="Getting better"/&gt;
+ &lt;down val="2" doc="Getting worse"/&gt;
+ &lt;even val="3" doc="Getting boring"/&gt;
+ &lt;/int-enum&gt;
+ &lt;/type&gt;
+ &lt;doc&gt;
+ The current economic trend, as an enumerated value.
+ &lt;/doc&gt;
+&lt;/key&gt;</tt></pre>
+</div></div>
+</div>
+<h2 id="_guidelines_for_property_providers">Guidelines for property providers</h2>
+<div class="sectionbody">
+<h3 id="_names">Names</h3><div style="clear:left"></div>
+<div class="paragraph"><p>Context property names can contain any character except "/".</p></div>
+<div class="paragraph"><p>Only core property names are allowed to start with a capital ASCII
+letter ("A" to "Z").</p></div>
+<div class="paragraph"><p>When defining a new non-core property, you need to choose a unique
+prefix. Start with a reversed fully qualified domainname that you
+control, such as "com.nokia." or "org.gnome.". Then, if the first
+component is "org" and the second component is not a top-level domain,
+drop "org". Then convert the first character of the prefix to
+lower-case if it is one of "A" to "Z".</p></div>
+<div class="paragraph"><p>For example, the GNOME project can use "gnome." as their prefix, KDE
+can use "kde.", and Nokia can use "com.nokia.".</p></div>
+</div>
+<h2 id="_providing_core_properties">Providing core properties</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The Context Framework project maintains a list of <em>core properties</em>.
+These core properties are intended to cover the needs of most
+applications and be meaningful for many different devices.</p></div>
+<div class="paragraph"><p>When you are implementing a provider for some of the core properties,
+you must of course make sure that you follow the specification of that
+property. You can not redefine its type or description in your
+property declaration file, obviously.</p></div>
+<div class="paragraph"><p>Thus, for core properties, you should not include any <tt>type</tt> or <tt>doc</tt>
+elements in your key declarations, just a <tt>name</tt> element. The list of
+core properties is also known to context subcribers at run-time and
+will be used to fill in the missing details.</p></div>
+<div class="paragraph"><p>For example, a property declaration file for core properties could
+look like this:</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><tt>&lt;?xml version="1.0"?&gt;
+&lt;provider bus="session"
+ service="com.example.RandomProvider"&gt;
+ &lt;key name="Example.Random"/&gt;
+&lt;/provider&gt;</tt></pre>
+</div></div>
+<div class="paragraph"><p>This just declares that the <tt>Example.Random</tt> property can be
+subscribed to by contacting <tt>com.example.RandomProvider</tt> on the
+session bus. It&#8217;s type and documentation are found elsewhere.</p></div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2009-11-26 11:20:27 EEST
+</div>
+</div>
+</body>
+</html>