/*****************************************************************************
Copyright © 2006, 2007, The Board of Trustees of the University of Illinois.
All Rights Reserved.
Sector: A Distributed Storage and Computing Infrastructure
National Center for Data Mining (NCDM)
University of Illinois at Chicago
http://www.ncdm.uic.edu/
Sector is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.
Sector is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
/*****************************************************************************
written by
Yunhong Gu [gu@lac.uic.edu], last updated 04/06/2007
*****************************************************************************/
#include "client.h"
using namespace cb;
string Client::m_strServerHost = "";
int Client::m_iServerPort = 0;
CGMP* Client::m_pGMP = NULL;
int Client::m_iCount = 0;
Client::Client()
{
}
Client::~Client()
{
}
int Client::init(const string& server, const int& port)
{
if (m_iCount ++ > 0)
return 1;
m_strServerHost = server;
m_iServerPort = port;
m_pGMP = new CGMP;
m_pGMP->init(0);
return 1;
}
int Client::close()
{
if (m_iCount -- == 0)
{
m_strServerHost = "";
m_iServerPort = 0;
m_pGMP->close();
delete m_pGMP;
}
return 1;
}
int Client::lookup(const string& name, Node* n)
{
CCBMsg msg;
msg.setType(4); // look up a file server
msg.setData(0, name.c_str(), name.length() + 1);
msg.m_iDataLength = 4 + name.length() + 1;
if (m_pGMP->rpc(m_strServerHost.c_str(), m_iServerPort, &msg, &msg) < 0)
return -1;
if (msg.getType() > 0)
memcpy(n, msg.getData(), sizeof(Node));
return msg.getType();
}
int Client::lookup(const string& name, vector<Node>& nl)
{
nl.clear();
Node n;
if (lookup(name, &n) < 0)
return 0;
CCBMsg msg;
msg.resize(65536);
msg.setType(1); // locate file
msg.setData(0, name.c_str(), name.length() + 1);
msg.m_iDataLength = 4 + name.length() + 1;
if (m_pGMP->rpc(n.m_pcIP, n.m_iAppPort, &msg, &msg) < 0)
return 0;
int num = (msg.m_iDataLength - 4) / 68;
n.m_uiID = 0;
n.m_iPort = 0;
for (int i = 0; i < num; ++ i)
{
strcpy(n.m_pcIP, msg.getData() + 68 * i);
n.m_iAppPort = *(int*)(msg.getData() + 68 * i + 64);
nl.insert(nl.end(), n);
}
return nl.size();
}
int Client::checkServStatus(const vector<Node>& nl, vector<NodeInfo>& il)
{
il.clear();
il.resize(nl.size());
CCBMsg msg;
msg.setType(1); // query server information
msg.m_iDataLength = 4;
vector<NodeInfo>::iterator c = il.begin();
for (vector<Node>::const_iterator i = nl.begin(); i != nl.end(); ++ i)
{
if (m_pGMP->rpc(i->m_pcIP, i->m_iAppPort, &msg, &msg) > 0)
{
*c = *(NodeInfo*)msg.getData();
c->m_iRTT = m_pGMP->rtt(i->m_pcIP, i->m_iAppPort);
}
else
c->m_iStatus = -1;
++ c;
}
return 1;
}