/*
 * Disk superblob implementation.
 */

#ifndef DISKSUPERBLOB_H
#define DISKSUPERBLOB_H

#include "persifs.h"
#include "superblob.h"


class diskSuperblob : public superblob
{
public:
  static void create(str filename, ref<blobIndex> bi,
                     callback<void, ref<diskSuperblob> >::ref cb,
                     cbe error);

  virtual void put(str blobContent,
                   callback<void, blockFingerprint, blockAddress>::ref cb,
                   cbe error);

  virtual void get(blockFingerprint fingerprint,
                   callback<void, str, blockAddress>::ref cb, cbe error);

  virtual void getDirect(blockAddress address,
                 callback<void, str, blockAddress>::ref on_get, cbe error);

  virtual ~diskSuperblob();
protected:
  diskSuperblob(FILE *f, ref<blobIndex> bi);
  FILE *f;
  ref<blobIndex> bi;

  // Callbacks
  void put_after_indexGet(
    str blobContent,
    blockFingerprint fp,
    callback<void, blockFingerprint, blockAddress>::ref cb,
    cbe error,
    blockAddress addr);
  void put_after_indexPut(
    str blobContent,
    blockFingerprint fp,
    blockAddress addr,
    callback<void, blockFingerprint, blockAddress>::ref cb,
    cbe error);
  void get_after_indexGet(blockFingerprint fp,
                           callback<void, str, blockAddress>::ref cb,
                           cbe error,
                           blockAddress addr);
};


#endif // DISKSUPERBLOB_H
