LightWrap++
AC++wrapperfortheLightWave3DSDK
io.h
Go to the documentation of this file.
1 #ifndef LWPP_IO_H
2 #define LWPP_IO_H
3 #include <lwpp/global.h>
4 #include <lwio.h>
5 
6 namespace lwpp
7 {
8  class Storeable;
9  class LWPP_Storeable;
10 
12  class SaveState
13  {
14  protected:
15  void write(const char *data, int len)
16  {
17  ss->write(ss->writeData, data, len);
18  }
19 
20  public:
21  const LWSaveState *ss;
22  SaveState(const LWSaveState *_ss) : ss(_ss)
23  {
24  ;
25  }
26  const LWSaveState *getState(void) const {return ss;}
27  bool isValid() {return ss != 0;}
28  void Begin(const LWBlockIdent &id, bool leaf = true) const
29  {
30  ss->beginBlk(ss->writeData, &id, leaf);
31  }
32  void End(void) const
33  {
34  ss->endBlk(ss->writeData);
35  }
36  void Depth(void) const
37  {
38  ss->depth(ss->writeData);
39  }
40 
42  void Write (const bool data) const
43  {
44  unsigned char c = data;
45  ss->writeU1(ss->writeData, &c, 1);
46  }
47 
49  void Write (const char data) const
50  {
51  ss->writeI1(ss->writeData, &data, 1);
52  }
53 
54  void Write (const char *data, int length) const
55  {
56  ss->writeI1(ss->writeData, data, length);
57  }
58 
60  void Write (const short data) const
61  {
62  ss->writeI2(ss->writeData, &data, 1);
63  }
64 
65  void Write (const short *data, int length) const
66  {
67  ss->writeI2(ss->writeData, data, length);
68  }
69 
71  void Write (const int data) const
72  {
73  ss->writeI4(ss->writeData, &data, 1);
74  }
75 
76  void Write (const int *data, int length) const
77  {
78  ss->writeI4(ss->writeData, data, length);
79  }
80 
82  void Write (const unsigned char data) const
83  {
84  ss->writeU1(ss->writeData, &data, 1);
85  }
86 
87  void Write (const unsigned char *data, int length) const
88  {
89  ss->writeU1(ss->writeData, data, length);
90  }
91 
92  void Write (const unsigned short data) const
93  {
94  ss->writeU2(ss->writeData, &data, 1);
95  }
96 
97  void Write (const unsigned short *data, int length) const
98  {
99  ss->writeU2(ss->writeData, data, length);
100  }
101 
102  void Write (const unsigned int data) const
103  {
104  ss->writeU4(ss->writeData, &data, 1);
105  }
106 
107  void Write (const unsigned int *data, int length) const
108  {
109  ss->writeU4(ss->writeData, data, length);
110  }
111 
112  void Write (const float data) const
113  {
114  ss->writeFP(ss->writeData, &data, 1);
115  }
116 
117  void Write (const float *data, int length) const
118  {
119  ss->writeFP(ss->writeData, data, length);
120  }
121 
122 #if LW_SDK == 95
123  void Write (const double data) const
124  {
125  ss->writeDP(ss->writeData, &data, 1);
126  }
127 
128  void Write (const double *data, int length) const
129  {
130  ss->writeDP(ss->writeData, data, length);
131  }
132 #endif
133 
134 
135  void Write (const char *data) const
136  {
137  ss->writeStr(ss->writeData, data);
138  }
139  void Write (const std::string data) const
140  {
141  ss->writeStr(ss->writeData, data.c_str());
142  }
144  template <class T> void WriteBlock (const LWBlockIdent &id, T value, bool leaf = true) const
145  {
146  Begin(id, leaf);
147  Write(value);
148  End();
149  }
150  template <class T> void WriteBlock (const LWBlockIdent &id, T value, int len, bool leaf = true) const
151  {
152  Begin(id, leaf);
153  Write(value, len);
154  End();
155  }
156 
157  void WriteItem(const LWBlockIdent &id, Storeable &object, bool leaf = false) const;
158 
159  void WriteItem(const LWBlockIdent &id, Storeable *object, bool leaf = false) const;
160 
161  };
162 
163 
165  class LoadState
166  {
167  protected:
168  const LWLoadState *ls;
169  mutable int rc;
170  int read(char *data, int len = 1) const
171  {
172  rc = ls->read(ls->readData, data, len);
173  return rc;
174  }
175 
176  public:
177  LoadState(const LWLoadState *load) : ls(load), rc(0)
178  {
179  ;
180  }
181  int LastRC() {return rc;}
182  bool isValid() {return ls != 0;}
183  const LWLoadState *getState() const {return ls;}
184  const LWLoadState *operator->() const {return ls;}
185  LWID Find(const LWBlockIdent *id) const
186  {
187  return ls->findBlk(ls->readData, id);
188  }
189  void End(void) const
190  {
191  ls->endBlk(ls->readData);
192  }
193  int Depth(void) const
194  {
195  return ls->depth(ls->readData);
196  }
197  const bool Eof(void) const {return rc == -1;}
198  const int Status(void) const {return rc;}
199 
200  bool readBool(void) const
201  {
202  unsigned char c;
203  rc = ls->readU1(ls->readData, &c, 1);
204  return (c == 1);
205  }
206  unsigned char readUChar(void) const
207  {
208  unsigned char c;
209  rc = ls->readU1(ls->readData, &c, 1);
210  return c;
211  }
212  char readChar(void) const
213  {
214  char c;
215  rc = ls->readI1(ls->readData, &c, 1);
216  return c;
217  }
218 
219  unsigned short readUShort(void) const
220  {
221  unsigned short s;
222  rc = ls->readU2(ls->readData, &s, 1);
223  return s;
224  }
225  short readShort(void) const
226  {
227  short s;
228  rc = ls->readI2(ls->readData, &s, 1);
229  return s;
230  }
231 
232  unsigned int readUInt(void) const
233  {
234  unsigned int i;
235  rc = ls->readU4(ls->readData, &i, 1);
236  return i;
237  }
238  int readInt(void) const
239  {
240  int i;
241  rc = ls->readI4(ls->readData, &i, 1);
242  return i;
243  }
244 
245  float readFloat(void) const
246  {
247  float f;
248  rc = ls->readFP(ls->readData, &f, 1);
249  return f;
250  }
251  void read(float *f, int length) const
252  {
253  rc = ls->readFP(ls->readData, f, length);
254  }
255 
256  /*void read(double &d) const
257  {
258  float f;
259  rc = ls->readFP(ls->readData, &f, 1);
260  d = (double)f;
261  }*/
262 
263 #if LW_SDK == 95
264 
265  double readDouble(void) const
266  {
267  double d;
268  rc = ls->readDP(ls->readData, &d, 1);
269  return d;
270  }
271 
272  void read(double *d, int length) const
273  {
274  rc = ls->readDP(ls->readData, d, length);
275  }
276 
277 #endif
278 
279 
280  void readString(char *buffer, int max) const
281  {
282  rc = ls->readStr(ls->readData, buffer, max);
283  }
284 
285  std::string readString() const
286  {
287  char buffer[1024];
288  rc = ls->readStr(ls->readData, buffer, 1023);
289  return std::string(buffer);
290  }
291  // Catch all read overloaded read function
292  LWError read(lwpp::Storeable &object) const;
293  void read(bool &b) const
294  {
295  unsigned char c;
296  rc = ls->readU1(ls->readData, &c, 1);
297  b = (c == 1);
298  }
299  void read(unsigned char &c) const
300  {
301  rc = ls->readU1(ls->readData, &c, 1);
302  }
303  void read(char &c) const
304  {
305  rc = ls->readI1(ls->readData, &c, 1);
306  }
307  void read(unsigned short &s) const
308  {
309  rc = ls->readU2(ls->readData, &s, 1);
310  }
311  void read(short &s) const
312  {
313  rc = ls->readI2(ls->readData, &s, 1);
314  }
315  void read(unsigned int &i) const
316  {
317  rc = ls->readU4(ls->readData, &i, 1);
318  }
319  void read(int &i) const
320  {
321  rc = ls->readI4(ls->readData, &i, 1);
322  }
323  void read(float &f) const
324  {
325  rc = ls->readFP(ls->readData, &f, 1);
326  }
327 
328 #if LW_SDK == 95
329 
330  void read(double &d) const
331  {
332  rc = ls->readDP(ls->readData, &d, 1);
333  }
334 
335 #endif
336 
337 
338  void read(std::string &str) const
339  {
340  char buffer[1024];
341  rc = ls->readStr(ls->readData, buffer, 1023);
342  str.clear();
343  str = buffer;
344  }
345  };
346 
348  class File : protected GlobalBase<LWFileIOFuncs>
349  {
350  public:
352  private:
353  ioType m_type;
354  union
355  {
356  LWSaveState *saveState;
357  LWLoadState *loadState;
358  };
359  public:
360  File(std::string name, ioType type, int ioMode = LWIO_ASCII) :
361  m_type(type),
362  saveState(0)
363  {
364  switch (m_type)
365  {
366  case (FILE_LOAD):
367  loadState = globPtr->openLoad (name.c_str(), ioMode);
368  break;
369 
370  case (FILE_SAVE):
371  saveState = globPtr->openSave (name.c_str(), ioMode);
372  break;
373 
374  default:
375  break;
376  }
377  }
378 
380  {
381  switch (m_type)
382  {
383  case (FILE_LOAD):
384  if (loadState) globPtr->closeLoad(loadState);
385  break;
386 
387  case (FILE_SAVE):
388  if (saveState) globPtr->closeSave(saveState);
389  break;
390 
391  default:
392  break;
393  }
394  }
395  bool isValid() {return (saveState != 0);}
396  LWSaveState *getLWSaveState() const {return saveState;}
397  LWLoadState *getLWLoadState() const {return loadState;}
398  SaveState getSaveState() const {return SaveState(saveState);}
399  LoadState getLoadState() const {return LoadState(loadState);}
400  LWError Save(Storeable &item);
401  LWError Load(Storeable &item);
402  };
403 }
404 
405 #endif // LWPP_IO_H