xref: /aosp_15_r20/system/libhwbinder/TextOutput.h (revision 77b80299c8bdfeca3ae6d0ce27ae1ad3db289be3)
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