00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WIFI_FRAME_STATS_SSID_STATS_HXX_
00023 # define WIFI_FRAME_STATS_SSID_STATS_HXX_
00024
00025 # include <boost/foreach.hpp>
00026 # include <boost/format.hpp>
00027
00028 # include <wipal/wifi/frame/stats/ssid_stats.hh>
00029 # include <wipal/tool/less.hh>
00030
00031 namespace wifi
00032 {
00033
00034 namespace frame
00035 {
00036
00037 namespace stats
00038 {
00039
00040 inline
00041 ssid_stats::ssid_stats(): total_ (0)
00042 {
00043 }
00044
00045 inline
00046 void
00047 ssid_stats::account_beacon(const std::string& ssid)
00048 {
00049 ++total_;
00050 ++freqs_[ssid];
00051 }
00052
00053 inline
00054 std::ostream&
00055 ssid_stats::print(std::ostream& os) const
00056 {
00057 typedef std::set<freq_type::const_iterator,
00058 tool::less_using_second> sorted_ssids;
00059
00060 const unsigned ssid_max_len = 40;
00061
00062 boost::format f (" %40d %f %d\n");
00063 sorted_ssids s;
00064
00065 for (freq_type::const_iterator i = freqs_.begin();
00066 i != freqs_.end();
00067 ++i)
00068 s.insert(i);
00069
00070 os << " distinct SSID's: " << freqs_.size() << '\n'
00071 << '\n'
00072 << " begin SSID list (ordered by frequency)\n";
00073 for (sorted_ssids::const_iterator i = s.begin(); i != s.end(); ++i)
00074 os << (f % escape_ssid((*i)->first, ssid_max_len)
00075 % (double ((*i)->second) / double (total_))
00076 % (*i)-> second);
00077 os << " end SSID list (ordered by frequency)\n"
00078 << '\n'
00079 << " begin SSID list (ordered by SSID)\n";
00080 for (freq_type::const_iterator i = freqs_.begin();
00081 i != freqs_.end();
00082 ++i)
00083 os << (f % escape_ssid(i->first, ssid_max_len)
00084 % (double (i->second) / double (total_))
00085 % i-> second);
00086 os << " end SSID list (ordered by SSID)\n";
00087
00088 return os << std::flush;
00089 }
00090
00091 inline
00092 std::string
00093 ssid_stats::escape_ssid(const std::string& s, size_t max_len)
00094 {
00095 std::string out ("\"");
00096
00097 BOOST_FOREACH(unsigned char c, s)
00098 {
00099 if (out.size() > max_len - 7)
00100 {
00101 out += "...";
00102 break;
00103 }
00104 if (c == '"')
00105 out += "\\\"";
00106 else if (std::isprint(c))
00107 out += c;
00108 else
00109 {
00110 std::ostringstream t;
00111
00112 t << "\\x" << std::hex << unsigned (c);
00113 out += t.str();
00114 }
00115 }
00116
00117 return out += '"';
00118 }
00119
00120 }
00121
00122 }
00123
00124 }
00125
00126 #endif // ! WIFI_FRAME_STATS_SSID_STATS_HXX_