1*77b80299SAndroid Build Coastguard Worker /*
2*77b80299SAndroid Build Coastguard Worker * Copyright (C) 2006 The Android Open Source Project
3*77b80299SAndroid Build Coastguard Worker *
4*77b80299SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*77b80299SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*77b80299SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*77b80299SAndroid Build Coastguard Worker *
8*77b80299SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*77b80299SAndroid Build Coastguard Worker *
10*77b80299SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*77b80299SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*77b80299SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*77b80299SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*77b80299SAndroid Build Coastguard Worker * limitations under the License.
15*77b80299SAndroid Build Coastguard Worker */
16*77b80299SAndroid Build Coastguard Worker
17*77b80299SAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_TEXTOUTPUT_H
18*77b80299SAndroid Build Coastguard Worker #define ANDROID_HARDWARE_TEXTOUTPUT_H
19*77b80299SAndroid Build Coastguard Worker
20*77b80299SAndroid Build Coastguard Worker #include <utils/Errors.h>
21*77b80299SAndroid Build Coastguard Worker #include <utils/String8.h>
22*77b80299SAndroid Build Coastguard Worker
23*77b80299SAndroid Build Coastguard Worker #include <stdint.h>
24*77b80299SAndroid Build Coastguard Worker #include <string.h>
25*77b80299SAndroid Build Coastguard Worker #include <sstream>
26*77b80299SAndroid Build Coastguard Worker
27*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
28*77b80299SAndroid Build Coastguard Worker namespace android {
29*77b80299SAndroid Build Coastguard Worker namespace hardware {
30*77b80299SAndroid Build Coastguard Worker
31*77b80299SAndroid Build Coastguard Worker class TextOutput
32*77b80299SAndroid Build Coastguard Worker {
33*77b80299SAndroid Build Coastguard Worker public:
34*77b80299SAndroid Build Coastguard Worker TextOutput();
35*77b80299SAndroid Build Coastguard Worker virtual ~TextOutput();
36*77b80299SAndroid Build Coastguard Worker
37*77b80299SAndroid Build Coastguard Worker virtual status_t print(const char* txt, size_t len) = 0;
38*77b80299SAndroid Build Coastguard Worker virtual void moveIndent(int delta) = 0;
39*77b80299SAndroid Build Coastguard Worker
40*77b80299SAndroid Build Coastguard Worker class Bundle {
41*77b80299SAndroid Build Coastguard Worker public:
Bundle(TextOutput & to)42*77b80299SAndroid Build Coastguard Worker inline explicit Bundle(TextOutput& to) : mTO(to) { to.pushBundle(); }
~Bundle()43*77b80299SAndroid Build Coastguard Worker inline ~Bundle() { mTO.popBundle(); }
44*77b80299SAndroid Build Coastguard Worker private:
45*77b80299SAndroid Build Coastguard Worker TextOutput& mTO;
46*77b80299SAndroid Build Coastguard Worker };
47*77b80299SAndroid Build Coastguard Worker
48*77b80299SAndroid Build Coastguard Worker virtual void pushBundle() = 0;
49*77b80299SAndroid Build Coastguard Worker virtual void popBundle() = 0;
50*77b80299SAndroid Build Coastguard Worker };
51*77b80299SAndroid Build Coastguard Worker
52*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
53*77b80299SAndroid Build Coastguard Worker
54*77b80299SAndroid Build Coastguard Worker // Text output stream for printing to the log (via utils/Log.h).
55*77b80299SAndroid Build Coastguard Worker extern TextOutput& alog;
56*77b80299SAndroid Build Coastguard Worker
57*77b80299SAndroid Build Coastguard Worker typedef TextOutput& (*TextOutputManipFunc)(TextOutput&);
58*77b80299SAndroid Build Coastguard Worker
59*77b80299SAndroid Build Coastguard Worker TextOutput& endl(TextOutput& to);
60*77b80299SAndroid Build Coastguard Worker TextOutput& indent(TextOutput& to);
61*77b80299SAndroid Build Coastguard Worker TextOutput& dedent(TextOutput& to);
62*77b80299SAndroid Build Coastguard Worker
63*77b80299SAndroid Build Coastguard Worker template<typename T>
64*77b80299SAndroid Build Coastguard Worker TextOutput& operator<<(TextOutput& to, const T& val)
65*77b80299SAndroid Build Coastguard Worker {
66*77b80299SAndroid Build Coastguard Worker std::stringstream strbuf;
67*77b80299SAndroid Build Coastguard Worker strbuf << val;
68*77b80299SAndroid Build Coastguard Worker std::string str = strbuf.str();
69*77b80299SAndroid Build Coastguard Worker to.print(str.c_str(), str.size());
70*77b80299SAndroid Build Coastguard Worker return to;
71*77b80299SAndroid Build Coastguard Worker }
72*77b80299SAndroid Build Coastguard Worker
73*77b80299SAndroid Build Coastguard Worker TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func);
74*77b80299SAndroid Build Coastguard Worker
75*77b80299SAndroid Build Coastguard Worker class TypeCode
76*77b80299SAndroid Build Coastguard Worker {
77*77b80299SAndroid Build Coastguard Worker public:
78*77b80299SAndroid Build Coastguard Worker inline explicit TypeCode(uint32_t code);
79*77b80299SAndroid Build Coastguard Worker inline ~TypeCode();
80*77b80299SAndroid Build Coastguard Worker
81*77b80299SAndroid Build Coastguard Worker inline uint32_t typeCode() const;
82*77b80299SAndroid Build Coastguard Worker
83*77b80299SAndroid Build Coastguard Worker private:
84*77b80299SAndroid Build Coastguard Worker uint32_t mCode;
85*77b80299SAndroid Build Coastguard Worker };
86*77b80299SAndroid Build Coastguard Worker
87*77b80299SAndroid Build Coastguard Worker TextOutput& operator<<(TextOutput& to, const TypeCode& val);
88*77b80299SAndroid Build Coastguard Worker
89*77b80299SAndroid Build Coastguard Worker class HexDump
90*77b80299SAndroid Build Coastguard Worker {
91*77b80299SAndroid Build Coastguard Worker public:
92*77b80299SAndroid Build Coastguard Worker HexDump(const void *buf, size_t size, size_t bytesPerLine=16);
93*77b80299SAndroid Build Coastguard Worker inline ~HexDump();
94*77b80299SAndroid Build Coastguard Worker
95*77b80299SAndroid Build Coastguard Worker inline HexDump& setBytesPerLine(size_t bytesPerLine);
96*77b80299SAndroid Build Coastguard Worker inline HexDump& setSingleLineCutoff(int32_t bytes);
97*77b80299SAndroid Build Coastguard Worker inline HexDump& setAlignment(size_t alignment);
98*77b80299SAndroid Build Coastguard Worker inline HexDump& setCArrayStyle(bool enabled);
99*77b80299SAndroid Build Coastguard Worker
100*77b80299SAndroid Build Coastguard Worker inline const void* buffer() const;
101*77b80299SAndroid Build Coastguard Worker inline size_t size() const;
102*77b80299SAndroid Build Coastguard Worker inline size_t bytesPerLine() const;
103*77b80299SAndroid Build Coastguard Worker inline int32_t singleLineCutoff() const;
104*77b80299SAndroid Build Coastguard Worker inline size_t alignment() const;
105*77b80299SAndroid Build Coastguard Worker inline bool carrayStyle() const;
106*77b80299SAndroid Build Coastguard Worker
107*77b80299SAndroid Build Coastguard Worker private:
108*77b80299SAndroid Build Coastguard Worker const void* mBuffer;
109*77b80299SAndroid Build Coastguard Worker size_t mSize;
110*77b80299SAndroid Build Coastguard Worker size_t mBytesPerLine;
111*77b80299SAndroid Build Coastguard Worker int32_t mSingleLineCutoff;
112*77b80299SAndroid Build Coastguard Worker size_t mAlignment;
113*77b80299SAndroid Build Coastguard Worker bool mCArrayStyle;
114*77b80299SAndroid Build Coastguard Worker };
115*77b80299SAndroid Build Coastguard Worker
116*77b80299SAndroid Build Coastguard Worker TextOutput& operator<<(TextOutput& to, const HexDump& val);
117*77b80299SAndroid Build Coastguard Worker inline TextOutput& operator<<(TextOutput& to,
118*77b80299SAndroid Build Coastguard Worker decltype(std::endl<char,
119*77b80299SAndroid Build Coastguard Worker std::char_traits<char>>)
120*77b80299SAndroid Build Coastguard Worker /*val*/) {
121*77b80299SAndroid Build Coastguard Worker endl(to);
122*77b80299SAndroid Build Coastguard Worker return to;
123*77b80299SAndroid Build Coastguard Worker }
124*77b80299SAndroid Build Coastguard Worker
125*77b80299SAndroid Build Coastguard Worker inline TextOutput& operator<<(TextOutput& to, const char &c)
126*77b80299SAndroid Build Coastguard Worker {
127*77b80299SAndroid Build Coastguard Worker to.print(&c, 1);
128*77b80299SAndroid Build Coastguard Worker return to;
129*77b80299SAndroid Build Coastguard Worker }
130*77b80299SAndroid Build Coastguard Worker
131*77b80299SAndroid Build Coastguard Worker inline TextOutput& operator<<(TextOutput& to, const bool &val)
132*77b80299SAndroid Build Coastguard Worker {
133*77b80299SAndroid Build Coastguard Worker if (val) to.print("true", 4);
134*77b80299SAndroid Build Coastguard Worker else to.print("false", 5);
135*77b80299SAndroid Build Coastguard Worker return to;
136*77b80299SAndroid Build Coastguard Worker }
137*77b80299SAndroid Build Coastguard Worker
138*77b80299SAndroid Build Coastguard Worker inline TextOutput& operator<<(TextOutput& to, const String16& val)
139*77b80299SAndroid Build Coastguard Worker {
140*77b80299SAndroid Build Coastguard Worker to << String8(val).c_str();
141*77b80299SAndroid Build Coastguard Worker return to;
142*77b80299SAndroid Build Coastguard Worker }
143*77b80299SAndroid Build Coastguard Worker
144*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
145*77b80299SAndroid Build Coastguard Worker // No user servicable parts below.
146*77b80299SAndroid Build Coastguard Worker
endl(TextOutput & to)147*77b80299SAndroid Build Coastguard Worker inline TextOutput& endl(TextOutput& to)
148*77b80299SAndroid Build Coastguard Worker {
149*77b80299SAndroid Build Coastguard Worker to.print("\n", 1);
150*77b80299SAndroid Build Coastguard Worker return to;
151*77b80299SAndroid Build Coastguard Worker }
152*77b80299SAndroid Build Coastguard Worker
indent(TextOutput & to)153*77b80299SAndroid Build Coastguard Worker inline TextOutput& indent(TextOutput& to)
154*77b80299SAndroid Build Coastguard Worker {
155*77b80299SAndroid Build Coastguard Worker to.moveIndent(1);
156*77b80299SAndroid Build Coastguard Worker return to;
157*77b80299SAndroid Build Coastguard Worker }
158*77b80299SAndroid Build Coastguard Worker
dedent(TextOutput & to)159*77b80299SAndroid Build Coastguard Worker inline TextOutput& dedent(TextOutput& to)
160*77b80299SAndroid Build Coastguard Worker {
161*77b80299SAndroid Build Coastguard Worker to.moveIndent(-1);
162*77b80299SAndroid Build Coastguard Worker return to;
163*77b80299SAndroid Build Coastguard Worker }
164*77b80299SAndroid Build Coastguard Worker
165*77b80299SAndroid Build Coastguard Worker inline TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func)
166*77b80299SAndroid Build Coastguard Worker {
167*77b80299SAndroid Build Coastguard Worker return (*func)(to);
168*77b80299SAndroid Build Coastguard Worker }
169*77b80299SAndroid Build Coastguard Worker
TypeCode(uint32_t code)170*77b80299SAndroid Build Coastguard Worker inline TypeCode::TypeCode(uint32_t code) : mCode(code) { }
~TypeCode()171*77b80299SAndroid Build Coastguard Worker inline TypeCode::~TypeCode() { }
typeCode()172*77b80299SAndroid Build Coastguard Worker inline uint32_t TypeCode::typeCode() const { return mCode; }
173*77b80299SAndroid Build Coastguard Worker
~HexDump()174*77b80299SAndroid Build Coastguard Worker inline HexDump::~HexDump() { }
175*77b80299SAndroid Build Coastguard Worker
setBytesPerLine(size_t bytesPerLine)176*77b80299SAndroid Build Coastguard Worker inline HexDump& HexDump::setBytesPerLine(size_t bytesPerLine) {
177*77b80299SAndroid Build Coastguard Worker mBytesPerLine = bytesPerLine; return *this;
178*77b80299SAndroid Build Coastguard Worker }
setSingleLineCutoff(int32_t bytes)179*77b80299SAndroid Build Coastguard Worker inline HexDump& HexDump::setSingleLineCutoff(int32_t bytes) {
180*77b80299SAndroid Build Coastguard Worker mSingleLineCutoff = bytes; return *this;
181*77b80299SAndroid Build Coastguard Worker }
setAlignment(size_t alignment)182*77b80299SAndroid Build Coastguard Worker inline HexDump& HexDump::setAlignment(size_t alignment) {
183*77b80299SAndroid Build Coastguard Worker mAlignment = alignment; return *this;
184*77b80299SAndroid Build Coastguard Worker }
setCArrayStyle(bool enabled)185*77b80299SAndroid Build Coastguard Worker inline HexDump& HexDump::setCArrayStyle(bool enabled) {
186*77b80299SAndroid Build Coastguard Worker mCArrayStyle = enabled; return *this;
187*77b80299SAndroid Build Coastguard Worker }
188*77b80299SAndroid Build Coastguard Worker
buffer()189*77b80299SAndroid Build Coastguard Worker inline const void* HexDump::buffer() const { return mBuffer; }
size()190*77b80299SAndroid Build Coastguard Worker inline size_t HexDump::size() const { return mSize; }
bytesPerLine()191*77b80299SAndroid Build Coastguard Worker inline size_t HexDump::bytesPerLine() const { return mBytesPerLine; }
singleLineCutoff()192*77b80299SAndroid Build Coastguard Worker inline int32_t HexDump::singleLineCutoff() const { return mSingleLineCutoff; }
alignment()193*77b80299SAndroid Build Coastguard Worker inline size_t HexDump::alignment() const { return mAlignment; }
carrayStyle()194*77b80299SAndroid Build Coastguard Worker inline bool HexDump::carrayStyle() const { return mCArrayStyle; }
195*77b80299SAndroid Build Coastguard Worker
196*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
197*77b80299SAndroid Build Coastguard Worker } // namespace hardware
198*77b80299SAndroid Build Coastguard Worker } // namespace android
199*77b80299SAndroid Build Coastguard Worker
200*77b80299SAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_TEXTOUTPUT_H
201