|
1 /**************************************************************************** |
|
2 ** |
|
3 ** |
|
4 ** Implementation of QIODevice class |
|
5 ** |
|
6 ** Created : 940913 |
|
7 ** |
|
8 ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. |
|
9 ** |
|
10 ** This file is part of the tools module of the Qt GUI Toolkit. |
|
11 ** |
|
12 ** This file may be distributed under the terms of the Q Public License |
|
13 ** as defined by Trolltech AS of Norway and appearing in the file |
|
14 ** LICENSE.QPL included in the packaging of this file. |
|
15 ** |
|
16 ** This file may be distributed and/or modified under the terms of the |
|
17 ** GNU General Public License version 2 as published by the Free Software |
|
18 ** Foundation and appearing in the file LICENSE.GPL included in the |
|
19 ** packaging of this file. |
|
20 ** |
|
21 ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition |
|
22 ** licenses may use this file in accordance with the Qt Commercial License |
|
23 ** Agreement provided with the Software. |
|
24 ** |
|
25 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
|
26 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
|
27 ** |
|
28 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for |
|
29 ** information about Qt Commercial License Agreements. |
|
30 ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
|
31 ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
|
32 ** |
|
33 ** Contact info@trolltech.com if any conditions of this licensing are |
|
34 ** not clear to you. |
|
35 ** |
|
36 **********************************************************************/ |
|
37 |
|
38 #include "qiodevice.h" |
|
39 |
|
40 // NOT REVISED |
|
41 /*! |
|
42 \class QIODevice qiodevice.h |
|
43 |
|
44 \brief The QIODevice class is the base class of I/O devices. |
|
45 |
|
46 \ingroup io |
|
47 |
|
48 An I/O device represents a medium that one can read bytes from |
|
49 and/or write bytes to. The QIODevice class is the abstract |
|
50 superclass of all such devices; classes like QFile, QBuffer and |
|
51 QSocket inherit QIODevice and implement virtual functions like |
|
52 write() appropriately. |
|
53 |
|
54 While applications sometimes use QIODevice directly, mostly it is |
|
55 better to go through QTextStream and QDataStream, which provide |
|
56 stream operations on any QIODevice subclass. QTextStream provides |
|
57 text-oriented stream functionality (for human-readable ASCII files, |
|
58 for example), while QDataStream deals with binary data in a totally |
|
59 platform-independent manner. |
|
60 |
|
61 The public member functions in QIODevice roughly fall into two |
|
62 groups: The action functions and the state access functions. The |
|
63 most important action functions are: <ul> |
|
64 |
|
65 <li> open() opens a device for reading and/or writing, depending on |
|
66 the argument to open(). |
|
67 |
|
68 <li> close() closes the device and tidies up. |
|
69 |
|
70 <li> readBlock() reads a block of data from the device. |
|
71 |
|
72 <li> writeBlock() writes a block of data to the device. |
|
73 |
|
74 <li> readLine() reads a line (of text, usually) from the device. |
|
75 |
|
76 <li> flush() ensures that all buffered data are written to the real device. |
|
77 |
|
78 </ul>There are also some other, less used, action functions: <ul> |
|
79 |
|
80 <li> getch() reads a single character. |
|
81 |
|
82 <li> ungetch() forgets the last call to getch(), if possible. |
|
83 |
|
84 <li> putch() writes a single character. |
|
85 |
|
86 <li> size() returns the size of the device, if there is one. |
|
87 |
|
88 <li> at() returns the current read/write pointer, if there is one |
|
89 for this device, or it moves the pointer. |
|
90 |
|
91 <li> atEnd() says whether there is more to read, if that is a |
|
92 meaningful question for this device. |
|
93 |
|
94 <li> reset() moves the read/write pointer to the start of the |
|
95 device, if that is possible for this device. |
|
96 |
|
97 </ul>The state access are all "get" functions. The QIODevice subclass |
|
98 calls setState() to update the state, and simple access functions |
|
99 tell the user of the device what the device's state is. Here are |
|
100 the settings, and their associated access functions: <ul> |
|
101 |
|
102 <li> Access type. Some devices are direct access (it is possible to |
|
103 read/write anywhere) while others are sequential. QIODevice |
|
104 provides the access functions isDirectAccess(), isSequentialAccess() |
|
105 and isCombinedAccess() to tell users what a given I/O device |
|
106 supports. |
|
107 |
|
108 <li> Buffering. Some devices are accessed in raw mode while others |
|
109 are buffered. Buffering usually provides greater efficiency, |
|
110 particularly for small read/write operations. isBuffered() tells |
|
111 the user whether a given device is buffered. (This can often be set |
|
112 by the application in the call to open().) |
|
113 |
|
114 <li> Synchronicity. Synchronous devices work there and then, for |
|
115 example files. When you read from a file, the file delivers its |
|
116 data right away. Others, such as a socket connected to a HTTP |
|
117 server, may not deliver the data until seconds after you ask to read |
|
118 it. isSynchronous() and isAsynchronous() tells the user how this |
|
119 device operates. |
|
120 |
|
121 <li> CR/LF translation. For simplicity, applications often like to |
|
122 see just a single CR/LF style, and QIODevice subclasses can provide |
|
123 that. isTranslated() returns TRUE if this object translates CR/LF |
|
124 to just LF. (This can often be set by the application in the call |
|
125 to open().) |
|
126 |
|
127 <li> Accessibility. Some files cannot be written, for example. |
|
128 isReadable(), isWritable and isReadWrite() tells the application |
|
129 whether it can read from and write to a given device. (This can |
|
130 often be set by the application in the call to open().) |
|
131 |
|
132 <li> Finally, isOpen() returns TRUE if the device is open. This can |
|
133 quite obviously be set using open() :) |
|
134 |
|
135 </ul> |
|
136 |
|
137 QIODevice provides numerous pure virtual functions you need to |
|
138 implement when subclassing it. Here is a skeleton subclass with all |
|
139 the members you are certain to need, and some it's likely that you |
|
140 will need: |
|
141 |
|
142 \code |
|
143 class YourDevice : public QIODevice |
|
144 { |
|
145 public: |
|
146 YourDevice(); |
|
147 ~YourDevice(); |
|
148 |
|
149 bool open( int mode ); |
|
150 void close(); |
|
151 void flush(); |
|
152 |
|
153 uint size() const; |
|
154 int at() const; // not a pure virtual function |
|
155 bool at( int ); // not a pure virtual function |
|
156 bool atEnd() const; // not a pure virtual function |
|
157 |
|
158 int readBlock( char *data, uint maxlen ); |
|
159 int writeBlock( const char *data, uint len ); |
|
160 int readLine( char *data, uint maxlen ); |
|
161 |
|
162 int getch(); |
|
163 int putch( int ); |
|
164 int ungetch( int ); |
|
165 }; |
|
166 \endcode |
|
167 |
|
168 The three non-pure virtual functions can be ignored if your device |
|
169 is sequential (e.g. an RS-232 port). |
|
170 |
|
171 \sa QDataStream, QTextStream |
|
172 */ |
|
173 |
|
174 |
|
175 /*! |
|
176 Constructs an I/O device. |
|
177 */ |
|
178 |
|
179 QIODevice::QIODevice() |
|
180 { |
|
181 ioMode = 0; // initial mode |
|
182 ioSt = IO_Ok; |
|
183 ioIndex = 0; |
|
184 } |
|
185 |
|
186 /*! |
|
187 Destructs the I/O device. |
|
188 */ |
|
189 |
|
190 QIODevice::~QIODevice() |
|
191 { |
|
192 } |
|
193 |
|
194 |
|
195 /*! |
|
196 \fn int QIODevice::flags() const |
|
197 Returns the current I/O device flags setting. |
|
198 |
|
199 Flags consists of mode flags and state flags. |
|
200 |
|
201 \sa mode(), state() |
|
202 */ |
|
203 |
|
204 /*! |
|
205 \fn int QIODevice::mode() const |
|
206 Returns bits OR'ed together that specify the current operation mode. |
|
207 |
|
208 These are the flags that were given to the open() function. |
|
209 |
|
210 The flags are: \c IO_ReadOnly, \c IO_WriteOnly, \c IO_ReadWrite, |
|
211 \c IO_Append, \c IO_Truncate and \c IO_Translate. |
|
212 */ |
|
213 |
|
214 /*! |
|
215 \fn int QIODevice::state() const |
|
216 Returns bits OR'ed together that specify the current state. |
|
217 |
|
218 The flags are: \c IO_Open. |
|
219 |
|
220 Subclasses may define more flags. |
|
221 */ |
|
222 |
|
223 /*! |
|
224 \fn bool QIODevice::isDirectAccess() const |
|
225 Returns TRUE if the I/O device is a direct access (not sequential) device, |
|
226 otherwise FALSE. |
|
227 \sa isSequentialAccess() |
|
228 */ |
|
229 |
|
230 /*! |
|
231 \fn bool QIODevice::isSequentialAccess() const |
|
232 Returns TRUE if the I/O device is a sequential access (not direct) device, |
|
233 otherwise FALSE. Operations involving size() and at(int) are not valid |
|
234 on sequential devices. |
|
235 \sa isDirectAccess() |
|
236 */ |
|
237 |
|
238 /*! |
|
239 \fn bool QIODevice::isCombinedAccess() const |
|
240 Returns TRUE if the I/O device is a combined access (both direct and |
|
241 sequential) device, otherwise FALSE. |
|
242 |
|
243 This access method is currently not in use. |
|
244 */ |
|
245 |
|
246 /*! |
|
247 \fn bool QIODevice::isBuffered() const |
|
248 Returns TRUE if the I/O device is a buffered (not raw) device, otherwise |
|
249 FALSE. |
|
250 \sa isRaw() |
|
251 */ |
|
252 |
|
253 /*! |
|
254 \fn bool QIODevice::isRaw() const |
|
255 Returns TRUE if the I/O device is a raw (not buffered) device, otherwise |
|
256 FALSE. |
|
257 \sa isBuffered() |
|
258 */ |
|
259 |
|
260 /*! |
|
261 \fn bool QIODevice::isSynchronous() const |
|
262 Returns TRUE if the I/O device is a synchronous device, otherwise |
|
263 FALSE. |
|
264 \sa isAsynchronous() |
|
265 */ |
|
266 |
|
267 /*! |
|
268 \fn bool QIODevice::isAsynchronous() const |
|
269 Returns TRUE if the I/O device is a asynchronous device, otherwise |
|
270 FALSE. |
|
271 |
|
272 This mode is currently not in use. |
|
273 |
|
274 \sa isSynchronous() |
|
275 */ |
|
276 |
|
277 /*! |
|
278 \fn bool QIODevice::isTranslated() const |
|
279 Returns TRUE if the I/O device translates carriage-return and linefeed |
|
280 characters. |
|
281 |
|
282 A QFile is translated if it is opened with the \c IO_Translate mode |
|
283 flag. |
|
284 */ |
|
285 |
|
286 /*! |
|
287 \fn bool QIODevice::isReadable() const |
|
288 Returns TRUE if the I/O device was opened using \c IO_ReadOnly or |
|
289 \c IO_ReadWrite mode. |
|
290 \sa isWritable(), isReadWrite() |
|
291 */ |
|
292 |
|
293 /*! |
|
294 \fn bool QIODevice::isWritable() const |
|
295 Returns TRUE if the I/O device was opened using \c IO_WriteOnly or |
|
296 \c IO_ReadWrite mode. |
|
297 \sa isReadable(), isReadWrite() |
|
298 */ |
|
299 |
|
300 /*! |
|
301 \fn bool QIODevice::isReadWrite() const |
|
302 Returns TRUE if the I/O device was opened using \c IO_ReadWrite mode. |
|
303 \sa isReadable(), isWritable() |
|
304 */ |
|
305 |
|
306 /*! |
|
307 \fn bool QIODevice::isInactive() const |
|
308 Returns TRUE if the I/O device state is 0, i.e. the device is not open. |
|
309 \sa isOpen() |
|
310 */ |
|
311 |
|
312 /*! |
|
313 \fn bool QIODevice::isOpen() const |
|
314 Returns TRUE if the I/O device state has been opened, otherwise FALSE. |
|
315 \sa isInactive() |
|
316 */ |
|
317 |
|
318 |
|
319 /*! |
|
320 \fn int QIODevice::status() const |
|
321 Returns the I/O device status. |
|
322 |
|
323 The I/O device status returns an error code. If open() returns FALSE |
|
324 or readBlock() or writeBlock() return -1, this function can be called to |
|
325 get the reason why the operation did not succeed. |
|
326 |
|
327 The status codes are: |
|
328 <ul> |
|
329 <li>\c IO_Ok The operation was successful. |
|
330 <li>\c IO_ReadError Could not read from the device. |
|
331 <li>\c IO_WriteError Could not write to the device. |
|
332 <li>\c IO_FatalError A fatal unrecoverable error occurred. |
|
333 <li>\c IO_OpenError Could not open the device. |
|
334 <li>\c IO_ConnectError Could not connect to the device. |
|
335 <li>\c IO_AbortError The operation was unexpectedly aborted. |
|
336 <li>\c IO_TimeOutError The operation timed out. |
|
337 <li>\c IO_OnCloseError An unspecified error happened on close. |
|
338 </ul> |
|
339 |
|
340 \sa resetStatus() |
|
341 */ |
|
342 |
|
343 /*! |
|
344 \fn void QIODevice::resetStatus() |
|
345 |
|
346 Sets the I/O device status to \c IO_Ok. |
|
347 |
|
348 \sa status() |
|
349 */ |
|
350 |
|
351 |
|
352 /*! |
|
353 \fn void QIODevice::setFlags( int f ) |
|
354 \internal |
|
355 Used by subclasses to set the device flags. |
|
356 */ |
|
357 |
|
358 /*! |
|
359 \internal |
|
360 Used by subclasses to set the device type. |
|
361 */ |
|
362 |
|
363 void QIODevice::setType( int t ) |
|
364 { |
|
365 #if defined(CHECK_RANGE) |
|
366 if ( (t & IO_TypeMask) != t ) |
|
367 qWarning( "QIODevice::setType: Specified type out of range" ); |
|
368 #endif |
|
369 ioMode &= ~IO_TypeMask; // reset type bits |
|
370 ioMode |= t; |
|
371 } |
|
372 |
|
373 /*! |
|
374 \internal |
|
375 Used by subclasses to set the device mode. |
|
376 */ |
|
377 |
|
378 void QIODevice::setMode( int m ) |
|
379 { |
|
380 #if defined(CHECK_RANGE) |
|
381 if ( (m & IO_ModeMask) != m ) |
|
382 qWarning( "QIODevice::setMode: Specified mode out of range" ); |
|
383 #endif |
|
384 ioMode &= ~IO_ModeMask; // reset mode bits |
|
385 ioMode |= m; |
|
386 } |
|
387 |
|
388 /*! |
|
389 \internal |
|
390 Used by subclasses to set the device state. |
|
391 */ |
|
392 |
|
393 void QIODevice::setState( int s ) |
|
394 { |
|
395 #if defined(CHECK_RANGE) |
|
396 if ( ((uint)s & IO_StateMask) != (uint)s ) |
|
397 qWarning( "QIODevice::setState: Specified state out of range" ); |
|
398 #endif |
|
399 ioMode &= ~IO_StateMask; // reset state bits |
|
400 ioMode |= (uint)s; |
|
401 } |
|
402 |
|
403 /*! |
|
404 \internal |
|
405 Used by subclasses to set the device status (not state). |
|
406 */ |
|
407 |
|
408 void QIODevice::setStatus( int s ) |
|
409 { |
|
410 ioSt = s; |
|
411 } |
|
412 |
|
413 |
|
414 /*! |
|
415 \fn bool QIODevice::open( int mode ) |
|
416 Opens the I/O device using the specified \e mode. |
|
417 Returns TRUE if successful, or FALSE if the device could not be opened. |
|
418 |
|
419 The mode parameter \e m must be a combination of the following flags. |
|
420 <ul> |
|
421 <li>\c IO_Raw specified raw (unbuffered) file access. |
|
422 <li>\c IO_ReadOnly opens a file in read-only mode. |
|
423 <li>\c IO_WriteOnly opens a file in write-only mode. |
|
424 <li>\c IO_ReadWrite opens a file in read/write mode. |
|
425 <li>\c IO_Append sets the file index to the end of the file. |
|
426 <li>\c IO_Truncate truncates the file. |
|
427 <li>\c IO_Translate enables carriage returns and linefeed translation |
|
428 for text files under MS-DOS, Window, OS/2 and Macintosh. On Unix systems |
|
429 this flag has no effect. Use with caution as it will also transform every linefeed |
|
430 written to the file into a CRLF pair. This is likely to corrupt your file when |
|
431 writing binary data to it. Cannot be combined with \c IO_Raw. |
|
432 </ul> |
|
433 |
|
434 This virtual function must be reimplemented by all subclasses. |
|
435 |
|
436 \sa close() |
|
437 */ |
|
438 |
|
439 /*! |
|
440 \fn void QIODevice::close() |
|
441 Closes the I/O device. |
|
442 |
|
443 This virtual function must be reimplemented by all subclasses. |
|
444 |
|
445 \sa open() |
|
446 */ |
|
447 |
|
448 /*! |
|
449 \fn void QIODevice::flush() |
|
450 |
|
451 Flushes an open I/O device. |
|
452 |
|
453 This virtual function must be reimplemented by all subclasses. |
|
454 */ |
|
455 |
|
456 |
|
457 /*! |
|
458 \fn uint QIODevice::size() const |
|
459 Virtual function that returns the size of the I/O device. |
|
460 \sa at() |
|
461 */ |
|
462 |
|
463 /*! |
|
464 Virtual function that returns the current I/O device index. |
|
465 |
|
466 This index is the data read/write head of the I/O device. |
|
467 |
|
468 \sa size() |
|
469 */ |
|
470 |
|
471 int QIODevice::at() const |
|
472 { |
|
473 return ioIndex; |
|
474 } |
|
475 |
|
476 /*! |
|
477 Virtual function that sets the I/O device index to \e pos. |
|
478 \sa size() |
|
479 */ |
|
480 |
|
481 bool QIODevice::at( int pos ) |
|
482 { |
|
483 #if defined(CHECK_RANGE) |
|
484 if ( (uint)pos > size() ) { |
|
485 qWarning( "QIODevice::at: Index %d out of range", pos ); |
|
486 return FALSE; |
|
487 } |
|
488 #endif |
|
489 ioIndex = pos; |
|
490 return TRUE; |
|
491 } |
|
492 |
|
493 /*! |
|
494 Virtual function that returns TRUE if the I/O device index is at the |
|
495 end of the input. |
|
496 */ |
|
497 |
|
498 bool QIODevice::atEnd() const |
|
499 { |
|
500 if ( isSequentialAccess() || isTranslated() ) { |
|
501 QIODevice* that = (QIODevice*)this; |
|
502 int c = that->getch(); |
|
503 bool result = c < 0; |
|
504 that->ungetch(c); |
|
505 return result; |
|
506 } else { |
|
507 return at() == (int)size(); |
|
508 } |
|
509 } |
|
510 |
|
511 /*! |
|
512 \fn bool QIODevice::reset() |
|
513 Sets the device index to 0. |
|
514 \sa at() |
|
515 */ |
|
516 |
|
517 |
|
518 /*! |
|
519 \fn int QIODevice::readBlock( char *data, uint maxlen ) |
|
520 Reads at most \e maxlen bytes from the I/O device into \e data and |
|
521 returns the number of bytes actually read. |
|
522 |
|
523 This virtual function must be reimplemented by all subclasses. |
|
524 |
|
525 \sa writeBlock() |
|
526 */ |
|
527 |
|
528 /*! |
|
529 This convenience function returns all of the remaining data in the |
|
530 device. Note that this only works for direct access devices, such |
|
531 as QFile. |
|
532 |
|
533 \sa isDirectAccess() |
|
534 */ |
|
535 QByteArray QIODevice::readAll() |
|
536 { |
|
537 int n = size()-at(); |
|
538 QByteArray ba(size()-at()); |
|
539 char* c = ba.data(); |
|
540 while ( n ) { |
|
541 int r = readBlock( c, n ); |
|
542 if ( r < 0 ) |
|
543 return QByteArray(); |
|
544 n -= r; |
|
545 c += r; |
|
546 } |
|
547 return ba; |
|
548 } |
|
549 |
|
550 /*! |
|
551 \fn int QIODevice::writeBlock( const char *data, uint len ) |
|
552 Writes \e len bytes from \e p to the I/O device and returns the number of |
|
553 bytes actually written. |
|
554 |
|
555 This virtual function must be reimplemented by all subclasses. |
|
556 |
|
557 \sa readBlock() |
|
558 */ |
|
559 |
|
560 /*! |
|
561 This convenience function is the same as calling |
|
562 writeBlock( data.data(), data.size() ). |
|
563 */ |
|
564 int QIODevice::writeBlock( const QByteArray& data ) |
|
565 { |
|
566 return writeBlock( data.data(), data.size() ); |
|
567 } |
|
568 |
|
569 /*! |
|
570 Reads a line of text, up to \e maxlen bytes including a terminating |
|
571 \0. If there is a newline at the end if the line, it is not stripped. |
|
572 |
|
573 Returns the number of bytes read, or -1 in case of error. |
|
574 |
|
575 This virtual function can be reimplemented much more efficiently by |
|
576 the most subclasses. |
|
577 |
|
578 \sa readBlock(), QTextStream::readLine() |
|
579 */ |
|
580 |
|
581 int QIODevice::readLine( char *data, uint maxlen ) |
|
582 { |
|
583 if ( maxlen == 0 ) // application bug? |
|
584 return 0; |
|
585 int pos = at(); // get current position |
|
586 int s = (int)size(); // size of I/O device |
|
587 char *p = data; |
|
588 if ( pos >= s ) |
|
589 return 0; |
|
590 while ( pos++ < s && --maxlen ) { // read one byte at a time |
|
591 readBlock( p, 1 ); |
|
592 if ( *p++ == '\n' ) // end of line |
|
593 break; |
|
594 } |
|
595 *p++ = '\0'; |
|
596 return (int)((long)p - (long)data); |
|
597 } |
|
598 |
|
599 |
|
600 /*! |
|
601 \fn int QIODevice::getch() |
|
602 |
|
603 Reads a single byte/character from the I/O device. |
|
604 |
|
605 Returns the byte/character read, or -1 if the end of the I/O device has been |
|
606 reached. |
|
607 |
|
608 This virtual function must be reimplemented by all subclasses. |
|
609 |
|
610 \sa putch(), ungetch() |
|
611 */ |
|
612 |
|
613 /*! |
|
614 \fn int QIODevice::putch( int ch ) |
|
615 |
|
616 Writes the character \e ch to the I/O device. |
|
617 |
|
618 Returns \e ch, or -1 if some error occurred. |
|
619 |
|
620 This virtual function must be reimplemented by all subclasses. |
|
621 |
|
622 \sa getch(), ungetch() |
|
623 */ |
|
624 |
|
625 /*! |
|
626 \fn int QIODevice::ungetch( int ch ) |
|
627 |
|
628 Puts the character \e ch back into the I/O device and decrements the |
|
629 index if it is not zero. |
|
630 |
|
631 This function is normally called to "undo" a getch() operation. |
|
632 |
|
633 Returns \e ch, or -1 if some error occurred. |
|
634 |
|
635 This virtual function must be reimplemented by all subclasses. |
|
636 |
|
637 \sa getch(), putch() |
|
638 */ |