1 /*
2  *  This file is part of KDiff3.
3  *
4  * SPDX-FileCopyrightText: 2002-2011 Joachim Eibl, joachim.eibl at gmx.de
5  * SPDX-FileCopyrightText: 2018-2020 Michael Reeves reeves.87@gmail.com
6  * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8 
9 #include <QTextCodec>
10 
11 // UTF8-Codec that saves a BOM
12 class UTF8BOMCodec: public QTextCodec
13 {
14     QTextCodec* m_pUtf8Codec;
15     class PublicTextCodec: public QTextCodec
16     {
17       public:
publicConvertToUnicode(const char * p,int len,ConverterState * pState)18         QString publicConvertToUnicode(const char* p, int len, ConverterState* pState) const
19         {
20             return convertToUnicode(p, len, pState);
21         }
publicConvertFromUnicode(const QChar * input,int number,ConverterState * pState)22         QByteArray publicConvertFromUnicode(const QChar* input, int number, ConverterState* pState) const
23         {
24             return convertFromUnicode(input, number, pState);
25         }
26     };
27 
28   public:
UTF8BOMCodec()29     UTF8BOMCodec()
30     {
31         m_pUtf8Codec = QTextCodec::codecForName("UTF-8");
32     }
name()33     QByteArray name() const override { return "UTF-8-BOM"; }
mibEnum()34     int mibEnum() const override { return 2123; }
35 
convertFromUnicode(const QChar * input,int number,ConverterState * pState)36     QByteArray convertFromUnicode(const QChar* input, int number, ConverterState* pState) const override
37     {
38         QByteArray r;
39         if(pState && pState->state_data[2] == 0) // state_data[2] not used by QUtf8::convertFromUnicode (see qutfcodec.cpp)
40         {
41             r += "\xEF\xBB\xBF";
42             pState->state_data[2] = 1;
43             pState->flags |= QTextCodec::IgnoreHeader;
44         }
45 
46         r += ((PublicTextCodec*)m_pUtf8Codec)->publicConvertFromUnicode(input, number, pState);
47         return r;
48     }
49 
convertToUnicode(const char * p,int len,ConverterState * pState)50     QString convertToUnicode(const char* p, int len, ConverterState* pState) const override
51     {
52         return ((PublicTextCodec*)m_pUtf8Codec)->publicConvertToUnicode(p, len, pState);
53     }
54 };
55