Documentation: improvements
authorJosé Bollo <jose.bollo@iot.bzh>
Mon, 19 Sep 2016 08:54:42 +0000 (10:54 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Tue, 20 Sep 2016 12:39:50 +0000 (14:39 +0200)
- improves formatting of the documentation on events
- add documentations of functions in headers

Change-Id: Ie39d34fca8bd563a099f6b575c72e314ca08a29d
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
doc/afb-events-guide.html
doc/afb-events-guide.md
doc/signaling-basis.svg [new file with mode: 0644]
include/afb/afb-binding.h
include/afb/afb-service-itf.h

index aa60640..c554fea 100644 (file)
@@ -5,7 +5,7 @@
   <meta name="generator" content="pandoc">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
   <meta name="author" content="José Bollo">
   <meta name="generator" content="pandoc">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
   <meta name="author" content="José Bollo">
-  <title>Guid for developing with events</title>
+  <title>Guide for developing with events</title>
   <style type="text/css">code{white-space: pre;}</style>
   <style type="text/css">
 div.sourceCode { overflow-x: auto; }
   <style type="text/css">code{white-space: pre;}</style>
   <style type="text/css">
 div.sourceCode { overflow-x: auto; }
@@ -51,13 +51,14 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
 </head>
 <body>
 <header>
 </head>
 <body>
 <header>
-<h1 class="title">Guid for developing with events</h1>
+<h1 class="title">Guide for developing with events</h1>
 <h2 class="author">José Bollo</h2>
 <h2 class="author">José Bollo</h2>
-<h3 class="date">16 septembre 2016</h3>
+<h3 class="date">19 septembre 2016</h3>
 </header>
 <nav id="TOC">
 <ul>
 </header>
 <nav id="TOC">
 <ul>
-<li><a href="#guid-for-developing-with-events">Guid for developing with events</a><ul>
+<li><a href="#guide-for-developing-with-events">Guide for developing with events</a><ul>
+<li><a href="#overview-of-events">Overview of events</a><ul>
 <li><a href="#subscribing-and-unsubscribing">Subscribing and unsubscribing</a></li>
 <li><a href="#generating-and-pushing-signals-and-data">Generating and pushing signals and data</a></li>
 <li><a href="#receiving-the-signals">Receiving the signals</a></li>
 <li><a href="#subscribing-and-unsubscribing">Subscribing and unsubscribing</a></li>
 <li><a href="#generating-and-pushing-signals-and-data">Generating and pushing signals and data</a></li>
 <li><a href="#receiving-the-signals">Receiving the signals</a></li>
@@ -76,11 +77,13 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
 <li><a href="#strict-separation">Strict separation</a></li>
 <li><a href="#soft-composition">Soft composition</a></li>
 </ul></li>
 <li><a href="#strict-separation">Strict separation</a></li>
 <li><a href="#soft-composition">Soft composition</a></li>
 </ul></li>
+</ul></li>
 </ul>
 </nav>
 </ul>
 </nav>
-<h2 id="guid-for-developing-with-events">Guid for developing with events</h2>
+<h1 id="guide-for-developing-with-events">Guide for developing with events</h1>
 <p>Signaling agents are services that send events to any clients that subscribed for receiving it. The sent events carry any data.</p>
 <p>To have a good understanding of how to write a signaling agent, the actions of subscribing, unsubscribing, producing, sending, receiving events must be described and explained.</p>
 <p>Signaling agents are services that send events to any clients that subscribed for receiving it. The sent events carry any data.</p>
 <p>To have a good understanding of how to write a signaling agent, the actions of subscribing, unsubscribing, producing, sending, receiving events must be described and explained.</p>
+<h2 id="overview-of-events">Overview of events</h2>
 <p>The basis of a signaling agent is shown on the following figure:</p>
 <figure>
 <img src="signaling-basis.svg" alt="scenario of using events" /><figcaption>scenario of using events</figcaption>
 <p>The basis of a signaling agent is shown on the following figure:</p>
 <figure>
 <img src="signaling-basis.svg" alt="scenario of using events" /><figcaption>scenario of using events</figcaption>
index 488c52a..f24bef3 100644 (file)
@@ -1,5 +1,5 @@
-Guid for developing with events
--------------------------------
+Guide for developing with events
+================================
 
 Signaling agents are services that send events to any clients that
 subscribed for receiving it. The sent events carry any data.
 
 Signaling agents are services that send events to any clients that
 subscribed for receiving it. The sent events carry any data.
@@ -8,6 +8,9 @@ To have a good understanding of how to write a signaling agent, the
 actions of subscribing, unsubscribing, producing, sending, receiving
 events must be described and explained.
 
 actions of subscribing, unsubscribing, producing, sending, receiving
 events must be described and explained.
 
+Overview of events
+------------------
+
 The basis of a signaling agent is shown on the following figure:
 
 ![scenario of using events](signaling-basis.svg)
 The basis of a signaling agent is shown on the following figure:
 
 ![scenario of using events](signaling-basis.svg)
diff --git a/doc/signaling-basis.svg b/doc/signaling-basis.svg
new file mode 100644 (file)
index 0000000..b13fcf1
--- /dev/null
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd">
+<svg width="46cm" height="30cm" viewBox="152 40 918 592" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="792.796" y1="114.769" x2="197.12" y2="115.607"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="776.804,119.791 792.796,114.769 792.796,114.769 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="494.958" y="125.188">request-data</text>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="153" y="43" width="67.35" height="36"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="153" y="43" width="67.35" height="36"/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="186.675" y="64.9">
+      <tspan x="186.675" y="64.9">client 1</tspan>
+    </text>
+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="163" y1="67.9" x2="210.35" y2="67.9"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="305.5" y="43.7" width="67.35" height="36"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="305.5" y="43.7" width="67.35" height="36"/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="339.175" y="65.6">
+      <tspan x="339.175" y="65.6">client 2</tspan>
+    </text>
+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="315.5" y1="68.6" x2="362.85" y2="68.6"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="502" y="42" width="97.25" height="36"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="502" y="42" width="97.25" height="36"/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="550.625" y="63.9">
+      <tspan x="550.625" y="63.9">: framework</tspan>
+    </text>
+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="512" y1="66.9" x2="589.25" y2="66.9"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="746" y="43" width="118.7" height="36"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="746" y="43" width="118.7" height="36"/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="805.35" y="64.9">
+      <tspan x="805.35" y="64.9">signaling agent</tspan>
+    </text>
+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="756" y1="67.9" x2="854.7" y2="67.9"/>
+  </g>
+  <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 4; stroke: #000000" x1="186.675" y1="79" x2="187" y2="629"/>
+  <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 4; stroke: #000000" x1="339.175" y1="79.7" x2="338.826" y2="630.701"/>
+  <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 4; stroke: #000000" x1="550.625" y1="78" x2="550.326" y2="628.401"/>
+  <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 4; stroke: #000000" x1="805.35" y1="79" x2="802.826" y2="629.101"/>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="789.968" y1="260.433" x2="349.441" y2="261.423"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="773.979,265.468 789.968,260.433 789.968,260.433 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="569.704" y="270.928">request-data</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="567" y1="143.067" x2="803" y2="144"/>
+    <polygon style="fill: #000000" points="567.02,138.067 551,143.004 566.98,148.067 "/>
+    <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="567.02,138.067 551,143.004 566.98,148.067 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="676.5" y="153.5">afb_daemon_make_event</text>
+  </g>
+  <text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="735.935" y="141.063">
+    <tspan x="735.935" y="141.063"></tspan>
+  </text>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="569.412" y1="179.822" x2="805.412" y2="180.755"/>
+    <polygon style="fill: #000000" points="569.431,174.822 553.412,179.759 569.392,184.822 "/>
+    <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="569.431,174.822 553.412,179.759 569.392,184.822 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="678.912" y="190.255">afb_req_subscribe</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="197.12" y1="216.016" x2="792.796" y2="215.178"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="213.113,210.994 197.12,216.016 197.12,216.016 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="494.958" y="225.597">reply of request-data</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="566.583" y1="297.202" x2="802.583" y2="298.135"/>
+    <polygon style="fill: #000000" points="566.603,292.202 550.583,297.139 566.563,302.202 "/>
+    <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="566.603,292.202 550.583,297.139 566.563,302.202 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="676.083" y="307.635">afb_req_subscribe</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="349.441" y1="337.639" x2="789.968" y2="336.649"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="365.429,332.603 349.441,337.639 349.441,337.639 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="569.704" y="347.144">reply of request-data</text>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="1006.34" y="41.2295" width="62.15" height="36"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1006.34" y="41.2295" width="62.15" height="36"/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="1037.42" y="63.1295">
+      <tspan x="1037.42" y="63.1295">device</tspan>
+    </text>
+    <line style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x1="1016.34" y1="66.1295" x2="1058.49" y2="66.1295"/>
+  </g>
+  <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 4; stroke: #000000" x1="1037.42" y1="77.2295" x2="1037.16" y2="628.967"/>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="1020.16" y1="131.163" x2="808.06" y2="131.163"/>
+    <polygon style="fill: #000000" points="1020.16,136.163 1036.16,131.163 1020.16,126.163 "/>
+    <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="1020.16,136.163 1036.16,131.163 1020.16,126.163 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="922.611" y="141.163">setup</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="813.303" y1="380.216" x2="1037.15" y2="380.064"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="829.299,375.206 813.303,380.216 813.303,380.216 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="925.228" y="390.14">&lt;&lt; wake up &gt;&gt;</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="558.037" y1="408.076" x2="803.998" y2="409.858"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="574.073,403.192 558.037,408.076 558.037,408.076 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="681.017" y="418.967">afb_event_push</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="188.634" y1="429.562" x2="549.439" y2="429.657"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="204.636,424.567 188.634,429.562 188.634,429.562 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="369.037" y="439.61">&lt;&lt; event &gt;&gt;</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="337.127" y1="463.504" x2="549.734" y2="462.689"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="353.108,458.442 337.127,463.504 337.127,463.504 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="443.43" y="473.096">&lt;&lt; event &gt;&gt;</text>
+  </g>
+  <g>
+    <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="787.847" y1="483.303" x2="558.037" y2="484.293"/>
+    <polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="771.868,488.371 787.847,483.303 787.847,483.303 "/>
+    <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="672.942" y="493.798">reply of afb_event_push</text>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="171.664" y="115.607" width="25.4558" height="100.409"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="171.664" y="115.607" width="25.4558" height="100.409"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="792.796" y="114.769" width="25.4558" height="100.409"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="792.796" y="114.769" width="25.4558" height="100.409"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="323.985" y="261.423" width="25.4558" height="76.2161"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="323.985" y="261.423" width="25.4558" height="76.2161"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="789.968" y="260.433" width="25.4558" height="76.2161"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="789.968" y="260.433" width="25.4558" height="76.2161"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="787.847" y="380.216" width="25.4558" height="103.086"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="787.847" y="380.216" width="25.4558" height="103.086"/>
+  </g>
+  <g>
+    <rect style="fill: #ffffff" x="532.581" y="408.076" width="25.4558" height="76.2161"/>
+    <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="532.581" y="408.076" width="25.4558" height="76.2161"/>
+  </g>
+</svg>
index 7d5da11..43075df 100644 (file)
@@ -172,6 +172,23 @@ struct afb_binding_interface
 
 /*
  * Function for registering the binding
 
 /*
  * Function for registering the binding
+ *
+ * A binding V1 MUST have a function of this name and signature.
+ * This function is called during loading of the binding. It
+ * receives an 'interface' that should be recorded for later access to
+ * functions provided by the framework.
+ *
+ * This function MUST return the address of a structure that describes
+ * the binding and its implemented verbs.
+ *
+ * In case of initialisation error, NULL must be returned.
+ *
+ * Be aware that the given 'interface' is not fully functionnal
+ * because no provision is given to the name and description
+ * of the binding. Check the function 'afbBindingV1ServiceInit'
+ * defined in the file <afb/afb-service-itf.h> because when
+ * the function 'afbBindingV1ServiceInit' is called, the 'interface'
+ * is fully functionnal.
  */
 extern const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *interface);
 
  */
 extern const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *interface);
 
index 1218cd5..9b7ae73 100644 (file)
 /* avoid inclusion of <json-c/json.h> */
 struct json_object;
 
 /* avoid inclusion of <json-c/json.h> */
 struct json_object;
 
+/*
+ * Interface for internal of services
+ * It records the functions to be called for the request.
+ * Don't use this structure directly.
+ * Use the helper functions documented below.
+ */
 struct afb_service_itf
 {
 struct afb_service_itf
 {
+       /* CAUTION: respect the order, add at the end */
+
        void (*call)(void *closure, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *callback_closure);
 };
 
        void (*call)(void *closure, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *callback_closure);
 };
 
+/*
+ * Object that encapsulate accesses to service items
+ */
 struct afb_service
 {
        const struct afb_service_itf *itf;
        void *closure;
 };
 
 struct afb_service
 {
        const struct afb_service_itf *itf;
        void *closure;
 };
 
+/*
+ * When a binding have an exported implementation of the
+ * function 'afbBindingV1ServiceInit', defined below,
+ * the framework calls it for initialising the service after
+ * registration of all bindings.
+ *
+ * The object 'service' should be recorded. It has functions that
+ * allows the binding to call features with its own personality.
+ *
+ * The function should return 0 in case of success or, else, should return
+ * a negative value.
+ */
 extern int afbBindingV1ServiceInit(struct afb_service service);
 
 extern int afbBindingV1ServiceInit(struct afb_service service);
 
+/*
+ * When a binding have an implementation of the function 'afbBindingV1ServiceEvent',
+ * defined below, the framework calls that function for any broadcasted event or for
+ * events that the service subscribed to in its name.
+ *
+ * It receive the 'event' name and its related data in 'object' (be aware that 'object'
+ * might be NULL).
+ */
 extern void afbBindingV1ServiceEvent(const char *event, struct json_object *object);
 
 extern void afbBindingV1ServiceEvent(const char *event, struct json_object *object);
 
-static inline void afb_service_call(struct afb_service service, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *callback_closure)
+/*
+ * Calls the 'verb' of the 'api' with the arguments 'args' and 'verb' in the name of the binding.
+ * The result of the call is delivered to the 'callback' function with the 'callback_closure'.
+ *
+ * The 'callcack' receives 3 arguments:
+ *  1. 'closure' the user defined closure pointer 'callback_closure',
+ *  2. 'iserror' a boolean status being true (not null) when an error occured,
+ *  2. 'result' the resulting data as a JSON object.
+ *
+ * See also 'afb_req_subcall'
+ *
+ * Returns 0in case of success or -1 in case of error.
+ */
+static inline void afb_service_call(struct afb_service service, const char *api, const char *verb, struct json_object *args, void (*callback)(void*closure, int iserror, struct json_object *result), void *callback_closure)
 {
        service.itf->call(service.closure, api, verb, args, callback, callback_closure);
 }
 {
        service.itf->call(service.closure, api, verb, args, callback, callback_closure);
 }