#include "stg/common.h"
#include "os_int.h"
-using namespace std;
-
//-------------------------------------------------------------------------
struct IP_MASK
{
IP_MASK() : ip(0), mask(0) {}
-IP_MASK(const IP_MASK & ipm) : ip(ipm.ip), mask(ipm.mask) {}
uint32_t ip;
uint32_t mask;
};
//-------------------------------------------------------------------------
class USER_IPS
{
- friend std::ostream & operator<< (ostream & o, const USER_IPS & i);
- //friend stringstream & operator<< (stringstream & s, const USER_IPS & i);
- friend const USER_IPS StrToIPS(const string & ipsStr) throw(string);
+ friend std::ostream & operator<< (std::ostream & o, const USER_IPS & i);
+ friend const USER_IPS StrToIPS(const std::string & ipsStr);
public:
- USER_IPS();
- USER_IPS(const USER_IPS &);
- USER_IPS & operator=(const USER_IPS &);
- const IP_MASK & operator[](int idx) const;
+ typedef std::vector<IP_MASK> ContainerType;
+ typedef ContainerType::size_type IndexType;
+
+ const IP_MASK & operator[](IndexType idx) const { return ips[idx]; }
std::string GetIpStr() const;
bool IsIPInIPS(uint32_t ip) const;
bool OnlyOneIP() const;
- int Count() const;
- void Add(const IP_MASK &im);
- void Erase();
+ bool IsAnyIP() const;
+ size_t Count() const { return ips.size(); }
+ void Add(const IP_MASK &im) { ips.push_back(im); }
private:
uint32_t CalcMask(unsigned int msk) const;
- std::vector<IP_MASK> ips;
+ ContainerType ips;
};
//-------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-inline
-USER_IPS::USER_IPS()
- : ips()
-{}
-//-----------------------------------------------------------------------------
-inline
-USER_IPS::USER_IPS(const USER_IPS & i)
- : ips(i.ips)
-{}
-//-----------------------------------------------------------------------------
-inline
-USER_IPS & USER_IPS::operator=(const USER_IPS & i)
-{
-ips = i.ips;
-return *this;
-}
-//-----------------------------------------------------------------------------
-inline
-const IP_MASK & USER_IPS::operator[](int idx) const
-{
-return ips[idx];
-}
//-----------------------------------------------------------------------------
inline
std::string USER_IPS::GetIpStr() const
return "*";
}
-std::vector<IP_MASK>::const_iterator it(ips.begin());
-std::stringstream s;
+ContainerType::const_iterator it(ips.begin());
+std::ostringstream s;
s << inet_ntostring(it->ip);
++it;
for (; it != ips.end(); ++it)
}
//-----------------------------------------------------------------------------
inline
-int USER_IPS::Count() const
-{
-return ips.size();
-}
-//-----------------------------------------------------------------------------
-inline
uint32_t USER_IPS::CalcMask(unsigned int msk) const
{
if (msk > 32)
if (ips.front().ip == 0)
return true;
-for (std::vector<IP_MASK>::const_iterator it(ips.begin()); it != ips.end(); ++it)
+for (ContainerType::const_iterator it(ips.begin()); it != ips.end(); ++it)
{
uint32_t mask(CalcMask(it->mask));
if ((ip & mask) == (it->ip & mask))
inline
bool USER_IPS::OnlyOneIP() const
{
-if (ips.size() == 1 && ips.front().mask == 32)
+if (ips.size() == 1 && ips.front().mask == 32 && ips.front().ip != 0)
return true;
return false;
}
//-----------------------------------------------------------------------------
inline
-void USER_IPS::Add(const IP_MASK &im)
+bool USER_IPS::IsAnyIP() const
{
-ips.push_back(im);
-}
-//-----------------------------------------------------------------------------
-inline
-void USER_IPS::Erase()
-{
-ips.erase(ips.begin(), ips.end());
+ return !ips.empty() && ips.front().ip == 0;
}
//-----------------------------------------------------------------------------
inline
return o << i.GetIpStr();
}
//-----------------------------------------------------------------------------
-/*inline
-stringstream & operator<<(std::stringstream & s, const USER_IPS & i)
-{
-s << i.GetIpStr();
-return s;
-}*/
-//-----------------------------------------------------------------------------
inline
-const USER_IPS StrToIPS(const std::string & ipsStr) throw(std::string)
+const USER_IPS StrToIPS(const std::string & ipsStr)
{
USER_IPS ips;
char * paddr;
return ips;
}
-char * str = new char[ipsStr.size() + 1];
-strcpy(str, ipsStr.c_str());
-char * pstr = str;
+char * tmp = new char[ipsStr.size() + 1];
+strcpy(tmp, ipsStr.c_str());
+char * pstr = tmp;
while ((paddr = strtok(pstr, ",")))
{
pstr = NULL;
ipMask.push_back(paddr);
}
-delete[] str;
+delete[] tmp;
-for (unsigned int i = 0; i < ipMask.size(); i++)
+for (USER_IPS::IndexType i = 0; i < ipMask.size(); i++)
{
char str[128];
char * strIp;