1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
// diskstruct.h
/******************************************************************************
*
* MiXViews - an X window system based sound & data editor/processor
*
* Copyright (c) 1993, 1994 Regents of the University of California
*
* Author: Douglas Scott
* Date: December 13, 1994
*
* Permission to use, copy and modify this software and its documentation
* for research and/or educational purposes and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation. The author reserves the right to distribute this
* software and its documentation. The University of California and the author
* make no representations about the suitability of this software for any
* purpose, and in no event shall University of California be liable for any
* damage, loss of data, or profits resulting from its use.
* It is provided "as is" without express or implied warranty.
*
******************************************************************************/
// DiskStruct is the base class for all classes which read a "typed stream" of
// values from an on-disk file. It is designed to allow reading and writing
// of all sizes of datatypes to and from files in such a way that the
// differences in in-memory struct layouts do not affect the on-disk layout
// Also, it takes into account cases of byte-swapped information.
#ifndef DISKSTRUCT_H
#ifdef __GNUG__
#pragma interface
#endif
#define DISKSTRUCT_H
#include "id.h"
#include "localdefs.h"
class DataFile;
class ValueSetterBase;
class DiskStruct {
public:
DiskStruct() {}
virtual ~DiskStruct() {}
virtual int read(DataFile* file) { return doRead(file, valueSetters()); }
virtual int write(DataFile* file) { return doWrite(file, valueSetters()); }
virtual LONG readSize() { return sizeof(*this); }
protected:
virtual int doRead(DataFile*, ValueSetterBase**);
virtual int doWrite(DataFile*, ValueSetterBase**);
virtual ValueSetterBase** valueSetters()=0;
};
// many standard file formats use an identifier chunk consisting of a 4-char
// identification string followed by a LONG indicating the size of what follows
class StandardChunk : public DiskStruct {
typedef DiskStruct Super;
public:
StandardChunk(const char* idString="", LONG len=0);
virtual boolean isValid() { return true; }
boolean isA(const char* idstr) { return (magic == idstr); }
long size() { return chunkSize; }
redefined LONG readSize() { return sizeof(*this) - Super::readSize(); }
protected:
redefined ValueSetterBase** valueSetters();
enum { NumElements = 2 };
private:
Id magic;
unsigned LONG chunkSize; // size in bytes of information to follow
};
// an expansion of DiskStruct for handling variable-length on-disk data where
// the additional data is an undifferentiated char[] block
class VariableBlockDiskStruct : public DiskStruct {
typedef DiskStruct Super;
public:
redefined int read(DataFile *);
redefined int write(DataFile *);
redefined LONG readSize() { return sizeof(*this); }
protected:
virtual void createVariableBlock()=0;
ValueSetterBase** blockValueSetters();
private:
virtual char* variableBlockAddress()=0;
virtual LONG variableBlockLength()=0;
};
#endif
|