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> 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);
Interface field iterator.
unsigned short serial() const
Get instance serial of interface.
virtual fawkes::WebReply * process_request(const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **session_data)
Process a request.
unsigned int num_readers() const
Get the number of readers.
const char * hash_printable() const
Get printable interface hash.
virtual ~WebviewBlackBoardRequestProcessor()
Destructor.
Fawkes library namespace.
WebviewBlackBoardRequestProcessor(const char *baseurl, fawkes::BlackBoard *blackboard)
Constructor.
Base class for all Fawkes BlackBoard interfaces.
bool has_writer() const
Check if there is a writer for the interface.
const Time * timestamp() const
Get timestamp of last write.
const char * id() const
Get identifier of interface.
Interface information list.
unsigned int datasize() const
Get data size.
virtual const char * what() const
Get primary string.
Base class for exceptions in Fawkes.
void read()
Read from BlackBoard into local copy.
bool changed() const
Check if data has been changed.
InterfaceFieldIterator fields_end()
Invalid iterator.
void append_body(const char *format,...)
Append to body.
const char * str(bool utc=false) const
Output function.
The BlackBoard abstract class.
InterfaceFieldIterator fields()
Get iterator over all fields of this interface instance.
const char * type() const
Get type of interface.