1 #ifndef _XECONTAINERFORMATPARSER_HPP
2 #define _XECONTAINERFORMATPARSER_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Test Executor
5  * ------------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Test log container format parser.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "xeDefs.hpp"
27 #include "deRingBuffer.hpp"
28 
29 namespace xe
30 {
31 
32 enum ContainerElement
33 {
34 	CONTAINERELEMENT_INCOMPLETE = 0,
35 	CONTAINERELEMENT_END_OF_STRING,
36 	CONTAINERELEMENT_BEGIN_SESSION,
37 	CONTAINERELEMENT_END_SESSION,
38 	CONTAINERELEMENT_SESSION_INFO,
39 	CONTAINERELEMENT_BEGIN_TEST_CASE_RESULT,
40 	CONTAINERELEMENT_END_TEST_CASE_RESULT,
41 	CONTAINERELEMENT_TERMINATE_TEST_CASE_RESULT,
42 	CONTAINERELEMENT_TEST_LOG_DATA,
43 
44 	CONTAINERELEMENT_LAST
45 };
46 
47 class ContainerParseError : public ParseError
48 {
49 public:
ContainerParseError(const std::string & message)50 	ContainerParseError (const std::string& message) : ParseError(message) {}
51 };
52 
53 class ContainerFormatParser
54 {
55 public:
56 								ContainerFormatParser		(void);
57 								~ContainerFormatParser		(void);
58 
59 	void						clear						(void);
60 
61 	void						feed						(const deUint8* bytes, size_t numBytes);
62 	void						advance						(void);
63 
getElement(void) const64 	ContainerElement			getElement					(void) const { return m_element; }
65 
66 	// SESSION_INFO
67 	const char*					getSessionInfoAttribute		(void) const;
68 	const char*					getSessionInfoValue			(void) const;
69 
70 	// BEGIN_TEST_CASE
71 	const char*					getTestCasePath				(void) const;
72 
73 	// TERMINATE_TEST_CASE
74 	const char*					getTerminateReason			(void) const;
75 
76 	// TEST_LOG_DATA
77 	int							getDataSize					(void) const;
78 	void						getData						(deUint8* dst, int numBytes, int offset);
79 
80 private:
81 								ContainerFormatParser		(const ContainerFormatParser& other);
82 	ContainerFormatParser&		operator=					(const ContainerFormatParser& other);
83 
84 	void						error						(const std::string& what);
85 
86 	enum State
87 	{
88 		STATE_AT_LINE_START,
89 		STATE_CONTAINER_LINE,
90 		STATE_DATA,
91 
92 		STATE_LAST
93 	};
94 
95 	enum
96 	{
97 		END_OF_STRING	= 0,			//!< End of string (0).
98 		END_OF_BUFFER	= 0xffffffff	//!< End of current data buffer.
99 	};
100 
101 	int							getChar						(int offset) const;
102 	void						parseContainerLine			(void);
103 	void						parseContainerValue			(std::string& dst, int& offset) const;
104 
105 	ContainerElement			m_element;
106 	int							m_elementLen;
107 	State						m_state;
108 	std::string					m_attribute;
109 	std::string					m_value;
110 
111 	de::RingBuffer<deUint8>		m_buf;
112 };
113 
114 } // xe
115 
116 #endif // _XECONTAINERFORMATPARSER_HPP
117