#include "fs.h"
#include "memblobindex.h"
#include "disksuperblob.h"
#include "inodelog.h"

void
FS::create(str filebase, callback<void, ref<FS> >::ref cb, cbe error)
{
  strbuf idxName(filebase);
  idxName << ".bdx";
  memBlobIndex::create(idxName,
                       wrap(create_afterBlobIndex, filebase, cb, error),
                       error);
}

void
FS::create_afterBlobIndex(str filebase,
                          callback<void, ref<FS> >::ref cb, cbe error,
                          ref<memBlobIndex> bi)
{
  strbuf blobName(filebase);
  blobName << ".blb";
  diskSuperblob::create(blobName, bi,
                        wrap(create_afterSuperblob, filebase, cb, error),
                        error);
}

void
FS::create_afterSuperblob(str filebase,
                          callback<void, ref<FS> >::ref cb, cbe error,
                          ref<diskSuperblob> blob)
{
  strbuf logName(filebase);
  logName << ".ilg";
  inodeLog::create(logName, blob,
                   wrap(create_afterInodeLog, filebase, blob, cb, error),
                   error);
}

void
FS::create_afterInodeLog(str filebase, ref<superblob> blob,
                         callback<void, ref<FS> >::ref cb, cbe error,
                         ref<inodeLog> log)
{
  cb(New refcounted<FS>(blob, log));
}

FS::FS(ref<superblob> blob, ref<inodeLog> log)
  : blob(blob), log(log)
{
}
