{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetAdmins(GetAdminsCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
// STG currently doesn't support <GetAdmin login="..."/>.
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.DelAdmin(arg, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "password", conf.password);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.AddAdmin(arg, conf, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "password", conf.password);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.ChgAdmin(conf, SimpleCallback, NULL) == STG::st_ok;
RESETABLE<std::string> configFile;
RESETABLE<std::string> server;
RESETABLE<uint16_t> port;
+ RESETABLE<std::string> localAddress;
+ RESETABLE<uint16_t> localPort;
RESETABLE<std::string> userName;
RESETABLE<std::string> userPass;
server = rhs.server;
if (!rhs.port.empty())
port = rhs.port;
+ if (!rhs.localAddress.empty())
+ localAddress = rhs.localAddress;
+ if (!rhs.localPort.empty())
+ localPort = rhs.localPort;
if (!rhs.userName.empty())
userName = rhs.userName;
if (!rhs.userPass.empty())
res += " server: '" + server.data() + "',";
if (!port.empty())
res += " port: " + x2str(port.data()) + ",";
+ if (!localAddress.empty())
+ res += " local address: '" + localAddress.data() + "',";
+ if (!localPort.empty())
+ res += " local port: " + x2str(localPort.data()) + ",";
if (!userName.empty())
res += " userName: '" + userName.data() + "',";
if (!userPass.empty())
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetCorporations(GetCorpsCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetCorp(arg, GetCorpCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.DelCorp(arg, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "cash", conf.cash);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.AddCorp(arg, conf, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "cash", conf.cash);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.ChgCorp(conf, SimpleCallback, NULL) == STG::st_ok;
SGCONF::OPTION_BLOCK & block = blocks.Add("Connection options")
.Add("s", "server", SGCONF::MakeParamAction(config.server, std::string("localhost"), "<address>"), "\t\thost to connect")
.Add("p", "port", SGCONF::MakeParamAction(config.port, uint16_t(5555), "<port>"), "\t\tport to connect")
+ .Add("local-address", SGCONF::MakeParamAction(config.localAddress, std::string(""), "<address>"), "\t\tlocal address to bind")
+ .Add("local-port", SGCONF::MakeParamAction(config.localPort, uint16_t(0), "<port>"), "\t\tlocal port to bind")
.Add("u", "username", SGCONF::MakeParamAction(config.userName, std::string("admin"), "<username>"), "\tadministrative login")
.Add("w", "userpass", SGCONF::MakeParamAction(config.userPass, "<password>"), "\tpassword for the administrative login")
.Add("a", "address", SGCONF::MakeParamAction(config, "<connection string>"), "connection params as a single string in format: <login>:<password>@<host>:<port>");
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetServices(GetServicesCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetService(arg, GetServiceCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.DelService(arg, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "comment", conf.comment);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.AddService(arg, conf, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "comment", conf.comment);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.ChgService(conf, SimpleCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetTariffs(GetTariffsCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
// STG currently doesn't support <GetTariff name="..."/>.
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.DelTariff(arg, SimpleCallback, NULL) == STG::st_ok;
}
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.AddTariff(arg, conf, SimpleCallback, NULL) == STG::st_ok;
}
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.ChgTariff(conf, SimpleCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetUsers(GetUsersCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.GetUser(arg, GetUserCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.DelUser(arg, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "month-traffic", stat, ConvMonthTraff);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.AddUser(arg, conf, stat, SimpleCallback, NULL) == STG::st_ok;
SGCONF::MaybeSet(options, "month-traffic", stat, ConvMonthTraff);
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.ChgUser(arg, conf, stat, SimpleCallback, NULL) == STG::st_ok;
throw SGCONF::ACTION::ERROR("Password is not specified.");
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.CheckUser(arg, it->second, SimpleCallback, NULL) == STG::st_ok;
std::string text = it->second;
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.SendMessage(logins, text, SimpleCallback, NULL) == STG::st_ok;
{
STG::SERVCONF proto(config.server.data(),
config.port.data(),
+ config.localAddress.data(),
+ config.localPort.data(),
config.userName.data(),
config.userPass.data());
return proto.RawXML(arg, RawXMLCallback, NULL) == STG::st_ok;
public:
SERVCONF(const std::string & server, uint16_t port,
const std::string & login, const std::string & password);
+ SERVCONF(const std::string & server, uint16_t port,
+ const std::string & localAddress, uint16_t localPort,
+ const std::string & login, const std::string & password);
~SERVCONF();
int ServerInfo(SERVER_INFO::CALLBACK f, void * data);
#define RECV_DATA_ANSWER_ERROR "Recv data answer error!"
#define UNKNOWN_ERROR "Unknown error!"
#define CONNECT_FAILED "Connect failed!"
+#define BIND_FAILED "Bind failed!"
#define INCORRECT_LOGIN "Incorrect login!"
#define INCORRECT_HEADER "Incorrect header!"
#define SEND_LOGIN_ERROR "Send login error!"
{
}
//---------------------------------------------------------------------------
+NETTRANSACT::NETTRANSACT(const std::string & s, uint16_t p,
+ const std::string & la, uint16_t lp,
+ const std::string & l, const std::string & pwd)
+ : server(s),
+ port(p),
+ localAddress(la),
+ localPort(lp),
+ login(l),
+ password(pwd),
+ outerSocket(-1)
+{
+}
+//---------------------------------------------------------------------------
int NETTRANSACT::Connect()
{
outerSocket = socket(PF_INET, SOCK_STREAM, 0);
return st_conn_fail;
}
+if (!localAddress.empty())
+ {
+ if (localPort == 0)
+ localPort = port;
+
+ unsigned long ip = inet_addr(localAddress.c_str());
+
+ if (ip == INADDR_NONE)
+ {
+ struct hostent * phe = gethostbyname(localAddress.c_str());
+ if (phe == NULL)
+ {
+ errorMsg = "DNS error.\nCan not reslove " + localAddress;
+ return st_dns_err;
+ }
+
+ struct hostent he;
+ memcpy(&he, phe, sizeof(he));
+ ip = *((long *)he.h_addr_list[0]);
+ }
+
+ struct sockaddr_in localAddr;
+ memset(&localAddr, 0, sizeof(localAddr));
+ localAddr.sin_family = AF_INET;
+ localAddr.sin_port = htons(localPort);
+ localAddr.sin_addr.s_addr = ip;
+
+ if (bind(outerSocket, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0)
+ {
+ errorMsg = BIND_FAILED;
+ close(outerSocket);
+ return st_conn_fail;
+ }
+ }
+
struct sockaddr_in outerAddr;
memset(&outerAddr, 0, sizeof(outerAddr));
NETTRANSACT(const std::string & server, uint16_t port,
const std::string & login, const std::string & password);
+ NETTRANSACT(const std::string & server, uint16_t port,
+ const std::string & localAddress, uint16_t localPort,
+ const std::string & login, const std::string & password);
int Transact(const std::string & request, CALLBACK f, void * data);
const std::string & GetError() const { return errorMsg; }
public:
IMPL(const std::string & server, uint16_t port,
const std::string & login, const std::string & password);
+ IMPL(const std::string & server, uint16_t port,
+ const std::string & localAddress, uint16_t localPort,
+ const std::string & login, const std::string & password);
~IMPL() { XML_ParserFree(parser); }
const std::string & GetStrError() const;
{
}
+SERVCONF::SERVCONF(const std::string & server, uint16_t port,
+ const std::string & localAddress, uint16_t localPort,
+ const std::string & login, const std::string & password)
+ : pImpl(new IMPL(server, port, localAddress, localPort, login, password))
+{
+}
+
SERVCONF::~SERVCONF()
{
delete pImpl;
//-----------------------------------------------------------------------------
SERVCONF::IMPL::IMPL(const std::string & server, uint16_t port,
const std::string & login, const std::string & password)
- : nt( server, port, login, password )
+ : nt(server, port, login, password)
+{
+parser = XML_ParserCreate(NULL);
+}
+//-----------------------------------------------------------------------------
+SERVCONF::IMPL::IMPL(const std::string & server, uint16_t port,
+ const std::string & localAddress, uint16_t localPort,
+ const std::string & login, const std::string & password)
+ : nt(server, port, localAddress, localPort, login, password)
{
parser = XML_ParserCreate(NULL);
}