ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/HostStatus/HostStatus.cpp
(Generate patch)

Comparing HostStatus/HostStatus.cpp (file contents):
Revision 30 by Douglas Thrift, 2003-11-14T19:31:53-08:00 vs.
Revision 65 by Douglas Thrift, 2004-01-01T17:55:25-08:00

# Line 5 | Line 5
5   // $Id$
6  
7   #include "HostStatus.hpp"
8 + #include "Host.hpp"
9  
10   int main(int argc, char* argv[])
11   {
# Line 18 | Line 19 | HostStatus::HostStatus()
19          string method = sgetenv("REQUEST_METHOD");
20  
21          parse(method);
22 <
22 <        multimap<string, string>::iterator itor = cgi.find("format");
23 <
24 <        if (itor != cgi.end())
25 <        {
26 <                string format = itor->second;
27 <
28 <                if (format == "t")
29 <                {
30 <                        this->format = table;
31 <                }
32 <                else
33 <                {
34 <                        this->format = page;
35 <                }
36 <        }
22 >        mode();
23  
24          display(method);
25   }
# Line 67 | Line 53 | void HostStatus::parse(const string& met
53          while (input.good());
54   }
55  
56 + void HostStatus::mode()
57 + {
58 +        multimap<string, string>::iterator itor = cgi.find("format");
59 +
60 +        if (itor != cgi.end())
61 +        {
62 +                string format = itor->second;
63 +
64 +                page = format != "t" ? true : false;
65 +        }
66 +
67 +        if (!page) return;
68 +
69 +        host = false, name = false, address = false, platform = false, since =
70 +                false;
71 +
72 +        for (multimap<string, string>::iterator itor = cgi.find("mode"); itor !=
73 +                cgi.upper_bound("mode") && itor != cgi.end(); itor++)
74 +        {
75 +                string mode = itor->second;
76 +
77 +                for (string::iterator itor = mode.begin(); itor != mode.end(); itor++)
78 +                {
79 +                        char mode = *itor;
80 +
81 +                        switch (mode)
82 +                        {
83 +                        case 'h':
84 +                                if (!host) host = true;
85 +                                break;
86 +                        case 'n':
87 +                                if (!name) name = true;
88 +                                break;
89 +                        case 'a':
90 +                                if (!address) address = true;
91 +                                break;
92 +                        case 'p':
93 +                                if (!platform) platform = true;
94 +                                break;
95 +                        case 's':
96 +                                if (!since) since = true;
97 +                                break;
98 +                        default:
99 +                                break;
100 +                        }
101 +                }
102 +        }
103 +
104 +        if (!host && !name && !address && !platform && !since) host = true, name =
105 +                true, address = true, platform = true, since = true;
106 + }
107 +
108   void HostStatus::display(const string& method)
109   {
110          cout << "Content-Type: text/html\n\n";
# Line 86 | Line 124 | void HostStatus::display(const string& m
124                  hostupdate << '\n' << flush;
125          }
126  
127 +        hostupdate.ignore(26);
128 +
129 +        list<Host> hosts;
130 +        bool done = false;
131 +
132 +        do
133 +        {
134 +                Host host;
135 +
136 +                hostupdate >> host;
137 +
138 +                hosts.push_back(host);
139 +
140 +                switch (hostupdate.peek())
141 +                {
142 +                case 'h':
143 +                case 'n':
144 +                case 'a':
145 +                case 'p':
146 +                case 's':
147 +                        break;
148 +                default:
149 +                        done = true;
150 +                        break;
151 +                }
152 +        }
153 +        while (!done && hostupdate.good());
154 +
155 +        if (page) header(method);
156 +
157 +        for (list<Host>::iterator itor = hosts.begin(); itor != hosts.end();
158 +                itor++)
159 +        {
160 +                Host host = *itor;
161 +
162 +                cout << host << flush;
163 +        }
164 +
165 +        if (page) footer();
166 + }
167 +
168 + void HostStatus::header(const string& method)
169 + {
170 +        cout << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\"\n"
171 +                << "\t\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
172 +                << "<html>\n"
173 +                << "<head>\n"
174 +                << "<link rel=\"StyleSheet\" href=\"../stylesheets/regular.css\" type="
175 +                << "\"text/css\">\n"
176 +                << "<title>Host Status</title>\n"
177 +                << "</head>\n"
178 +                << "<body>\n"
179 +                << "<div>\n"
180 +                << "<h1 id=\"title\" class=\"center\">Host Status</h1>\n"
181 +                << "</div>\n"
182 +                << "<div class=\"hr\">\n"
183 +                << "<p class=\"floatleft\"><a href=\"./\"><img src=\"/icons/back.gif\""
184 +                << " alt=\"\"></a></p><p/>\n"
185 +                << "<form action=\"hoststatus.cgi\" method=\"POST\">\n"
186 +                << "<table class=\"center\">\n"
187 +                << "<tr>\n"
188 +                << "<td>\n"
189 +                << "<select name=\"host\" size=\"2\" multiple>\n";
190 +
191 +        if (method != "POST") sputenv("QUERY_STRING=mode=h");
192 +
193 +        pstream hostupdate("./hostupdate.cgi");
194 +
195 +        if (method == "POST") hostupdate << "mode=h\n" << flush;
196 +
197 +        hostupdate.ignore(26);
198 +
199 +        list<Host> hosts;
200 +        bool done = false;
201 +
202          do
203          {
204 <                string line;
204 >                Host host;
205 >
206 >                hostupdate >> host;
207 >
208 >                hosts.push_back(host);
209 >
210 >                switch (hostupdate.peek())
211 >                {
212 >                case 'h':
213 >                        break;
214 >                default:
215 >                        done = true;
216 >                        break;
217 >                }
218 >        }
219 >        while (!done && hostupdate.good());
220  
221 <                getline(hostupdate, line);
221 >        set<string> selected;
222  
223 <                cout << line << '\n';
223 >        for (multimap<string, string>::iterator itor = cgi.find("host"); itor !=
224 >                cgi.upper_bound("host") && itor != cgi.end(); itor++)
225 >        {
226 >                string host = itor->second;
227 >
228 >                if (host != "") selected.insert(host);
229          }
230 <        while (hostupdate.good());
230 >
231 >        for (list<Host>::iterator itor = hosts.begin(); itor != hosts.end();
232 >                itor++)
233 >        {
234 >                Host host = *itor;
235 >
236 >                cout << "<option" << (selected.find(host.getHost()) != selected.end() ?
237 >                        " selected>" : ">") << host.getHost() << "</option>\n";
238 >        }
239 >
240 >        bool all = host && name && address && platform && since;
241 >
242 >        cout << "</select>\n"
243 >                << "</td>\n"
244 >                << "<td>\n"
245 >                << "<input type=\"checkbox\" name=\"mode\" value=\"h\""
246 >                << (host && !all ? " checked" : "") << ">&nbsp;Host\n"
247 >                << "<input type=\"checkbox\" name=\"mode\" value=\"n\""
248 >                << (name && !all ? " checked" : "") << ">&nbsp;Name\n"
249 >                << "<input type=\"checkbox\" name=\"mode\" value=\"a\""
250 >                << (address && !all ? " checked" : "") << ">&nbsp;Address\n"
251 >                << "<input type=\"checkbox\" name=\"mode\" value=\"p\""
252 >                << (platform && !all ? " checked" : "") << ">&nbsp;Platform\n"
253 >                << "<input type=\"checkbox\" name=\"mode\" value=\"s\""
254 >                << (since && !all ? " checked" : "") << ">&nbsp;Since\n"
255 >                << "</td>\n"
256 >                << "<td><input type=\"submit\" value=\"Status\"></td>\n"
257 >                << "</tr>\n"
258 >                << "</table>\n"
259 >                << "</form>\n"
260 >                << "<table class=\"center\">\n"
261 >                << "<tr>\n";
262 >
263 >        if (host) cout << "<th>Host</th>\n";
264 >        if (name) cout << "<th>Name</th>\n";
265 >        if (address) cout << "<th>Address</th>\n";
266 >        if (platform) cout << "<th>Platform</th>\n";
267 >        if (since) cout << "<th>Since</th>\n";
268 >
269 >        cout << "</tr>\n";
270 > }
271 >
272 > void HostStatus::footer()
273 > {
274 >        cout << "</table>\n"
275 >                << "</div>\n"
276 >                << "</html>\n";
277   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines