~oif-team/ubuntu/natty/qt4-x11/xi2.1

« back to all changes in this revision

Viewing changes to src/corelib/io/qbufferedfsfileengine.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-08-24 04:09:09 UTC
  • Revision ID: james.westby@ubuntu.com-20050824040909-xmxe9jfr4a0w5671
Tags: upstream-4.0.0
ImportĀ upstreamĀ versionĀ 4.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <qdatetime.h>
 
2
#include <stdio.h>
 
3
 
 
4
#include "qfileengine.h"
 
5
#include "qbufferedfsfileengine_p.h"
 
6
 
 
7
// Required to build with msvc.net 2002
 
8
#ifndef S_ISREG
 
9
#define S_ISREG(x)   (((x) & S_IFMT) == S_IFREG)
 
10
#endif
 
11
 
 
12
QBufferedFSFileEngine::QBufferedFSFileEngine()
 
13
    : QFSFileEngine(*new QBufferedFSFileEnginePrivate)
 
14
{
 
15
}
 
16
 
 
17
QFileEngine::Type QBufferedFSFileEngine::type() const
 
18
{
 
19
    return Type(BufferedFSFileEngine);
 
20
}
 
21
 
 
22
bool QBufferedFSFileEngine::open(int /* flags */)
 
23
{
 
24
    return false;
 
25
}
 
26
 
 
27
bool QBufferedFSFileEngine::open(int /* flags */, FILE *fh)
 
28
{
 
29
    Q_D(QBufferedFSFileEngine);
 
30
    d->fh = fh;
 
31
    d->fd = fileno(fh);
 
32
    struct stat st;
 
33
    if (::fstat(fileno(fh), &st) != 0)
 
34
        return false;
 
35
    d->sequential = !S_ISREG(st.st_mode);
 
36
    return true;
 
37
}
 
38
 
 
39
bool QBufferedFSFileEngine::close()
 
40
{
 
41
    return true;
 
42
}
 
43
 
 
44
void QBufferedFSFileEngine::flush()
 
45
{
 
46
    Q_D(QBufferedFSFileEngine);
 
47
#ifdef Q_OS_WIN
 
48
    fpos_t pos;
 
49
    int gotPos = fgetpos(d->fh, &pos);
 
50
#endif
 
51
    fflush(d->fh);
 
52
#ifdef Q_OS_WIN
 
53
    if (gotPos == 0)
 
54
        fsetpos(d->fh, &pos);
 
55
#endif
 
56
    d->lastIOCommand = QBufferedFSFileEnginePrivate::IOFlushCommand;
 
57
}
 
58
 
 
59
qint64 QBufferedFSFileEngine::at() const
 
60
{
 
61
    Q_D(const QBufferedFSFileEngine);
 
62
    return qint64(ftell(d->fh));
 
63
}
 
64
 
 
65
bool QBufferedFSFileEngine::seek(qint64 offset)
 
66
{
 
67
    Q_D(QBufferedFSFileEngine);
 
68
    return fseek(d->fh, long(offset), SEEK_SET) != -1;
 
69
}
 
70
 
 
71
qint64 QBufferedFSFileEngine::read(char *data, qint64 maxlen)
 
72
{
 
73
    Q_D(QBufferedFSFileEngine);
 
74
    if (d->lastIOCommand != QBufferedFSFileEnginePrivate::IOReadCommand) {
 
75
        flush();
 
76
        d->lastIOCommand = QBufferedFSFileEnginePrivate::IOReadCommand;
 
77
    }
 
78
    if (feof(d->fh))
 
79
            return -1;
 
80
    return fread(data, 1, size_t(maxlen), d->fh);
 
81
}
 
82
 
 
83
qint64 QBufferedFSFileEngine::write(const char *data, qint64 len)
 
84
{
 
85
    Q_D(QBufferedFSFileEngine);
 
86
    if (d->lastIOCommand != QBufferedFSFileEnginePrivate::IOWriteCommand) {
 
87
        flush();
 
88
        d->lastIOCommand = QBufferedFSFileEnginePrivate::IOWriteCommand;
 
89
    }
 
90
    return fwrite(data, 1, size_t(len), d->fh);
 
91
}
 
92