23 #include "blackboard_processor.h"
24 #include <webview/page_reply.h>
26 #include <blackboard/blackboard.h>
27 #include <interface/interface.h>
28 #include <interface/field_iterator.h>
29 #include <interface/interface_info.h>
30 #include <utils/time/time.h>
36 using namespace fawkes;
51 __baseurl = strdup(baseurl);
52 __baseurl_len = strlen(__baseurl);
53 __blackboard = blackboard;
61 for (__ifi = __interfaces.begin(); __ifi != __interfaces.end(); ++__ifi) {
62 __blackboard->close(__ifi->second);
72 const char *upload_data,
73 size_t *upload_data_size,
76 if ( strncmp(__baseurl, url, __baseurl_len) == 0 ) {
78 std::string subpath = std::string(url).substr(__baseurl_len);
81 r->
set_html_header(
" <link type=\"text/css\" href=\"/static/css/jqtheme/jquery-ui.custom.css\" rel=\"stylesheet\" />\n"
82 " <script type=\"text/javascript\" src=\"/static/js/jquery.min.js\"></script>\n"
83 " <script type=\"text/javascript\" src=\"/static/js/jquery-ui.custom.min.js\"></script>\n");
85 *r +=
"<script type=\"text/javascript\">\n"
87 " $(\"#blackboard-interfaces-title\").click(function(){\n"
88 " if ( $(\"#blackboard-interfaces\").is(\":visible\") ) {\n"
89 " $(\"#blackboard-interfaces\").hide(\"blind\");\n"
90 " $(\"#blackboard-interfaces-icon\").attr(\"src\", \"/static/images/icon-triangle-e.png\");\n"
92 " $(\"#blackboard-interfaces\").show(\"blind\");\n"
93 " $(\"#blackboard-interfaces-icon\").attr(\"src\", \"/static/images/icon-triangle-s.png\");\n"
96 " $(\"#blackboard-interfaces\").hide();\n"
99 "<div id=\"blackboard-box\">\n"
100 " <div><a id=\"blackboard-interfaces-title\" href=\"#\"><img id=\"blackboard-interfaces-icon\" "
101 "class=\"blackboard-interfaces-icon\" src=\"/static/images/icon-triangle-e.png\" />"
102 "BlackBoard Interfaces</a></div>\n"
103 " <div id=\"blackboard-interfaces\">\n";
105 bool found_some =
false;
108 for (InterfaceInfoList::iterator i = iil->begin(); i != iil->end(); ++i) {
111 *r +=
"<tr><th>Interface</th><th>Reader(s)</th><th>Writer</th></tr>\n";
114 r->
append_body(
"<tr><td><a href=\"%s/view/%s::%s\">%s::%s</a></td><td>%u</td><td style=\"color:%s\">%s</td></tr>\n",
115 __baseurl, i->type(), i->id(), i->type(), i->id(),
116 i->num_readers(), i->has_writer() ?
"green" :
"red", i->has_writer() ?
"yes" :
"no");
123 *r +=
"<b>No interfaces found.</b>\n";
129 if (subpath.find(
"/view/") == 0) {
130 std::string iuid = subpath.substr(subpath.find_first_not_of(
"/", std::string(
"/view/").length()));
131 std::string iftype = iuid.substr(0, iuid.find(
"::"));
132 std::string ifname = iuid.substr(iuid.find(
"::") + 2);
134 r->
append_body(
"<h2>Interface: %s</h2>\n", iuid.c_str());
135 if (__interfaces.find(iuid) == __interfaces.end()) {
137 Interface *iface = __blackboard->open_for_reading(iftype.c_str(), ifname.c_str());
138 __interfaces[iuid] = iface;
143 if (__interfaces.find(iuid) != __interfaces.end()) {
174 " <tr><td><b>Type:</b></td><td>%s</td></tr>\n"
175 " <tr><td><b>ID:</b></td><td>%s</td></tr>\n"
176 " <tr><td><b>Has writer?:</b></td><td>%s</td></tr>\n"
177 " <tr><td><b>Num readers:</b></td><td>%u</td></tr>\n"
178 " <tr><td><b>Serial:</b></td><td>%u</td></tr>\n"
179 " <tr><td><b>Data size:</b></td><td>%u</td></tr>\n"
180 " <tr><td><b>Hash:</b></td><td>%s</td></tr>\n"
181 " <tr><td><b>Data changed:</b></td>"
182 "<td>%s (last at %s)</td></tr>\n"
196 " <th>Name</th><th>Type</th><th>Value</th>\n"
199 bool is_string = (fi.get_type() ==
IFT_STRING);
201 if ( fi.get_length() > 1 ) {
202 r->
append_body(
" <td>%s</td><td>%s [%zu]</td><td>%s%s%s</td>\n",
203 fi.get_name(), fi.get_typename(),
204 fi.get_length(), is_string ?
"<pre>" :
"",
205 fi.get_value_string(), is_string ?
"</pre>" :
"");
207 r->
append_body(
" <td>%s</td><td>%s</td><td>%s%s%s</td>\n",
208 fi.get_name(), fi.get_typename(), is_string ?
"<pre>" :
"",
209 fi.get_value_string(), is_string ?
"</pre>" :
"");
214 r->
append_body(
"<p><a href=\"%s\">Clear detailed</a></p>\n", __baseurl);