#ifndef WVEXPORTER_H
#define WVEXPORTER_H

#include "wv.h"
#include "ms-ole-summary.h"

#ifdef __cplusplus
extern "C" {
#endif

/* This is our exportation abstraction layer.  
 * Each wvDocument maps to one file,
 * which streams can be opened within.
 */
typedef MsOle wvDocument;

  typedef struct {
    /* consider all of this data to be private */    

    /* our toplevel OLE Document */
    wvDocument *ole;

    /* the OLE streams within the toplevel OLE document */
    wvStream     *documentStream;
    wvStream     *table1Stream;
    wvStream     *table0Stream;
    wvStream     *dataStream;
    MsOleSummary *summaryStream;

    /* more accounting structures to come later */

    FIB fib;
    version ver;
  } wvExporter;

  int wvExporter_queryVersionSupported(version v);
  wvExporter * wvExporter_create(const char *filename);
  wvExporter * wvExporter_create_version(const char *filename, version v);
  void wvExporter_close(wvExporter *exp);
  void wvExporter_summaryPutString(wvExporter *exp, U32 field, const char *str);
  void wvExporter_summaryPutLong(wvExporter *exp, U32 field, U32 l);
  void wvExporter_summaryPutTime(wvExporter *exp, U32 field, time_t *t);

  size_t wvExporter_writeChars(wvExporter *exp, const char *chars);
  size_t wvExporter_writeBytes(wvExporter *exp, size_t sz, size_t nmemb,
			       const void *bytes);

  /* */
wvStream* wvStream_new(wvDocument* ole_file, const char* name);
int wvStream_write(void *ptr, size_t size, size_t nmemb, wvStream *in);
int write_32ubit(wvStream *in, U32 out);
int write_16ubit(wvStream *in, U16 out);
int write_8ubit(wvStream *in, U8 out);

void wvInitFIBForExport(FIB *item);
void wvPutFIB(FIB *item, wvStream *fd);
void wvPutDOP(version ver, DOP *item, wvStream *fd);
void wvPutANLD(version ver,ANLD *item,wvStream *fd);
void wvPutANLV(ANLV *item,wvStream *fd);
void wvPutANLV(ANLV *item,wvStream *fd);
void wvPutASUMYI(ASUMYI *asu,wvStream *fd);
void wvPutATRD(ATRD *item, wvStream *fd);
void wvPutBKD(BKD *item,wvStream *fd);
void wvPutBKF(BKF *item,wvStream *fd);
void wvPutBKL(BKL *item,wvStream *fd);
void wvPutBRC10(BRC *item, wvStream *fd);
void wvPutBRC6(BRC *item, wvStream *fd);
void wvPutBRC(BRC *item, wvStream *fd);
void wvPutBTE(BTE *bte,wvStream *fd);
void wvPutBX(BX *item, U8 *page, U16 *pos);
void wvPutBX6(BX *item, U8 *page, U16 *pos);
void wvPutDCS(DCS *item,wvStream *fd);
void wvPutDOGRID(DOGRID *dog,wvStream *fd);
void wvPutCOPTS(COPTS *item,wvStream *fd);
void wvPutDOPTYPOGRAPHY(DOPTYPOGRAPHY *dopt,wvStream *fd);
void wvPutDTTM(DTTM *item,wvStream *fd);
void wvUnixToDTTM(struct tm * src, DTTM * dest);
void wvPutFBSE(FBSE *item, wvStream *fd);
void wvPutFDOA(FDOA *item,wvStream *fd);
void wvPutFFN6(FFN *item, wvStream *fd);
void wvPutFFN(FFN *item, wvStream *fd);
void wvPutFILETIME(FILETIME *ft,wvStream *fd);
void wvPutFLD(FLD *item,wvStream *fd);
void wvPutFONTSIGNATURE(FONTSIGNATURE *fs,wvStream *fd);
void wvPutPANOSE(PANOSE *item,wvStream *fd);
void wvPutFAnchor(FAnchor *item,wvStream *fd);
void wvPutFOPTE(FOPTE *afopte,wvStream *fd);
void wvPutFOPTEArray(FOPTE **fopte,MSOFBH *msofbh,wvStream *fd);
void wvPutFRD(FRD *item,wvStream *fd);
void wvPutFSPA(FSPA *item,wvStream *fd);
void wvPutFTXBXS(FTXBXS *item,wvStream *fd);
void wvPutChar(wvStream *fd,U8 chartype, U16 ch);
void wvPutLFO(LFO *item,wvStream *fd);
void wvPutLSPD(LSPD *item, wvStream *fd);
void wvPutLSTF(LSTF *item,wvStream *fd);
void wvPutLVL(LVL *item, wvStream *fd);
void wvPutLVLF(LVLF *item,wvStream *fd);
void wvPutNUMRM(NUMRM *item, wvStream *fd);
void wvPutOLST(OLST *item, wvStream *fd);
void wvPutPCD(PCD *item, wvStream *fd);
void wvPutPGD(PGD *item, wvStream *fd);
void wvPutPHE6(PHE *item, wvStream *fd);
void wvPutPHE(PHE *item, wvStream *fd);
void wvPutPRM(PRM *item, wvStream *fd);
void wvPutRR(RR *item, wvStream *fd);
void wvPutRS(RS *item, wvStream *fd);
void wvPutSED(SED *item, wvStream *fd);
void wvPutSEPX(version ver,SEPX *item,wvStream *fd);
void wvPutSHD(SHD *item, wvStream *fd);
void wvPutPropHeader(PropHeader *header,wvStream *file);
void wvPutFIDAndOffset(FIDAndOffset *fid,wvStream *file);
void wvPutSummaryInfo(SummaryInfo *si,wvStream *file,U32 offset);
void wvPutTBD(TBD *item, wvStream *fd);
void wvPutTC(TC *tc, wvStream *fd);
void wvPutTLP(TLP *item, wvStream *fd);
void wvPutWKB(WKB *item,wvStream *fd);
void wvPutSTSHI(STSHI *item, U16 cbSTSHI, wvStream *fd);
void wvPutSTD(STD *item, U16 len, wvStream *fd);
void wvPutSTSH(STSH *item, U16 cbStshi, wvStream *fd);

#ifdef __cplusplus
}
#endif
    
#endif /* WVEXPORTER_H */