// this is the remote yfs server

#ifndef yfs_server_h
#define yfs_server_h

#include <string>
#include "yfs_protocol.h"
#include "extent_client.h"
#include "lock_client.h"
#include "lock_client_cache.h"

class yfs_server {
  extent_client *ec;
  lock_client_cache *el; //the lock client 
  extent_transfer *et;
 private:
  static std::string filename(yfs_protocol::inum);
  static yfs_protocol::inum inum(std::string);
  int mylookup(yfs_protocol::inum parent, std::string name, yfs_protocol::inum & inum);
  int mygetfile( yfs_protocol::inum inum, yfs_protocol::fileinfo &fin);
  int mygetdir( yfs_protocol::inum inum, yfs_protocol::dirinfo &din);
		  
  const static int DEBUG = 0;	  
		  
  unsigned int last_inum;
 public:


  yfs_server(struct sockaddr_in dst, struct sockaddr_in dst, int);

  bool isfile(yfs_protocol::inum);
  bool isdir(yfs_protocol::inum);
  yfs_protocol::inum ilookup(yfs_protocol::inum di, std::string name);

  int getfile(yfs_protocol::inum, yfs_protocol::fileinfo &);
  int getdir(yfs_protocol::inum, yfs_protocol::dirinfo &);
  int mknod(yfs_protocol::inum parent, std::string name, mode_t mode, dev_t dev, yfs_protocol::inum & inum);
  int lookup(yfs_protocol::inum parent, std::string name, yfs_protocol::inum & inum);
  int readdir(yfs_protocol::inum inum, std::list<yfs_protocol::dirent> &lst);
  //int test_server_connection(int value,const char  ame, int &);
  int setattr(yfs_protocol::inum inode, int to_set, yfs_protocol::fileinfo fi, int & r);
  int read(yfs_protocol::inum, std::string &value);
  int write(yfs_protocol::inum inum, std::string buf, unsigned long long off,  int & r );
  int mkdir(yfs_protocol::inum parent, std::string name, mode_t mode, yfs_protocol::inum & inum);
  int unlink(yfs_protocol::inum , yfs_protocol::inum , int & );
  };

#endif 
