#ifndef FSDIR_H
#define FSDIR_H

#include "amisc.h"
#include "async.h"
#include "arpc.h"
#include "nfsserv.h"
#include "fsfile.h"
#include "fs.h"

struct fsdirent
{
  fsdirent(str name, str fileid);
  fsdirent(const char *buf, unsigned long len, const char **next);
  str strify();
  
  str name;
  str fileid;
  ihash_entry<fsdirent> hlink;
};

typedef ihash<str, fsdirent, &fsdirent::name, &fsdirent::hlink> fsdirlist;

class fsdir : public fsfile
{
public:
  fsdir(fs *fs, str fileid);
  void get_dircontents(callback<void, int, ptr<fsdirlist> >::ref cb);
  void write_dircontents(ref<fsdirlist> lst, callback<void, int>::ref cb);
  void add_file(str filename, str fileid, callback<void, int>::ref cb);

private:
  void get_dircontents_on_get_fattr(
    callback<void, int, ptr<fsdirlist> >::ref cb, bool ok, fattr3 fa);
  void get_dircontents_on_read(callback<void, int, ptr<fsdirlist> >::ref cb,
                                fattr3 fa, bool ok, str data);
  void write_dircontents_on_write(callback<void, int>::ref cb,
                                  unsigned long len,
                                  bool ok);
  void write_dircontents_on_set_size(callback<void, int>::ref cb,
                                     bool ok);
  void add_file_on_get_dircontents(str filename, str fileid,
                                   callback<void, int>::ref cb,
                                   int r, ptr<fsdirlist> lst);
  void add_file_on_write_dircontents(callback<void, int>::ref cb, int r);
  
};

#endif // FSDIR_H
