SDIFFile.hxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __SDIFFile__
00023 #define __SDIFFile__
00024
00025 #include "SDIFType.hxx"
00026 #include "SDIFHeader.hxx"
00027 #include "SDIFFrame.hxx"
00028 #include "SDIFMatrix.hxx"
00029 #include "SDIFStorage.hxx"
00030 #include "ByteOrder.hxx"
00031
00032 #ifndef WIN32
00033 #ifdef macintosh
00034 #include <types.h>
00035 #include <unistd.h>
00036 #else
00037 #include <sys/types.h>
00038 #include <unistd.h>
00039 #endif
00040 #else
00041 #include <stdio.h>
00042 #include <io.h>
00043 #endif
00044
00058 namespace SDIF
00059 {
00060
00061 class File
00062 {
00063 public:
00064 enum Mode
00065 {
00066 eInput = 1, eOutput = 2, eFullDuplex = 3
00067 };
00068
00069 File(const char* filename, Mode mode);
00070 ~File();
00071
00072 void Open(void);
00073 void Close(void);
00074
00075 bool Done(void);
00076
00077 CLAM::TIndex Pos(void);
00078 CLAM::TIndex Pos(CLAM::TIndex pos);
00079
00080 private:
00081 bool mSkipData;
00082 bool mFirstAccess;
00083 char* mpName;
00084 Mode mMode;
00085 int mFile;
00086 CLAM::TSize mSize;
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 void Read(CLAM::TByte* ptr,int n);
00111
00112 template <class T> void TRead(T& t)
00113 {
00114 Read((CLAM::TByte*) &t,sizeof(T));
00115 FixByteOrder((CLAM::TByte*) &t,1,sizeof(T));
00116 }
00117
00118 void Write(const CLAM::TByte* ptr,int n);
00119
00120 template <class T> void TWrite(const T& t)
00121 {
00122 T tmp(t);
00123 FixByteOrder((CLAM::TByte*) &tmp,1,sizeof(T));
00124 Write((CLAM::TByte*) &tmp,sizeof(T));
00125 }
00126
00127 inline void FixByteOrder(CLAM::TByte* ptr,
00128 CLAM::TUInt32 nElems,CLAM::TUInt32 elemSize);
00129
00130 void Read(DataFrameHeader& header);
00131 void Write(const DataFrameHeader& header);
00132
00133 void Read(FrameHeader& header);
00134 void Write(const FrameHeader& header);
00135
00136 void Read(MatrixHeader& header);
00137 void Write(const MatrixHeader& header);
00138
00139 void Read(OpeningsFrame& frame);
00140 void Write(const OpeningsFrame& frame);
00141
00142 void Read(Matrix& matrix);
00143 void Write(const Matrix& matrix);
00144
00145 void Read(TypeId& header);
00146 void Write(const TypeId& header);
00147
00148 void SkipMatrixData(const Matrix& matrix);
00149 void ReadMatrixData(Matrix& matrix);
00150 void WriteMatrixData(const Matrix& matrix);
00151
00152 public:
00153 void Read(Storage& storage);
00154 void Write(const Storage& storage);
00155
00156 void Read(Frame& frame);
00157 void Write(const Frame& frame);
00158
00159 private:
00160 void _FixByteOrder(
00161 CLAM::TByte* ptr,CLAM::TUInt32 nElems,CLAM::TUInt32 elemSize);
00162 };
00163
00164 inline int File::Pos(void)
00165 {
00166 int pos = lseek(mFile,0,SEEK_CUR);
00167 return pos;
00168 }
00169
00170 inline int File::Pos(int pos)
00171 {
00172 return lseek(mFile,pos,SEEK_SET);
00173 }
00174
00175 inline void File::Read(CLAM::TByte* ptr,int n)
00176 {
00177 if (read(mFile,(char*)ptr,n)!=n) {
00178 throw CLAM::Err("DataFileIO read error");
00179 }
00180 }
00181
00182 inline void File::Write(const CLAM::TByte* ptr,int n)
00183 {
00184 if (write(mFile,(const char*)ptr,n)!=n) {
00185 throw CLAM::Err("DataFileIO read error");
00186 }
00187 }
00188
00189 inline bool File::Done(void)
00190 {
00191 return Pos()>=mSize;
00192 }
00193
00194 inline void File::FixByteOrder(CLAM::TByte* ptr,
00195 CLAM::TUInt32 nElems,CLAM::TUInt32 elemSize)
00196 {
00197 #ifdef CLAM_LITTLE_ENDIAN
00198 _FixByteOrder(ptr,nElems,elemSize);
00199 #else
00200 #ifndef CLAM_BIG_ENDIAN
00201 #pragma message ("BYTE ORDER NOT DEFINED!")
00202 #endif
00203 #endif
00204 }
00205
00206 }
00207
00208 #endif
00209