// RPC stubs for yfs to talk to yfs_server

#include "yfs_client.h"
#include "../rpc/rpc.h"

yfs_client::yfs_client(sockaddr_in xdst)
  : dst(xdst)
{
}

bool
yfs_client::isfile(yfs_protocol::inum inum)
{
  if(inum & 0x80000000)
    return true;
  return false;
}

bool
yfs_client::isdir(yfs_protocol::inum inum)
{
  return ! isfile(inum);
}

yfs_protocol::status
yfs_client::getfile(yfs_protocol::inum inum, yfs_protocol::fileinfo &fin)
{
 // write(1, "in yfs_client get file\n", 30);
  return cl.call(dst, yfs_protocol::getfile, inum, fin);
}

yfs_protocol::status
yfs_client::getdir(yfs_protocol::inum inum, yfs_protocol::dirinfo &fin)
{
	printf("\nin yfs_client get dir\n");
	yfs_protocol::status ret= cl.call(dst, yfs_protocol::getdir, inum, fin);
	printf("returning with %d from yfs_client get dir", ret);
	return ret;
}

yfs_protocol::status yfs_client::readdir(yfs_protocol::inum inum, std::list<yfs_protocol::dirent> &lst) {
	printf("entering yfs client read dir\n");
	yfs_protocol::status ret = cl.call(dst, yfs_protocol::readdir, inum, lst);
	printf("leaving yfs client read dir\n");
	return ret;
}

yfs_protocol::status yfs_client::setattr(yfs_protocol::inum inode,int   to_set, yfs_protocol::fileinfo  fi) {
	printf("entering yfs client setattr\n");
	int  res;
	yfs_protocol::status ret = cl.call(dst, yfs_protocol::setattr, inode,to_set, fi, res);
	printf("leaving yfs client setattr\n");
	return ret;
}


//needs to also add an entry to the appropriate dir
yfs_protocol::status yfs_client::mknod(yfs_protocol::inum parent, const char * name, mode_t mode, dev_t dev, yfs_protocol::inum & inum) {
//	printf("entering mkmod from yfs_client; name to create is %s mode:%llu dev:%llu \n", name, mode, dev);
		
	std::string a_name(name);
	printf("convert to std string and we get: %s \n", a_name.c_str());
	return cl.call(dst, yfs_protocol::mknod, parent, a_name, mode, dev, inum);
}
yfs_protocol::status yfs_client::mkdir(yfs_protocol::inum parent, const char * name, mode_t mode,  yfs_protocol::inum & inum) {
//	printf("entering mkmod from yfs_client; name to create is %s mode:%llu dev:%llu \n", name, mode, dev);
		
	std::string a_name(name);
	printf("yfs client mkdir with name is  %s \n", a_name.c_str());
	return cl.call(dst, yfs_protocol::mkdir, parent, a_name, mode, inum);
}


yfs_protocol::status yfs_client::lookup(yfs_protocol::inum parent,const char * name, yfs_protocol::inum & inum) 
{
	//write(1,"in  yfs client lookup, calling remote\n",50);
	std::string a_name(name);
	printf("arguments to call are parent %lld, name %s", parent, a_name.c_str());
	return cl.call(dst, yfs_protocol::lookup, parent, a_name, inum);
	
}

yfs_protocol::status yfs_client::read(yfs_protocol::inum inum, std::string & value) 
{
	printf("entering read in yfs_client \n");
		
	yfs_protocol::status ret =  cl.call(dst, yfs_protocol::read, inum, value);
	printf("leaving read in yfs_client with value %s\n", value.c_str());
	
	return ret;
	
	
}


yfs_protocol::status yfs_client::write(yfs_protocol::inum inum, std::string to_copy, long long off, int & res)
{
	printf("entering write in yfs_client \n");
	
	//unsigned long long second_size = size;
	unsigned long long second_off = off;
	printf("in yfs_client write: inum is %llu, to_copy %s \n, off is %llu, second_off %llu, size of to_copy%u \n ", inum, to_copy.c_str(), off, second_off, to_copy.size());
	yfs_protocol::status ret =  cl.call(dst, yfs_protocol::write, inum, to_copy, second_off,  res);
	
	printf("leaving write in yfs_client \n");
	return ret;
	
}

yfs_protocol::status yfs_client::unlink(yfs_protocol::inum inum_parent, yfs_protocol::inum inum) {
	printf("entering yfs client for inum %llu\n", inum);
	int res;
	yfs_protocol::status ret = cl.call(dst, yfs_protocol::unlink, inum_parent, inum, res);
	printf("leaving yfs client\n");
	return ret;
}




