Просмотр исходного кода

Use constructors instead of static methods to parse DNS packets

develop
Robin Thoni 6 лет назад
Родитель
Сommit
9be539af34

+ 3
- 1
src/modules/dns-base/CMakeLists.txt Просмотреть файл

@@ -21,7 +21,9 @@ add_library(${PROJECT_NAME}
21 21
         includes/dns-base/QDnsResourceRecord.h
22 22
         src/QDnsPacket.cpp
23 23
         includes/dns-base/QDnsPacket.h
24
-        includes/dns-base/QDnsBase.h)
24
+        includes/dns-base/QDnsBase.h
25
+        src/RecordData/QDnsRDataDecoder.cpp
26
+        includes/dns-base/RecordData/QDnsRDataDecoder.h src/RecordData/QDnsRDataA.cpp src/RecordData/QDnsRDataA.h)
25 27
 
26 28
 target_link_libraries(${PROJECT_NAME} Qt5::Core)
27 29
 

+ 4
- 2
src/modules/dns-base/includes/dns-base/QDnsHeader.h Просмотреть файл

@@ -18,9 +18,9 @@ namespace QDns
18 18
         public:
19 19
             QDnsHeader();
20 20
 
21
-            static QDnsHeader parse(const QByteArray &data);
21
+            explicit QDnsHeader(const QByteArray &data);
22 22
 
23
-            static QDnsHeader parse(QDataStream &dataStream);
23
+            explicit QDnsHeader(QDataStream &dataStream);
24 24
 
25 25
             QByteArray serialize() const;
26 26
 
@@ -97,6 +97,8 @@ namespace QDns
97 97
             void setAdditionalCount(quint16 additionalCount);
98 98
 
99 99
         private:
100
+            void parse(QDataStream &dataStream);
101
+
100 102
             bool m_isValid;
101 103
             quint16 m_id;
102 104
             quint16 m_flags;

+ 4
- 4
src/modules/dns-base/includes/dns-base/QDnsPacket.h Просмотреть файл

@@ -19,9 +19,9 @@ namespace QDns
19 19
         public:
20 20
             QDnsPacket();
21 21
 
22
-            static QDnsPacket parse(const QByteArray &data);
22
+            explicit QDnsPacket(const QByteArray &data);
23 23
 
24
-            static QDnsPacket parse(const QByteArray &data, QDataStream &dataStream);
24
+            QDnsPacket(const QByteArray &data, QDataStream &dataStream);
25 25
 
26 26
             QByteArray serialize() const;
27 27
 
@@ -50,10 +50,10 @@ namespace QDns
50 50
             void setAdditionalRecords(const QList<QDnsResourceRecord> &additionalRecords);
51 51
 
52 52
         private:
53
-            bool m_isValid;
53
+            void parse(const QByteArray &data, QDataStream &dataStream);
54 54
 
55
+            bool m_isValid;
55 56
             QDnsHeader m_header;
56
-
57 57
             QList<QDnsQuery> m_queries;
58 58
             QList<QDnsResourceRecord> m_answerRecords;
59 59
             QList<QDnsResourceRecord> m_authorityRecords;

+ 4
- 3
src/modules/dns-base/includes/dns-base/QDnsQuery.h Просмотреть файл

@@ -17,9 +17,9 @@ namespace QDns
17 17
         public:
18 18
             QDnsQuery();
19 19
 
20
-            static QDnsQuery parse(const QByteArray &packetData, quint32 pos);
20
+            QDnsQuery(const QByteArray &packetData, quint32 pos);
21 21
 
22
-            static QDnsQuery parse(const QByteArray &packetData, QDataStream &dataStream);
22
+            QDnsQuery(const QByteArray &packetData, QDataStream &dataStream);
23 23
 
24 24
             QByteArray serialize() const;
25 25
 
@@ -40,8 +40,9 @@ namespace QDns
40 40
             void setClass(quint16 aClass);
41 41
 
42 42
         private:
43
-            bool m_isValid;
43
+            void parse(const QByteArray &packetData, QDataStream &dataStream);
44 44
 
45
+            bool m_isValid;
45 46
             QString m_name;
46 47
             quint16 m_type;
47 48
             quint16 m_class;

+ 4
- 3
src/modules/dns-base/includes/dns-base/QDnsResourceRecord.h Просмотреть файл

@@ -18,9 +18,9 @@ namespace QDns
18 18
         public:
19 19
             QDnsResourceRecord();
20 20
 
21
-            static QDnsResourceRecord parse(const QByteArray &packetData, quint32 pos);
21
+            QDnsResourceRecord(const QByteArray &packetData, quint32 pos);
22 22
 
23
-            static QDnsResourceRecord parse(const QByteArray &packetData, QDataStream &dataStream);
23
+            QDnsResourceRecord(const QByteArray &packetData, QDataStream &dataStream);
24 24
 
25 25
             QByteArray serialize() const;
26 26
 
@@ -49,8 +49,9 @@ namespace QDns
49 49
             void setData(const QByteArray &data);
50 50
 
51 51
         private:
52
-            bool m_isValid;
52
+            void parse(const QByteArray &packetData, QDataStream &dataStream);
53 53
 
54
+            bool m_isValid;
54 55
             QString m_name;
55 56
             quint16 m_type;
56 57
             quint16 m_class;

+ 16
- 15
src/modules/dns-base/src/QDnsHeader.cpp Просмотреть файл

@@ -17,34 +17,35 @@ namespace QDns
17 17
                   , m_authorityCount(0)
18 18
                   , m_additionalCount(0)
19 19
         {
20
-
21 20
         }
22 21
 
23
-        QDnsHeader QDnsHeader::parse(const QByteArray &data)
22
+        QDnsHeader::QDnsHeader(const QByteArray &data)
23
+                : QDnsHeader()
24 24
         {
25 25
             QDataStream dataStream(data);
26
-            return QDnsHeader::parse(dataStream);
26
+            parse(dataStream);
27 27
         }
28 28
 
29
-        QDnsHeader QDnsHeader::parse(QDataStream &dataStream)
29
+        QDnsHeader::QDnsHeader(QDataStream &dataStream)
30
+                : QDnsHeader()
31
+        {
32
+            parse(dataStream);
33
+        }
34
+        void QDnsHeader::parse(QDataStream &dataStream)
30 35
         {
31
-            QDnsHeader header;
32
-
33 36
             if (dataStream.device()->bytesAvailable() < 12)
34 37
             {
35
-                header.m_isValid = false;
38
+                m_isValid = false;
36 39
             }
37 40
             else
38 41
             {
39
-                dataStream >> header.m_id;
40
-                dataStream >> header.m_flags;
41
-                dataStream >> header.m_queryCount;
42
-                dataStream >> header.m_answerCount;
43
-                dataStream >> header.m_authorityCount;
44
-                dataStream >> header.m_additionalCount;
42
+                dataStream >> m_id;
43
+                dataStream >> m_flags;
44
+                dataStream >> m_queryCount;
45
+                dataStream >> m_answerCount;
46
+                dataStream >> m_authorityCount;
47
+                dataStream >> m_additionalCount;
45 48
             }
46
-
47
-            return header;
48 49
         }
49 50
 
50 51
         QByteArray QDnsHeader::serialize() const

+ 28
- 25
src/modules/dns-base/src/QDnsPacket.cpp Просмотреть файл

@@ -13,62 +13,65 @@ namespace QDns
13 13
         {
14 14
         }
15 15
 
16
-        QDnsPacket QDnsPacket::parse(const QByteArray &data)
16
+        QDnsPacket::QDnsPacket(const QByteArray &data)
17
+                : QDnsPacket()
17 18
         {
18 19
             QDataStream dataStream(data);
19
-            return parse(data, dataStream);
20
+            parse(data, dataStream);
20 21
         }
21 22
 
22
-        QDnsPacket QDnsPacket::parse(const QByteArray &data, QDataStream &dataStream)
23
+        QDnsPacket::QDnsPacket(const QByteArray &data, QDataStream &dataStream)
24
+                : QDnsPacket()
23 25
         {
24
-            QDnsPacket packet;
26
+            parse(data, dataStream);
27
+        }
25 28
 
26
-            packet.m_header = QDnsHeader::parse(dataStream);
27
-            if (!packet.m_header.isValid())
29
+        void QDnsPacket::parse(const QByteArray &data, QDataStream &dataStream)
30
+        {
31
+            m_header = QDnsHeader(dataStream);
32
+            if (!m_header.isValid())
28 33
             {
29
-                packet.m_isValid = false;
34
+                m_isValid = false;
30 35
             }
31 36
             else
32 37
             {
33
-                for (quint16 i = 0; i < packet.m_header.getQueryCount() && packet.m_isValid; ++i)
38
+                for (quint16 i = 0; i < m_header.getQueryCount() && m_isValid; ++i)
34 39
                 {
35
-                    auto entry = QDnsQuery::parse(data, dataStream);
40
+                    auto entry = QDnsQuery(data, dataStream);
36 41
                     if (!entry.isValid())
37 42
                     {
38
-                        packet.m_isValid = false;
43
+                        m_isValid = false;
39 44
                     }
40
-                    packet.m_queries.append(entry);
45
+                    m_queries.append(entry);
41 46
                 }
42
-                for (quint16 i = 0; i < packet.m_header.getAnswerCount() && packet.m_isValid; ++i)
47
+                for (quint16 i = 0; i < m_header.getAnswerCount() && m_isValid; ++i)
43 48
                 {
44
-                    auto entry = QDnsResourceRecord::parse(data, dataStream);
49
+                    auto entry = QDnsResourceRecord(data, dataStream);
45 50
                     if (!entry.isValid())
46 51
                     {
47
-                        packet.m_isValid = false;
52
+                        m_isValid = false;
48 53
                     }
49
-                    packet.m_answerRecords.append(entry);
54
+                    m_answerRecords.append(entry);
50 55
                 }
51
-                for (quint16 i = 0; i < packet.m_header.getAuthorityCount() && packet.m_isValid; ++i)
56
+                for (quint16 i = 0; i < m_header.getAuthorityCount() && m_isValid; ++i)
52 57
                 {
53
-                    auto entry = QDnsResourceRecord::parse(data, dataStream);
58
+                    auto entry = QDnsResourceRecord(data, dataStream);
54 59
                     if (!entry.isValid())
55 60
                     {
56
-                        packet.m_isValid = false;
61
+                        m_isValid = false;
57 62
                     }
58
-                    packet.m_authorityRecords.append(entry);
63
+                    m_authorityRecords.append(entry);
59 64
                 }
60
-                for (quint16 i = 0; i < packet.m_header.getAdditionalCount() && packet.m_isValid; ++i)
65
+                for (quint16 i = 0; i < m_header.getAdditionalCount() && m_isValid; ++i)
61 66
                 {
62
-                    auto entry = QDnsResourceRecord::parse(data, dataStream);
67
+                    auto entry = QDnsResourceRecord(data, dataStream);
63 68
                     if (!entry.isValid())
64 69
                     {
65
-                        packet.m_isValid = false;
70
+                        m_isValid = false;
66 71
                     }
67
-                    packet.m_additionalRecords.append(entry);
72
+                    m_additionalRecords.append(entry);
68 73
                 }
69 74
             }
70
-
71
-            return packet;
72 75
         }
73 76
 
74 77
         QByteArray QDnsPacket::serialize() const

+ 14
- 11
src/modules/dns-base/src/QDnsQuery.cpp Просмотреть файл

@@ -16,29 +16,32 @@ namespace QDns
16 16
         {
17 17
         }
18 18
 
19
-        QDnsQuery QDnsQuery::parse(const QByteArray &packetData, quint32 pos)
19
+        QDnsQuery::QDnsQuery(const QByteArray &packetData, quint32 pos)
20
+                : QDnsQuery()
20 21
         {
21 22
             QDataStream dataStream(packetData);
22 23
             dataStream.skipRawData(pos);
23
-            return parse(packetData, dataStream);
24
+            parse(packetData, dataStream);
24 25
         }
25 26
 
26
-        QDnsQuery QDnsQuery::parse(const QByteArray &packetData, QDataStream &dataStream)
27
+        QDnsQuery::QDnsQuery(const QByteArray &packetData, QDataStream &dataStream)
28
+                : QDnsQuery()
27 29
         {
28
-            QDnsQuery query;
30
+            parse(packetData, dataStream);
31
+        }
29 32
 
30
-            query.m_name = QDnsLabel::parse(packetData, dataStream);
31
-            if (query.m_name.isNull() || dataStream.device()->bytesAvailable() < 4)
33
+        void QDnsQuery::parse(const QByteArray &packetData, QDataStream &dataStream)
34
+        {
35
+            m_name = QDnsLabel::parse(packetData, dataStream);
36
+            if (m_name.isNull() || dataStream.device()->bytesAvailable() < 4)
32 37
             {
33
-                query.m_isValid = false;
38
+                m_isValid = false;
34 39
             }
35 40
             else
36 41
             {
37
-                dataStream >> query.m_type;
38
-                dataStream >> query.m_class;
42
+                dataStream >> m_type;
43
+                dataStream >> m_class;
39 44
             }
40
-
41
-            return query;
42 45
         }
43 46
 
44 47
         QByteArray QDnsQuery::serialize() const

+ 17
- 13
src/modules/dns-base/src/QDnsResourceRecord.cpp Просмотреть файл

@@ -14,41 +14,45 @@ namespace QDns
14 14
         {
15 15
         }
16 16
 
17
-        QDnsResourceRecord QDnsResourceRecord::parse(const QByteArray &packetData, quint32 pos)
17
+        QDnsResourceRecord::QDnsResourceRecord(const QByteArray &packetData, quint32 pos)
18
+                : QDnsResourceRecord()
18 19
         {
19 20
             QDataStream dataStream(packetData);
20 21
             dataStream.skipRawData(pos);
21
-            return parse(packetData, dataStream);
22
+            parse(packetData, dataStream);
22 23
         }
23 24
 
24
-        QDnsResourceRecord QDnsResourceRecord::parse(const QByteArray &packetData, QDataStream &dataStream)
25
+        QDnsResourceRecord::QDnsResourceRecord(const QByteArray &packetData, QDataStream &dataStream)
26
+                : QDnsResourceRecord()
25 27
         {
26
-            QDnsResourceRecord rr;
28
+            parse(packetData, dataStream);
29
+        }
27 30
 
28
-            rr.m_name = QDnsLabel::parse(packetData, dataStream);
29
-            if (rr.m_name.isNull() || dataStream.device()->bytesAvailable() < 10)
31
+        void QDnsResourceRecord::parse(const QByteArray &packetData, QDataStream &dataStream)
32
+        {
33
+            m_name = QDnsLabel::parse(packetData, dataStream);
34
+            if (m_name.isNull() || dataStream.device()->bytesAvailable() < 10)
30 35
             {
31
-                rr.m_isValid = false;
36
+                m_isValid = false;
32 37
             }
33 38
             else
34 39
             {
35
-                dataStream >> rr.m_type;
36
-                dataStream >> rr.m_class;
37
-                dataStream >> rr.m_ttl;
40
+                dataStream >> m_type;
41
+                dataStream >> m_class;
42
+                dataStream >> m_ttl;
38 43
                 quint16 length;
39 44
                 dataStream >> length;
40 45
                 if (dataStream.device()->bytesAvailable() < length)
41 46
                 {
42
-                    rr.m_isValid = false;
47
+                    m_isValid = false;
43 48
                 }
44 49
                 else
45 50
                 {
46 51
                     char data[length];
47 52
                     dataStream.readRawData(data, length);
48
-                    rr.m_data.append(data, length);
53
+                    m_data.append(data, length);
49 54
                 }
50 55
             }
51
-            return rr;
52 56
         }
53 57
 
54 58
         QByteArray QDnsResourceRecord::serialize() const

+ 1
- 1
src/modules/dns-base/tests/DnsHeader.cpp Просмотреть файл

@@ -40,7 +40,7 @@ TEST_P(DnsHeaderTest, parseAndGetters)
40 40
 {
41 41
     auto params = GetParam();
42 42
     auto data = QByteArray::fromHex(params.hexData);
43
-    auto header = QDns::Base::QDnsHeader::parse(data);
43
+    auto header = QDns::Base::QDnsHeader(data);
44 44
     ASSERT_EQ(header.isValid(), params.isValid);
45 45
 
46 46
     if (header.isValid())

+ 2
- 2
src/modules/dns-base/tests/DnsPacket.cpp Просмотреть файл

@@ -22,7 +22,7 @@ TEST_P(DnsPacketParseTest, parse)
22 22
 {
23 23
     auto params = GetParam();
24 24
     auto data = QByteArray::fromHex(params.hexData);
25
-    auto packet = QDns::Base::QDnsPacket::parse(data);
25
+    auto packet = QDns::Base::QDnsPacket(data);
26 26
 
27 27
     ASSERT_EQ(packet.isValid(), params.isValid);
28 28
 
@@ -60,7 +60,7 @@ TEST_P(DnsPacketSerializeTest, parse)
60 60
 {
61 61
     auto params = GetParam();
62 62
     auto data1 = QByteArray::fromHex(params.hexData1);
63
-    auto packet = QDns::Base::QDnsPacket::parse(data1);
63
+    auto packet = QDns::Base::QDnsPacket(data1);
64 64
 
65 65
     // TODO improve tests
66 66
     ASSERT_EQ(packet.serialize().toHex(), QString(params.hexData2).remove(" "));

+ 1
- 1
src/modules/dns-base/tests/DnsQuery.cpp Просмотреть файл

@@ -26,7 +26,7 @@ TEST_P(DnsQueryParseTest, parse)
26 26
 {
27 27
     auto params = GetParam();
28 28
     auto data = QByteArray::fromHex(params.hexData);
29
-    auto query = QDns::Base::QDnsQuery::parse(data, params.pos);
29
+    auto query = QDns::Base::QDnsQuery(data, params.pos);
30 30
 
31 31
     ASSERT_EQ(query.isValid(), params.isValid);
32 32
 

+ 1
- 1
src/modules/dns-base/tests/DnsResourceRecord.cpp Просмотреть файл

@@ -28,7 +28,7 @@ TEST_P(DnsResourceRecordParseTest, parse)
28 28
 {
29 29
     auto params = GetParam();
30 30
     auto data = QByteArray::fromHex(params.hexData);
31
-    auto rr = QDns::Base::QDnsResourceRecord::parse(data, params.pos);
31
+    auto rr = QDns::Base::QDnsResourceRecord(data, params.pos);
32 32
 
33 33
     ASSERT_EQ(rr.isValid(), params.isValid);
34 34
 

Загрузка…
Отмена
Сохранить