aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/textfileformat.h
blob: c4c879b427d15a4310eca572797d5fd294a8a069 (plain)
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
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#pragma once

#include "result.h"
#include "textcodec.h"
#include "utils_global.h"

#include <QStringList>

namespace Utils {

class FilePath;

class QTCREATOR_UTILS_EXPORT TextFileFormat
{
public:
    enum LineTerminationMode
    {
        LFLineTerminator,
        CRLFLineTerminator,
        NativeLineTerminator =
#if defined (Q_OS_WIN)
        CRLFLineTerminator,
#else
        LFLineTerminator
#endif
    };

    enum ReadResultCode {
        ReadSuccess,
        ReadEncodingError,
        ReadMemoryAllocationError,
        ReadIOError
    };

    class QTCREATOR_UTILS_EXPORT ReadResult
    {
    public:
        ReadResult() = default;
        ReadResult(ReadResultCode code) : code(code) {}
        ReadResult(ReadResultCode code, const QString &error) : code(code), error(error) {}

        ReadResultCode code = ReadSuccess;
        QString content;
        QString error;
        QByteArray decodingErrorSample;
    };

    TextFileFormat();

    void detectFromData(const QByteArray &data);

    bool decode(const QByteArray &data, QString *target) const;

    ReadResult readFile(const FilePath &filePath, const TextEncoding &fallbackEncoding);

    static Result<> readFileUtf8(const FilePath &filePath,
                                 const TextEncoding &fallbackEncoding,
                                 QByteArray *plainText);

    Result<> writeFile(const FilePath &filePath, QString plainText) const;

    static QByteArray decodingErrorSample(const QByteArray &data);

    LineTerminationMode lineTerminationMode = NativeLineTerminator;
    bool hasUtf8Bom = false;

    TextEncoding encoding() const;
    void setEncoding(const TextEncoding &encoding);

private:
    TextEncoding m_encoding;
};

} // namespace Utils