00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "jabberoo.hh"
00031 using namespace jabberoo;
00032
00033
00034 class pred_presence_jid
00035 {
00036 string _jid;
00037 public:
00038 pred_presence_jid(const Presence& p)
00039 : _jid(p.getFrom()) {}
00040 pred_presence_jid(const string& s) : _jid(s) {}
00041
00042 bool operator()(const Presence& p) const
00043 { return (JID::compare(_jid, p.getFrom()) == 0); }
00044 };
00045
00046 class pred_presence_priority
00047 {
00048 int _priority;
00049 public:
00050 pred_presence_priority(const Presence& p)
00051 : _priority(p.getPriority()){}
00052 bool operator()(const Presence& p) const
00053 { return p.getPriority() <= _priority; }
00054 };
00055
00056 PresenceDB::PresenceDB(Session& s)
00057 : _Owner(s)
00058 {}
00059
00060 PresenceDB::db::const_iterator PresenceDB::find_or_throw(const string& jid) const
00061 {
00062 db::const_iterator it = _DB.find(JID::getUserHost(jid));
00063 if (it != _DB.end())
00064 return it;
00065 else
00066 throw XCP_InvalidJID();
00067 }
00068
00069 void display(const Presence& p)
00070 {
00071 cerr << "\tItem: " << p.toString() << endl;
00072 }
00073
00074
00075 void PresenceDB::insert(const Presence& p)
00076 {
00077
00078 list<Presence>& l = _DB[JID::getUserHost(p.getFrom())];
00079
00080
00081 if (p.getType() == Presence::ptUnavailable ||
00082 p.getType() == Presence::ptError)
00083 {
00084
00085 if (l.empty())
00086 {
00087 _DB.erase(JID::getUserHost(p.getFrom()));
00088 return;
00089 }
00090 else
00091 {
00092
00093 iterator it = find_if(l.begin(), l.end(), pred_presence_jid(p));
00094 if (it != l.end())
00095 l.erase(it);
00096
00097 if (l.empty())
00098 _DB.erase(JID::getUserHost(p.getFrom()));
00099 }
00100 }
00101
00102 else
00103 {
00104
00105 if (l.empty())
00106 {
00107 l.push_back(p);
00108 }
00109
00110 else
00111 {
00112
00113 iterator it = find_if(l.begin(), l.end(), pred_presence_jid(p));
00114 if (it != l.end())
00115 {
00116
00117 if (it->getPriority() == p.getPriority())
00118 {
00119
00120 *it = p;
00121 return;
00122 }
00123
00124 else
00125 l.erase(it);
00126 }
00127
00128 it = find_if(l.begin(), l.end(), pred_presence_priority(p));
00129 l.insert(it, p);
00130 }
00131 }
00132 }
00133
00134 void PresenceDB::remove(const string& jid)
00135 {
00136 list<Presence>& l = _DB[JID::getUserHost(jid)];
00137
00138
00139 if (l.empty())
00140 {
00141 _DB.erase(JID::getUserHost(jid));
00142 return;
00143 }
00144 else
00145 {
00146
00147 iterator it = find_if(l.begin(), l.end(), pred_presence_jid(jid));
00148 if (it != l.end())
00149 l.erase(it);
00150
00151 if (l.empty())
00152 _DB.erase(JID::getUserHost(jid));
00153 }
00154 }
00155
00156
00157 PresenceDB::range PresenceDB::equal_range(const string& jid) const
00158 {
00159 db::const_iterator it = find_or_throw(jid);
00160 return make_pair(it->second.begin(), it->second.end());
00161 }
00162
00163 Presence PresenceDB::findExact(const string& jid) const
00164 {
00165 PresenceDB::db::const_iterator it = find_or_throw(jid);
00166
00167
00168 if (it->second.begin() == it->second.end())
00169 throw XCP_InvalidJID();
00170
00171
00172 string::size_type i = jid.find("/");
00173 if (i != string::npos)
00174 {
00175 list<Presence> l= it->second;
00176
00177
00178
00179 iterator it2 = find_if(l.begin(), l.end(), pred_presence_jid(jid));
00180
00181
00182 if (it2 == l.end())
00183 throw XCP_InvalidJID();
00184
00185
00186 return *it2;
00187 }
00188 else
00189 {
00190
00191 return *find_or_throw(jid)->second.begin();
00192 }
00193 }
00194
00195 PresenceDB::const_iterator PresenceDB::find(const string& jid) const
00196 {
00197 PresenceDB::db::const_iterator it = find_or_throw(jid);
00198
00199
00200 if (it->second.begin() != it->second.end())
00201 return find_or_throw(jid)->second.begin();
00202 else
00203 throw XCP_InvalidJID();
00204 }
00205
00206 bool PresenceDB::contains(const string& jid) const
00207 {
00208 return (_DB.find(JID::getUserHost(jid)) != _DB.end());
00209 }
00210
00211 bool PresenceDB::available(const string& jid) const
00212 {
00213 db::const_iterator it = _DB.find(JID::getUserHost(jid));
00214
00215
00216
00217 if (it != _DB.end() && it->second.begin() != it->second.end())
00218 return (it->second.begin()->getType() == Presence::ptAvailable);
00219 else
00220 return false;
00221 }
00222
00223 void PresenceDB::clear()
00224 {
00225
00226 _DB.clear();
00227 }